|
以太网数据帧的物理特性是其长度必须在46~1500字节之间,而数据帧在进入每一层协议栈的时候均会做一些封装。
而更具体的以太网帧格式为:
分用
当目的主机收到一个以太网帧时,就在协议栈中从底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部的协议标识,以确定接收数据的上层协议。这个过程称作分用。
分段 (fragmentation)
老的内核通常在IP层处理IP分段,IP层可以接收0~64KB的数据。因此,当数据IP packet大于PMTU时,就必须把数据分成多个IP分段。 较新的内核中,L4会尝试进行分段:L4不会再把超过PMTU的缓冲区直接传给IP层,而是传递一组和PMTU相匹配的缓冲区。这样,IP层只需要给每个分段增加IP报头。但是这并不意味着IP层就不做分段的工作了,一些情况下,IP层还会进行分段操作。
- 分段是指将一个IP包分成多个传输,在接收端 IP 层重新组装
- 一个 IP 包能否分包,取决于它的 DF 标志位:DF bit (0 = "may fragment," 1 = "don't fragment")
- 分包后,每个分段有 MF 标志位:MF bit (0 = "last fragment," 1 = "more fragments")
第一个表格中:
- IP 包长度 5140,包括 5120 bytes 的 payload
- DF = 0, 允许分包
- MF = 0, 这是未分包
第二个表格中:
- 0-0 第一个分包: 长度 1500 = 1480 (payload) + 20 (IP Header). Offset(起始偏移量): 0
- 0-1 第二个分包: 长度 1500 = 1480 (payload) + 20 (IP Header). Offset: 185 = 1480 / 8
- 0-2 第三个分包: 长度 1500 = 1480 (payload) + 20 (IP Header). Offset: 370 = 185 + 1480/8
- 0-3 第四个分包: 长度 700 = 680 (payload, = (5140 - 20) - 1480 * 3) + 20 (IP Header) . Offset: 555 = 370 + 1480/8
需要注意的是,只有第一个包带有原始包的完整 IPv4 + TCP/UDP 信息,后续的分包只有 IPv4 信息。
分包带来的问题:
- sender overhead:需要消耗 CPU 去分包,包括计算和数据拷贝。
- receiver overhead:重新组装多个分包。在路由器上组装非常低效率,因此组装往往在接收主机上进行。
- 重发 overhead:一个分包丢失,则整个包需要重传。
- 在多个分包出现顺序错开时,防火墙可能将分到当无效包处理而丢弃。
MTU
(编辑:PHP编程网 - 湛江站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|