TCP連線建立與終止

2021-09-25 21:21:20 字數 3960 閱讀 5601

目錄

tcptcp連線建立--------三次握手

tcp連線終止--------四次揮手

tcp的狀態變遷圖

tcp是乙個全雙工的、面向連線的、可靠地傳輸協議,所以無論哪一方向另一方傳送資料之前,都需要先在兩者之間建立乙個連線;基於全雙工通訊所以存在tcp的半關閉狀態,也就是說斷開連線必須是雙方都關閉,否則就說這種狀態為半關閉狀態(比如說客戶端請求關閉連線之後仍然可以接收伺服器發來的資料)。

tcp首部中部分標誌字元(控制位):

2.連線建立過程:

(1)請求端傳送乙個報文段1:syn指明客戶打算連線的伺服器視窗,以及初始化序列號isn;

(2)伺服器發回包含伺服器的初始化序列號的syn報文段2作為應答,同時將確認序號設定為伺服器的isn加1,以對客戶端的syn報文段進行確認,乙個syn占用乙個序號。

(3)客戶端將確認序列號設定為伺服器的isn加1億對伺服器的syn報文段加以確認(報文段3)。

3.詳細描述:

剛開始客戶端處於 closed 的狀態,服務端處於 listen 狀態接下來

(1)第一次握手:客戶端給服務端發乙個 syn 報文,並指明客戶端的初始化序列號isn(c)。此時客戶端處於syn_send狀態。

(2)第二次握手:伺服器收到客戶端的 syn 報文之後,會以自己的 syn 報文作為應答,並且也是指定了自己的初始化序列號 isn(s),同時會把客戶端的 isn + 1 作為 ack 的值,表示自己已經收到了客戶端的 syn,此時伺服器處於syn_revd的狀態。

(3)第三次握手:客戶端收到 syn 報文之後,會傳送乙個 ack 報文,當然,也是一樣把伺服器的 isn + 1 作為 ack 的值,表示已經收到了服務端的 syn 報文,此時客戶端處於establised狀態。

(4)伺服器收到 ack 報文之後,也處於establised 狀態,此時,雙方以建立起了鏈結。

4.三次握手的作用:

(1)確認雙方的接受能力、傳送能力是否正常。

(2)指定自己的初始化序列號,為後面的可靠傳送做準備。

(3)如果是 https 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密金鑰的生成到。

5.  isn

(1)三次握手的乙個重要步驟是客戶端和服務端交換isn, 以便讓對方知道接下來接收資料的時候如何按序列號組裝資料。如果isn是固定的,攻擊者很容易猜出後續的確認號,因此isn 是動態生成的

6.半、全連線佇列

(1)伺服器第一次收到客戶端的 syn 之後,就會處於 syn_rcvd 狀態,此時雙方還沒有完全建立起連線,伺服器會把此種狀態下請求連線放在乙個佇列裡,我們把這種佇列稱之為半連線佇列。當然還有乙個全連線佇列,就是已經完成三次握手,建立起連線的就會放在全連線佇列中。如果佇列滿了就有可能會出現丟包現象

7.syn-ack 重傳次數問題

(1)伺服器傳送完syn-ack包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超 過系統規定的最大重傳次數,系統將該連線資訊從半連線佇列中刪除。注意,每次重傳等待的時間不一定相同,一般會是指數增長,例如間隔時間為 1s, 2s, 4s, 8s, ….

8.三次握手過程中是否可以攜帶資料

(1)可以

(2)第一次、第二次握手不可以攜帶資料,而第三次握手是可以攜帶資料的。

(3)第

一、二次不可以:如果有人要惡意攻擊伺服器,那他每次都在第一次握手中的 syn 報文中放入大量的資料,因為攻擊者根本就不理伺服器的接收、傳送能力是否正常,然後瘋狂著重** syn 報文的話,這會讓伺服器花費很多時間、記憶體空間來接收這些報文。---------------伺服器容易受到攻擊

(4)第三次可以:此時客戶端已經處於 established 狀態,也就是說,對於客戶端來說,他已經建立起連線了,並且也已經知道伺服器的接收、傳送能力是正常的了,所以能攜帶資料頁

