V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mghio
V2EX  ›  程序员

TCP 中的 MSS 疑问

  •  
  •   mghio · 2023-04-08 08:51:35 +08:00 · 1787 次点击
    这是一个创建于 603 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    7 条回复    2023-04-08 18:58:00 +08:00
    yyzh
        1
    yyzh  
       2023-04-08 09:28:12 +08:00 via Android
    不一样的话包大了你收不到啊
    fortitudeZDY
        2
    fortitudeZDY  
       2023-04-08 09:31:45 +08:00 via Android
    首先应该就不是同一个值,mss 本质上是通告而非协商,另外,如果去返非对称,理论上应该可以看到不同的 mss
    boatrain1111
        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, 这样不> 是可以更高效吗?
    hatebugs
        4
    hatebugs  
       2023-04-08 15:24:12 +08:00 via iPhone
    如果 A 主机的 mtu 小,发包收包都要满足才行,肯定取得最小值呀,不同的值就不行
    hatebugs
        5
    hatebugs  
       2023-04-08 15:28:17 +08:00 via iPhone
    @boatrain1111 这楼主的疑问就是看的这篇文章的。这个问题就不对,如果 mtu 小的情况下,交互肯定有问题的。xintao 测试是直接改得 mss ,得改 mtu 来测试
    hatebugs
        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 ,就是这样的
    lysS
        7
    lysS  
       2023-04-08 18:58:00 +08:00
    mtu 上行下行可以是不同的,tcp 的 mss 可能是取的两者的最小值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2572 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:48 · PVG 11:48 · LAX 19:48 · JFK 22:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.