一、基础知识
TCP(Transmission Control Protocol)是一种基于连接的、可靠的、面向字节流的传输层协议。其在传输数据时,会将数据分割成若干个段进行传输,每个段都会被编号。而当接收端收到这些分段数据时,会将它们按照编号重新组合成原始数据。所以TCP是可靠的协议。
然而,当网络中存在多条路径时,TCP数据分别通过不同的路径进行传输并重新组合,这就可能导致数据的乱序。当其中一些数据包到达接收端时,却处于乱序状态,就成了TCP Out-of-Order。
二、TCP重传机制
TCP通过巧妙的重传机制来保证数据可靠性。当发送端发送数据时,会等待接收端发送确认消息;如果发送端没有接收到确认消息,则会重传消息。这个等待确认消息的时间就叫做重传超时时间,也称RTO(Retransmission Timeout)。如果重传次数超过一定数量,就会放弃发送数据。
然而当数据出现乱序时,TCP会等待将数据全部接收完毕之后再进行确认,这样会导致超时时间的减少,从而增加了重传的概率。
三、TCP快速重传
TCP快速重传是指当TCP检测到数据包丢失时快速发送重传请求,从而缩短超时时间。 至于何时判断数据包丢失,一般情况下是根据数据包的到达顺序判断的。但是,TCP仅仅是通过是否收到ACK包来判断是否发送重传请求的,这就导致了TCP在存在乱序情况下不能及时发送重传请求,从而降低了网络的传输效率。
四、TCP乱序解决方法
1、基于定时器
在TCP通信时,分别再发送端和接收端维护一个定时器。发送端将数据按照序号依次发送,接收端在收到数据后将数据按照编号存储,并对数据进行排序处理,每收到一个数据都会启动定时器。当定时器时间到了,如果数据还没有到达,则让发送端重传。如果数据接收到了,则将数据存储起来供上层应用处理。
此方案可在简化代码实现上面得到改善,但还存在一定网络延迟和数据量大的情况下执行效率下降。
2、基于SACK(Selective Acknowledgement)
SACK允许TCP接收端向发送端发送一个确认报文,其中包含对其中部分数据的确认。发送端只需尝试发送缺少的部分数据即可。这个方案可以减少冗余性的数据发送,从而提高传输效率。但是并不是所有TCP栈都支持SACK选项。
因此,SACK方案相对更为高效但可移植性较差。
五、总结
TCP Out-of-Order是TCP网络通信中的一种常见问题。TCP发送数据前,会对数据进行分割,分割成一些有序的数据包序列,尽管TCP是可靠的传输协议,但是由于TCP数据往返过程中会遇到多条路径,会导致数据包序列的混淆。对该问题,我们可以采用定时器或SACK等方法进行解决,这些方法能够提高网络的传输效率和数据传输的可靠性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/240963.html