网络篇(一):《趣谈网络协议》读书笔记
lipiwang 2024-10-25 15:48 12 浏览 0 评论
大家好,我是 杰哥
相信很多朋友跟我一样,虽然学校有涉及到网络相关知识,但是工作中一直没怎么用到,所以渐渐地就对于网络知识变得生疏了很多。但渐渐地,当接触到越来越多的新技术或者新业务需求时,你会发现,其实网络知识对于 IT 人员来讲,是一块不容忽视的领域
于是,最近杰哥就进入网络部分的研读啦
首先,推荐给大家一本新书 ——《趣谈网络协议》。整本书的风格比较接地气,读完之后的感觉就是,作者刘超能够把复杂的技术讲得通俗易懂,并且能够让我们快速 get 到网络知识的全貌
接下来,就跟着我,先来看看整本书的第一部分:MAC 层、IP 层以及 传输层的内容吧~
一、MAC 层
(一)定义
(一)Medium Access Control,即媒体访问控制
(二)解决的问题
1、 这个包是发给谁的?谁应该接收?
会在头部添加源 MAC 和目的 MAC 地址
2、大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
有。分别有三种协议规则:信道划分协议、轮流协议以及随机接入协议
3、如果发送的时候出现了错误,怎么办?
采用 CRC,即循环冗余检测,通过 XOR 异或的算法,校验是否出现错误
4、如果发送的时候找不到目的 MAC 地址,怎么办?
若未找到目的 MAC 地址,则通过 ARP 协议广播查找,并缓存一段时间
(三)交换机与 VLAN
1、交换机的 MAC 地址学习能力
交换机具有 MAC 地址学习能力,学会之后,他就能知道谁在哪里,不用再广播查找了
2、STP 协议-解决环路问题
当交换机的数目越来越多的时候,会遭遇环路问题,让网络包迷路,这就需要使用 STP 协议。
通过华山论剑比武的方式,将有环路的图变成没有环路的树,从而解决环路问题
3、VLAN - 解决隔离问题
交换机数目多会面临隔离问题,可以通过 VLAN 形成虚拟局域网,从而解决广播问题和安全问题
二、IP 层
(一)ICMP 与 Ping
1、Ping 是通过 ICMP(Internet Control Message Protocol,互联网控制报文协议)协议工作的
2、Ping 比起原生的 ICMP 协议,多了两个字段,一个是标识符:区分用于不同功能,另一个是序号:确定返回结果
3、ICMP 相当于网络世界的侦察兵。有两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文
4、Ping 使用查询报文,Traceroute 使用差错报文
5、Traceroute 的作用
1)故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器,判断去往目的地途径的各个路由器的距离
2)故意设置不分片位,从而确定路径的 MTU(最大传输单元)
(二)静态路由
可以配置多个路由表,根据源 IP 地址、入口设备、TOS 等选择路由表,然后在路由表中查找路由。这样可以使得来自不同来源的包走不同的路由
(三)动态路由
根据路由协议生成动态路由表,路由表随网络运行环境的变化而变化。从而将问题转化为如何找到图的最短路径问题,有如下两种协议
1、距离矢量路由协议
基于 Bellman-Ford 算法
1)存在两个问题
a.好消息传得快,坏消息传得慢
b.每次发送时,需要发送整个全局路由表,适用于小型网络
2)应用
BGP(边界网关协议,外网的路由协议) 协议使用的是路径矢量路由协议,并且是这个协议的升级版。
3)BGP 对于问题的规避
a.在 BGP 中,除了下一跳之外,还包括了自治系统的路径,解决了第一个问题
b.全局路由表是自治系统这个粒度的,本身就比较少
2、链路状态路由协议
1)基于 Dijkstra 算法
2)相对于距离矢量路由协议来说,更新时只广播更新的或改变的网络拓扑。节省了带宽,并且提高了 CPU 利用率。并且当某个路由器挂了,它的邻居都会广播这个消息,使得坏消息迅速传播
3)应用
OSPF(开放式最短路径优先)基于链路状态路由协议,广泛应用在数据中心内部的协议。应用时,可发现多条最短路径,并在多条路径中进行负载均衡
三、传输层
(一)TCP 与 UDP 的区别
1、TCP 是面向连接的;UDP 是面向无连接的
2、TCP 提供可靠交付;UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达
3、TCP 面向字节流;UPD基于数据报,一个个地发一个个地收
4、TCP 是可以有拥塞控制的;UDP不会
(二)UDP
1、包头
即,UDP 头中分别包含:源端口号、目标端口号、UDP 长度、UDP 校验和以及数据,其中数据用来标识当前是属于 TCP 协议还是 UDP 协议
2、特点
- 沟通简单。数据结构、处理逻辑、包头简单。
- 监听的端口谁都可以传输数据给他
- 不会根据网络情况而改变
3、应用场景
- 资源少的内网,对丢包不敏感的应用。如 DHCP 协议、TFTP
- 不需要一对一沟通,建立连接,而是可以广播的应用。如 DHCP、VXLAN
- 需要处理速度快,延时低,可容忍少数丢包。如视频聊天、语音通话
4、基于 UDP 定制化的 5个例子
- 来自网页或者APP 的访问
- QUIC 协议(快速 UDP 互联网连接)
- 流媒体的协议
- 实时游戏
- 物联网
- 移动通信领域
(三)TCP
1、三次握手
第一次握手:客户端 A 与服务器 B 建立连接。将标志位 SYN 置为 1,产生一个随机值 seq=x,发送给服务端。客户端随即进入 SYN_SENT 状态,等待服务端确认;
第二次握手:服务端 B 收到数据包后进行确认。服务端由标志位 SYN =1 得知客户端是要建立连接,于是将标志位 SYN 和 ACK 都置为 1 ,ack=x+1,随机产生一个值 seq=y。服务端随即进入 SYN_RECVD 状态
第三次握手:客户端 A 确认。客户端收到确认后,检查 ack 是否为 x+1,ACK 是否为1,若正确,则将标志位 ACK 置为1,ack = y+1,发送给服务端,并进入 ESTABELISHED 状态。服务端收到之后,也进入 ESTABELISHED 状态
完成三次握手之后,客户端和服务端就可以开始进行数据传输
Tips1:为什么是三次握手而不是两次?
客户端 A 与服务器 B 建立连接,B 发送应答包后是不能确定 A 已经收到的。当网络波动时,A 会重复发送请求,B 会重复应答
三次握手可以确定双方都准备好了资源,避免死锁发生
2、四次挥手
第一次:A 说不玩了,就进入 FIN_WAIT_1 状态
第二次:B 收到 A 的消息后,发送“知道了”,进入 CLOSED_WAIT 状态;A 收到 B “知道了”的消息后,就进入 FIN_WAIT_2 状态
第三次:B 对 A 说,“我也不玩了”,并进入 LAST_ACK 状态,等待 A 的确认
第四次:A 进行确认。A 向 B 发送"知道了"的 ACK 后,不会直接“跑路”,而是进入 TIME_WAIT 状态(等待 2MSL 之后才会进入 CLOSED 状态)。而此时 B 收到请求之后,则直接变为 CLOSED 状态。也就是说,一般情况下,B 是比 A 先关闭的
Tips2:为什么客户端 A 还要等待 2MSL 之后才会关闭连接?
MSL(最长生存时间),是包在网络上存在的最长时间,超过这个时间的包将会被丢弃
A 并不知道 B 是否接到自己的 ACK ,A 是这么想的:
1)如果 B 没有收到自己的 ACK,会超时重传FIN,那么A再次接到重传的 FIN,会再次发送 ACK
2)如果 B 收到自己的 ACK,也不会再发任何消息,包括 ACK
无论是 1 还是 2,A都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:
去向 ACK 消息最大存活时间(MSL) + 来向 FIN 消息的最大存活时间(MSL)
这恰恰就是 2MSL( Maximum Segment Life)
所以,等待 2MSL 时间,A 就可以放心地释放 TCP 占用的资源、端口号,此时可以使用该端口号连接任何服务器。同时也能保证网络中老的链接全部消失
Tips3:那么如果 B 超过了 2 MSL 的时间,依然没有收到它发的 FIN 的 ACK,怎么办呢 ?
按照 TCP 的规则,B 当然还会重发 FIN,这时 A 收到这个包之后,就表示:“我已经在这里等了这么长时间,已经仁至义尽了,之后的包我就都不认了。”于是A 直接发送 RST 给B,B 就知道 A 已经跑路了
Tips4: RST 表示什么意思?
RST(Reset the connection),用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求
3、顺序问题
通过每个包设置一个 ID 来保证顺序性
若第二个报文序列先于第一个到达,接收端会保留这个报文段,并等待缺少的字节来填补该间隔。同时保存不同状态包的记录,等待第一个报文的到达之后,最终进行累计确认
TCP 的客户端和服务端分别通过缓存来保存不同状态包的记录:
1)发送端根据处理情况设置四个部分:
- 发送了并且已经确认的
- 发送了并且尚未确定的
- 没有发送等待发送的
- 没有发送暂时不会发送(为了流量控制)
2)接收端设置三个部分:
- 接受并且确认过的
- 还没接收,马上就能接受
- 还没接收,也没法接收
4、重发机制(保证不丢包)
保证每个请求都有应答。常见的重传机制,如下:
1)超时重试
对每个已经发送但未收到 ACK 的包,都设置一个定时器,超过了一定时间,就重新尝试。而这个值是多少呢?是通过采样 RTT(Round-Trip Time 往返时延) 的时间及 RTT 的波动范围,进行加权平均,算出一个值
2)快速重传
快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传
它的思想是:当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段
举个例子,你就明白了:
比如,发送方发出了 1,2,3,4 份数据:
当 Seq1 先收到了,于是就 ack 回 2;
而 Seq2 因为某些原因没收到,Seq3 和 Seq4 到达了,因为 Seq2 还是没有收到,于是还是 ack 回 2;
发送端收到了三个 ack = 2 的确认,便知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2
最后,接收端收到了 Seq2,此时因为 Seq3,Seq4 都收到了,于是 ack 回 5
3)SACK 方法
这种方式需要在 TCP 头部字段里加一个 SACK ,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到。知道了这些信息,就可以只重传丢失的数据
5、流量控制
即,对发送方发送速率的控制。防止发送方把接收方的缓存塞满
接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区(即接收窗口大小)还剩余多少是空闲的 发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为 0 时,发送方就会停止发送数据,防止出现大量丢包情况的发生
停止之后,客户端也会定时发送窗口探测数据包,看是否有机会调整窗口的大小
6、拥塞控制
拥塞窗口(cwnd),是为了防止网络被塞满,避免了包丢失和超时重传
具体步骤如下:
S1:慢启动
也可以称为试探启动。以 cwnd 为 1 开始,即一次只能发送一个包
S2:指数增长
当每次收到确认之后,cwnd 再加一个 cwnd 的值,即分别变为 1,2,4,8... 当 达到 ssthresh 的值(65535)时,变成线性增长
S3:拥塞避免
有两种处理方式:超时重传 和 快速重传
1)超时重传的处理方式:当发生超时指标的丢包时,需要重新从慢启动开始(cwnd=1),并且 ssthresh 的值变为 cwnd/2
但是可以很明显看到,这种方式太激进了,反应也很强烈,会造成网络卡顿
2)快速重传的处理方式:cwnd 减半(cwnd/2)。然后,ssthresh=cwnd。若3个包返回时,cwnd = cwnd+3,即成线性增长
7、TCP 的安全问题-SYN攻击
1)什么是 SYN 攻击?
我们知道,在 TCP 的三次握手过程中,第二次握手进行完还未进行第三次握手期间:即服务器发送了 SYN-ACK 之后,收到客户端的 ACK 之前,处于 SYN_RCVD 状态。当收到 ACK 后,服务器才能转入 ESTABLISHED 状态
而,攻击者会在短时间内伪造大量不存在的IP地址,向服务器不断地发送 SYN 包,根据三次握手的流程,服务器会为每个客户端请求回复确认包,并等待客户的确认
由于源地址不存在,服务器需要不断重发直至超时。这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪
2)如何检测 SYN 攻击?
当你在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击
3)如何防御 SYN 攻击?
根据 TCP 的设计思想,这种攻击无法被直接避免。只能通过以下几种常见的方式减轻 SYN 攻击的危害:
缩短超时(SYN Timeout)时间
增加最大半连接数
过滤网关防护
SYN cookies 技术
总结
好了,这个是本人读完《趣谈网络协议》这本书的第一部分的读书笔记。整体内容包括:
其中,重点在于对于MAC层、IP层以及传输层这三层协议的知识扫盲梳理,和 TCP 协议的三次握手、四次挥手以及如何保证靠谱传输的机制的学习
剩余部分的总结,也在整理之中了,敬请期待下次推送
嗯,就这样。每天学习一点,时间会见证你的强大~
欢迎大家关注我们的公众号,一起持续性学习吧~
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)