通信领域中的连接是指通信方向网络申请为确保通信质量而预留资源。
基于连接的通信过程是:
1、发起呼叫方提交呼叫申请,网络发起连接建立过程
2、这个连接建立的过程,是在整个通信路径上为本次通信预留资源
3、如果整条路径都许可本次通信,则连接建立,反向在整个通信路径上逐点确认
4、呼叫方收到确认则连接建立。
在建立了连接的通信过程, 双方并不使用各自的通信地址(只用于连接建立过程中的识别与寻址)而是使用网络分配的连接号进行路由(其实就是查一下连接号分配表,然后将数据转发到下一个节点,这个表就是连接建立过程中进行填写)。
而ip网络则是非连接的分组交换,和上述基于连接的通信有几个区别:
1、没有连接的建立过程,所以网络并不为通信预留任何资源,所以ip只提供尽力传送的服务承诺
2、网络各节点对每个ip包都要根据目的地址进行路由,比连接的方式要复杂的多
而tcp属于运输层协议,只存在于端系统中,对中间的ip中继节点是透明的。所以对tcp来说,不管你中间跨了千山万水,它就认为源目双方就是一根网线连起来的,只要源目可达即可。
所以,题主的问题首先就犯了一个概念错误:事实上并不存在图示的那个连接路径,每个ip包都是独立路由的,如果始终都使用了相同的中继节点,那也是一种巧合。tcp只知道源目可达,然后用差控流控来管理通信过程;ip连源目通不通都不管,他只看来了一个包,然后用目的ip查路由表,按最长匹配找到就转发,找不到就丢。
我知道提问者你想象的世界里TCP连接建立后是这样的:
而实际上是这样的:
互联网上两台机器建立的TCP连接的物理链路每时每刻的都可能在断开和产生新的链路。
TCP是虚拟连接,如果低层物理链路断开,只要不引起keepalive retry timeout,TCP连接会一直健在。
有两种场景:
场景1:通信双方A/B非直连链路断
1.1 断开时间很短暂,小于TCP连接超时时间
TCP连接丝毫不受影响
1.2 断开很长时间,超过TCP连接超时时间
TCP双方会删除这个连接
场景2: 通信双方A/B物理直连链路断
如这个例子里的A或B的网线拔掉了,A/B网卡灯灭,网卡驱动程序会通知IP层:网络接口down 掉了,IP层删除所有和该接口有关联的路由表,如果该接口为唯一出口,则流量的出口即为空,所有依赖于此接口的TCP连接都应该收到通知消息,消息大意为:No route to the destination,您老人家看着办!TCP最简单的做法就是Reset现有连接,或者弹出一个消息窗口:No Route is available now! 收到用户的确认,再删除连接。
以上演绎也可以基于路由协议BGP,因为BGP也是TCP连接,唯一的不同是BGP使用了自己的keep live ,三次没有收到对方的keeplive,将reset 整个TCP连接,并释放路由表。
如果依靠BGP Hello(最小值为1秒),至少会耗费3 秒才会发现中间路径断,对于要求收敛速度…<50 ms 的场景,黄花菜都凉了,我们需要配置BFD来检测双向的连接。
对于直连链路,网络接口会第一时间通知BGP链路断,即使这样,配置BFD也可以大大缩短发现故障的时间,让快速收敛成为可能。