1. 程式人生 > >一次經典的tcp三次握手

一次經典的tcp三次握手

ges 但是 字節 alt 經典的 二次 pan 連接 分享

TCP報頭

技術分享

在三次握手中使用的字段:

32位序列號 seq:表示的是本次報文發送的數據的第一個字節的序號

32位確認號:ack 表示期望下一次應該接受到的報文的第一個字節的序號,若ack = N則表示,到序號N-1為止的所有的數據都已經正確的收到了。

ACK位(圖中紅色部分,用ACK大寫表示ACK位,ack小寫表示確認號):確認,當ACK = 1是確認號ack才有效,建立連接後,所有傳送的報文段都必須把ACK置為1.

SYN位(圖中紅色部分):同部位,在建立連接的時候使用,若SYN=1,ACK=0,則表示是一個連接請求報文,若接收方同意接收連接,則使用SYN = 1,ACK = 1。所以,從上面可以看出來SYN = 1表示這個報文是一個連接請求或連接接收報文

三次握手的過程

技術分享

A發送連接請求:A發送連接請求時,將SYN置為1,ACK置為0,seq取一個數x,ack取0(因為ACK為0,所以這個時候ack取值沒有意義),這個過程將消耗一個序號

B確認連接:若B同意A請求連接,則B發送的報文中,SYN = 1,ACK = 1,seq取一個數字y,ack取x +1,這個過程將消耗一個序號。seq取y和前面的過程沒有關系,ack取x+1是因為,A發送的數據seq為x,並且在發送的過程當中消耗了一個序號,所以,下一次應該收到的數據的地址為x+1,加的1就是消耗的一個序號。

A確認:A需要再次確認,SYN = 0,ACK = 1, seq = x + 1, ack = y + 1。 seq表示發送的數據的序號為x + 1,同時希望B下一次發送的數據的序號為y + 1。

一個例子

發送的第一個數據包

技術分享

在第一個包的時候SYN = 1,ACK = 1,seq的值為一個隨機的值,ack為0。

發送的第二個數據包

技術分享

在第二個數據包的時候ACK = 1,SYN = 1,seq的值為一個隨機數,ack的值為上一個數據包的seq的值+1。

發送的第三個數據包

技術分享

在第三個數據包中:SYN = 0,ACK = 1,seq的值為第一個數據包的seq的值+1,ack的值為第二個數據包的seq值+1。

總結一下

在三次握手的時候,有四個字段是非常重要的。SYN和ACK均占一位,表示同步和確認。seq和ack均為32位,分別為發送的數據的序號,和希望對方發送的數據的序號。

在三次握手的過程中,第一次和第二次的過程中SYN的值均為1,並且每個過程都消耗掉一個序號,消耗一個序號的意思是:使得數據的序號加1,好像是發送了一位數據,但是並沒有真正的傳遞數據。

參考:謝希仁 《計算機網絡》第六版

一次經典的tcp三次握手