(一)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可以关闭套接字选项。或者是将两次写操作的数据复制到单个缓冲区,然后对缓冲区进行一次发送。

最新文章

  1. MySQL对时间戳的转换处理
  2. CentOs中mysql的安装与配置
  3. CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方
  4. Linux内核-模块编译和安装
  5. 注意map<> 的[]
  6. Android 6.0doze和standby 的一点理解
  7. boost::asio 连接管理11 如何关闭连接
  8. SQL Server中日志
  9. Did you forget about DBModel.InitializeModel the model [AAAdm] ?
  10. PHP系统左侧菜单栏的管理与实现
  11. 使用Angular CLI从蓝本生成代码
  12. 搭建一个交互式的前端构建环境.md
  13. Oracle数据库备份及还原
  14. ORACLE拼日期
  15. yum方面的知识
  16. CAS缺点
  17. Porsche Piwis II V14. three hundred and fifty computer software Tester II
  18. 用LSTM生成武侠人名
  19. 乱序字符串anagrams
  20. Enter键禁止表单提交

热门文章

  1. Spring Boot中使用@Transactional注解配置事务管理
  2. 【Python】python基础语法 编码
  3. matlab exist函数
  4. 【题解】洛谷9月月赛加时赛 —— Never·island
  5. python安装方法- 3.6.3版本
  6. React获取组件实例
  7. noip模拟赛 但有用
  8. ZOJ 2532 Internship 求隔边
  9. 由一篇博文做出的代码,不用Math.round()如何实现其功能
  10. 2015/9/17 Python基础(13):函数