tcp協議握手為什要各隨機一個數字並加一?


TCP是一個有狀態協議,A與B之間有一個TCP連接,C想搞破壞,於是想偽造A的IP給B發一個Reset,要分兩種情景:

情景一:C處於A與B之間流量的路徑上
C可以捕獲到A、B的IP包,偽造是小菜一碟,比如大防火牆reset用戶連接

情景二:C不在A與B之間流量的路徑上
C可以在世界的任何角落,偽造一個合法TCP報文,最關鍵是TCP欄位里的sequence number 、acknowledged number,只要這兩項位於接收者滑動窗口內,就是合法的,對方可以接收並Reset A、B之間的TCP連接。

而TCP握手採用隨機序列號(不完全隨機,而是隨著時間流逝而線性增長,到了2^32盡頭再回滾),為的就是讓攻擊者更難以猜測sequence number,因為偽造的sequence number不在合法範圍內,而被接收方丟棄,增加安全性。

至於加一,不知道你說的是SYN標誌位佔據sequence的一個序號,還是對方確認加一?

如果是前者,那是因為SYN是建立連接的關鍵欄位,而為了確保對方接收到,使用超時重傳機制,TCP規定,只為有數據的TCP報文重傳,SYN佔據一個序號(可以認為只有一個位元組數據的報文),所以TCP會重傳SYN報文。

如果是後者,對方接收到數據,比如sequence number = 1000,TCP Payload = 1000,

數據第一個位元組編號為1000,最後一個為1999

對方會回應一個確認報文,確認號為2000,意味著編號2000前的位元組接收完成,準備接收編號為2000及更多的數據。

這裡的加一表現為 1999 + 1 = 2000


源 IP 可以偽造,所以要隨機。報文不一定會按發送的時序到達目標,所以要加一。


TCP的握手,其模型就是紅藍軍問題,該問題在於,要確保數據被傳輸到對方時,還不能被第三方篡改,所以隨機的序列號是解決這個問題的一個最簡單的方式。


上面都回答得很好了。

我就說說為什麼要是3次協商,而不是更多或更少

因為這涉及到「兩軍問題」

關於這個問題你可以百度一下,有很詳細的解釋,我就不再複製粘貼了。

兩軍問題的實質是,如何在不可靠的信道上進行可靠的傳輸,這可能嗎?不可能。

但我們這世界並不是完美的世界,在很多情況下找不到完美的通信信道。

所以我們就要「將就」一下了,通過不可靠的信道進行不可靠的通信---起碼還可以通信吧。

TCP就是為了解決如果在不可靠的通信信道上「儘可能地」、「儘力地」進行通信,「盡我之所能」地建立起一條「看似可靠」的鏈接。

為什麼是3次握手,而不是反覆地4、5、6次握手呢?3次握手以後,我對這條信道的「信心」就建立起來了:起碼就目前而言,這條信道是暢通的。當然更多次的握手,會讓我對這條信道可靠性的信心越來越強,但3次是建立信心的最低次數。


1.隨機初始序列號是為了防止出現與其他連接的序列號重疊的情況,尤其對於同一連接的兩個不同實例而言,新的序列號也不能出現重疊的情況。隨機初始序列號還可以防止他人偽造出可以打斷正常TCP連接的報文段。

2.至於+1,卷一原話:「ACK號是不斷積累的,並且總是表明ACK發送者希望收到的下一個序列號(而不是它上一個接收到的序列號)」。

簡析TCP的三次握手與四次分手 | 果凍想


要回答這個問題,首先要了解兩個概念,TCP報文的序號和確認號。

序號是報文段**首位元組的位元組流編號**

確認號指主機A期望從主機B收到的下一位元組的序號。(假設主機A和主機B進行通信)

首先,為了避免安全性攻擊,在進行連接時,主機A和主機B的初始序號都是隨機設定的。

整個過程如下:(第一次握手),A發送一個同步報文 x 給主機B,用來請求連接,假設序號為 seq_a,(第二次握手)主機B響應,發送一個同步報文 y 進行響應,假設序號是 seq_b(隨機設定),而確認號則一定是 seq_a+1,這意味著主機B期望收到的主機A的下一個報文序號是 seq_a+1。原因很簡單,報文 x 的數據欄位大小一定小於等於 1,假設報文 x 的大小是2,則該確認號是 seq+2(這是普通報文交換的情況)

同理,A接收到響應報文 y 後,第三次握手的報文序號是 seq_a+1,確認號是 seq_b+1,因為報文y位元組大小是1


專業答案可以看:車小胖,簡單粗暴答案可以看:tombkeeper。下面我以自己語言盡量通俗易懂的回答一下。


TCP是可靠傳輸的協議。那麼是什麼機制使它可靠呢?其中兩點是:確認應答(ACK)序列號(當然不止這兩點)。ACK很好理解,TCP客戶端發送數據後,服務端就會返回一個ACK,表示已經收到了該數據。


為什麼加1

序列號是這樣的:序列號是按順序給發送數據的每一個位元組都標上編號。即是說,每個位元組對應一個序列號。

如果發送數據包序列號為1,數據長度為1位元組,則對方ACK返回為2。表示可以接收下一個數據包

如果發送數據包序列號為1,數據長度為1000位元組,則對方ACK會返回1001。則告訴發送方可以發送序列號為1001的數據包了。

總之,接收端是查詢了發送端序列號和數據長度,然後把下一步應該接收的序列號(即加1)作為ACK返回。


為什麼隨機

然後說說為什麼要隨機?從0或1開始不好嗎?作死哦。這樣讓黑客作案很方便了。反正大家都知道序列號是從1開始,我只要偽造一個TCP數據包,修改下目的地址和埠,就可以對接收端進行攻擊。


為什麼加1?

表明SYN確認收到了。FIN同理

Why does a SYN or FIN bit in a TCP segment consume a byte in the sequence number space?

為什麼隨機?

圖來自Stanford CS144 2.1 TCP Service Model

推薦公開課Stanford CS144 Networking-SP Course Info | Stanford Lagunita


補充一下這個隨機序號吧
RFC1948中提出了一個較好的初始化序列號ISN隨機生成演算法,簡單描述就是:
ISN = C +H(sourceIP, sourcePort, destIP, destPort)
H中的4個參數分別是:源IP,源埠號,目的IP,目的埠號。


聽說的某種解釋:加一是因為這個包雖然內容是空的但是它傳遞了信息


推薦閱讀:

在TCP里可以讓數個Application共享一個Port么?
在以TCP為連接方式的伺服器中,為什麼在服務端設計當中需要考慮心跳?
基於UDP實現的可靠傳輸協議(比如uTP),與TCP協議相比有什麼優缺點?
為什麼多 TCP 連接分塊下載比單連接下載快?
為什麼區域網的IP普遍是192.168開頭?

TAG:計算機網路 | TCPIP | TCP | 網路工程 | 網路協議 |