從應用層觀察TCP的三次握手和TFO

2021-07-25 17:45:31 字數 1201 閱讀 2785

網路程式一般分為客戶端和服務端,先來用一段偽**看一下客戶端和服務端程式會呼叫哪些函式

服務端:

server()

}

客戶端偽**:

client()

}

tcp的三次握手就隱含在上述的函式呼叫中,更確切的說,是隱含在connect和accept之間。這裡借用unp裡面的對三次握手過程的描述:

解釋一下上圖:

1.伺服器端繫結埠,開始監聽之後,就呼叫accept等待連線,程式會阻塞到accpet呼叫中

2.當客戶端呼叫connect時,核心協議棧傳送syn包給服務端,然後阻塞到connect呼叫中,假定此時syn包的包序號是j

3.當伺服器端接收到syn包之後,協議棧會返回乙個syn包k和乙個對客戶端的確認包ack,其中包序號要加1,即返回syn k 和 ack j+1

4.客戶端接收到syn k 和 ack j+1之後,會對服務端的同步包syn k 做出回應,返回乙個確認包 ack k +1 ; 同時,connect函式不再阻塞,返回到客戶端程式中。此時,客戶端已經認為連線已經建立

5.服務端程式接收ack k+1後,accept函式返回。此時,三次握手完畢。

考慮下tcp的為什麼需要三次握手,其實三次握手的場景就是兩個互相對話並確認對方存在的乙個過程:

a: 你聽的到我說話嗎?(syn)

b:聽到了,你能聽到我說話嗎?(ack+syn)

a: 我也能聽到 (ack)

ok,握手完畢

如果這個對話過程少了任何一句,就會發現無法保證通訊鏈路雙向都是通暢的。

說到這裡還想提一下google近年來提出的tfo(tcp fast open)。tfo允許在握手期間攜帶資料,應該是google針對http大面積應用的場景對tcp作出的改善,畢竟乙個http的短連線中,三次握手就占用了不少時間。我本身對tfo也了解不多,只能大概談談個人理解,如果存在有失偏頗之處,敬請諒解。

與上面描述的正常的tcp三次握手,僅用來確認對方是否存在不同,tfo對話場景大概是這個樣子的:

a:小紅,我是小明,你現在在**(sync + data)

b:小明啊,我是小紅,我在0.98零點酒吧呢 (sync + ack + data)

tcp的三次握手 傳輸層 TCP 三次握手

使用tcp協議進行通訊的雙方必須先建立連線,然後才能開始傳輸資料。為了確保連線雙方可靠性,在雙方建立連線時,tcp協議採用了三次握手策略。如圖 客戶端傳送帶有syn標誌的連線請求報文段,然後進入syn send狀態,等待服務端的確認。服務端接收到客戶端的syn報文段後,需要傳送ack資訊對這個syn...

TCP的三次握手

tcp的三次握手分類 網路分析 第一步 請求方向服務方傳送syn,表示想發起一次tcp連線。我們假定這次的序列號是某個數值x 初始的ack號為0 trust target syn seq x ack 0 第二步 服務方產生syn,ack響應,並向請求方傳送ack,ack的值為x 1,表示資料成功接收...

TCP的三次握手

tcp被稱為可靠的資料傳輸協議,主要是通過許多機制來實現的,其中最重要的就是三次握手的功能。如何利用tcp的報頭來確認這個資料報已經被對方接受,並進一步與對方主機實現連線呢?看下圖 我們把上述過程分為a.b.c.d四個階段來說明 a 資料報發起 當客戶端想要對伺服器端發起連線時,就必須要送出乙個要求...