必要的基础知识
FIN:FIN位为1表示结束连接
四次挥手过程
第一次挥手:客户端给服务段发送FIN=1信号,告诉客户端我需要关闭连接。客户端进入FIN_WAIT_1状态。
第二次挥手:服务端受到FIN信号,发送给客户端ACK=1信号,告诉客户端我知道你要关闭连接了,但是我这边数据还没有处理完,数据处理完通知你。服务端进入CLOSE_WAIT状态,客户端受到ACK=1信号进入FIN_WAIT_2状态。
第三次挥手:服务端数据树立完成,发送给客户端FIN信号,告诉客户端我已经处理完数据了,可以关闭连接了。服务端进入LAST_ACK状态。
第四次挥手:客户端收到服务端发送的FIN报文,给服务端发送一个ACK确认信号。客户端进入TIME_WAIT状态,服务端收到客户端的ACK确认信号就会进入CLOSE状态(服务端关闭连接),客户端经过2MSL时间后自动进入CLOSE状态(客户端也完成连接的关闭)。
为什么挥手需要四次
第一次挥手客户端发送FIN信号告诉服务端我不再发送数据,但是还能接受数据。而服务端先给客户端会一个ACK应答报文,自己可能还有数据处理和发送,只有服务端不再发送数据后在给客户端发送FIN报文表示同意关闭连接
为什么客户端等待2MSL后才进入CLOSE状态
- 一个重要的原因
MSL(Maximum Segment Lifetime),指的是报文最大生存时间。所有的报文超过MSL将会被丢弃。
如果服务端没有收到客户端的ACK报文,超时之后服务端会重发FIN报文,客户顿受到重发的FIN报文后再次发送ACK,如果此时服务端受到ACK就不会发送任何消息。因此客户端确保对方能够受到ACK报文必须等待一段时间(最坏的情况就是ACK报文的最大存活时间+FIN报文的最大存活时间=2MSL) - 第二个重要的原因:
-如果一个赤道的数据包没有被服务端接收,断开连接后客户端又在相同的端口与服务端建立了一个新的连接,此时迟到的数据包到达服务端就会让服务端认为是新的客户端发送来的数据,因此2MSL时间足以让两个方向上的数据包都被丢弃,新的连接就不会接收过期的报文。