网络基础:TCP协议-如何保证传输的高性能

TCP高性能的保证

TCP传输相比于UDP传输,其更具有可靠性,安全性。但是传输效率与速度都比UDP要稍逊一筹。不过TCP协议自身是保证其效率及性能的。

TCP协议保证高性能的方式有:

  • 滑动窗口
  • 快速重传
  • 延迟应答
  • 捎带应答

滑动窗口

在保证TCP传输的可靠的性的时候,其中有一条就是确认应答。倘若是每发送一条数据,就等待一次ACK应答的话。大量的时间就会浪费在数据的往返上,这样性能会大大降低。如果能够一次发送多条数据,就可以大大的提高性能(实质是将多个数据等待的ACK响应时间重叠)。

窗口大小指的是无需等待ACK应答可发送的数据最大值。
网络基础:TCP协议-如何保证传输的高性能
网络基础:TCP协议-如何保证传输的高性能
如图,假设窗口大小为4000。那么就是是说图上1001~5001之间的数据是可以一次性全部发送,并且不需要等待ACK响应的。当发送完这4000的数据后,此时等待。等到ACK响应中确认收到1001~2000的数据时,滑动窗口右移。
网络基础:TCP协议-如何保证传输的高性能

以此类推。滑动窗口内部的数据都是已经发送但是没有收到ACK应答的数据。滑动窗口左侧的都是已经收到了ACK应答的数据。滑动窗口右侧是未发送的数据。

操作系统维护滑动窗口时,需要开辟一个发送缓冲区,缓冲区内的记录了没有被应答的数据。只有去确认过应答的数据才能够被缓冲区删除掉。

滑动窗口处理丢包问题

丢包问题主要有两种情况:

  1. 发送端发送的数据丢包
  2. 接收端的ACK响应丢包
发送端发送的数据丢包

网络基础:TCP协议-如何保证传输的高性能

这里1001~2000的数据报文丢失,此时发送端并不知道,继续发送滑动窗口内的报文。这时候接收到了三条重复的ACK响应(TCP协议规定,收到三条相同的ACK响应就出发重传)。此时重传1001~2000的数据报文。重传完毕后,等待接收端的响应。此时接收端响应为下一条是6001的数据报文,也就是说在2001~6000的报文都接收到了,这段报文被放到了接收端的接收缓冲区中。那么此时滑动窗口继续移动,发送端继续发送。

这个接收到三个重复的ACK响应,就开始重传响应所要求的报文的机制就是快重传速机制。

注:快重传机制与超时重传机制不同,超时重传机制应用于没有任何一条ACK响应收到,而超时时间已经到达,则出发超时重传;而快速重传机制是接收到了重复的三条ACK响应才触发。两者缺一不可!!
接收端ACK响应丢包

网络基础:TCP协议-如何保证传输的高性能

接连三条的ACK响应都丢包,但是第四条ACK响应到达。此时并不会影响发送端的发送。因为ACK响应的是下一条数据包是4001,这意味着接收端已接收到前面的所以报文数据。所以接收端ACK响应丢包其实对发送端发送的影响并不是那么大,后续的ACK响应能够处理好这个问题。

延迟应答

我们知道,TCP传输的效率是由接收端的窗口大小决定。窗口越大,网络的吞吐量就越大,传输效率就越高。在避免网络阻塞的前提下进程提高传输效率。 而窗口大小就是每次接收端接收到数据后,发送 ACK响应中保存的一个字段。

比如说接收端接收缓冲区起初大小为 1 M,发送端发送500K的数据供接收端处理,接收端收到后,立刻进行ACK应答,此时的窗口大小应该是500K。倘若接收端处理刚刚接收的500K数据速度很快,在ACK应答还没有到达的时候已经处理完了,这个时候实际上窗口大小是1M,但是由于响应的过快,发送端收到ACK响应时默认的窗口大小是500K,这就变相的浪费了500K的空间。如果能够在收到数据时,延迟一会再应答,那么可能就将一些简易处理的数据已经处理完毕了,这样的话,使得窗口大小变大,从而增加传输的效率。

延迟应答的规则:

  • 数量限制:每个N个包就应答一次
  • 时间限制:超过最大延迟时间就应答一次

具体的数量以及时间限制与操作系统有关。一般情况数量取 2,最大延迟时间取200ms。

捎带应答

在两主机之间通信时,常常采用捎带应答的方式来提高效率。而ACK响应常常伴随着数据报文共同传输。比如说TCP连接的三次握手时,在服务器收到SYN请求报文后,也会给客户端发送SYN请求,这时候服务器对于刚才客户端SYN请求的ACK应答就随着服务器发送的SYN请求一并过去,这个过程就是捎带应答。


欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!