码迷,mamicode.com
首页 > 编程语言 > 详细

如何在用C语言关闭TCP程序中的Nagle算法

时间:2018-04-08 15:58:48      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:关闭   image   cli   接收   技术   clu   sizeof   cpp   info   

TCP为了防止在网络中过多的小分组会导致阻塞,因此提供了Nagle算法:要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。Nagle算法会导致自己写的TCP程序中,小分组不能及时的发送出去。
现在我写了个基于TCP的socket程序,希望AP往client端发送1000个16字节的报文。结果发现client端接收到的报文并不是每次大小都是82字节(82字节是因为有66字节的TCP和IP头等,外加16字节我自己的数据),会出现大小为98字节的数据(98字节是因为有66字节的TCP和IP头等,外加两个16字节的自己的数据)。如下图所示:

技术分享图片

这时就想起了关闭TCP中的Nagle算法。于是在我的TCP发送的Socket程序中加入如下代码(记得还要导入头文件: #include <netinet/tcp.h>):

    /* Disable the Nagle (TCP No Delay) algorithm */
    //sock_cli是自己定义的socket套接字
    int flag = 1;
    int ret = setsockopt( sock_cli, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );
    if (ret == -1) {
      printf("Couldn‘t setsockopt(TCP_NODELAY)\n");
      exit(-1);
    }

重新编译并且运行,抓包后如下图所示:

 技术分享图片

可以发现不会在出现小分组等待的现象,说明关闭了Nagle算法。

 

如何在用C语言关闭TCP程序中的Nagle算法

标签:关闭   image   cli   接收   技术   clu   sizeof   cpp   info   

原文地址:https://www.cnblogs.com/qwblog/p/8744859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!