主要有兩個問題:
假設客戶端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報文,怎麼樣確認接收方接收到了這個報文?傳送...