Nagle 算法

为防止因数据包过多而发生网络过载, Nagle算法在1984年诞生了。它应用于TCP层,非常简单。其使用与否会导致如图所示差异

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

优点

TCP套接字默认使用Nagle算法交换数据,因此最大限度地进行缓冲,直到收到ACK。图左侧正是这种情况。为了发送字符串"Nagle", 将其传递到输出缓冲。这时头字符"N" 之前没有其他数据(没有需接收的ACK ), 因此立即传输。之后开始等待字符"N" 的ACK消息,等待过程中,剩下的"agle" 填入输出缓冲。接下来,收到字符"N" 的ACK消息后,将输出缓冲的"agle" 装入一个数据包发送。也就是说,共需传递4个数据包以传输这个字符串。
      接下来分析未使用Nagle算法时发送字符串"Nagle" 的过程。假设字符"N" 到"e" 依序传到输出缓冲。此时的发送过程与ACK接收与否无关,因此数据到达输出缓冲后将立即被发送出去。从图右侧可以看到,发送字符串"Nagle" 时共需10个数据包。由此可知,不使用Nagle算法将对网络流量(Traffic: 指网络负载或混杂程度)产生负面影响。即使只传输1 个字节的数据,其头信息都有可能是几十个字节。因此,为了提高网络传输效率,必须使用Naglej算法

缺点
   但Nagle算法并不是什么时候都适用。根据传输数据的特性,网络流最未受太大影响时,不使用Nagle算法要比使用它时传输速度快。最典型的是传输大文件时,由于把数据输入到缓冲区的速度快,但是把缓冲区输出到网络上就慢,如果还要等待ACK的话,那就更慢,所以我们希望缓冲区的数据尽快发送出去,后面的数据才更好的输入到缓存区中。在这种情况下不使用Nagle算法不仅不会增加数据包的数撮, 反而会在无需等待ACK的前提下连续传输, 因此可以大大提高传输速度。

禁用Nagle 算法
    刚才说过的“大文件数据“应禁用Nagle算法换言之,如果有必要,就应禁用Nagle算法; 。"Nagle算法使用与否在网络流量上差别不大,使用Nagle算法的传输速度更慢"
禁用方法非常简单。从下列代码也可看出,只需将套接字可选项TCP_NODELAY: 改为1 (真)即可。

int on=l;

setsockopt(sockfd, SOL_SOCKET, TCP_NODELAY, (void *)&on, sizeof(on));
 setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on));
可以通过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);

如果正在使用Nagel算法, opt_ val变量中会保存0; 如果已禁用Nagle算法,则保存1 。

心跳

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <linux/tcp.h>

  int keepAlive = 1; 
    int keepIdle = 3;  
    int keepInterval = 1; 
    int keepCount = 3;

setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
    setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
    setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
    setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

socket属性心跳、Nagle 算法相关推荐

  1. socket中的nagle算法

    TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认.为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据.(一个连接会设置MS ...

  2. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

  3. 【计算机网络】2、TCP:四次挥手与TIME_WAIT、shutdown() 优雅关闭 server、探活、拥塞窗口与 Nagle 算法、端口占用、tcp 的流式协议、可靠性

    文章目录 六.四次挥手 与 TIME_WAIT 6.1 TIME_WAIT 的作用 6.2 TIME_WAIT 的危害和方案 七.server 用 shutdown() 优雅关闭 7.1 close( ...

  4. 网络协议:TCP保活机制和Nagle算法

    一 Nagle算法背景 有时候,我们可能会遇到一些很小的分组,比如,20字节的IP首部,20字节的TCP首部和1字节的数据,如果很多这样的小分组数据,在局域网一般不会出现拥塞,但是在广域网就可有可能. ...

  5. 在c语言中如何屏蔽一段程序,如何在用C语言关闭TCP程序中的Nagle算法

    TCP为了防止在网络中过多的小分组会导致阻塞,因此提供了Nagle算法:要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组.相反,TCP收集这些少量 ...

  6. 使用setsockopt TCP_NODELAY禁用 Nagle算法

    Nagle算法用于对缓冲区内的一定数量的消息进行自动连接.该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率.(Nagle虽然解决了小封包问题,但也导致了较 ...

  7. 再次谈谈TCP的Nagle算法与TCP_CORK选项

    事件回放 使用OpenVPN传输虚拟桌面流量,终端上有明显逐帧刷屏现象,网络环境为百兆局域网. 分析 1.首先将OpenVPN改为TCP模式,因为局域网环境下TCP和UDP差别不大,不会引起重传叠加问 ...

  8. Nagle算法和延迟确认

    TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认.为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据.(一个连接会设置MS ...

  9. TCP-Nagle:代码版本重新解释Nagle算法

    开年来的第一份工作,就是在最新的内核上打补丁. 可没想到Nagle算法也被我冲进了去年的垃圾桶里. 在网上找了一些资料,理论很快被消化,但看了看内核的实现,久久没能动弹.坐了一天,才摸索出来点什么,觉 ...

最新文章

  1. android sqlite 中 创建表 不要使用 IF NOT EXISTS + TA...
  2. Map获取键值,Map的几种遍历方法
  3. python考证书-计算机二级 Python 怎么考?考什么?
  4. Vr-Vantage之场景与环境
  5. ios基础篇(二十六)—— UITableViewCell的分组索引与标记
  6. JS的typeof力所能及已经力所不及
  7. android横向滑动缩放,移动端实现内容左右滑动,并点击放大效果的问题
  8. 4 大妙招,教你快速搞定复杂的系统编程!
  9. 难道千元机的品质真的不如旗舰机吗?
  10. java mldn_MLDN java面试题
  11. 递归算法教学设计java,递归算法数字游戏教学软件的设计|java递归算法经典实例...
  12. 计算机网络发展史及分类,计算机网络发展史简介
  13. 51实验10: 独立按键控制一个数码管显示0-9,按一次只加1.
  14. Codevs3332 数列
  15. 【原创项目】GC Server 更新
  16. pip 和 conda 什么区别?
  17. 趣头条:资讯界的拼多多?
  18. 如何实现上拉刷新下拉加载
  19. 佩戴安全帽数据集使用说明和下载
  20. jupyter学习记录(一)——安装模块与导入图片

热门文章

  1. 算法题十一 之 两数相乘
  2. “热干面”商用版本配方,6个核心配方,实实在在的配方分享
  3. 一粒云磁盘扩容和组建raid
  4. 使用xlsx.full.min.js读取excel表格数据
  5. 计算机网络中局域网特点,计算机网络中,局域网的特点是什么?
  6. 每日简报 3月27日简报新鲜事 在这里,60秒读懂世界
  7. 极米H6投影仪和H3S区别 极米H6和极米H3S哪款好
  8. 棋盘格类的路径(范围)
  9. 杂谈:我对苹果哲学的理解──苹果的骗局zz (3086字)
  10. 乙肝两对半的五项指标