关于MSS的一个小疑问的思考

本文阅读量 Posted by Kird on 2023-04-08

关于MSS的一个小疑问的思考

@laixintao大佬的一片文章有关 MTU 和 MSS 的一切 | 卡瓦邦噶!中的疑问,为什么当TCP两边的MTU一大一小时,两边都使用最小值来发数据,例如:

A mtu1500,B 800,实际双方都使用800,如果B使用1500来发不更高效吗?

分析

A -> B: 为了B能收到,只能使用800,这个方向没有什么疑问

B -> A: 一开始以为是B的网卡mtu是800,使用1500发不出去数据,后来想到网卡可以根据mtu来分片为1500,到达A后,自然A也可以收到包,为什么不可以呢?

我们只看B->A的方向,假设TCP计划要发送的数据包是这样的:

IP header + TCP header + payload 1 + payload2 + payload3

如果TCP层不分片的话,IP层进行分片(认为开启),

分片1: IP header +<u> TCP header</u> + payload 1

分片2: IP header + payload 2

分片3: IP header + payload 3

可以看到除了第一个分片,其他的都没有 TCP header了,ip层是不可靠的,当无序到达A后,如果丢了一个没法找B进行重传了。

结论

作为TCP发送方,使用网卡的mtu-40来设置mss,本质上是可靠性的一种实现,虽然在tcp层分片不高效会多带很多header,但是能保证每个分片都有tcp header。相当于用这种方式保证TCP层的可靠。

这也解释了上述例子里B使用800-40而不是用1500-40作为mss



支付宝打赏 微信打赏

赞赏支持一下