終止連線需要四次揮手,這是由tcp的半關閉造成的。收到乙個fin只意味著(即傳送第乙個fin的)將執行主動關閉,而另一方(收到fin的)執行被動關閉。

關閉過程:

(1)應用程式完成資料傳輸請求斷開連線向伺服器傳送乙個fin(報文段4);

(2)伺服器收到fin,發揮乙個ack(標誌位唯一表示確認應答字段有效),確認序號為收到的序號加1(報文段5),和syn一樣fin將占用乙個序號。同時tcp伺服器還會向應用程式傳送乙個檔案結束符,接著伺服器程式就關閉連線。

(3)伺服器端向客戶端傳送乙個fin進一步確認斷開連線(報文段6)。

(4)客戶端發回乙個確認fin,也會發回乙個tcp軟體產生的ack,將確認序號設定為收到序號加1(報文段7)。

3.詳細描述

剛開始雙方都處於 establised 狀態,假如是客戶端先發起關閉請求:

(1)第一次揮手:客戶端傳送乙個 fin 報文,報文中會指定乙個序列號。此時客戶端處於closed_wait1狀態。

(2)第二次揮手:服務端收到 fin 之後,會傳送 ack 報文,且把客戶端的序列號值 + 1 作為 ack 報文的序列號值,表明已經收到客戶端的報文了,此時服務端處於close_wait2狀態。

(3)第三次揮手:如果服務端也想斷開連線了,和客戶端的第一次揮手一樣,發給 fin 報文,且指定乙個序列號。此時服務端處於last_ack的狀態。

(4)第四次揮手:客戶端收到 fin 之後,一樣傳送乙個 ack 報文作為應答,且把服務端的序列號值 + 1 作為自己 ack 報文的序列號值,此時客戶端處於time_wait狀態。需要過一陣子以確保服務端收到自己的 ack 報文之後才會進入 closed 狀態

(5)服務端收到 ack 報文之後,就處於關閉連線了,處於 closed 狀態。

4.time_wait狀態-----------2msl等待狀態

(1)等待足夠的時間以確保遠端tcp接收到連線中斷請求的確認;

(2)保證tcp最後傳送的ack丟失

該圖精簡一下也就更直觀一些了:七個報文段包含了三次握手、四次揮手的全過程以及客戶端和伺服器的狀態變遷

(1)兩處establi_shed狀態:兩個導致進入establi_shed狀態的變遷對應開啟乙個連線,而兩個導致從establi_shed狀態離開的變遷對應關閉乙個連線。establi_shed狀態是連線雙方能夠進行雙向資料傳遞的狀態。

(2)time_wait狀態:也成2msl等待狀態。每個具體的tcp實現必須選擇乙個報文段最大生存時間msl。它是任何報文段被丟棄前在網路內的最長時間。rfc規定msl為2分鐘,實際上只有三十秒、一分鐘或者2分鐘。為了不讓tcp最後傳送的ack丟失,將time_wait狀態停留時間設為2msl

TCP連線的建立與終止

乙個tcp連線由乙個4元組構成,它們分別是兩個ip位址,兩個埠號。即乙個tcp連線是由一對端點或套接字構成,其中通訊的每一端都由一對 ip位址,埠號 所唯一標識。乙個tcp連線通常分為3個階段 啟動 資料傳輸和退出 tcp開啟與關閉 下圖是乙個典型的tcp連線的建立和關閉過程 為了建立乙個tcp連線...

TCP連線的建立與終止

上圖可見tcp三次握手過程。其中需要注意的是步驟一 syn 1且ack 0。syn為1時,源於協議的設計syn和fin各佔乙個位元組的序號。且步驟一和步驟二進行同步請求時,syn為1,之後syn為0。因為網路原因,可能客戶a向伺服器b傳送了乙個syn同步請求連線在網路中滯留了一會。然而客戶a在超時重...

TCP連線的建立與終止

img tcp連線的建立與終止 下面是tcp連線建立與終止的時候的時序圖 img 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 1 第一次握手 建立連線時,客戶端a傳送syn包 syn j 到伺服器b,並進入syn send狀態,等待伺服器b確認。2 第二次握手 伺服...