TCP三次握手

2021-08-18 02:50:59 字數 1463 閱讀 4745

tcp三次握手流程圖:

1、初始態:

首先客戶端、伺服器端均處於closed狀態,客戶端會呼叫connect函式開啟連線,服務端則會呼叫listen函式處於listen狀態

2、第一次握手

客戶端建立socket,呼叫connect函式,此時會向伺服器發出連線請求報文,該報文中syn欄位置一,同時會選擇乙個初始序列號seq=x,之後客戶端會進入syn_sent狀態

tcp規定,syn報文段(syn=1的報文段)不能攜帶資料,但需要消耗掉乙個序號

3、第二次握手

服務端收到客戶端請求報文以後,如果同意建立連線則會確認報文,該報文中,ack位、syn位置一,確認號ack=x+1,同時也會為自己初始化乙個序列號seq=y,此時伺服器進入syn_rcvd狀態

這個報文也不能攜帶資料,但是同樣要消耗乙個序號

4、第三次握手

客戶端收到確認ack以後,還會向伺服器端傳送乙個確認報文,然後客戶端會進入established狀態,該報文中,ack位置一,ack=y+1。tcp規定,ack報文段可以攜帶資料,但是如果不攜帶資料則不消耗序號。因此此時如果攜帶了資料,則此時序列號為x+1。伺服器收到ack以後也會進入established狀態,至此,tcp連線建立過程結束。

tcp三次握手相關問題

1、為什麼要三次握手而不是兩次握手

<1> 兩次握手可能導致客戶端傳送的已過期的syn報文段傳到伺服器,伺服器為其分配資源,浪費資源

假設是2次握手: 

所以如果採用兩次握手,

由於現在a並沒有發出建立連線的請求,因此不會理財b的確認,也不會向b傳送資料。但b卻以為新的傳輸連線已經建立了,並一直等待a發來資料。b的許多資源就這樣白白浪費了。

<2>

兩次握手可能會導致死鎖

兩端同時開啟鏈結

兩個應用程式同時彼此執行主動開啟的情況,2端的埠需要一致,這就需要雙方都熟知埠,這種情況發生的概率很小 ,這裡簡單的介紹一下

場景:1. pc1的應用程式使用埠7777 與pc2的埠8888  執行主動開啟

2. pc2的應用程式使用埠8888 與pc1的埠7777 執行主動開啟

3. syn包同時開啟對端,這種情況即為同時開啟

tcp中,對於同時開啟它僅建立一條連線而不是兩條連線

,狀態變遷圖如下:同時傳送syn包,然後收到進行確認直接進入established狀態,可以看到同時開啟需要連線建立需要4個報文段,比三次握手多一次!

參考:《tcp/ip》詳解卷1

部落格:

tcp三次握手 TCP 三次握手總結

tcp特點概述 tcp segment structure 段結構 step2 server host receives syn,replie with syn ack segment 答覆syn ack報文段 step3 client receives synack,replies with ac...

TCP 三次握手

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

TCP三次握手

1.伺服器準備好接受外來連線。passive open 被動開啟 需呼叫 socket bind listen 函式來完成。2.客戶端通過呼叫 connect 主動開啟 active open 這使得客戶 tcp傳送乙個 syn 表示同步 分節,這個分節告訴伺服器,客戶端將在待建立的連線中傳送的資料...