TCP之Nagle算法&&延迟ACK
来源:互联网 发布:容祖儿麻烦你知乎 编辑:程序博客网 时间:2024/05/25 20:00
转载:http://www.cnblogs.com/wanpengcoder/p/5366156.html
1. Nagle算法:
是为了减少广域网的小分组数目,从而减小网络拥塞的出现;
该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去;其中小分组的定义是小于MSS的任何分组;
该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快;而在希望减少微小分组数目的低速广域网上,则会发送更少的分组;
2. 延迟ACK:
如果tcp对每个数据包都发送一个ack确认,那么只是一个单独的数据包为了发送一个ack代价比较高,所以tcp会延迟一段时间,如果这段时间内有数据发送到对端,则捎带发送ack,如果在延迟ack定时器触发时候,发现ack尚未发送,则立即单独发送;
延迟ACK好处:
(1) 避免糊涂窗口综合症;
(2) 发送数据的时候将ack捎带发送,不必单独发送ack;
(3) 如果延迟时间内有多个数据段到达,那么允许协议栈发送一个ack确认多个报文段;
3. 当Nagle遇上延迟ACK:
试想如下典型操作,写-写-读,即通过多个写小片数据向对端发送单个逻辑的操作,两次写数据长度小于MSS,当第一次写数据到达对端后,对端延迟ack,不发送ack,而本端因为要发送的数据长度小于MSS,所以nagle算法起作用,数据并不会立即发送,而是等待对端发送的第一次数据确认ack;这样的情况下,需要等待对端超时发送ack,然后本段才能发送第二次写的数据,从而造成延迟;
4. 关闭Nagle算法:
使用TCP套接字选项TCP_NODELAY可以关闭套接字选项;
如下场景考虑关闭Nagle算法:
(1) 对端不向本端发送数据,并且对延时比较敏感的操作;这种操作没法捎带ack;
(2) 如上写-写-读操作;对于此种情况,优先使用其他方式,而不是关闭Nagle算法:
--使用writev,而不是两次调用write,单个writev调用会使tcp输出一次而不是两次,只产生一个tcp分节,这是首选方法;
--把两次写操作的数据复制到单个缓冲区,然后对缓冲区调用一次write;
--关闭Nagle算法,调用write两次;有损于网络,通常不考虑;
5. 禁止Nagle和开启Nagle算法发送数据与确认示意图:
- TCP之Nagle算法&&延迟ACK
- TCP之Nagle算法&&延迟ACK
- TCP之Delay Ack和Nagle算法
- Nagle算法遇上延迟ACK
- Nagle算法与ACK延迟算法
- TCP/IP延迟确认和Nagle算法
- TCP Nagle算法&&延迟确认机制
- TCP交互数据流之经受时延的ACK和Nagle算法
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- Delayed ACK 和 nagle算法
- TCP协议学习之 nagle算法
- TCP—Nagle算法
- TCP中的Nagle算法
- tcp的Nagle算法
- TCP—Nagle算法
- TCP Nagle算法详解
- Android如何获取手机各项信息
- jQuery选择器大全
- CANoe入门基础教程(一)
- TP5,验证码自动刷新
- Golang编译程序从后台运行,不出现dos窗口
- TCP之Nagle算法&&延迟ACK
- vue 调用高德地图
- 关于Javascript的Dojo包导入eclipse有错误Xpath is invalid in dojo library的处理方案
- sublime Text3 注册码
- 程序开发之——低耦合高内聚
- iOS之渲染到纹理
- 数据结构 第四章 串、数组和广义表
- docker应用输出中文日志乱码,解决过程
- 二叉树的非递归遍历