笔记整理:TCP的三次握手,四次挥手

TCP的三次握手,四次挥手

老生常谈的“三次握手,四次挥手”,一直都知道这个理论,相关的图也见不了少,但是从没有自己重新画一遍,自己好好的锊一遍,这次抽空整理了下,作为笔记记录一下。

三次握手,四次挥手过程

截图1
上图就是三次握手,四次挥手的过程,画了个简单的草图,分别给每个步骤标了个序号,下面开始详细说明下每个步骤所做的事情。

  1. 第一次握手:客户端发送报文(标记位为[SYS],seq=0),然后就将状态变更为SYS-SEND
  2. 第二次握手:服务端在接收到客户端发送的报文后,将自身的状态由LISTEN变更为SYN_RCVD状态,并返回一段报文(标记位为[SYS,ACK],seq=0,ack=1)告诉客户端,我收到你的请求连接请求了。
  3. 第三次握手:客户端在收到服务端返回的报文后,再次发送报文(标记位为[ACK], seq=1, ack=1),并将自身的状态由SYN-SEND变更为ESTBLISHED。服务端收到客户端发送的报文后将自身状态变更为由SYN-RCVD变更为ESTBLISHED,这样客户端和服务端就建立好了连接,客户端可以开始传输数据了。
  4. 第一次挥手:客户端发送完数据包之后,主动发起是释放连接的报文(标记位为[FIN, ACK], seq=2000, ack=500)后就将自身的状态由ESTBLISHED变更为FIN-WAIT-1
  5. 第二次挥手:服务端收到客户端的FIN报文后,将自身状态由ESTBLISHED变更为CLOSE_WAIT状态,并发送一段报文(标记位为[ACK], seq=500, ack=2001)告诉客户端,我收到了你想释放连接的请求。客户端在收到服务端返回的确认报文后,将自身状态由FIN-WAIT-1变更为FIN-WAIT-2
  6. 第三次挥手:服务端在处理完客户端发送的数据后,就会向客户端发送第三次挥手的报文(标记位为[FIN, ACK], seq=500, ack=2001 ),并将自身状态由CLOSE_WAIT变更为LAST_ACK
  7. 第四次挥手:客户端在第二次收到服务端发过来的确认报文的时候,将自身状态由FIN_WAIT-2变更为TIME_WAIT,并向服务端发送报文(标记位为[ACK], seq=2001, ack=501)。服务端在收到客户端发送的ACK报文时,就将自身状态由LAST_ACK变更为CLOSED状态,释放了当前连接。
  8. 以上就是老生常谈的三次握手,四次挥手的过程。
  9. 而客户端连接释放再需要在经过TIME_WAIT的2MSL之后才会释放连接。

但是细心的你肯定会发现这个时候只是服务端释放了连接,但是客户端的状态还是在TIME-WAIT并没有释放连接。或许你也会有这些疑问:

  1. 为什么“握手”是三次,“挥手”却要四次?
  2. 为什么客户端在TIME-WAIT阶段要等2MSL?

相关详细的解释可以参考https://www.cnblogs.com/AhuntSun-blog/p/12037852.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章