三次握手
置位概念:根據 TCP 的包頭字段,存在 3 個重要的標識 ACK、SYN、FIN
ACK:表示驗證字段 SYN:位數置 1,表示建立 TCP 連接 FIN:位數置 1,表示斷開 TCP 連接
三次握手過程說明:
1. 由客戶端發送建立 TCP 連接的請求報文,其中報文中包含 seq 序列號,是由發送端隨機生成的,并且將報文中的 SYN 字段置為 1,表示需要建立 TCP 連接。(SYN=1,seq=x,x 為隨機生成數值)2. 由服務端回復客戶端發送的 TCP 連接請求報文,其中包含 seq 序列號,是由回復端隨機生成的,并且將 SYN 置為 1,而且會產生 ACK 字段,ACK 字段數值是在客戶端發送過來的序列號 seq 的基礎上加 1 進行回復,以便客戶端收到信息時,知曉自己的 TCP 建立請求已得到驗證。(SYN=1,ACK=x+1,seq=y,y 為隨機生成數值)這里的 ack 加 1 可以理解為是確認和誰建立連接。3. 客戶端收到服務端發送的 TCP 建立驗證請求后,會使自己的序列號加 1 表示,并且再次回復 ACK 驗證請求,在服務端發過來的 seq 上加 1 進行回復。(SYN=1,ACK=y+1,seq=x+1)
四次揮手
四次揮手過程說明:
1. 客戶端發送斷開 TCP 連接請求的報文,其中報文中包含 seq 序列號,是由發送端隨機生成的,并且還將報文中的 FIN 字段置為 1,表示需要斷開 TCP 連接。(FIN=1,seq=x,x 由客戶端隨機生成)2. 服務端會回復客戶端發送的 TCP 斷開請求報文,其包含 seq 序列號,是由回復端隨機生成的,而且會產生 ACK 字段,ACK 字段數值是在客戶端發過來的 seq 序列號基礎上加 1 進行回復,以便客戶端收到信息時,知曉自己的 TCP 斷開請求已經得到驗證。(FIN=1,ACK=x+1,seq=y,y 由服務端隨機生成)3. 服務端在回復完客戶端的 TCP 斷開請求后,不會馬上進行 TCP 連接的斷開,服務端會先確保斷開前,所有傳輸到 A 的數據是否已經傳輸完畢,一旦確認傳輸數據完畢,就會將回復報文的 FIN 字段置 1,并且產生隨機 seq 序列號。(FIN=1,ACK=x+1,seq=z,z 由服務端隨機生成)4. 客戶端收到服務端的 TCP 斷開請求后,會回復服務端的斷開請求,包含隨機生成的 seq 字段和 ACK 字段,ACK 字段會在服務端的 TCP 斷開請求的 seq 基礎上加 1,從而完成服務端請求的驗證回復。(FIN=1,ACK=z+1,seq=h,h 為客戶端隨機生成)
至此 TCP 斷開的 4 次揮手過程完畢
11 種狀態
1. 一開始,建立連接之前服務器和客戶端的狀態都為 CLOSED;2. 服務器創建 socket 后開始監聽,變為 LISTEN 狀態;3. 客戶端請求建立連接,向服務器發送 SYN 報文,客戶端的狀態變味 SYN_SENT;4. 服務器收到客戶端的報文后向客戶端發送 ACK 和 SYN 報文,此時服務器的狀態變為 SYN_RCVD;5. 然后,客戶端收到 ACK、SYN,就向服務器發送 ACK,客戶端狀態變為 ESTABLISHED;6. 服務器端收到客戶端的 ACK 后變為 ESTABLISHED。此時 3 次握手完成,連接建立!
由于 TCP 連接是全雙工的,斷開連接會比建立連接麻煩一點點。
1. 客戶端先向服務器發送 FIN 報文,請求斷開連接,其狀態變為 FIN_WAIT1;2. 服務器收到 FIN 后向客戶端發送 ACK,服務器的狀態圍邊 CLOSE_WAIT;3. 客戶端收到 ACK 后就進入 FIN_WAIT2 狀態,此時連接已經斷開了一半了。如果服務器還有數據要發送給客戶端,就會繼續發送;4. 直到發完數據,就會發送 FIN 報文,此時服務器進入 LAST_ACK 狀態;5. 客戶端收到服務器的 FIN 后,馬上發送 ACK 給服務器,此時客戶端進入 TIME_WAIT 狀態;6. 再過了 2MSL 長的時間后進入 CLOSED 狀態。服務器收到客戶端的 ACK 就進入 CLOSED 狀態。
至此,還有一個狀態沒有出來:CLOSING 狀態。
CLOSING 狀態表示: 客戶端發送了 FIN,但是沒有收到服務器的 ACK,卻收到了服務器的 FIN,這種情況發生在服務器發送的 ACK 丟包的時候,因為網絡傳輸有時會有意外。
?LISTEN:等待從任何遠端 TCP 和端口的連接請求。?SYN_SENT:發送完一個連接請求后等待一個匹配的連接請求。?SYN_RECEIVED:發送連接請求并且接收到匹配的連接請求以后等待連接請求確認。?ESTABLISHED:表示一個打開的連接,接收到的數據可以被投遞給用戶。連接的數據傳輸階段的正常狀態。?FIN_WAIT_1:等待遠端 TCP 的連接終止請求,或者等待之前發送的連接終止請求的確認。?FIN_WAIT_2:等待遠端 TCP 的連接終止請求。?CLOSE_WAIT:等待本地用戶的連接終止請求。?CLOSING:等待遠端 TCP 的連接終止請求確認。?LAST_ACK:等待先前發送給遠端 TCP 的連接終止請求的確認(包括它字節的連接終止請求的確認)?TIME_WAIT:等待足夠的時間過去以確保遠端 TCP 接收到它的連接終止請求的確認。?TIME_WAIT 兩個存在的理由:?可靠的實現 tcp 全雙工連接的終止;?允許老的重復分節在網絡中消逝。?CLOSED:不在連接狀態(這是為方便描述假想的狀態,實際不存在)
編輯:hfy
-
服務器
+關注
關注
12文章
9293瀏覽量
85850 -
TCP
+關注
關注
8文章
1377瀏覽量
79186
發布評論請先 登錄
相關推薦
評論