目錄
TCP 三次握手
1. SYN (Synchronize:同步)
2. SYN-ACK (Synchronize + Acknowledge:同步+確認)
3. ACK (Acknowledge:確認)
為什么是三次而不是兩次或四次?
三次握手的作用
TCP 四次揮手
第一次揮手:客戶端發送 FIN
第二次揮手:服務器發送 ACK 確認
第三次揮手:服務器發送 FIN
第四次揮手:客戶端發送 ACK 確認
為什么需要四次揮手?
TCP 三次握手

TCP三次握手(Three-Way Handshake) 是建立TCP連接時,客戶端和服務器之間為了保證可靠的數據傳輸而進行的三次消息交換。 三次握手的目的是通過交換序列號,確認通信雙方都準備好建立連接,并且雙方都能進行數據的發送和接收。
注意: 三次握手只在TCP連接建立時進行一次,而不是在每次發送消息時都進行。因為 TCP是一個 面向連接的協議,這意味著在發送數據之前,客戶端和服務器 需要建立一個持久的連接。這個連接在數據傳輸過程中保持開放,直到完成數據交換或者關閉連接。 三次握手是TCP連接建立的過程,一旦連接建立,客戶端和服務器之間就可以進行多次數據傳輸,直到連接關閉。
1. SYN (Synchronize:同步)
- 客戶端向服務器發送一個TCP包,SYN(同步)標志位為1,表示請求建立連接,并告訴服務器自己初始的序列號(seq。seq是一個隨機值,這個序列號用于標識數據包的順序,并且確保數據在傳輸過程中能夠按照正確的順序重組。使用隨機的初始序列號可以防止一些網絡攻擊(比如猜測攻擊),防止攻擊者能夠偽造合法的TCP連接)。
- 該包的目的就是告訴服務器:客戶端準備建立連接,同時也告訴服務器客戶端準備好數據流的初始序列號。
客戶端 → 服務器
- SYN = 1
- 初始序列號:seq = x
2. SYN-ACK (Synchronize + Acknowledge:同步+確認)
- 服務器收到客戶端的SYN包后,知道客戶端要建立連接,于是服務器向客戶端發送一個SYN-ACK包,表示服務器同意建立連接,并且確認客戶端的序列號。
- SYN-ACK包包含兩個標志位:
- SYN = 1:表示服務器同意連接。
- ACK = 1:表示確認收到了客戶端的請求包。
- 同時,服務器會選定自己的序列號seq(如:y)并告知客戶端,之后會根據這個序列號繼續數據傳輸。
服務器 → 客戶端
- SYN = 1
- ACK = 1
- 確認客戶端序列號:ack = x + 1
- 初始序列號:seq = y
(SYN 是表示服務器同意與客戶端建立連接,并且會告訴客戶端服務器的初始序列號。ACK是表示確認收到客戶端的 SYN請求包,即確認客戶端發出的序列號 x,并且ACK中的確認號應是客戶端的序列號 x + 1。)
3. ACK (Acknowledge:確認)
- 客戶端收到服務器的SYN-ACK包后,確認服務器同意建立連接,并向服務器發送一個ACK包。此包用于確認服務器的 SYN包。
- 客戶端在該包中會將序列號ack設置為服務器的初始序列號加1(即:ack = y + 1),同時客戶端的序列號遞增為x + 1。
客戶端 → 服務器
- ACK = 1
- 確認服務器序列號:ack = y + 1
- 序列號:seq = x + 1
完成三次握手后,建立TCP連接,客戶端和服務器可以開始正常的數據傳輸。
為什么是三次而不是兩次或四次?
兩次握手不足以保證服務器是否收到客戶端的請求。如果客戶端發送了SYN包,但服務器沒有響應,客戶端就無法知道服務器是否準備好接收連接。四次握手會增加額外的開銷和延遲,而實際情況下三次握手就足夠保證雙方都準備好進行通信了。
三次握手的作用
- 保證雙方準備好通信:通過交換序列號,客戶端和服務器可以確保彼此都準備好接收和發送數據。
- 確認雙方的接收能力:三次握手確保連接的兩端都能夠進行數據的發送和接收。
- 避免無效連接:如果客戶端或服務器沒有準備好,就不會建立連接,從而避免了無效連接的浪費。
TCP 四次揮手

四次揮手是 TCP 連接關閉的過程,確保客戶端和服務器都能獨立且正確地關閉各自的連接。客戶端和服務器在關閉連接時需要分別發送 FIN 包,并且每個 FIN(Finish)包都需要對方的 ACK 確認,以保證雙方都準備好關閉連接。
第一次揮手:客戶端發送 FIN
客戶端 -> 服務器:FIN(Finish)客戶端向服務器發送一個 FIN 包(帶有 FIN 標志),表示客戶端沒有數據要發送了,但仍然能夠接收來自服務器的數據。此時客戶端進入 FIN_WAIT_1 狀態。
第二次揮手:服務器發送 ACK 確認
服務器 -> 客戶端:ACK服務器收到客戶端的 FIN 包后,確認客戶端的關閉請求,發送一個 ACK 包(帶有 ACK 標志)給客戶端,確認號為客戶端發送的序列號 + 1。此時,服務器進入 CLOSE_WAIT 狀態,等待關閉其發送通道(即它需要先發送完自己未發送的數據)。客戶端進入 FIN_WAIT_2 狀態。
第三次揮手:服務器發送 FIN
服務器 -> 客戶端:FIN(Finish)當服務器沒有數據可發送并準備關閉連接時,服務器向客戶端發送一個 FIN 包(帶有 FIN 標志),表示服務器也沒有數據要發送了。此時,服務器進入 LAST_ACK 狀態。
第四次揮手:客戶端發送 ACK 確認
客戶端 -> 服務器:ACK
客戶端收到服務器的 FIN 包后,發送一個 ACK 包(帶有 ACK 標志)給服務器,確認號為服務器發送的序列號 + 1。此時,客戶端進入 TIME_WAIT 狀態,等待 2MSL(Maximum Segment Lifetime,最大報文生存時間),確保服務器收到了確認包。如果客戶端在此時間段內沒有收到重復的 FIN 包,它將徹底關閉連接。TIME_WAIT 狀態也是為了防止網絡延遲或丟包等問題,避免導致數據包的重發。)
服務器收到客戶端的確認包后,進入 CLOSED 狀態,連接完全關閉。
為什么需要四次揮手?
- TCP 是全雙工的協議,即通信的雙方(客戶端和服務器)可以同時發送和接收數據。因此,關閉連接時,雙方需要各自關閉自己的一條發送通道,才能完成連接的正常關閉。
- 每個方向上的數據傳輸都需要確認,確保數據不會丟失或錯亂。