有没有发现一个很奇怪的组合,即 Nagle 算法和延时 ACK 的组合。这个组合为什么奇怪呢?

我举一个例子你来体会一下。比如,客户端分两次将一个请求发送出去,由于请求的第一部分的报文未被确认,Nagle 算法开始起作用;

同时延时 ACK 在服务器端起作用,假设延时时间为 200ms,服务器等待 200ms 后,对请求的第一部分进行确认;

接下来客户端收到了确认后,Nagle 算法解除请求第二部分的阻止,让第二部分得以发送出去,服务器端在收到之后,进行处理应答,同时将第二部分的确认捎带发送出去。

你从这张图中可以看到,Nagle 算法和延时确认组合在一起,增大了处理时延,实际上,两个优化彼此在阻止对方。

从上面的例子可以看到,在有些情况下 Nagle 算法并不适用, 比如对时延敏感的应用。幸运的是,我们可以通过对套接字的修改来关闭 Nagle 算法。


int on = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on)); 

值得注意的是,除非我们对此有十足的把握,否则不要轻易改变默认的 TCP Nagle 算法。因为在现代操作系统中,针对 Nagle 算法和延时 ACK 的优化已经非常成熟了,有可能在禁用 Nagle 算法之后,性能问题反而更加严重。

禁用 Nagle 算法相关推荐

  1. 使用setsockopt TCP_NODELAY禁用 Nagle算法

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

  2. java settcpnodelay_Python Twisted TCP socket如何设置TCP的NODELAY(禁用Nagle算法)?

    我有一个正在继续开发的实时多人游戏(它目前在app store:https://itunes.apple.com/us/app/blewp!-eat-or-be-eaten-mmo/id9961226 ...

  3. TCP/IP学习笔记(六)Nagle算法

    在TCP传输数据流中,存在两种类型的TCP报文段,一种包含成块数据(通常是满长度的,携带一个报文段最多容纳的字节数),另一种则包含交互数据(通常只有携带几个字节数据). 对于成块数据的报文段,TCP采 ...

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

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

  5. 如何关闭和启用Nagle算法

    如果各位读者在搜索如何关闭的话,那么我有理由相信各位对想要解决的问题已经算是比较清楚了,废话不多数. 什么是nagle算法,它是干嘛用的,请自行google or 百度 Step1 Open regr ...

  6. TCP-IP详解:Nagle算法

    参考书籍:TCP/IP详解,卷1:协议 Small Packet Problem 在使用一些协议通讯的时候,比如Telnet,会有一个字节字节的发送的情景,每次发送一个字节的有用数据,就会产生41个字 ...

  7. socket属性心跳、Nagle 算法

    Nagle 算法 为防止因数据包过多而发生网络过载, Nagle算法在1984年诞生了.它应用于TCP层,非常简单.其使用与否会导致如图所示差异 Nagle算法:"只有收到前一数据的ACK消 ...

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

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

  9. TCP/IP卷一:80---TCP数据流与窗口管理之(延时确认(延迟ACK)、Nagle算法)

    一.延迟确认(延迟ACK) 在许多情况下,TCP并不对每个到来的数据包都返回ACK,利用TCP的累积ACK字段(参见TCP报文格式https://blog.csdn.net/qq_41453285/a ...

最新文章

  1. 解决360浏览器兼容模式的页面显示问题
  2. 图形界面不卡的linux,图形化界面linux(linaro)的安装小结
  3. webpack4.x Loaders
  4. Google服务你都用了哪些?
  5. JavaScript 循环
  6. mp4视频转gif图片
  7. java递归mysql生成树_java递归生成树结构的数据
  8. 微型计算机系统的几个指标课件,[计算机基础课件67.ppt
  9. assigning the result of this type assertion to a variable could eliminate the followin assertion解决
  10. GetDC()没有释放造成的后果
  11. 3dmark压力测试 linux,压榨你的电脑潜能:3DMark压力测试正式发布
  12. July大神交大读书会子atoi
  13. 自带流量的免费微信编辑器推荐
  14. Latex使用本地字体
  15. amd服务器主板文件,支持AMD Opteron的主板_服务器解决方案-中关村在线
  16. vue和socket.io开发简单web聊天室
  17. FS61C低电压检测IC芯片 series Low Power Voltage Detector
  18. js中的repeat()
  19. openid和unionid的区别
  20. 统一身份认证实现,推广的可能性及优缺点?

热门文章

  1. el-progress仪表盘进度条底色修改
  2. IDEA、MySQL提示Truncated incorrect DOUBLE value报错解决方法
  3. 什么是shell?shell的用途是啥?
  4. TI/德州仪器 TPS3808G30DBVT 微处理器
  5. mysql建表外键_mysql建表约束
  6. html 文档模板,html/template(模板)
  7. Day31_编程式路由导航
  8. 深度学习之模型finetuning
  9. 论文尾注改为参考文献格式方法
  10. CCPC网络赛重赛榜单(重赛)