TCP数据流与窗口管理

版权声明:转载请注明出处 https://blog.csdn.net/ty13572053785/article/details/85340783

一、交互式通信

       “交互式”TCP连接是指,该连接需要咋客户端和服务端之间传输用户输入信息,如按键操作、短消息、鼠标等动作。如果采用较小的报文段来承载这些用户信息,那么传输协议需要付出很高的代价,因为每个交换分组中包含的有效负载字节较少。反之,报文段较大则会引入更大的延迟,对延迟敏感类应用(如在线游戏,协同工具)造成负面影响。我们需要权衡相关因素,找出折中方法。

二、延迟确认

       在很多情况下,TCP并不是对每个到来的数据包都返回ACK,利用TCP的累计ACK字段就能实现上述功能。累计确认可以允许TCP延迟一段时间发送ACK,以便将ACK和相同方向上需要传的数据结合发送。这种捎带传输的方法常用于与批量数据传输。采用延迟ACK的方法会减少ACK传输数目,可以一定程度的减轻网络负载。

三、Nagle算法

       微型报传输会造成很高的网络传输代价,为了解决此问题,提出了Nagle算法。
       Nagle算法要求,当一个TCP连接中有在传数据(即那些已发送但还未确认的数据),小的报文段(长度小于SMSS)就不能被发送,直到所有的在传数据都收到ACK。并且,在收到ACK后,TCP需要收集这些小数据,将其整合到一个报文段中发送。这种方法迫使TCP遵循停等规则------只有等接受到所有在传数据的ACK后才能继续发送。该算法的精妙在于它实现了自时钟控制:ACK返回越快,数据传输也越快。在相对高延迟的广域网中,更需要减少微型报的数目,该算法使得单位时间内发送的报文数目更少。RTT控制着发包速率。Nagle算法做出了一种折中:传输的包数目更少而长度更大,但同时传输时延也更长。

四、延迟ACK与Nagle算法结合

       延迟ACK与Nagle算法的结合会导致某种程度的死锁。延迟ACK采用捎带确认,客户端在接收到服务端的数据包后,客户端并不立即发送ACK,而是出于等待状态,希望有数据一同捎带发送。在服务端,由于使用了Nagle算法,直到收到ACK之前都不允许发送数据,因为任意时刻只允许至多一个包在传,所以延迟ACK与Nagle算法的结合导致了某种程度的死锁。
       在有些情况下版本适合Nagle算法,典型的包括哪些要求时延尽量小的应用(如多人网络游戏),在这种情况下,需要禁用Nagle算法。

五、流量控制与窗口管理

       每个TCP报文段(除了连接建立之初的包交换)都包含一个有效的序列号字段,一个ACK号和确认字段,以及一个窗口大小字段(包含窗口通告信息)。每个TCP头部的窗口大小字段表明接收端可用缓存空间的大小,以字节为单位。
1.发送窗口结构
在这里插入图片描述
       TCP发送窗口可分为两部分,已发送但未确认和即将发送(可用窗口)。左边界左边是已发送已经确认,右边界往右的部分直至窗口移动前都不能发送。随着时间的推移,当接收到返回的ACK,滑动窗口也随之右移。窗口两端的相对移动使得窗口增大或减小。
关闭: 即窗口左边界右移,当已发送数据得到ACK确认时,窗口会减小。
打开: 即窗口右边界右移,使得可发送数据量增大。当已确认数据得到处理,接收端可用缓存增大,窗口也随之增大。
2.接收窗口结构
在这里插入图片描述
       接收端窗口结构记录了已接收并确认的数据,以及他能够接收的最大序列号。该窗口可以保证其接收数据的正确性。
       与发送窗口一样,该窗口结构也包含一个左边界和右边界,但窗口内的字节并没有区分。对接收端来说,到达序列号小于窗口左边界,被认为是重复数据而丢弃;越过右边界的数据则超出处理范围,也被丢弃。注意到由于TCP的累计确认结构,只有当到达数据序列号等于左边界时,数据才不会被丢弃,窗口才能向前滑动。对选择确认TCP来说,使用SACK选项,窗口内的其他报文段也可以被接收确认,但只有在接收到等于左边界的序列号数据时,窗口才能前移。
3.零窗口与TCP持续计数器
       TCP通过接收端的通告窗口来实现流量控制,通告窗口指示了接收端可接受的数据量。当窗口值变为0时,可以有效阻止发送端进行发送,直到窗口大小恢复为非零值。如果包含一个窗口更新的ACK丢失,通信双方就会一直处于等待状态,造成死锁。为了防止这种死锁的发生,发送端会采用一个持续计数器间歇性地查询接收端,看其窗口是否已增长。
4.大容量缓存与自动调优
       接收端窗口大小受限于其缓存大小。一般来说,如果上层应用没有设置其接收缓存大小,就会为其分配一个相对较小的空间,因为有时候即使在高带宽的传输路径上(高带宽也有可能高延迟,带宽与延迟无关),传输延迟仍然很大,导致网络吞吐性能变差。在一些操作系统中采用自动调优的方式可以高效地自动分配缓存大小。

五、糊涂窗口综合征

       随着TCP的不断发展,出现了一种奇怪的问题。当通告窗口较小时,发送端会立即发送数据填满该窗口,这样在连接中就会出现大量高耗费的小数据包。这种现象被称为“糊涂窗口综合征”。针对这种问题,对发送端来说,若通告窗口较小则避免发送小数据包;接收端则尽量避免通告小窗口。

猜你喜欢

转载自blog.csdn.net/ty13572053785/article/details/85340783