您的位置:首页 > 理论基础 > 计算机网络

TCP_NODELAY

2017-10-25 15:48 197 查看

TCP_NODELAY和TCP_CORK

先上代码:

         int flag = 1;

         int result = setsockopt(sock,            /* socket affected */

                                 IPPROTO_TCP,     /* set option at TCP level */

                                 TCP_NODELAY,     /* name of option */

                                 (char *) &flag,  /* the cast is historical

                                                         cruft */

                                 sizeof(int));    /* length of option value */

         if (result 注意:TCP_NODELAY需要头文件 

TCP_NODELAY 不使用Nagle算法,不会将小包进行拼接成大包再进行发送,直接将小包发送出去,会使得小包时候用户体验非常好。

TCP_NODELAY 和 TCP_CORK,这两个选项都对网络连接的行为具有重要的作用。许多UNIX系统都实现了TCP_NODELAY选项,但是,

TCP_CORK则是Linux系统所独有的而且相对较新;它首先在内核版本2.4上得以实现。此外,其他UNIX系统版本也有功能类似的选项,

值得注意的是,在某种由BSD派生的系统上的TCP_NOPUSH选项其实就是TCP_CORK的一部分具体实现。

TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。

John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的,他在1984年首次用这种方法来尝试解决福特汽车公司的网络拥塞

问题(欲了解详情请参看IETF RFC 896)。他解决的问题就是所谓的silly window syndrome,中文称“愚蠢窗口症候群”,具体

含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及40个字节长的

包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞。

Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是

合乎需要的。现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然

后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个

较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以

上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle算法。

另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用

就是文件服务器。应用Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,

其方式正好同TCP_NODELAY相反。

注意:TCP_NODELAY和TCP_CORK都会禁止nagle算法,但是它们的行为不同。

TCP_CORK设置后将不发送部份帧。所有排队的部份帧只在此项清除后,才能发送。在调用sendfile(2)前准备数据报头或对网络吞吐量

进行优化有用处。在现在的实现中,当设置了TCP_CORK后,会有阻塞200ms,当阻塞时间过后,数据就会自动传送。这个选项在2.5.71后

可以跟TCP_NODELAY联合使用。

总结:

Set TCP_CORK before sending a series of data that should be considered as a single message and set TCP_NODELAY 

before sending short messages that should be sent immediately.

参考:
http://blog.csdn.net/hide1713/archive/2008/09/25/2978107.aspx http://bbs.chinaunix.net/viewthread.php?tid=64174&extra=&page=1 http://articles.techrepublic.com.com/5100-10878_11-1050878.html http://www.baus.net/on-tcp_cork http://blog.chinaunix.net/u2/72383/showart_1408991.html http://lists.xiph.org/pipermail/icecast/2005-December/010188.html http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Realtime_Tuning_Guide/sect-Realtime_Tuning_Guide-Application_Tuning_and_Deployment-TCP_NODELAY_and_Small_Buffer_Writes.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP_NODELAY socket