TCP的三次握手四次揮手

2022-09-01 21:06:14 字數 3050 閱讀 2881

seq序號:佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

ack確認號:佔32位,只有ack標誌位為1時,確認序號欄位才有效,ack=seq+1。

確認ack標誌位:僅當ack=1時確認號字段才有效。當ack=0時,確認號無效。tcp規定,在連線建立後所有傳送的報文段都必須把ack置1.

同步syn標誌位:在連線建立時用來同步序號。當syn=1而ack=0時,表明這是乙個連線請求報文段。對方若同意建立連線,則應在響應的報文段中式syn=1和ack=1.因此,syn置為1就表示這是乙個連線請求或連線接受報文。

終止fin標誌位:用來釋放乙個連線。當fin=1時,表示此報文段的傳送方的資料已傳送完畢,並要求釋放運輸連線。

tcp/ip 協議是傳輸層的乙個面向連線的安全可靠的乙個傳輸協議,三次握手的機制是為了保證能建立乙個安全可靠的連線,那麼第一次握手是由客戶端發起。

握手之前主動開啟連線的客戶端結束closed階段,被動開啟的伺服器端也結束closed階段,並進入listen階段。隨後開始「三次握手」:

客戶端會向服務端傳送乙個報文,在報文裡面:

當服務端收到這個報文之後就知道客戶端要和我建立乙個新的連線。

於是服務端就向客戶端傳送乙個確認訊息包,在這個訊息包裡面:

第三次握手就是當客戶端收到服務端傳送的確認響應報文之後,還要繼續去給服務端進行回應:

伺服器收到來自客戶端的「確認收到伺服器資料」的tcp報文之後,明確了從伺服器到客戶端的資料傳輸是正常的。結束syn-sent階段,進入established階段。

通過以上三次連線,不管是客戶端還是服務端,都知道我既能給對方傳送訊息,也能收到對方的響應。那麼,這個連線就被安全的建立了。

為什麼要進行第三次握手,而不是兩次?

正如上文所描述的,為了實現可靠傳輸,傳送方和接收方始終需要同步( synchronize )序號。 需要注意的是, 序號並不是從 0 開始的, 而是由傳送方隨機選擇的初始序列號 ( initial sequence number, isn )開始 。 由於 tcp 是乙個雙向通訊協議, 通訊雙方都有能力傳送資訊, 並接收響應。 因此, 通訊雙方都需要隨機產生乙個初始的序列號, 並且把這個起始值告訴對方。

於是, 這個過程就變成了下面這樣。

注意:如果四次,那麼就造成了浪費,因為在三次結束之後,就已經可以保證客戶端可以給服務端發資訊,客戶端可以收到服務端的資訊; 服務端可以給客戶端發資訊,服務端可以收到客戶端的資訊。

在三次握手過程中,server傳送syn-ack之後,收到client的ack之前的tcp連線稱為半連線(half-open connect),此時server處於syn_rcvd狀態,當收到ack後,server轉入established狀態。syn攻擊就是client在短時間內偽造大量不存在的ip位址,並向server不斷地傳送syn包,server回覆確認包,並等待client的確認,由於源位址是不存在的,因此,server需要不斷重發直至超時,這些偽造的syn包將產時間占用未連線佇列,導致正常的syn請求因為佇列滿而被丟棄,從而引起網路堵塞甚至系統癱瘓。syn攻擊時一種典型的ddos攻擊,檢測syn攻擊的方式非常簡單,即當server上有大量半連線狀態且源ip位址是隨機的,則可以斷定遭到syn攻擊了,使用如下命令可以讓之現行:

netstat -nap | grep syn_recv
四次揮手機制也是由客戶端去發起。

客戶端會向服務端傳送乙個報文,在報文裡面:

當服務端收到這個報文之後,我就知道了客戶端想要和我斷開連線,但是此時服務端不一定能做好準備,因為當客戶端發起斷開連線的這個訊息的時候,對於服務端而言,他和還有可能有未傳送完的訊息,他還要繼續傳送,所以呢,此時對於服務端而言,我只能進行乙個訊息確認,就是我先告訴服務端,我知道你要給我斷開連線了,但是我這裡邊還可能沒有做好準備,你需要等我一下,等會兒我會告訴你,於是返回一段tcp報文,其中:

前"兩次揮手"既讓伺服器端知道了客戶端想要釋放連線,也讓客戶端知道了伺服器端了解了自己想要釋放連線的請求。於是,可以確認關閉客戶端到伺服器端方向上的連線了

伺服器端自從發出ack確認報文之後,經過closed-wait階段,做好了釋放伺服器端到客戶端方向上的連線準備,再次向客戶端發出一段tcp報文,其中:

客戶端同樣要給服務端繼續傳送乙個訊息確認的報文:

後「兩次揮手」既讓客戶端知道了伺服器端準備好釋放連線了,也讓伺服器端知道了客戶端了解了自己準備好釋放連線了。於是,可以確認關閉伺服器端到客戶端方向上的連線了,由此完成「四次揮手」。

為什麼是4次揮手?

tcp連線是雙向傳輸的對等模式(即雙方都可以同時向對方傳送/接受資料),當有一方要關閉連線時,會發生fin告知對方,對方回乙個ack則乙個方向上的連線關閉了 ,所以需要兩個fin才能斷開。

當服務端收到客戶端傳送過來的fin斷開請求時,回覆ack後只是斷開了客戶端 -> 服務端方向的連線,服務端還可以繼續向客戶端傳送資料(若資料沒有傳送完)。資料傳送完後,服務端也傳送乙個fin,客戶端回覆ack,則全部斷開了

為什麼客戶端在time-wait階段要等2msl?

為的是確認伺服器端是否收到客戶端發出的ack確認報文

當客戶端發出最後的ack確認報文時,並不能確定伺服器端能夠收到該段報文。所以客戶端在傳送完ack確認報文之後,會設定乙個時長為2msl的計時器。msl指的是maximum segment lifetime:一段tcp報文在傳輸過程中的最大生命週期。2msl即是伺服器端發出為fin報文和客戶端發出的ack確認報文所能保持有效的最大時長。

伺服器端在1msl內沒有收到客戶端發出的ack確認報文,就會再次向客戶端發出fin報文;

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...

TCP三次握手四次揮手

tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線。位碼即tcp標誌位,有6種標誌 urg urgent緊急 ack acknowledgement 確認 psh push傳送 rst...