之前在看网络基础知识时,心中一直有个疑问:为什么 MSS 两端都使用一个想同的值,为什么不使用不同的值(比如:A -> B 1410 bytes; B -> A 1460 bytes ), 感觉这样不是可以更高效吗?
1
yyzh 2023-04-08 09:28:12 +08:00 via Android
不一样的话包大了你收不到啊
|
2
fortitudeZDY 2023-04-08 09:31:45 +08:00 via Android
首先应该就不是同一个值,mss 本质上是通告而非协商,另外,如果去返非对称,理论上应该可以看到不同的 mss
|
3
boatrain1111 2023-04-08 11:05:00 +08:00
最近看的一篇文章正好可以解答你的疑惑: https://www.kawabangga.com/posts/4983 ,文章的评论区里也说了
> 这里就有一个疑问:为什么 MSS 两端都使用一个共同的值,而不是 A -> B 1410 bytes; B -> A 1460 bytes, 这样不> 是可以更高效吗? |
4
hatebugs 2023-04-08 15:24:12 +08:00 via iPhone
如果 A 主机的 mtu 小,发包收包都要满足才行,肯定取得最小值呀,不同的值就不行
|
5
hatebugs 2023-04-08 15:28:17 +08:00 via iPhone
@boatrain1111 这楼主的疑问就是看的这篇文章的。这个问题就不对,如果 mtu 小的情况下,交互肯定有问题的。xintao 测试是直接改得 mss ,得改 mtu 来测试
|
6
hatebugs 2023-04-08 16:18:34 +08:00 via iPhone
假设: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 ,就是这样的 |
7
lysS 2023-04-08 18:58:00 +08:00
mtu 上行下行可以是不同的,tcp 的 mss 可能是取的两者的最小值
|