? ? 我们在学习 TCP/IP 协议时都知道, TCP 报文段假设非常长的话. 会在发送时发生分段, 在接受时进行重组, 相同 IP 数据报在长度超过一定值时也会发生分片, 在接收端再将分片重组.
? ? 我们先来看两个与 TCP 报文段分段和 IP 数据报分片密切相关的概念.
? ? MYU(最大传输单元)
? ? MTU 前面已经说过了, 是链路层中的网络对数据帧的一个限制, 依旧以以太网为例. MTU 为 1500 个字节. 一个 IP 数据报在以太网中 传输. 假设它的长度大于该 MTU 值, 就要进行分片传输, 使得每片数据报的长度小于 MTU. 分片传输的 IP 数据报不一定按序到达, 但 IP 首部中的信息能让这些数据报片按序组装. IP 数据报的分片与重组是在网络层进完毕的.
? ??MSS(最大分段大小)
? ?MSS 是 TCP 里的一个概念(首部的选项字段中).
MSS 是 TCP 数据包每次可以传输的最大数据分段, TCP 报文段的长度大于 MSS 时. 要进行分段传输.
TCP 协议在建立连接的时候通常要协商两方的 MSS 值. 每一方都实用于通告它期望接收的 MSS 选项 (MSS 选项仅仅出如今 SYN 报文段中, 即 TCP 三次握手的前两次).MSS 的值一般为 MTU 值减去两个首部大小(须要减去 IP 数据包包头的大小 20Bytes 和 TCP 数据段的包头 20Bytes) 所以假设用链路层以太网. MSS 的值往往为 1460. 而 Internet 上标准的 MTU(最小的 MTU, 链路层网络为 x2.5 时)为 576, 那么假设不设置, 则 MSS 的默认值就为 536 个字节. 非常多时候, MSS 的值最好取 512 的倍数. TCP 报文段的分段与重组是在运输层完毕的.
? ? 到了这里有一个问题自然就明了了. TCP 分段的原因是 MSS,IP 分片的原因是 MTU, 因为一直有 MSS<=MTU, 非常明显, 分段后的每一段 TCP 报文段再加上 IP 首部后的长度不可能超过 MTU, 因此也就不须要在网络层进行 IP 分片了. 因此 TCP 报文段非常少会发生 IP 分片的情况.
? ? 再来看 UDP 数据报. 因为 UDP 数据报不会自己进行分段. 因此当长度超过了 MTU 时. 会在网络层进行 IP 分片.
相同, ICMP(在网络层中)相同会出现 IP 分片情况.
? ? 总结: UDP 不会分段, 就由 IP 来分. TCP 会分段, 当然就不用 IP 来分了!
? ? 另外. IP 数据报分片后. 仅仅有第一片带有 UDP 首部或 ICMP 首部, 其余的分片仅仅有 IP 头部, 到了端点后依据 IP 头部中的信息再网络层进行重组. 而 TCP 报文段的每一个分段中都有 TCP 首部, 到了端点后依据 TCP 首部的信息在传输层进行重组. IP 数据报分片后, 仅仅有到达目的地后才进行重组, 而不是向其它网络协议. 在下一站就要进行重组.
? ? 最后一点, 对 IP 分片的数据报来说, 即使仅仅丢失一片数据也要又一次传整个数据报(既然有重传, 说明运输层使用的是具有重传功能的协议, 如 TCP 协议).
这是因为 IP 层本身没有超时重传机制 ------ 由更高层 (比方 TCP) 来负责超时和重传.
当来自 TCP 报文段的某一段 (在 IP 数据报的某一片中) 丢失后. TCP 在超时后会重发整个 TCP 报文段, 该报文段相应于一份 IP 数据报(可能有多个 IP 分片). 没有办法仅仅重传数据报中的一个数据分片.
? ?? ?
来源: http://www.bubuko.com/infodetail-3012038.html