TCP_NODELAY,Nagle算法

什么是Nagle算法???使用该算法能够获得那些数据通信特性???或者说,有什么优势呢???


Nagle算法:

为防止因数据包过多而发生网络过载,Nagle算法在1984年诞生了。应用于TCP层,非常简单。其使用

不使用导致如下的差异:


  如上图:展示了通过Nagle算法发送字符串“Nagle”和未使用Nagle算法的差别。

  可以得到如下结论:

  只有收到前一数据的ACK消息时,Nagle算法才发送下一数据。


TCP套接字默认使用Nagle算法交换数据,因此最大限度地进行缓冲,直到收到ACK。如上左图:

为了发送字符串“Nagle”,将其传递到输出缓冲。这时头字符“N”之前没有其它数据(没有需要接收的ACK),

因此立即传输。之后开始等待字符“N”的ACK消息,等待过程中,剩下的“agle”填入输出缓冲。接下来,收

到字符“N”的ACK消息后,将输出缓冲的“agle”装入一个数据包发送。也就是说:共需要传递4个数据包以

传输1个字符串(来回)

  接下来分析未使用Nagel算法时发送字符串“Nagle”的过程。假设字符“N”到“e”依序传到输出缓冲。此

时的发送过程与ACK接收来到无关。因此数据到达输出缓冲后将立即被发送出去。从右上图可以看到:发送字符串

“Nagle”时共需要10个数据包。由此可知,不使用Nagle算法将对网络流量(Traffic:指网络

负载或混杂程度)产生负面影响。即使只传输1个字节的数据,其头信息都有可能是几十个字节。因此:

  为了提高网络传输效率,必须使用Nagle算法。


  实际上:在程序中将字符串传输给输出缓冲时并不是逐字传递的,故发送字符串的情况并非如上图所示,上图

只是为了让大家便于理解而已!!!

  但如果隔一段时间再把构成字符串的字符传到输出缓冲(如果存在此类数据传递)的话,那么可能会产生如上

情况。



  但Nagle算法并不是什嘛时候都适用。根据传输数据的特性,网络流量未受太大影响时,不使用Nagel

算法要比使用它时传输速度快。最典型的是“传输大文件数据”。将文件数据传入输出缓冲不会花太多时间,因此,即

便不使用Nagle算法,也会在装满输出缓冲时传输数据包。这不仅不会增加数据包的数量,反而会在无需等待

ACK的前提下连续传输,因此可以大大提高传输速度。。。


  一般情况下,不适用Nagle算法可以提高传输速度。但如果无条件放弃使用Nagle算法,就会增加过多

的网络流量,反而会影响传输。因此,未准确判断数据特性时不应禁用Nagle算法。


禁用Nagle算法:

1,刚才说过的“大文件数据”应禁用Nagle算法。换言之,如果有必要,就应禁用Nagle算法

  Nagle算法使用:如果在网络流量上差别不大,使用Nagle算法的传输速度更慢

2,禁用的方法非常简单。从下列代码可以看出,只需将套接字可选项TCP_NODELAY该为1(真)即可。


  int opt_val = 1;
  setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&opt_val, sizeof(opt_val));
  可以通过TCP_NODELAY的值查看Nagle算法的设置状态

  int opt_val;
  socklen_t opt_len;
  opt_len = sizeof(opt_val);
  getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&opt_val, &opt_len);
  如果正常使用Nagle算法,opt_val变量中会保存0,如果已禁用Nagle算法,则保存1.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值