TCP异常情况

时间:2025-03-30 19:21:42

1.服务器主机崩溃

       客户端在给服务器发送数据时,由于收不到服务器端回传的ACK确认报文,正常情况下,客户端TCP均会进行超时重传,一般为重传12次大约9分钟后才放弃重传,并关闭客户端TCP链接。

2.服务器主机崩溃后重启

     如果服务器主机在崩溃重启的这段时间里,客户端没有向服务器发送数据,或者客户端没有因重传次数超过限制关闭TCP链接。则在服务器重启后,当客户端再向服务器发送TCP报文时,由于服务器中的TCP链接已经关闭,会直接向客户端回复RST报文,客户端在接收RST报文后关闭自己的TCP链接。

3.服务器主机断网

     与情况1类似,客户端会进行超时重传,直到重传次数超过后放弃重传,并关闭客户端TCP链接。(因为TCP中会忽略目的主机不可达和目的网络不可达的ICMP报文,并进行重传,直到重传总时间超过限制)

4.服务器主机断网又恢复

     如果在服务器主机断网或者中间路由器出现故障这段时间内,客户端和服务器之间没有进行相互通信,即双方均没有察觉对方目的不可达,则在恢复网络链接后两端的TCP链接均有效,能够正常继续进行通信。

     如果在服务器主机断网或者中间路由器出现故障这段时间内,客户端因向服务器发送数据超时,并重传总时间超过限制关闭TCP链接。则再网络恢复后,服务器再向客户端发送TCP报文时,客户端也会直接恢复RST报文,服务器再收到RST报文后关闭自己的TCP链接。
     上述是理论上如此,但实际中,如果网线被拔了,服务器能检测到网络断开,会清空掉所有连接的。本地网络变化,本机网络是可以检测到的。

5.服务器关机或服务器进程被终止

     正常情况下服务器主机被关机时,操作系统都会事先通知所有仍在运行的进程,并先将所有进程终止后,再继续关闭电脑。而所有的进程在被终止时,Unix操作系统内核都会事先去关闭所有已经打开的TCP链接,即向客户端发送FIN标志报文,进行四次握手关闭连接。
     因此,对于这种情况,客户端是能够察觉到并正常关闭TCP链接。

6.服务器的端口被关闭

     如果在通信过程中,服务器的监听端口被管理员或系统禁掉,则当客户端再向服务器发送TCP报文时,服务器在收到该报文后,由于发送该目的端口没有处于监听状态,则会直接向客户端发送RST报文,客户端在收到RST报文后会直接关闭自己TCP链接。

7.中间路由器故障

     链接只是两端维持,中间路由器对链接无感,所以如果中间路由器故障,会重传报文,直到连接关闭。如果涉及了nat,又是另外一回事了。

8.与本机直接相连的路由器故障

     本机直接相邻的路由器故障,会导致相关局域网各个主机ip失效,从而导致网络出问题。

的保活机制

     TCP中的保活机制是一个可选项,并不是必须的。
     主要用在服务器端,用于检测已建立TCP链接的客户端的状态,防止因客户端崩溃或者客户端网络不可达,而服务器端一直保持该TCP链接,占用服务器端的大量资源(因为Linux系统中可以创建的总TCP链接数是有限制的)。
保活机制原理:设置TCP保活机制的保活时间keepIdle,即在TCP链接超过该时间没有任何数据交互时,发送保活探测报文;设置保活探测报文的发送时间间隔keepInterval;设置保活探测报文的总发送次数keepCount。如果在keepCount次的保活探测报文均没有收到客户端的回应,则服务器端即关闭与客户端的TCP链接。