TCP 連線與關閉

2021-10-03 18:34:44 字數 2397 閱讀 8430

一.tcp 協議

傳輸控制協議( transmission control protocol, tcp )是種面向連線、確保資料在端到端間可靠傳輸的協議。面向連線是插在傳送資料前,需要先建立一條虛擬的鏈路,然後讓資料在這條鏈路上「流動」完成傳輸。

1、tcp 協議的報文頭:

2、協議六個狀態位:

連線協議相關的就是中間那六個狀態位:urg、ack、psh、rst、syn、fin,都置為 1 表示有效,在這六個當中,我們主要關注重點關注 ack、syn、fin 這三個。下面解釋一下這三個狀態位:

二.tcp連線的三次握手1、下面我們就來看看為什麼是三次握手,而不是四次或者兩次:

2、tcp 協議三次握手時序圖:

總體來說就是呼叫、應答、回應,我們來詳細的介紹每一步:

經過這三步之後,兩台伺服器就建立連線了,可以進行通訊資料傳輸了。為什麼要三次握手呢?主要是為了資訊對等和防止出現請求超時導致髒連線

3、為什麼會出現髒連線?

看下面這張圖:

因為ttl 網路報文的生存時間往往都會超 tcp 請求超時時間,如果兩次握手就可以建立連線 ,傳輸資料並釋放連線後,第乙個超時的連線請求才到達 b 機器的話,b 機器會以為是 a 建立新連線的請求,然後確認同意建立連線。因為 a 機器的狀態不是 syl_sent ,所以直接丟棄了 b 的確認資料 ,以致最後只是 b 機器單方面建立連線完畢。

三次握手就可以解決這個問題,因為需要 a 伺服器確認了才真正的建立了連線。

三.tcp 四次揮手

1、先看下面這個場景:

a:b 啊,我不想玩了。

b:哦,你不想玩了啊,我知道了。

這個時候,還只是 a 不想玩了,也即 a 不會再傳送資料,但是 b 能不能在 ack 的時候,直接關閉呢?當然不可以了,很有可能 a 是發完了最後的資料就準備不玩了,但是 b 還沒做完自己的事情,還是可以傳送資料的,所以稱為半關閉的狀態

b:a 啊,好吧,我也不玩了,拜拜。

a:好的,拜拜。

這就是乙個完整的關閉連線,在這個關閉的過程中,一共說了四句話,我們也稱之為四次揮手。

2、tcp 協議四次揮手時序圖:

我們結合上面的時序圖和場景再來分析一下 tcp 斷開過程。

當 a 說「不玩了」,a 就進入fin-wait-1的狀態,b 收到「a 不玩」的訊息後,傳送知道了,b 就進入close-wait的狀態。a 收到「b 說知道了」,就進入fin-wait-2的狀態,如果這個時候 b 直接跑路,則 a 將永遠在這個狀態。雖然 tcp 協議裡面並沒有對這個狀態的處理,但是 linux 有,可以調整 tcp_fin_timeout 這個引數,設定乙個超時時間,最後 a 也會關閉的。

如果 b 沒有跑路,傳送了「b 也不玩了」的請求到達 a 時,a 傳送「知道 b 也不玩了」的 ack 後,從 fin-wait-2 狀態結束,按說 a 可以跑路了,但是最後的這個 ack 萬一 b 收不到呢?則 b 會重新發乙個「b 不玩了」,這個時候 a 已經跑路了的話,b 就再也收不到 ack 了,因而 tcp 協議要求 a 最後等待一段時間time-wait,這個時間要足夠長,長到如果 b 沒收到 ack 的話,「b 說不玩了」會重發的,a 會重新發乙個 ack 並且足夠時間到達 b。

要求 a 等待 time-wait還有乙個原因就是防止產生混亂,a 直接關閉了,但是這個時候 b是不知道的,可能在 a 關閉之前 b還傳送了很多資料報,如果這時候 a 的埠被乙個新的應用占用了的話,那麼新的應用就會接收到上個連線中 b傳送過來的資料報,這樣就混亂了,雖然這個資料報是無效的,但是等待 time-wait 可以是乙個雙保險,因而也需要等足夠長的時間,等到原來 b 傳送的所有的包都死翹翹,再空出埠來。

TCP連線建立與關閉

tcp transmission control protocol 傳輸控制協議 是一種面向連線的 可靠的 基於位元組流的傳輸層通訊協議.tcp是傳輸層協議,使用三次握手建立連線,當主動方發出 syn 連線請求時,接收方接受請求後,發出 syn ack 作為響應,接收到響應後,對響應的 syn 執行...

TCP連線與關閉過程

在 tcp ip 協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖 1所示。1 第一次握手 建立連線時,客戶端a傳送 syn包 syn j 到伺服器 b,並進入 syn send 狀態,等待伺服器 b確認。2 第二次握手 伺服器b收到 syn包,必須確認客戶a的 syn ack ...

關閉tcp連線

luolei localhost sudo netstat a grep ssh tcp 0 0 192.168.1.10 40278 com ssh established unix 2 acc stream listening 7565 tmp ssh uyvolk4882 agent.4882...