TCP的Nagle算法和delayed ack---延时发送和延时应答与稍带应答选项

提高TCP的网络利用率的二个思考

我们都知道,TCP是一个基于字节流的可靠传输协议。意思着TCP本身把所有要发送的数据当做一个字节流来处理,而上层应用发送的数据,总是一段段有长有短,有开始有结束的有意义的有限长度数据报。然后TCP只知道这是个字节流,它并不知道哪些字节能组成一个完整的有意义的数据报。然而TCP底下的IP层又是一个基于数据报文的协议,所以TCP根据自己的算法来截断和组合字节流形成一个个IP报文。

  • 提高有效数据和TCPIP首部数据长度比:
    如果网络上大量的发送小包(比如40个字节的IP+TCP头部+1个字节有有效数据)的情况下,大部分的网络资源都用来传输对应用层没有意义的TCPIP首部了,所以网络的利用率是很低的,要提高利用率,就可以减少小包的比率,尽量让每个TCP报文所携带的用户数据变长,比如,将多个用户数据报文组合成一个TCP报文后再发送。
  • 减少ACK的数量:
    如果给每一个TCP发送请求都回复一个ACK,而TCP的每个ACK通告发送的端的是在此序列之前的所有TCP数据都已经传送完成,那么如何减少ACK这种不传送有效用户 数据的报文的数量,就成为了提高网络利用率考虑的另外一个方面。

解决方案:Nagle算法和delayed ack(延时发送和延时应答与稍带应答选项)

  • Nagle算法-延时发送
    Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。Nagle算法的核心定义是: 任意时刻,最多只能有一个未收对确认报文(发送端没有收到接收端发回的确认本报文的ACK消息)的小于MSS尺寸的报文。
    具体如以下规则,以保证发送方不会过于频繁的发送小报文:
    (1)如果等待发送的数据的长度达到MSS,则允许发送;
    (2)设置了TCP_NODELAY选项(关闭Nagle算法),则允许发送;
    (3)如果所有的小于MSS的报文都已经被确认(并且TCP_CORK选项被关闭),则允许发送;
    (4)如果发生了超时(一般为200ms),则允许发送。
    Nagle算法的目标是发送端做控制,以达到避免网络拥塞并提高网络有效利用率的目标。

  • delayed ack-延时应答与稍带应答
    我们知道TCP是双向通信的。所以延时应答和稍带应答的逻辑很简单,收到TCP报文后,并不立刻发回应答,而是等待一段时间,等某些条件满足后再发回应答。
    这样个延时提供了三个可能性:
    (1)多个数据一起收全后合并多个应答成一个应答,从而减少了应答数量
    (2)延时这段时间里应用层收走了更多的TCP报文,可以给发送发通告一个更大的发送窗口,从而提高了网络利用率
    (3)应答和窗口更新通告以及接收发发送给发送方的反向应用层数据在一个报文里发送,从而减少了报文数量

具体规则如下:
(1)每到达200ms ---------发送应答
(2)每两个数据包----------发送应答
(3)接收方应用层有数据要求发送回发送方,并且有接收方要发送的数据包达到发送条件–由数据发送带回应答。

与Nagle算法,TCP_NODELAY非常相关的TCP_CORK

在关闭Nagle算法的场景下,一般也需要关闭TCP_CORK,二者的目标是一至的都是减少网络上的小分组报文来提搞网络利用率,但Nagle算法用的是拥塞控制,而TCP_CORK用的是小分组延时组合成大分组报文的方式,具体见TCP_CORK配置选项和TCP_NODELAY Nagle算法的异同
大家可以根据自己的测试场景或者应用场景的需求,决定如何设置这二个参数。

Nagle算法和delayed ack算法同时启动可能会导致的问题

这在某些应用场景下会导致一个典型的“发-发-收”的场景问题,即:接收方要在收到二个TCP小报文,并在应用层将二个报文合并后再完成应用层处理后,然后再把应用层响应结果发送回发送方的场景

如下图所示:
1)发送方发送第一个小报文给接收方
2)接收方应用层收到第一个报文,并等待第二个小报文的到来
3)接收方delayed ack,不发回TCP应答
4)发送放Nagle算法,没有等到第一个小报文的TCP应答,则不发送第二个小报文
5) 接收方和发送方相互等待死锁,直到接收方的delayer ack的200ms定时器超时,发送回TCP应答ACK
6)发送方发送第二个小报文给接收方
7)接收方应用层收到第一和第二两个小报文,处理后发回应用层响应(捎带回TCP应答ACK)
则相比于不开启nagle或者不开启delayed ack(二者只要有一个不开启,或者二个都不开启),则我们可以看到第5步这里,我们白白的多等待了200ms。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值