天天看点

TCP/UDP报文的最大负载和报文的最小长度

以太网最大传输单元(MTU)

以太网的最大数据帧1518Bytes,以太网的帧头14Bytes,帧尾校验4Bytes

以太网最大传输单元(MTU):1518B - 14B - 4B = 1500Bytes

以太网最小MTU是576Bytes

Internet上的标准MTU值为576字节

TCP数据包每次能够传输的最大量(MSS)

MSS就是TCP数据包每次能够传输的最大量。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的,默认是536Bytes。发送大于MTU就会被分片。理论上,单个TCP包能打包的数据量远远多于1448字节,现在为了适应MTU,只要在以太网上跑TCP,系统就默认最大以1448字节打包TCP。最小的TCP的MTU是576字节。

MSS = MTU(1500B) - IP头(20B)- TCP头(20B)= 1460Bytes

实际场景下,TCP包头中会带有12字节的选项,时间戳。

所以单个TCP包实际传输的最大量就缩减为1448字节:

实际MSS = MTU(1500B) - IP头(20B) -TCP头(20B)- TCP选项时间戳(12B) = 1448Bytes

UDP数据包最大传输量

UDP的最大包长度是 2^16-1 = 65535Bytes

UDP数据包每次能够传输的最大理论长度 = UDP的最大包长度(65535B) - UDP头(8B) - IP头(20B) = 65507Bytes

然而这个只是UDP数据包的最大理论长度。

首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层、网络层、传输层、应用层。UDP属于传输层,在传输过程中,udp包的整体是作为下层协议的数据字段进行传输的,它的长度大小受到下层ip层和数据链路层协议的制约。

UDP数据包每次能够传输的最大长度 = MTU(1500B) - IP头(20B) -UDP头(8B)= 1472Bytes

当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于MTU。这个时候发送方IP层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于MTU。IP数据报分片后,只有第一片带有UDP首部,其余的分片只有IP头部,到了端点后根据IP头部中的信息在网络层进行重组。由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报,将导致丢弃整个UDP数据报。因此,在普通的局域网环境下,将UDP的数据控制在1472字节以下为好。

而TCP报文段的每个分段中都有TCP首部,到了端点后根据TCP首部的信息在传输层进行重组。IP数据报分片后,只有到达目的地后才进行重组,而不是像其他网络协议,在下一站就要进行重组。

进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值。如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地。鉴于Internet上的标准MTU值为576字节,所以在进行Internet的UDP编程时,最好将UDP的数据长度控件在548字节(576-8-20)以内。

继续阅读