TCP連線管理
一些基本的概念可以先看另一篇部落格:https://www.cnblogs.com/HannahLihui/p/10078496.html
這篇直接對TCP連線過程做筆記
一、TCP連線的建立
1.TCP連線詳細過程
假設執行在主機(客戶)的一個程序想跟另一臺主機(伺服器)上程序建立一個連線
第一步:客戶端的TCP首先向服務端的TCP傳送一個特殊的TCP報文段。該報文段不包含應用層資訊。報文段的SYN(標誌位)置1。因此這個報文段也叫SYN報文段。另外客戶會隨機選擇初始序號放在TCP 報文段的序號欄位中。報文段會封裝在IP資料報,併發送給伺服器。為了避免某些安全攻擊,會適當隨機化初始序號(client_isn)。
第二步:一旦TCP SYN報文段的IP資料報到達伺服器主機,伺服器會取出該報文段,為TCP連線分配報文段和快取,並向客戶傳送允許連線的報文段,這個報文段也不包括應用層資料。
報文段包括三個重要資訊。
1.SYN置1
2.確認號欄位置為client_isn+1
3.選擇自己的初始序號
這個報文段表明伺服器已經接收到客戶的SYN分組,表示同意該連線,所以初始化好了序號,並用確認號表明期望下一次從客戶端收到序號是client_isn+1的報文段。該報文段也叫做SYNACK報文段
第三步:收到SYNACK報文段之後,客戶也要分配給連線快取和變數。客戶主要給伺服器傳送另一個報文段,這最後一個報文段對伺服器的允許連線的報文段進行確認(將server_isn+1作為確認號)。連線被確認之後,SYN置0.這個報文段可以攜帶客戶到服務端的應用層資訊。
連線建立好之後SYN就置0
為什麼是三次握手,而不是兩次呢,可以看看知乎的回答,都太有才了啊
https://www.zhihu.com/question/24853633
兩次握手主要是防止失效的客戶端連線被服務端接受引起錯誤
為什麼連線建立需要三次握手,而不是兩次握手?
防止失效的連線請求報文段被服務端接收,從而產生錯誤。
PS:失效的連線請求:若客戶端向服務端傳送的連線請求丟失,客戶端等待應答超時後就會再次傳送連線請求,此時,上一個連線請求就是『失效的』。
若建立連線只需兩次握手,客戶端並沒有太大的變化,仍然需要獲得服務端的應答後才進入ESTABLISHED狀態,而服務端在收到連線請求後就進入ESTABLISHED狀態。此時如果網路擁塞,客戶端傳送的連線請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通訊,通訊結束後釋放連線。此時,如果那個失效的連線請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送資料或主動傳送資料。但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連線資源。
連結: https://www.zhihu.com/question/24853633/answer/254224088
二、TCP連線的關閉(四次揮手)
客戶應用程式發出關閉連線命令 第一步:客戶TCP向伺服器傳送特殊的TCP報文段,首部的標誌位FIN置1 第二步:伺服器回送一個確認報文段。 第三步:伺服器傳送終止報文段,FIN置1. 第四步:客戶對伺服器的終止報文段進行確認 最後兩個主機釋放所有TCP資源
三、TCP連線狀態轉換