传输层--TCP协议提高效率机制

TCP提高效率机制

TCP可靠传输的基础上要提高效率,那么又是怎么实现的呢?

滑动窗口

TCP可靠传输中,我们总结了TCP的头部字段的作用和如何实现可靠传输的,现在就是提高效率。第一就是滑动窗口。

  • 滑动窗口是什么?

可靠传输是每次发送一条信息后,都要等到对方的应答才能继续发送,所以一半的时间用来接收ACK的应答,这样传输效率明显就很低,所以为了解决这个问题,就有了滑动窗口,滑动窗口是一次发送窗口大小的数据,然后再进行一次等待,这样就很大程度上把等待对方ACK的时间叠加在一起。就提高了传输的效率。
传输层--TCP协议提高效率机制

但是提高传输效率,也需要操作系统内核去开辟缓存,进行记录发送缓冲区,用来记录哪些数据没有收到ACK,就需要重新发送。确认应答的就可以删掉。

那么这里就要注意了,如果当在传输过程中发生了数据丢失,也就是说,当在批量的传输数据的时候,中间的某一个数据丢失,是要怎么处理?
我们来画图演示:
传输层--TCP协议提高效率机制
当上面画的数据中其中有一个丢失了后,回复的ACK中就会不断给回复下一个该发的是丢失的那个,这时候,系统就会重新发送丢失的那个数据报。

还有一种情况,就是当回复的ACK丢失了,其实没有什么影响,因为TCP协议规定的是,每次回复的ACK都表示的是下一次该发送哪个数据报,这样表示的是当前序号以前的我全部收到了。

流量控制

上面说了有滑动窗口,那么是不是滑动窗口越大越好呢?当然不是!虽然为了提高效率,滑动窗口大的话,每次的吞吐量也就变大了,但是TCP是数据的传输,所以在两台电脑上的情况是不一样的,当发送数据数据的滑动窗口过大的时候,结果对端的机器缓冲区中数据处理的特别慢,当对端接收缓冲区中数据满了的时候,再发送数据就会丢失,那么发送方发现没有ACK超时后,就会不停的发送数据,从而导致网络的拥塞程度加大,而传输效率也没有上去。所以采用了流量控制

流量控制是,在发送方发送数据的时候,会发送一个自己的滑动窗口的大小,然后对端接收后,看自己缓冲区的大小在响应的TCP头部写上自己的滑动窗口的大小,发送方拿到后,会比较,两次TCP中滑动窗口的大小,选取小的,当作发送消息的滑动窗口。

流量控制的过程
每次在接收方收到数据后就会在响应的ACK中加上自己目前的剩余接收缓存的大小,在发送方就会与自己的比较,取小的,当发送方发现确认应答的报文中,滑动窗口为0是后,就不会发送数据,但是会在一定时间内,发送一个探测性的报文来询问对端的接收缓冲区。

拥塞控制

TCP应用了滑动窗口来进行提高数据的传输效率,但是如果在TCP连接后一开始就发送大量的数据,这样从整个网络而言,是会引发问题的。

当网络当前状况很差的时候,如果突然就向网络中发送大量的数据,这样不仅会让网络更为阻塞,还会影响TCP的传输速率。

所以TCP就有了一个慢启动的拥塞控制,每次开始发送小的数据发现发送成功,然后以指数的形式开始增长,当达到阈值,开始线性增长,如果发现丢包率达到一定值的时候,就把发送的阈值减为最大发送的一半,然后发送数据的也降低为新的阈值,开始以线性增长。
图:

延迟应答

前面提到滑动窗口越大,传输的效率相对来说较高,但是为了提高传输效率,每次应答是就会带这接收方的缓冲区的大小,让发送方有选择的进行滑动窗口大小的调整。那么为什么要延迟应答呢?

这一种情况下,在接收方处理数据的时间非常短,那么如果发送方发送的数据后,接收方收到数据在没处理数据时候,计算出剩余缓冲区,发送给发送方,这样的话,滑动窗口就没有达到最大,如果我们延迟应答,就可以有时间给接收方处理数据,这样给发送方的滑动窗口就能更大一点。

当然延迟应答的时间不能超过,对端的超时重传的时间。在一定时间内可以延迟应答。也就是说不是每个包都应答,可以隔几个包来进行应答一次。

捎带应答

捎带应答是在延迟应答的基础上,所以当有些场景下,就会把应答的ACK和要发送的数据合在一块,比如:客户端和服务器在通信的时候,发送一个信息,服务器在回复的时候,就可以延迟应答,干脆就在回复的时候就加上ACK来应答