python TCP協議詳解 三向交握四次揮手和11種狀態

來源:互聯網
上載者:User

標籤:color   time_wait   包含   last   概念   soc   完數   需要   揮手   

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丟包的時候,因為網路傳輸有時會有意外。

 

python TCP協議詳解 三向交握四次揮手和11種狀態

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.