為什麼TCP的序號是隨機的,而不是從0開始?

2022-07-02 11:24:08 字數 1195 閱讀 9631

主要有兩個問題:

假設客戶端a發給服務端b的乙個包在網路裡面停留太久;

最後本次連線已經結束了,後面又重新建立了一次連線;

恰巧這次連線的四元組和上次相同,(其實就是源埠剛好相同)

四元組=源ip位址+源埠號+目標ip位址+目標埠號

這時序號又是從0開始,而卡了很久的包在這時送到了服務端;

因為連線時的序號都是從0開始,這個包的序號如果剛好落在序號段接收的範圍內,就會被接收;

後面客戶端a傳送的真正這個序號的包,根據tcp協議,認為是重複,會被丟棄;

這個需要先了解一下tcp建立連線的過程(三次握手),此處預設都會;

上面的圖中,主機c模擬主機b,向主機a傳送連線請求;

這種情況針對於區域網外想和內網裡面的主機通訊;

比如你在家,想遠端登入公司內網的一台主機;

這裡c是偽造了b的ip位址,也就是主機c發出的包的源位址是b的ip位址;

這一點很容易實現,學過作業系統和計算機網路的就能理解;

運輸層和網路層的協議是作業系統實現的,網絡卡負責**幀;

主機a收到連線請求後,因為ip位址是認可的,就會傳送確認包

應該是公司內部授權外部這些ip位址的主機可以建立連線

根據tcp三次握手,此時再傳送ack包給主機a,連線就成功建立了

而傳送的ack需要依賴主機a的syn,如果序號都是從0開始,那可就太簡單了;

連線建立後,主機c繼續偽造主機b的ip,就能隨意傳送資料給主機a了;

因為主機a的確認包實際還是傳送給主機b,為了防止b響應,這裡還涉及到一種dos的技術,感興趣的可以去了解;

在使用隨機之前,還有一種isn生成器,它不是從0開始;

比如每4微秒讓序號+1,因為序號有32位,所以週期是4.55h左右;

或者bsd unix的一小時增加128000,每次連線增加64000;

因為序號生成有一些規律,所以也是存在一定風險;

**期刊中提到發起多次真實連線請求,通過分析isn增長規律,去**之後的isn;

我疑問的是為什麼能夠獲取到isn的這些包?另外,又是怎麼知道主機b的ip位址的?

以上是了解到的一些情況,如果有誤,歡迎指出找的一些資料:

為什麼TCP的初始序列號是隨機的

tcp在開始傳輸資料前,客戶端和伺服器需要隨機生成自己的初始序列號 initial sequence number isn 然後通過三次握手進行交換確認。考慮場景,b是伺服器,a是乙個合法的客戶端,c假冒a 比如模擬ip等 和b進行通訊。由於isn是隨機的,最終c無法傳遞資料到b。c假冒a,b接受後...

TCP為什麼是面向連線的,為什麼是面向資料流的

tcp的核心是它要提供乙個可靠的傳輸協議。第乙個問題 tcp如果想要提供乙個可靠的傳輸協議,一定需要每次都建立連線嗎?三 次招手的意義在於讓通訊兩端確定,資訊剛才是可以從任意一端傳到另 一端的。如果傳送資料前我們沒有三次招手。那麼,由於tcp是乙個可靠 的傳輸協議,所以一定會提供超時重試的機制,而且...

為什麼說TCP協議是可靠的

由於ip 資料報的 mtu 有長度限制,tcp報文段過大時,需要切割。切割之後傳送出去,由於網路鏈路的不確定性,接收端接收到包的次序和傳送次序很大概率是不一致的。接收端如何把接收到的 同一批 tcp報文段資料拼接成預期的二進位制資料?傳送方傳送了乙個tcp報文,怎麼樣確認接收方接收到了這個報文?傳送...