【自问自答】TCP一次数据包最大负载是多少?真的是65495byte吗?

最近在玩wireshark抓包,抓了一下文件上传,发现有的数据包达到了16312byte,于是产生了一个疑问一个数据包最大负载能达到多少?
《【自问自答】TCP一次数据包最大负载是多少?真的是65495byte吗?》

查了一通资料,找到了65495byte这个数字,这个数字有什么依据呢?

是这样算出来的:
因为ip协议头中段总长度(length)最多为16bit
ip首部最少20,tcp首部最少也为20
所以留给数据的最大长度为2^16-1-20-20=65495
(突然也明白了端口范围为什么也是这个了^_^)

这个数据太理论化了,实际上呢?

先看个表,来自wiki:
《【自问自答】TCP一次数据包最大负载是多少?真的是65495byte吗?》

再补补概念:
MTU: Maximum Transmission Unit,是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

MSS: Maximum Segment Size,是传输控制协议(TCP)的一个参数,以字节数定义一个计算机或通信设备所能接受的分段的最大数据量。 它并不会计算 TCP 或 IP 协议头的大小。

一个TCP包(数据段)的荷载 <= MSS < MTU

前面的那次上传总文件大小是30000+,数据包达到了16312,是因为lookback网卡的MTU为16384,去掉头部占用76,最大负载也就是16312
《【自问自答】TCP一次数据包最大负载是多少?真的是65495byte吗?》

如果MTU=1500,单位为byte,PPPoE首部6,PPP协议2
数据链路层最大data为1500-8=1492
IPv4首部最少20,IPv6首部40,TCP首部最少20
MSS最大为1492-20-20=1452

结论:数据包最大荷载是由网络设备的MTU决定的

Reference:

    原文作者:TCP
    原文地址: https://segmentfault.com/a/1190000012962389
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