为什么TCP需要三次握手和四次挥手?

174 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

感觉每次这种问题在面试中不是出现在简答题那里,就是当面试官笑眯眯的问你的时候,当听到这个问题的时候,往往大脑一片空白~~

什么是三次握手?

image.png 三次握手是指建立一个TCP连接时候,需要客户端和服务器总共发送三个包。

(为啥来来回回的发呢?)

作用就是为了确认双方的接收能力和发送能力是否正常,然后指定自己的初始化序列号为后面的可靠性传送做充足的准备。

如图:

image.png

  1. 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c),此时客户端处于 SYN_SENT 状态。

作用:客户端发送网络包,服务端收到了,这时候服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

  1. 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,为了确认客户端的 SYN,将客户端的 ISN+1 作为 ACK 的值,此时服务器处于 SYN_RCVD 的状态

作用:服务端发包,客户端收到了,这时候客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的,但是此时服务器并不能确认客户端的接收能力是否正常。

  1. 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,值为服务器的 ISN+1。此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。

作用:客户端发包,服务端收到了,这时候服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

image.png

什么是四次挥手

TCP 终止一个连接,需要经过四次挥手。

image.png

  1. 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态,停止发送数据,等待服务端的确认。
  2. 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
  3. 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
  4. 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

原因:服务端在收到客户端断开连接 Fin 报文后,并不会立即关闭连接,而是先发送一个 ACK 包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送 FIN 报文断开连接,因此需要四次挥手

参考文章