tcp四次挥手详细流程(一文读懂TCP四次挥手工作原理及面试常见问题汇总)
tcp四次挥手详细流程(一文读懂TCP四次挥手工作原理及面试常见问题汇总)syn:发起一个新连接;RST:重置连接;URG:Urgent Pointer紧急指针有效;ACK:确认序号有效;PSH:接收方应该尽快将这个报文交给应用层;
简述本文主要介绍TCP四次挥手的工作原理,以及在面试中常见的问题。
字段含义seq序号:Sequence Number,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行对比。
ack序号:Acknowledge Number,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq 1。
Flags标志位:
URG:Urgent Pointer紧急指针有效;
ACK:确认序号有效;
PSH:接收方应该尽快将这个报文交给应用层;
RST:重置连接;
syn:发起一个新连接;
FIN:释放一个连接;
注意:标志位ACK和ack序号是不同的概念。确认方ack=发起方Seq 1,两端配对。
四次挥手四次挥手及释放或解除TCP连接,连接的释放必须是一方主动释放,另一方被动释放。流程如下:
图 1 四次挥手原理图
1) 第一次挥手,客户端发出连接释放syn包(FIN=1,seq=u)到服务器端,并且停止再发送数据,主动关闭连接,进入FIN-WAIT-1状态,等待服务器端确认。
2) 第二次挥手,服务器端收到客户端发送的连接释放syn包后,即发出确认syn包(ACK=1,seq=v,ack=u 1)到客户端,进入CLOSE-WAIT状态,此时TCP处于半关闭状态。客户端收到服务器端确认后,进入FIN-WAIT-2状态,等待服务器端发出的连接释放syn包。
3) 第三次挥手,当服务器端数据传送完毕后,服务器端发送连接释放syn包(FIN=1,ACK=1,seq=w,ack=u 1),服务器端计入LAST-ACK状态,等待客户端最后确认。
4) 第四次挥手,当客户端收到服务器端连接释放syn包后,客户端发出确认syn包(ACK=1,seq=u 1,ack=w 1),客户端进入TIME-WAIT状态。此时TCP未释放,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
5) 服务器端只要收到客户端发出的确认,立即进入CLOSED状态,由此完成四次挥手。
常见面试题问题1:为什么"握手"是三次,"挥手"却要四次?
TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。
TCP释放连接时之所以需要"四次挥手" 是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。
问题2:为什么客户端在TIME-WAIT阶段要等待2MSL?
客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成"四次挥手"。
所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因。
ok,以上就是TCP四次挥手工作原理及面试常见问题汇总,看完记得转发、点赞和收藏。如果有错误,欢迎批评指正,感谢。
(云渺书斋)