TCP/IP 10 TCP的连接与终止
TCP是一个面向连接的协议,从而保证数据的可靠性,也就是说TCP其实是有状态的,其中分为连接,传输数据,和终止。连接的过程分为三步,我们称之为三次握手,终止连接分为四步我们称之为四次挥手。传输过程中又包括交互数据流和传输数据流。
1、TCP连接的建立
如下图所示,分为三步,
(1)服务器必须准备好接受外来的连接,通常通过socket,bind和listen这3个函数完成,称之为被动打开
(2)客户端通过connect发起主动打开,客户端TCP发送一个SYN分节,告诉服务器端客户将在连接中发送的数据的初始***,通常SYN分节不携带数据
(3)服务器端必须确认(ACK)客户端的SYN,同时自己发送一个SYN分节,它包含服务端在同一链接中发送的数据的初始***。服务端在单个分节中发送SYN和对客户端SYN的ACK(确认)
(4)客户端必须确认服务端的SYN(发送一个ACK进行确认)
这个交换至少需要3个分组,以上称之为TCP连接建立的三次握手
2、TCP连接的终止
(1)某个应用进程首先close,执行主动关闭。客户端的TCP发送一个FIN分节
(2)接收到这个FIN的服务端执行被动关闭。这个FIN由TCP确认。
(3)一段时间后,接收这个文件结束符的应用进程将调用close关闭它的套接字,这就导致它的TCP也发送一个FIN。
(4)接收这个最终的FIN的原发端TCP(即执行主动关闭的一段)确认这个FIN
既然每个方向都要发送一个FIN和ACK,通常情况下4个分节,某些情况下步骤1的FIN随数据一起发送,另外步骤2和3发送的分节也有可能合并成一个分节。
3、2MSL状态
MSL是Maximum Segment Lifetime,译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间。
等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。
当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
TTL(IP头部的最大生存时间)与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。
4、FIN_WAIT_2状态
这就是著名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态。在这个状态下,应用程序还有接受数据的能力,但是已经无法发送数据,但是也有一种可能是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。