网络编程(27)—— 再谈Nagle算法

        这段时间一直在研究Nagle算法问题,其实自从了解到这个算法以后,心里有不少的疑问,本文主要是对我自己这些疑问的一个分析,属于个人的一个理解,如果有哪个大神一不小心路过这里,有错误的地方还望给予批评教育~~

 

问题一,Nagle算法是不是TCP可靠连接的基础,把Nagle算法禁用了是不是TCP就变成不可靠连接了?

       先说答案,答案是否定的。Nagle只是一个算法而已,TCP是可靠连接是TCP的一个传输特性,不会单纯依赖一个算法。

       我之所以有这个疑问,是因为一直以来我对TCP可靠性传输的理解是:发送端发送一个数据包之后,要等到接收到对端发回的ACK才会发送下一个包,这岂不是Nagle算法发送数据包的条件之一(注意这里说的是之一,其实Nagle算法开启后,发送端发送数据包的条件还有很多,后面会进行介绍)?

       其实,本质上是我对TCP可靠性传输理解错误的问题,它的可靠性传输是指发送端发送一个数据包后,如果没有收到对端的ACK,发送端还会重复发送这个数据包,直到收到对端针对这个包发送过来的ACK为止,TCP的包与包之间是独立的。

所以说TCP的可靠性传输和Nagle算法没有关系。

 

问题二,Nagle算法开启后,只有收到ACK后,才会发送下一个包?收到ACK是发送下一个包的唯一条件吗?

       下面就介绍下,Nagle算法中的发包条件。条件当然有很多种,收到上一包的ACK只是众多条件中的一种,下面是发送端的发包条件,我将逐一进行解释:

1、  收到对端发送的上一个包的ACK时,允许发送。

2、  包长度大于MSS时,允许发送。

3、  包中包含FIN时,允许发送。

4、  一旦发生了超时(一般200ms),允许发送。

        首先,第一条,这也是我一直在强调的,请看下面的图,这是我画的一副在Nagle算法开启前后发包方式的对比图,请注意改图只是模拟说明问题,没有体现开启ACK算法后其他因素也可促成发包,且实际情况中即使关闭Nagle算法也不会出现图右那种一个字节一个字节发送数据的情况。


        下面来解释下第二条,MSS(MaxitumSegment Size)最大分段大小,它其实是TCP中一个可设置的OPTION,表示TCP数据包每次能够传输的最大的数据分段。这也很容易理解,一旦数据包大于MSS还不进行发送的话,显然是在浪费时间。

         第三条,包含FIN时,说明发送端在请求断开连接,既然要断开连接了,肯定会立即发送,因为后面不会再有数据了。

          第四条,等待超时,这里的等待是包括等待以上三种情况出现的时间,这个时间肯定是有限制,不可能无限制等待。

          以上就是在开启Nagle算法后可以触发发送端发包的几个原因,当然若Nagle算法关闭,上述情况下也会发包,而且要特别增加一条就是:只要一有数据包就会发送,一般情况(只是一般情况,会有特殊情况的出现,比如发送大文件,稍后进行解释)下上述几种条件在达到之前,包已经被发送了。

问题三、Nagle算法开启有什么好处?

        答案是减少网络流量,防止通信阻塞。这点可以从上图中看出,同样发送一个“Hello”字符串,开启Nagle算法后使用了4个数据包,而关闭Nagle算法后却要使用10个数据包,可见Nagle算法的开启可以减少网络流量防止通信阻塞。

问题四、是不是所有的TCP传输中都需要开启Nagle算法?

         当然不是,Nagle算法并不是适合于所有的情况,传输大文件就是一种。在传输大文件时,发送端在等待上一包的ack到来之前,输出缓冲区就已经被填满,若此时开启了Nagle算法,程序就会在等待ack的过程中阻塞,就影响到了传输速度,因此要根据实际情况选择性的开启和关闭Nagle算法。

问题五、怎么样开启和关闭Nagle算法?

          通过setsockopt()函数,设置TCP_NODELAY选项,可以选择开启或者关闭Nagle算法。

Int option=0;
Setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(void*)&option,sizeof(option));

设置option=0,开启Nagle算法。

设置option=1,关闭Nagle算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值