TCP和1448
2017-12-18
TCP和1448
1448字节是以太网中,单个TCP包的实际运载能力。例如,上层调用send(1000KB),下层会把这1000KB封装成多个TCP包进行发送,单个TCP包每次打包1448字节的数据进行发送。
MTU和1500
以太网Ethernet最大的数据帧是1518字节。以太网的帧头14字节和帧尾CRC校验4字节,剩下承载上层协议的长度只剩下1518 - 14 - 4 = 1500字节,这个值就是MUT。
MSS
MSS就是TCP数据包每次能够传输的最大量。为了达到最佳传输效能,TCP协议在建立连接时通常需要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU代替(需要减去IP数据包包头的大小20B和TCP数据段的包头20B),所以往往MSS为1460。通讯双方会根据双方提供的MSS值的最小值确定为这次连接的MSS值。
实际通信中,TCP包头中会带有12字节的选项——时间戳,因此单个TCP包实际传输的最大量就缩减为1488字节(1500 - 20 - 30 - 12 = 1448)。
为什么TCP会选择1448作为最大打包单位?
如果使用更大的数据量来打包,会降低传输效率。闯过MTU的大包反而降低效率的原因如下:IP层非常关系MTU,因为IP曾会根据MTU来决定是否把上层传送的数据进行分片。就像一条运输线路的承载能力是有限的,碰到大东西要运输,只能把大东西拆分成散件,分开运输,到达目的之后还必须再次组装起来。
因此,为了使每次传输的数据不被IP层分片,TCP层最大打包单位是1448B。
Linux上查看MTU
通常Linux下默认MTU是1500,这个值可以被修改,但是现在大部分计算机网络都被以太网承载,所以修改这个值意义不大。查看方法:
cat /sys/class/net/eth0/mtu