关于 tcp 的 nodelay - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sujin190
V2EX    问与答

关于 tcp 的 nodelay

  •  
  •   sujin190 2015 年 12 月 26 日 2662 次点击
    这是一个创建于 3685 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网上很多资料都说设置 tcp nodelay 会关闭 Nagle 算法,写入缓冲区的数据会立即发送,那么这个选项是完全关闭一定不再就行数据连接呢,还是在快速发送大量数据,缓冲去数据在无法立即发送时还是会进行数据连接呢?比如我们每次发送 10 字节,一定是每个 tcp 包都是 10 字节负载么?

    6 条回复    2015-12-28 02:05:07 +08:00
    ryd994
        1
    ryd994  
       2015 年 12 月 27 日 via Android
    在缓冲区一直有很多数据的情况下开关没有区别
    区别只在缓冲有一丁点数据,远小于 mtu 的时候
    sujin190
        2
    sujin190  
    OP
       2015 年 12 月 27 日
    @ryd994 我想也应该是这样,否则就不合理了,只是没有地方对这个有说明,想求证一下
    redsonic
        3
    redsonic  
       2015 年 12 月 27 日   1
    "关闭 Nagle 算法,写入缓冲区的数据会立即发送" 这句话是对的。接下来的一个问句看不太明白。
    最后一个问句”比如我们每次发送 10 字节,一定是每个 tcp 包都是 10 字节负载么?“ 这个不对:和开不开 TCP_NODELAY 没关系。 TCP 是面向流的,写入缓冲区相当于把包裹交给快递员,至于快递公司的飞机什么时候飞,飞机载荷多少你是不知道的。加了 TCP_NODELAY 相当于加急件,塞到即将起飞的飞机上,但这架飞机上肯定不止这一件货物。
    Nagle 算法除了和缓冲区有关(加急件),还隐藏着和对端的 ACK 交互:如果没有 TCP_NODELAY ,则没有收到对端 ACK 之前,不能发送缓冲区中剩余的数据,类似于 USB2.0 的传输方式。开了 TCP_NODELAY 则可以无视对方 ACK 应答是否已收到(实际上还有很多其他限制),尽可能早点发出缓冲区剩余的数据,类似于 USB3.0 的传输方式(可能是 3.1 ,记不清了)。
    想深入了解话可以看看老神书 TCP IP 详解卷 1 。 想了解真实的协议栈里面是怎么处理的可以看看内核代码,看了就有收获,很多细节,比如 TSO 对 nodelay 的影响,实际发包的时机。
    sujin190
        4
    sujin190  
    OP
       2015 年 12 月 27 日
    @redsonic 感谢解答,内核什么的估计还看不动,以前都没注意过,最近在观察 tcp 发包过程忽然想到这个问题
    ryd994
        5
    ryd994  
       2015 年 12 月 28 日
    @redsonic 你说的对端 ACK 和剩余数据,那个应该属于 window size 吧?和 nagle 有什么关系?
    redsonic
        6
    redsonic  
       2015 年 12 月 28 日   1
    @ryd994 ACK 和 window 有关系,属于 TCP 拥塞管理的部分,但也和 nagle 有关系,摘自 TCP/IP 详解卷 1 ”该算法要求一个 TCP 连接上最多只有一个未被确认的未完成小分组,在该分组的确认到达之前不能发送其他的小分组。相反, TCP 收集这些少量的分组,并在确认到来时以一个分组的方式发出去“。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5240 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 09:25 PVG 17:25 LAX 01:25 JFK 04:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86