TCP通过三报文握手建立可靠地通信连接后,再完成了数据传输之后,会通过四报文挥手来释放连接。
假设TCP客户进程的应用进程通知其主动关闭TCP连接。
TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态。该本文段首部中的终止位FIN和确认位ACK的值都被置为1,表明这是一个TCP连接释放报文段。同时也对之前收到的报文段进行确认。序号seq字段的值设置为u,等于TCP客户进程之前已经传送过的数据的最后一个字节的序号加1。确认段ack字段的值设置为v,等于TCP客户进程之前已经收到的数据的最后一个字节的序号加1。
TCP服务器进程收到该链接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。该报文段首部中的确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段。序号seq字段的值设置为v,等于TCP服务器进程之前已经传送过的数据的最后一个字节的序号加1。确认号ack字段的值设置为u+1。
TCP服务器进程这时通知高层应用进程:TCP客户进程要断开与自己的TCP连接。此时,从TCP客户进程到TCP服务器进程这个方向的连接就释放了,这时TCP连接处于半关闭状态,TCP客户进程没有数据要发送了,但TCP服务器进程如果还有数据要发送,TCP客户进程仍然要接收。
TCP客户进程收到确认报文段后,就进入终止等待2状态,等待TCP服务器进程可能存在的数据传输。如果使用TCP服务器进程的应用进程已经没有数据要发送了,应用进程就通知其TCP服务器进程释放连接。
TCP服务器进程发送TCP连接释放报文段并进入最后确认状态。其报文段首部中各位数值如图所示。
接收到TCP连接释放报文段后,TCP客户进程会发送一条普通的TCP确认报文段,紧接着进入时间等待状态。而TCP服务器进程收到该确认报文段后就会进入关闭状态。TCP客户进程在等待2MSL(最长报文段寿命)后,进入关闭状态。
设置等待时间是有原因的,譬如上图所示的情况,TCP客户进程发回的TCP普通确认报文段发生了丢失,而此时TCP客户进程已经关闭,那么TCP服务器进程就会一直重复发送确认报文段,要求超时重传,但却没有得到回应,无法进入关闭状态。
而加入TCP客户进程出现了故障,TCP服务器进程要如何发现了,这就要用到保活计时器。TCP服务器进程每收到一次客户进程的数据,就重新设置并启动保活计时器。若计时器定时周期内没有收到TCP客户进程发来的数据,则当计时器到时后,TCP服务器进程就向TCP客户进程发送一个探测报文段,以后每隔75秒就发送一次,若一连发送10个探测报文段后仍无TCP客户进程的响应,服务器进程就认为客户进程所在主机出现了故障,关闭这个连接。
计算机网络——TCP连接的释放(四报文挥手)
最新推荐文章于 2022-07-29 14:44:05 发布