太原网站优化工具方法,fc网页游戏排行榜,建立网站的步骤,柳州住房和城乡建设厅网站TCP四次挥手过程
TCP断开连接是通过四次挥手实现的#xff0c;双方都可以主动断开连接#xff0c;断开连接后主机中的资源将被释放#xff0c;四次挥手的过程如下#xff1a; 客户端打算关闭连接时#xff0c;会发送一个TCP首部FIN标志位为1的报文#xff0c;也就是FIN报…TCP四次挥手过程
TCP断开连接是通过四次挥手实现的双方都可以主动断开连接断开连接后主机中的资源将被释放四次挥手的过程如下 客户端打算关闭连接时会发送一个TCP首部FIN标志位为1的报文也就是FIN报文之后客户端进入FIN_WAIT_1状态。服务端收到该报文后就向客户端发送ACK应答报文接着服务端进入CLOSE_WAIT状态。客户端收到服务端的ACK应答报文后之后进入FIN_WAIT_2状态。等待服务端处理完数据后也向客户端发送FIN报文之后服务端进入LAST_ACK状态。客户端收到服务端的FIN报文后回一个ACK应答报文之后进入TIME_WAIT状态服务端收到了ACK应答报文后就进入了CLOSE状态至此服务端已经完成连接的关闭。客户端在经过2MSL一段时间后自动进入了CLOSE状态至此客户端也完成了连接的关闭。
可以看到每个方向都需要一个FIN和一个ACK因此通常被称为四次握手 PS:主动关闭连接的才有TIME_WAIT状态。 为什么需要四次挥手
回顾一下四次挥手双方FIN包的过程就能理解为什么需要四次挥手了。
关闭连接时客户端向服务端发送FIN时仅仅表示客户端不再发送数据了但是还能接收数据。服务端收到客户端的FIN报文时先回一个ACK应答报文而服务端可能还有数据需要处理和发送等服务端不再发送数据时才发送FIN报文给客户端来表示同意现在关闭连接。
从上面过程可知服务端通常需要等待完成数据的发送和处理所以服务端的ACK和FIN一般会分开发送因此是需要四次挥手 第一次挥手丢失
当客户端(主动关闭方)调用close函数后就会向服务端发送FIN报文试图与服务端断开连接此时客户端的连接进入到FIN_WAIT_1状态
正常情况下如果能及时收到服务端(被动关闭方)的ACK则会很快变为FIN_WAIT2状态。
如果第一次挥手丢失了那么客户端迟迟收不到被动方的ACK的话也就会触发超时重传机制重传FIN报文重发次数tcp_orphan_retries参数控制。
当客户端重传FIN报文的次数超过tcp_orphan_retries后就不再发送FIN报文则会再等待一段时间(时间为上一次超时时间的2倍)如果还是没能收到第二次挥手那么直接进入到close状态. 具体过程
当客户端超时重传3次FIN报文后由于tcp_orphan_retries为3已达到最大重传次数于是再等待一段时间(时间为上次超时时间的2倍)如果还是没能收到服务端的第二次挥手(ACK报文)那么客户端就会断开连接 第二次挥手丢失
当服务端收到客户端的第一次挥手后就会先回一个ACK确认报文此时服务端的连接进入到CLOSE_WAIT状态。
由于ACK报文不会重传所以如果服务端的第二次挥手丢失了客户端就会触发超时重传。重传FIN报文直到服务端的第二次挥手或者达到最大重传次数。 具体过程
当客户端超时重传2次FIN报文后由于tcp_orphan_retries为2已达到最大超时重传次数于是再等待一段时间(时间为上一次超时时间的2倍)如果还是没能收到服务端的第二次挥手ACK报文那么客户端就会断开连接。 当客户端收到第二次挥手后会处于FIN_WAIT_2状态这个状态需要等待服务端第三次挥手也就是服务端的FIN报文。 对于close函数关闭的连接由于无法再发送和接收数据所以FIN_WAIT_2状态不可以持续太久而tcp_fin_timeout控制了这个状态下连接的持续时长默认值是60秒 这意味着对于调用close关闭的连接如果在60秒后还没有收到FIN报文客户端主动关闭方的连接就会直接关闭 但是如果主动关闭方使用shutdown函数关闭连接指定了只关闭发送方向而接受方向并没有关闭那么意味着主动关闭方还是可以接收数据的。 此时如果主动关闭方一直没收到第三次挥手那么主动方的连接会一直处于FIN_WAIT2状态tcp_fin_timeout 无法控制 shutdown 关闭的连接 第三次挥手丢失
当服务端收到客户端的FIN报文后内核会自动回复ACK同时连接处于CLOSE_WAIT状态它表示等待应用程序调用close函数关闭连接。
此时内核是没有权利代替进程关闭连接诶必须由进程主动调用close函数来触发服务端发送FIN报文。
服务端处于CLOSE_WAIT状态时调用了close函数内核就会发出FIN报文同时连接进入LAST_ACK状态等待客户端返回ACK来确认连接关闭。
如果迟迟收不到这个ACK服务端就会重发FIN报文重发次数依然由tcp_orphan_retries参数控制这与客户端重发FIN报文的重传次数控制方式是一样的 具体过程
当服务端重传第三次挥手报文的次数达到了3次后由于tcp_orphan_retries 为3达到了重传最大次数于是再等待一段时间时间为上次超时时间的2倍如果还是没能收到客户端的第四次挥手ACK报文那么服务端就会断开连接。 第四次挥手丢失
当客户端收到服务端的第三次挥手的FIN报文后就会回ACK报文也就是第四次挥手此时客户端连接进入TIME_WAIT状态。
在linux系统中TIME_WAIT状态会维持2MSL后才会进入关闭状态
然后服务端被动关闭方没有收到ACK报文前还是处于LAST_ACK状态。
如果第四次挥手的ACK报文没有到达服务端服务端就会重发FIN报文重发次数依然由tcp_orphan_retries 参数控制。 具体过程
当服务端重传第三次挥手报文到达2时达到了最大重传次数于是再等待一段时间时间为上次超时时间的2倍如果还是没能收到客户端的第四次挥手ACK报文那么服务端就会断开连接客户端在收到第三次挥手后就会进入TIME_WAIT状态开启时长为2MSL的定时器如果途中再次收到第三次挥手(FIN报文)后就会重置定时器当等待2MSL时长后客户端就会断开连接