本文主要是介绍TCP通信过程中异常情况整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
TCP通信过程中异常情况整理
本文主要叙述,客户端与服务器端在TCP链接已经建立且正常通信过程中,发生以下几种异常情况时TCP链接会产生的各种现象。
- 服务器主机崩溃
- 服务器主机崩溃后重启
- 服务器主机断网或者中间路由器出现故障
- 服务器主机断网或者中间路由器出现故障后又恢复
- 服务器关机或服务器进程被终止
- 服务器的端口被关闭
- TCP的保活机制
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. TCP的保活机制
TCP中的保活机制是一个可选项,并不是必须的。
主要用在服务器端,用于检测已建立TCP链接的客户端的状态,防止因客户端崩溃或者客户端网络不可达,而服务器端一直保持该TCP链接,占用服务器端的大量资源(因为Linux系统中可以创建的总TCP链接数是有限制的)。
保活机制原理:设置TCP保活机制的保活时间keepIdle,即在TCP链接超过该时间没有任何数据交互时,发送保活探测报文;设置保活探测报文的发送时间间隔keepInterval;设置保活探测报文的总发送次数keepCount。如果在keepCount次的保活探测报文均没有收到客户端的回应,则服务器端即关闭与客户端的TCP链接。
保活探测报文:
TCP保活探测报文的内容为,将之前已发送数据的最大序列号序列的减1,并设置数据大小为1个字节,数据内容为“0”,然后发送到客户端,如下图所示:
客户端对服务器端保活探测报文的确认报文,其报文格式如下:
这篇关于TCP通信过程中异常情况整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!