一条tcp链路各个数据包走的路径一样吗,如果中间链路断电,将会触发怎样的处理?

途经该“断电物理链路”的IP报文会被丢弃,稍后路由器的链路状态检测机制会发现物理链路断电,会及时通知路由器的路由协议算法,路由算法会将该物理链路剔除掉,重新计算最短路径,这就是“路由重收敛”,后续的IP报文会走新的物理链路。

 

那些被丢弃的IP报文,路由器会重传吗?

不会!

谁来重传呢?

TCP数据发送一方,每当发送一个TCP Segment,都会启动一个定时器,一旦定时器超时而没有收到对端的ACK,会重传该TCP Segment。

既然IP报文被丢弃了,接收方不会接收到,自然也不会ACK,所以最终TCP发送方会重传这些丢弃的TCP Segment。

至于第一个问题,那不是两三句话可以说清的问题。为了让更多的读者充分理解这个问题,需要更多的背景知识。

影响TCP性能有那些因素?

(1) Window Size

(2) RTT

(3) Packet Drop Rate

(4) Packet Disorder Rate

以上四个因素都会影响TCP的传输效率,但和我们这个问题有关的是因素(4),接下来重点解释这个因素。

Packet Disorder Rate

通俗地说,就是报文乱序的比率,最理想的情况是“Packet Disorder Rate

= 0”,意味着报文没有任何乱序,发送方的报文发送顺序和报文接收顺序是一摸一样的。

为何乱序不好?

众所周知,TCP是基于字节流的传输模式,TCP会对segment编号,比如“1、2、3、4、5”,到达接收端时,接收端按照这个顺序“1、2、3、4、5”将数据提交给应用层。

如果乱序了,接收方的接收顺序为“2、3、4、5”,别急,此时1还没有到达,问TCP能将“2、3、4、5”提交给应用层吗?

不能,因为“2、3、4、5”这些所谓编号,只对TCP有意义,只有TCP知道它们之间的先后顺序。当TCP将数据提交给应用层时,TCP报文头会被剥离,剥离掉的还有这些编号。换句话说,应用层压根看不到编号

假设“2、3、4、5”已经提交给了应用层,此时1终于翩翩而至,此时TCP再将1提交给应用层,应用层由于没有编号信息,该如何排列?是“2、3、4、5、1”吗?很显然,这样的排序是错误的,这样排序的数据对于应用层没有任何意义,是一堆废数据而已。

所以TCP不能将还没有完全排序的数据提交给应用层,TCP会耐心等待segment 1的到来!

问题又来了,此时“2、3、4、5”segments会霸占着接收方的缓冲区,接收方的接收缓冲区极度缩小到1个segment。此时接收方会及时刷新自己的window size = 1 segment,当接收方接收到这个window size时,最多一次只能发送1个segment,这将严重影响TCP传输效率。

如果没有乱序,接收方的TCP数据可以及时被取走,window size = 5 segments, 这样的传输效率显然会更高。

 

当发送方、接收方之间某一条链路断,断开之前、断开之后TCP会话走的路径相同吗?

很显然会不相同,断开之后路由协议重新计算新的路径,所以断开之后会走不同的路径。

但是,无论断开之前、之后,路由器都会尽自己最大可能,保证TCP segment走相同的路径,这样才最大限度保证乱序不会发生。