重庆网站建设培训机构,wordpress 标签云链接,大地资源中文在线观看,wordpress插件使用模板本文目录提高TCP的网络利用率的二个思考解决方案#xff1a;Nagle算法和delayed ack#xff08;延时发送和延时应答与稍带应答选项#xff09;Nagle算法和delayed ack算法同时启动可能会导致的问题提高TCP的网络利用率的二个思考
我们都知道#xff0c;TCP是一个基于字节流…
本文目录提高TCP的网络利用率的二个思考解决方案Nagle算法和delayed ack延时发送和延时应答与稍带应答选项Nagle算法和delayed ack算法同时启动可能会导致的问题提高TCP的网络利用率的二个思考
我们都知道TCP是一个基于字节流的可靠传输协议。意思着TCP本身把所有要发送的数据当做一个字节流来处理而上层应用发送的数据总是一段段有长有短有开始有结束的有意义的有限长度数据报。然后TCP只知道这是个字节流它并不知道哪些字节能组成一个完整的有意义的数据报。然而TCP底下的IP层又是一个基于数据报文的协议所以TCP根据自己的算法来截断和组合字节流形成一个个IP报文。
提高有效数据和TCPIP首部数据长度比 如果网络上大量的发送小包比如40个字节的IPTCP头部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的报文都已经被确认则允许发送 4如果发生了超时一般为200ms则允许发送。 Nagle算法的目标是发送端做控制以达到避免网络拥塞并提高网络有效利用率的目标。 delayed ack-延时应答与稍带应答 我们知道TCP是双向通信的。所以延时应答和稍带应答的逻辑很简单收到TCP报文后并不立刻发回应答而是等待一段时间等某些条件满足后再发回应答。 这样个延时提供了三个可能性 1多个数据一起收全后合并多个应答成一个应答从而减少了应答数量 2延时这段时间里应用层收走了更多的TCP报文可以给发送发通告一个更大的发送窗口从而提高了网络利用率 3应答和窗口更新通告以及接收发发送给发送方的反向应用层数据在一个报文里发送从而减少了报文数量
具体规则如下 1每到达200ms ---------发送应答 2每两个数据包----------发送应答 3接收方应用层有数据要求发送回发送方并且有接收方要发送的数据包达到发送条件–由数据发送带回应答。
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。