一次經典的tcp三次握手
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三次握手