对TCP协议通信过程中的TCP_NODELAY选项的通俗解释


30年前,阳澄湖的蟹农老王,每抓一只大闸蟹,就派一辆三轮车送到上海,1小时后再带着卖蟹的钱回来,老王想,这样好处是回款快(延迟小)。

老张、老李、老赵等等蟹农也发现了这个好处,于是大家都开始这种办法。

但是,30年前的乡间小路,很快被一辆辆的三轮车所堵塞,结果三天三夜也没有到达上海,老王的如意算盘泡汤了。

痛定思痛,老王觉得,没有必要一个螃蟹一辆三轮车,可以将上午的所有螃蟹装在一辆大卡车上,上午发车;下午抓的螃蟹装在另一辆大卡车里,下午发车。这样即使一天抓1000个螃蟹,也只需要两卡车,而不需要1000辆三轮车

这样,乡间的小路也不会造成拥堵,早上发货,中午时卖蟹的钱会被大卡车运回来。虽然回款时间变长了(延迟大了),但是半天时间回一次款,老王觉得也还行,能接受。

以上就是Nagle算法的通俗解释。

70-80年代,一些远程交互式软件,如Rlogin,客户端将用户输入的每一个字符独立传输到服务器端,服务器端再将这一个字符发回来,rlogin再显示到用户屏幕上。这样一个字节的字符却需要20字节的IP+ 20字节的TCP头,这样的传输效率非常低下,只有 1/41 =2.43%

更要命的是,那时网络带宽特别窄,这样的传输模式很容易将窄窄的带宽挤满而丢包,再重传、再丢包的恶性循环。

于是Nagle发明了一个算法,针对交互式应用,将用户敲入的字符缓存一下,聚集了几个字符放在一起发送,这样传输效率则高得多,唯一的不足是,可能会有一些延迟。

为了避免延迟过大,等待用户时间由定时器控制,比如100-200毫秒,定时器到了,立马将缓冲区的数据发送出去。

但记住一点,Nagle算法是时代的产物,因为当时网络带宽有限。而现在的局域网、广域网的带宽则宽裕得多,所以目前的TCP/IP协议栈默认将Nagle算法关闭,即通过SO_NODELAY = 1

这就好比,现在老王用一辆大卡车运一只螃蟹,走沿海高速也不会堵,尽管这听起来很荒诞…


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值