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 状态,此时,双⽅已
建⽴起了连接
上述每⼀次握⼿的作⽤如下:
•
第⼀次握⼿:客⼾端发送⽹络包,服务端收到了
这样服务端就能得出结论:客⼾端的发送能⼒、服务端的接收能⼒是正常的。
•
第⼆次握⼿:服务端发包,客⼾端收到了
这样客⼾端就能得出结论:服务端的接收、发送能⼒,客⼾端的接收、发送能⼒是正常的。不过此
时服务器并不能确认客⼾端的接收能⼒是否正常
•
第三次握⼿:客⼾端发包,服务端收到了。
这样服务端就能得出结论:客⼾端的接收、发送能⼒正常,服务器⾃⼰的发送、接收能⼒也正常
通过三次握⼿,就能确定双⽅的接收和发送能⼒是正常的。之后就可以正常通信了
四次挥⼿
tcp 终⽌⼀个连接,需要经过四次挥⼿
过程如下:
•
第⼀次挥⼿:客⼾端发送⼀个 FIN 报⽂,报⽂中会指定⼀个序列号。此时客⼾端处于 FIN_WAIT1
状态,停⽌发送数据,等待服务端的确认•
第⼆次挥⼿:服务端收到 FIN 之后,会发送 ACK 报⽂,且把客⼾端的序列号值 +1 作为 ACK 报⽂的
序列号值,表明已经收到客⼾端的报⽂了,此时服务端处于 CLOSE_WAIT状态
•
第三次挥⼿:如果服务端也想断开连接了,和客⼾端的第⼀次挥⼿⼀样,发给 FIN 报⽂,且指定⼀
个序列号。此时服务端处于 LAST_ACK 的状态
•
第四次挥⼿:客⼾端收到 FIN 之后,⼀样发送⼀个 ACK 报⽂作为应答,且把服务端的序列号值 +1
作为⾃⼰ ACK 报⽂的序列号值,此时客⼾端处于 TIME_WAIT状态。需要过⼀阵⼦以确保服务端收
到⾃⼰的 ACK 报⽂之后才会进⼊ CLOSED 状态,服务端收到 ACK 报⽂之后,就处于关闭连接了,
处于 CLOSED 状态
四次挥⼿原因
服务端在收到客⼾端断开连接 Fin 报⽂后,并不会⽴即关闭连接,⽽是先发送⼀个 ACK 包先告诉客
⼾端收到关闭连接的请求,只有当服务器的所有报⽂发送完毕之后,才发送 FIN 报⽂断开连接,因此
需要四次挥⼿





