TCP的Nagle算法与ACK延滞算法

Nagle算法

Nagle算法的目的在于减少广域网上小分组的数。

该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他小分组。相反TCP收集这些少量的分组,并在确认到来时以一个分组的方式发送出去。

image.png

在套接字选项设置中,可以开启TCP_NODELAY禁用 Nagle 算法,允许小包发送。

对于延时敏感型,同时数据传输量比较小的应用,开启TCP_NODELAY选项是一个正确的选择。比如,对于SSH会话,数据传输非常少,但是要求用户的输入能够及时获得返回,有较低的延时。如果开启了Nagle算法,就很可能出现频繁的延时,导致用户体验极差。

ACK延滞算法

TCP协议规定在接受到数据段时需要向对方发送一个确认ACK,但如果只是单纯的发送一个确认ACK,代价会比较高(20字节的IP首部,20字节的TCP首部),最好能附带响应数据一起发送给对方。于是就有了ACK延滞算法。

该算法使得TCP在接收到数据后不能立即发送ACK,而是等待一段时间,然后才发送ACK。TCP期待在这等待的一小段时间内自身有数据发送回对端,被延滞的ACK就可以由这些数据捎带,从而省掉一个TCP分节。这个时延一般为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。

这里的延迟200ms,不是指的从接受到对方数据到发送ack的最长等待时间差。而是指的内核启动的一个定时器,它每隔200ms就查看下是否有ack要发送。例如:假设定时器在0ms时启动,对方的数据段在185ms时到达,那么ack最迟会在200ms时发送,而不是385ms时发送。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 19.1 引言 前一章我们介绍了TCP连接的建立与释放,现在来介绍使用TCP进行数据传输的有关问题。 一些有关TC...
    张芳涛阅读 882评论 0 3
  • 21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。T...
    张芳涛阅读 3,053评论 0 8
  • TCP/IP协议 作者:xinyuans 本文为参考TCP/IP详解卷一,某些知识点加上了作者自己的理解,如有错误...
    xinyuans阅读 834评论 0 1
  • 20.1 引言 在第15章我们看到TFTP使用了停止等待协议。数据发送方在发送下一个数据块之前需要等待接收对已发送...
    张芳涛阅读 886评论 0 2
  • 数据链路层 任务有3:发送和接收IP数据包,ARP请求和应答,RARP请求和应答以太网数据链路帧的封装格式是6字节...
    纵横而乐阅读 1,804评论 0 1