11種狀態解析 LISTEN 等待從任何遠端TCP 和埠的連接請求。 SYN_SENT 發送完一個連接請求後等待一個匹配的連接請求。 SYN_RECEIVED 發送連接請求並且接收到匹配的連接請求以後等待連接請求確認。 ESTABLISHED 表示一個打開的連接,接收到的數據可以被投遞給用戶。連接 ...
11種狀態解析
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 接收到它的連接終止請求的確認。
CLOSED ------------------- 不在連接狀態(這是為方便描述假想的狀態,實際不存在)
TIME_WAIT 兩個存在的理由:
1.可靠的實現tcp全雙工連接的終止;
2.允許老的重覆分節在網路中消逝。
TCP協議
可靠傳輸, TCP數據包沒有長度限制, 理論上可以無限長, 但是為了保證網路的效率,
通常TCP數據包的長度不會超過IP數據包的長度, 以確保單個TCP數據包不必再分割
UDP協議
不可靠傳輸, ""報頭""部分一共只有8個位元組, 總長度不超過65535位元組, 正好放進一個IP數據包
三次握手
置位概念: 根據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丟包的時候,因為網路傳輸有時會有意外。