目录
封装成帧
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从比特流中识别帧的开始和结束。
首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息。
为了提高帧的传输效率,应当使帧的数据部分长度尽量大于首部和尾部的长度。最大传输单元MTU(Maximum Transfer Unit):帧数据部分长度上限。
当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。ASCII码是7位编码,一共可以组合成128个不同的ASCII码,其中可打印的有95个,而不可打印的控制字符有33个。(可打印的字符就是可以在键盘上输入的字符,我们使用的标准键盘有47个键可输入94个字符,包括使用shift键,加上空格键,一共可以输入95个可打印字符)
控制字符SOH(start of header)放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT(end of transmission)表示帧的结束。注意:SOH和EOT都只是控制字符的名称,他们的十六进制编码分别是01(二进制是00000001)和04(二进制是00000100)。SOH,EOT 并不是S O H E O T这几个字符,只是名字而已。
当传输中出现差错,帧定界符的作用更加明显。假设未发送完一个帧而发生故障,接收端就知道收到的数据是不完整的帧(只有首部),必须丢弃。
透明传输
"透明”在计算机领域是非常重要的一个术语
一种实际存在的事物却又看起来不存在一样
即是控制字符在帧数据中,但是要当做不存在的去处理
为了解决透明传输问题,字节填充法或字符填充:在控制字符SOH、EOT的前面插入一个转义字符ESC(其十六进制编码是1B,二进制是00011011)。而接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。
差错监测
物理层只管传输比特流,无法控制是否出错
数据链路层只进行数据的检测,不进行纠正
1.奇偶校验码
1.1什么是奇偶校验码
奇偶校验码也是一种校验码,它用来检测数据传输过程中是否发生错误,是众多校验码中最为简单的一种。
顾名思义,它有两种校验方法:奇校验和偶校验
奇校验:原始码流+校验位 总共有奇数个1
偶校验:原始码流+校验位 总共有偶数个1
1.2. 算法
它的校验位只有一位,要么是0,要么是1。并且它的校验码还可以放在码流的前面。
例如下图有5组原始码,校验位的计算方法如下。红色代表校验位。
2.循环冗余校验码CRC
一种根据传输或保存的数据而产生固定位数校验码的方法
检测数据传输或者保存后可能出现的错误
生成的数字计算出来并且附加到数据后面
CRC的错误检测能力与位串的阶数r有关
2.1计算校验位
https://www.jianshu.com/p/7f4fd7f62de2
以一个题目为例:设待校验的数据为。D8~D1 = 10101011,若采用CRC,且生成多项式为 10011,则其 CRC 码为:
这里首先要注意题目中的一个表述——“多项式”,该题目中写作“10011”,在有的题目中往往写作“x^4+x+1”
首先,在数据位后加多项式最高幂次个0,比如这里的多项式最高次项为x^4,那就在数据位后加四个0,变成:101010110000,作为被除数
然后,将多项式 10011 作为除数进行断除。需要注意的是,图中所框的部分,对应位只做xor(异或)运算,也就是做减法但不影响其他位
最后得到的余数:1010,即是校验位。那么整个CRC码为:10101011 1010
2.2接收端校验
以上一节例题为例,假设收到的CRC码变成了10001011 1010,第10位(右边为低位)发生了错误。
现在尝试用CRC码与多项式 10011 进行短除:
余数不为0,帧发生错误
3.最大传输单元MTU
形象理解传输中数据的长度限制
以寄送快递为例:https://blog.csdn.net/weixin_39294633/article/details/81176666
1500字节就是在传输过程中的最大传输单元,也称为MTU,是指在传输数据过程中允许报文的最大长度。
3.1 MTU对IP协议的影响
(1)IP报文在超过MTU后需要分片,接收端需要组装;
(2)一旦分片后的IP报文有一部分丢失,则接收端组装会失败,对于整个P报文而言相当于传输失败,而IP协议不会负责重新传输数据;
(3)由于MTU影响的IP报文的分片和组装会加大报文丢失的可能性;
(4)报文的分片和组装由IP层自己做,会加大传输的成本,降低性能。
3.2 MTU对UDP协议的影响
(1)UDP协议的报头为固定的20字节;
(2)若UDP数据的长度超过(1500-20)1480字节,则数据在网络层会分片;
(3)数据的分片会加大数据丢失的可能性。
3.3 MTU对TCP协议的影响
(1)TCP协议的报头长度为20–60字节;
(2)若TCP报文的总长度超过1500字节,则数据同样在网络层会分片;
(3)TCP单个数据报的最大长度称为最大段尺寸MSS;
(4)在TCP三次握手建立连接的时候,双方会商量传输中MSS的大小;
(5)与UDP相同的是,分片越多数据丢包的可能性越大,可靠性也就越差。
4.以太网协议详解
4.1 以太网中数据帧结构
http://c.biancheng.net/view/6391.html
以太帧起始部分由前同步码和帧开始定界符组成,后面紧跟着一个以太网报头,以 MAC 地址说明目的地址和源地址。以太帧的中部是该帧负载的包含其他协议报头的数据包,如 IP 协议。
字段 | 含义 |
前同步码 | 用来使接收端的适配器在接收 MAC 帧时能够迅速调整时钟频率,使它和发送端的频率相同。前同步码为 7 个字节,1 和 0 交替。 |
帧开始定界符 | 帧的起始符,为 1 个字节。前 6 位 1 和 0 交替,最后的两个连续的 1 表示告诉接收端适配器:“帧信息要来了,准备接收”。 |
目的地址 | 接收帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。 |
源地址 | 发送帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。 |
类型 | 上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。 |
数据 | 也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。 在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。 |
帧检验序列 FCS | 检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。 |