TCP之Nagle算法与延迟ACK
(一)Nagle算法
为了减少网络中小分组的数目,减少网络拥塞的情况。Nagle算法要求在一条TCP连接上最多只能有一个未被确认的未完成小分组,在该分组ACK到达之前不能够发送其他的小分组,发送端需要收集需要发送的小分组,在接收端的ACK响应到来的时候将所有收集的小分组以一个大分组的形式发送出去。其中小分组被定义为小于MSS的任何分组。
该算法的优点是自适应的,确认到达的越快,则数据发送的也将会越快。
(二)延迟ACK
如果TCP连接上,接收端对每一个数据包都响应一个ACK确认并发送,而了一个ACK响应则发送一个单独的数据包造成的代价比较高,所以TCP会延迟一段时间(一般为40
ms),如果在延迟的这段时间之内有数据发送给对端(接收端发送给发送端),则会连带着这次的ACK响应将数据包发送。而如果在延迟时间到达的时候,仍然没有数据包要发送,则将ACK单独发送。
延迟ACK的好处:
(1)避免了糊涂窗口综合征;
(2)发送数据的时候将ACK捎带发送,而不用单独发送ACK
(3)如果在延迟时间内有多个数据包到达,那么接收端可以发送最后一个数据包的ACK以确认多个报文段。
(三)发送端采用Nagle算法,接收端采用延迟ACK
一种典型场景:客户端写-写-读。客户端先发送一个数据包(小包),当第一次数据包发送后,对端延迟ACK,不发送ACK应答,而本端由于第一次发送的数据包没有确认,第二次将要发送的数据包(也是小包)会由于Nagle算法,等待第一次的ACK后才能发送。而服务端由于没有数据包发送,只能在延迟ACK的触发器时间到达时(40ms),才会发送第一次数据包的响应,从而造成网络延迟。
(四)关闭Nagle算法
对于上述(三)讨论的情况,使用套接字选项TCP_NODELAY可以关闭套接字选项。或者是将两次写操作的数据复制到单个缓冲区,然后对缓冲区进行一次发送。
最新文章
- MySQL对时间戳的转换处理
- CentOs中mysql的安装与配置
- CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方
- Linux内核-模块编译和安装
- 注意map<;>; 的[]
- Android 6.0doze和standby 的一点理解
- boost::asio 连接管理11 如何关闭连接
- SQL Server中日志
- Did you forget about DBModel.InitializeModel the model [AAAdm] ?
- PHP系统左侧菜单栏的管理与实现
- 使用Angular CLI从蓝本生成代码
- 搭建一个交互式的前端构建环境.md
- Oracle数据库备份及还原
- ORACLE拼日期
- yum方面的知识
- CAS缺点
- Porsche Piwis II V14. three hundred and fifty computer software Tester II
- 用LSTM生成武侠人名
- 乱序字符串anagrams
- Enter键禁止表单提交
热门文章
- Spring Boot中使用@Transactional注解配置事务管理
- 【Python】python基础语法 编码
- matlab exist函数
- 【题解】洛谷9月月赛加时赛 —— Never&#183;island
- python安装方法- 3.6.3版本
- React获取组件实例
- noip模拟赛 但有用
- ZOJ 2532 Internship 求隔边
- 由一篇博文做出的代码,不用Math.round()如何实现其功能
- 2015/9/17 Python基础(13):函数