-
若通信完不释放连接,连接就会一直存在,占用资源。
-
TCP的
连接释放是一个四报文握手。 -
传输结束后,通信双方都可以释放连接。
现在A和B都处于ESTABLISHED状态,如下图。

A的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。① A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,等于前面已传送过的数据的最后一个字节的序号加1。此时A进入了FIN-WAIT-1(终止等待1)状态,等待B的确认。(注意FIN报文段即使不携带数据,也会消耗掉一个序号)。
② B收到连接释放报文段后就发回确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程此时通知高层应用进程,此时从A到B的这个方向的连接就释放了,TCP连接处于半关闭状态:A无数据要发送,若B有数据要发送,A仍要接收即B到A这个方向上的连接未关闭,此状态可能要持续一段时间。
A收到来自B的确认之后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
③ 若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。此时B发出的连接释放报文段必须使FIN=1。先假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已经发送过的确认号ack=u+1。这时B就进入了LAST-ACK(最后确认)状态,等待A的确认。
④ A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1(TCP标准规定前面发送过的SYN、FIN报文段需要消耗掉一个序号,确认报文段不消耗序号。)。然后进入到TIME-WAIT(时间等待)状态。
此时TCP连接还没有释放掉。必须经过时间等待计数器设置的时间到了,A才进入CLOSED状态,才能开始建立下一个新的连接。 -
TIME-WAIT状态存在的必要性
1、为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段可能丢失,B收不到对自己向A发送的FIN+ACK报文段的确认(B无法进入CLOSED状态),B就会超时重传这个FIN+ACK报文段,而A在此延时状态下便能收到这个报文段,A也重传一次确认,重新启动时间等待计时器。
2、防止已失效的连接请求报文段出现在本连接中。A发送完最后一个ACK报文段后,等待给定的时间。可以使本连接持续的时间内所产生的的所有报文段都从网络中消失。 -
B只要收到了A发出的确认,就进入了
CLOSED状态。
B此时撤销相应的传输控制块,结束本次TCP连接。
B结束TCP连接的时间要比A早一些。 -
保活计时器
客户已主动与服务器建立了TCP连接,后来客户端的主机突然出故障。
服务器以后就不能再收到客户发来的数据,需要有措施使服务器不要再白白等待下去。即采用保活计时器。
保活计时器的时间通常设置为两小时,若两小时没收到客户的数据,服务器就发送一个探测报文段,以后每隔75秒钟发送一次。
若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。

被折叠的 条评论
为什么被折叠?



