TCP的Nagle算法和ACK延滞算法

Nagle算法

Nagle算法的本质其实就是限制大批量的小数据包同时发送。

该算法要求一个TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他小分组。这里的小分组是指,长度小于最大报文段长度MSS的TCP分组。这样发送端就可以将接下来连续的几个小分组存储起来,等待接收到前一个小分组的ACK分组之后,再将分组一次性发送出去。

对于延时敏感型,同时数据传输量比较小的应用,可以禁用Nagle算法。

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

对于SSH会话,数据传输非常少,但是要求用户的输入能够及时获得返回,有较低的时延。如果开启了Nagle算法,就很可能出现频繁的延时,导致用户体验极差。

ACK延滞算法

TCP协议规定接收方在接收对端的数据时,会像对方发送一个确认ACK,但如果只是单纯的发送一个确认ACK,代价会表较高(20字节的IP首部,20字节的TCP首部),最好能附带响应数据一起发送给对端。

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值