TCP建立和關閉連線

2021-05-24 13:37:56 字數 2564 閱讀 9103

一、建立連線

1) 請求端(通常稱為客戶)傳送乙個 s y n段指明客戶打算連線的伺服器的埠,以及初

始序號(i s n,在這個例子中為1 4 1 5 5 3 1 5 2 1) 。這個s y n段為報文段1。

2) 伺服器發回包含伺服器的初始序號的s y n報文段(報文段2)作為應答。同時,將確認

序號設定為客戶的i s n加1以對客戶的s y n報文段進行確認。乙個s y n將占用乙個序號。

3) 客戶必須將確認序號設定為伺服器的 i s n加1以對伺服器的s y n報文段進行確認(報文段3) 。

這三個報文段完成連線的建立。這個過程也稱為三次握手( three-way handshake) 。

三次握手three-way handshake

乙個虛擬連線的建立是通過三次握手來實現的

1. (b) --> [syn] --> (a)

假如伺服器a和客戶機b通訊. 當a要和b通訊時,b首先向a發乙個syn (synchronize) 標記的包,告訴a請求建立連線.

注意: 乙個 syn包就是僅syn標記設為1的tcp包(參見tcp包頭resources). 認識到這點很重要,只有當a受到b發來的syn包,才可建立連線,除此之外別無他法。因此,如果你的防火牆丟棄所有的發往外網介面的syn包,那麼你將不 能讓外部任何主機主動建立連線。

2. (b)

接著,a收到後會發乙個對syn包的確認包(syn/ack)回去,表示對第乙個syn包的確認,並繼續握手操作.

注意: syn/ack包是僅syn 和 ack 標記為1的包.

3. (b) --> [ack] --> (a)

b收到syn/ack 包,b發乙個確認包(ack),通知a連線已建立。至此,三次握手完成,乙個tcp連線完成

note: ack包就是僅ack 標記設為1的tcp包. 需要注意的是當三此握手完成、連線建立以後,tcp連線的每個包都會設定ack位

這就是為何連線跟蹤很重要的原因了. 沒有連線跟蹤,防火牆將無法判斷收到的ack包是否屬於乙個已經建立的連線.一般的包過濾(ipchains)收到ack包時,會讓它通過(這絕對不是個 好主意). 而當狀態型防火牆收到此種包時,它會先在連線表中查詢是否屬於哪個已建連線,否則丟棄該包

二、關閉連線

tcp協議的連線是全雙工連線,乙個tcp連線存在雙向的讀寫通道。

簡單說來是 「先關讀,後關寫」,一共需要四個階段。以客戶機發起關閉連線為例:

1.伺服器讀通道關閉

2.客戶機寫信道關閉

3.客戶機讀通道關閉

4.伺服器寫信道關閉

關閉行為是在發起方資料傳送完畢之後,給對方發出乙個fin(finish)資料段。直到接收到對方傳送的fin,且對方收到了接收確認ack之後,雙方的資料通訊完全結束,過程中每次接收都需要返回確認資料段ack。

詳細過程:

第一階段 客戶機傳送完資料之後,向伺服器傳送乙個fin資料段,序列號為i;

1.伺服器收到fin(i)後,返回確認段ack,序列號為i+1,關閉伺服器讀通道;

2.客戶機收到ack(i+1)後,關閉客戶機寫信道;

(此時,客戶機仍能通過讀通道讀取伺服器的資料,伺服器仍能通過寫信道寫資料)

第二階段 伺服器傳送完資料之後,向客戶機傳送乙個fin資料段,序列號為j;

3.客戶機收到fin(j)後,返回確認段ack,序列號為j+1,關閉客戶機讀通道;

4.伺服器收到ack(j+1)後,關閉伺服器寫信道。

這是標準的tcp關閉兩個階段,伺服器和客戶機都可以發起關閉,完全對稱。

fin標識是通過傳送最後一塊資料時設定的,標準的例子中,伺服器還在傳送資料,所以要等到傳送完的時候,設定fin(此時可稱為tcp連線處於半關閉狀態,因為資料仍可從被動關閉一方向主動關閉方傳送)。如果在伺服器收到fin(i)時,已經沒有資料需要傳送,可以在返回ack(i+1)的時候就設定fin(j)標識,這樣就相當於可以合併第二步和第三步。

四次握手four-way handshake

四次握手用來關閉已建立的tcp連線

1. (b) --> ack/fin --> (a)

2. (b)

3. (b)

4. (b) --> ack --> (a)

注意: 由於tcp連線是雙向連線, 因此關閉連線需要在兩個方向上做。ack/fin 包(ack 和fin 標記設為1)通常被認為是fin(終結)包.然而, 由於連線還沒有關閉, fin包總是打上ack標記. 沒有ack標記而僅有fin標記的包不是合法的包,並且通常被認為是惡意的

三、finrst比較

《tcp連線的狀態轉換圖深度剖析》

參考:

《tcp/ip詳解-卷1》第18章《tcp連線的建立與終止》

TCP連線建立和關閉中的疑難點

tcp連線建立和關閉中的疑難點 近日在閱讀 unix網路程式設計 以前在 計算機網路 課程中學到tcp,當時只是簡單了解了tcp連線建立的三次握手和關閉時的四次握手。並沒有對其中各個狀態以及其中的疑問進行深究。以下僅僅是個人的學習筆記 疑問1 tcp建立連線時為什麼要進行第三次握手?疑問2 tcp關...

TCP連線建立和釋放

cp是面向連線的運輸層協議,它提供可靠交付的 全雙工的 面向位元組流的點對點服務。http協議便是基於tcp協議實現的。雖然作為應用層協議,http協議並沒有明確要求必須使用tcp協議作為運輸層協議,但是因為http協議對可靠性的的要求,預設http是基於tcp協議的。若是使用udp這種不可靠的 盡...

TCP連線建立與關閉

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