TCP 中的 MSS 疑问

2023-04-08 08:51:35 +08:00
 mghio

之前在看网络基础知识时,心中一直有个疑问:为什么 MSS 两端都使用一个想同的值,为什么不使用不同的值(比如:A -> B 1410 bytes; B -> A 1460 bytes ), 感觉这样不是可以更高效吗?

1598 次点击
所在节点    程序员
7 条回复
yyzh
2023-04-08 09:28:12 +08:00
不一样的话包大了你收不到啊
fortitudeZDY
2023-04-08 09:31:45 +08:00
首先应该就不是同一个值,mss 本质上是通告而非协商,另外,如果去返非对称,理论上应该可以看到不同的 mss
boatrain1111
2023-04-08 11:05:00 +08:00
最近看的一篇文章正好可以解答你的疑惑: https://www.kawabangga.com/posts/4983 ,文章的评论区里也说了

> 这里就有一个疑问:为什么 MSS 两端都使用一个共同的值,而不是 A -> B 1410 bytes; B -> A 1460 bytes, 这样不> 是可以更高效吗?
hatebugs
2023-04-08 15:24:12 +08:00
如果 A 主机的 mtu 小,发包收包都要满足才行,肯定取得最小值呀,不同的值就不行
hatebugs
2023-04-08 15:28:17 +08:00
@boatrain1111 这楼主的疑问就是看的这篇文章的。这个问题就不对,如果 mtu 小的情况下,交互肯定有问题的。xintao 测试是直接改得 mss ,得改 mtu 来测试
hatebugs
2023-04-08 16:18:34 +08:00
假设:A 1500 <-> B 800
A -> B: 为了 B 能收到,只能使用 800
A <- B:B 自己 mtu 是 800 ,tcp 设计的时候为了避免分片会用的网卡 mtu 来设置 mss ,也是 800 。这块是为了在 TCP 层来分片,每个分片都会带上 TCP 的 header ,如果使用大包来发,会在 IP 层分片,如果丢了一个分片就需要重传全部的分片了

假设发送的预期数据包:IPh TCPh payload1 payload2 payload3

分片 1: IPh TCPh payload1
分片 2: IPh payload2
分片 3: IPh payload3

接收方收到丢失一个分片就没办法重组了,不是每个接受的分片里都有 tcp seq

tcp 发送方,使用网卡的 mtu-40 来设置 mss,本质上是可靠性的一种实现,虽然在 tcp 层分片不高效,但是能保证每个分片都有 tcp header 。 例子里 B 使用 800 而不是用 1500 ,就是这样的
lysS
2023-04-08 18:58:00 +08:00
mtu 上行下行可以是不同的,tcp 的 mss 可能是取的两者的最小值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/930735

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX