tcp/ip原理/三次握手/四次揮手

@ tcp/ip原理

1.1 tcp/ip三次握手

 

 

1.1.1 創建過程說明

a)   由主機A發送創建TCP鏈接的請求報文, 其中報文中包含seq序列號, 是由發送端隨機生成的, 而且還將報文中SYN字段置爲1, 表示須要創建TCP鏈接。html

b)   主機B會回覆A發送的TCP鏈接請求報文, 其中包含seq序列號, 是由回覆端隨機生成的, 而且將回復報文的SYN字段置爲1, 並且會產生ACK字段, ACK字段數值是在A發過來的seq序列號基礎上加1進行回覆,以便A收到信息時, 知曉本身的TCP創建請求已獲得了驗證。linux

c)   A端收到B端發送的TCP創建驗證請求後, 會使本身的序列號加1表示, 而且再次回覆ACK驗證請求, 在B端發送過來的seq基礎上加1, 進行回覆。服務器

1.1.2 簡述說明

  1. 在最開始, 客戶端和服務器都處於CLOSED狀態。
  2. 服務器會建立socket文件開始監聽, 服務器狀態處於LISTEN。
  3. 客戶端向服務器發送SYN, 請求創建鏈接, 發完以後本身的狀態變爲SYN_SENT。
  4. 服務器收到客戶端發來的SYN, 而後會回覆ACK和SYN, 發完以後本身的狀態變爲SYN_RECV
  5. 客戶端收到服務器發來的SYN和ACK以後會立刻回覆ACK, 回覆完以後狀態變爲ESTABLISHED。
  6. 服務器端收到客戶端發來的ACK以後會直接進入ESTABLISHED

至此, 三次握手完成, 鏈接創建。併發

1.2 tcp/ip 四次揮手

 

 

 

1.2.1 斷開過程說明

a)   主機A發送斷開TCP鏈接請求的報文, 其中報文中包含seq序列號, 是由發送端隨機生成的, 而且還將報文中FIN字段置爲1, 表示須要斷開TCP鏈接。socket

b)   主機B會回覆A發送的TCP斷開請求報文, 其中包含seq序列號, 是由回覆端隨機生成的, 並且會產生ACK字段, ACK字段數值, 是在A發過來的seq序列號基礎上加1進行回覆, 以便A收到信息時, 知曉本身的TCP斷開請求已獲得了驗證。tcp

c)   主機B在回覆完A的TCP斷開請求後, 不會立刻就進行TCP鏈接的斷開, 主機B會先確保斷開前, 全部傳輸到A的數據是否已經傳輸完畢, 一旦確認傳輸數據完畢就會將回復報文的FIN字段置爲1, 併產生隨機seq序列號。函數

d)   主機A收到主機B的TCP斷開請求後, 會回覆主機B的斷開請求, 包含隨機生成的seq字段和ack字段, ack字段會在主機B的TCP斷開請求的seq基礎上加1, 從而完成主機B請求的驗證回覆。spa

 

1.2.2 簡述說明

  1. 客戶端發送一個FIN並進入FIN_WAIT_1狀態, 幷包括一個序號X。
  2. 服務端接收到客戶端發送的FIN, 而後回覆ACK確認號X+1和已方的序號Y給客戶端, 此時服務端進入CLOSE_WAIT狀態, 客戶端收到服務端的ACK後, 進入FIN_WAIT_2狀態。
  3. 服務端發送一個FIN給客戶端, 包括ACK確認號X+1和已方的一個序號Y, 並進入LAST_ACK狀態。
  4. 客戶端收到服務端發送的FIN, 而後回覆ACK確認號Y+1和已方的序號X+1給服務端, 此時客戶端進入TIME_WAIT狀態, 通過2MSL時間後關閉鏈接, 服務端收到客戶端的ACK後, 關閉鏈接。

 

 

1.3 tcp/ip狀態集

1.3.1 十一種狀態集介紹

 

Statushtm

Descriptionblog

LISTEN

服務啓動後首先處於偵聽LISTENING狀態

SYN_SENT

在發送鏈接請求後等待匹配的鏈接請求。經過connect()函數向服務器發出一個同步SYNC信號後進入此狀態

SYN_RECEIVED

已經收到併發送同步SYNC信號以後等待確認ACK請求

ESTABLISHED

鏈接已經創建, 表示2臺機器能夠相互通訊, 此時鏈接兩端是平等的

FIN_WAIT_1

主動關閉端調用close()函數發出FIN請求包, 表示本方的數據發送所有結束, 等待TCP鏈接另外一端的確認包或FIN請求包

FIN_WAIT_2

主動關閉端在FIN_WAIT_1狀態下收到確認包, 進入等待遠程TCP的鏈接終止請求的半關閉狀態, 這時能夠接收數據, 但再也不發送數據

CLOSE_WAIT

被動關閉端接到FIN後, 就發出ACK以迴應FIN請求, 並進入等待本地用戶的鏈接終止請求的半關閉狀態, 這時能夠發送數據, 但再也不接收數據

CLOSING

在發出FIN後, 又收到對方發來的FIN後, 進入等待對方對鏈接終止FIN的確認ACK的狀態, 少見

LAST_ACK

被動關閉端所有數據發送完成以後, 向主動關閉端發送FIN, 進入等待確認包的狀態

TIME_WAIT

主動關閉端接收到FIN後, 就發送ACK包, 等待足夠時間(2倍MSL時間)以確保被動關閉端收到了終止請求的確認包

CLOSED

鏈接關閉, 表明雙方無任何鏈接狀態

 

 

參考連接:

http://www.4e00.com/blog/linux/2016/08/06/tcp-open-and-close.html

相關文章
相關標籤/搜索