TCP三次握⼿和四次挥⼿

三次握⼿

三次握⼿(Three-way Handshake)其实就是指建⽴⼀个TCP连接时,需要客⼾端和服务器总共发送3

个包

主要作⽤就是为了确认双⽅的接收能⼒和发送能⼒是否正常、指定⾃⼰的初始化序列号为后⾯的可靠

性传送做准备

过程如下:

第⼀次握⼿:客⼾端给服务端发⼀个 SYN 报⽂,并指明客⼾端的初始化序列号 ISN(c),此时客⼾端

处于 SYN_SENT 状态

第⼆次握⼿:服务器收到客⼾端的 SYN 报⽂之后,会以⾃⼰的 SYN 报⽂作为应答,为了确认客⼾

端的 SYN,将客⼾端的 ISN+1作为ACK的值,此时服务器处于 SYN_RCVD 的状态

第三次握⼿:客⼾端收到 SYN 报⽂之后,会发送⼀个 ACK 报⽂,值为服务器的ISN+1。此时客⼾端

处于 ESTABLISHED 状态。服务器收到 ACK 报⽂之后,也处于 ESTABLISHED 状态,此时,双⽅已

建⽴起了连接

image-20251220193400734

上述每⼀次握⼿的作⽤如下:

第⼀次握⼿:客⼾端发送⽹络包,服务端收到了

这样服务端就能得出结论:客⼾端的发送能⼒、服务端的接收能⼒是正常的。

第⼆次握⼿:服务端发包,客⼾端收到了

这样客⼾端就能得出结论:服务端的接收、发送能⼒,客⼾端的接收、发送能⼒是正常的。不过此

时服务器并不能确认客⼾端的接收能⼒是否正常

第三次握⼿:客⼾端发包,服务端收到了。

这样服务端就能得出结论:客⼾端的接收、发送能⼒正常,服务器⾃⼰的发送、接收能⼒也正常

通过三次握⼿,就能确定双⽅的接收和发送能⼒是正常的。之后就可以正常通信了

四次挥⼿

tcp 终⽌⼀个连接,需要经过四次挥⼿

过程如下:

第⼀次挥⼿:客⼾端发送⼀个 FIN 报⽂,报⽂中会指定⼀个序列号。此时客⼾端处于 FIN_WAIT1

状态,停⽌发送数据,等待服务端的确认

第⼆次挥⼿:服务端收到 FIN 之后,会发送 ACK 报⽂,且把客⼾端的序列号值 +1 作为 ACK 报⽂的

序列号值,表明已经收到客⼾端的报⽂了,此时服务端处于 CLOSE_WAIT状态

第三次挥⼿:如果服务端也想断开连接了,和客⼾端的第⼀次挥⼿⼀样,发给 FIN 报⽂,且指定⼀

个序列号。此时服务端处于 LAST_ACK 的状态

第四次挥⼿:客⼾端收到 FIN 之后⼀样发送⼀个 ACK 报⽂作为应答,且把服务端的序列号值 +1

作为⾃⼰ ACK 报⽂的序列号值,此时客⼾端处于 TIME_WAIT状态。需要过⼀阵⼦以确保服务端收

到⾃⼰的 ACK 报⽂之后才会进⼊ CLOSED 状态,服务端收到 ACK 报⽂之后,就处于关闭连接了

处于 CLOSED 状态

image-20251220193809809

四次挥⼿原因

服务端在收到客⼾端断开连接 Fin 报⽂后,并不会⽴即关闭连接,⽽是先发送⼀个 ACK 包先告诉客

⼾端收到关闭连接的请求,只有当服务器的所有报⽂发送完毕之后,才发送 FIN 报⽂断开连接,因此

需要四次挥⼿