1樓:
答案已經有了,補充乙個,如果你想要抓包驗的話,用wireshark 抓包看 seq都是從0開始實際上是相對的順序號 ,預設是相對的,可以改配置改成絕對序列號 , 實際上是隨機的。
tcpdump -S選項是絕對序列號
2樓:嚮往美
上面都回答得很好了。
我就說說為什麼要是3次協商,而不是更多或更少
因為這涉及到「兩軍問題」
兩軍問題的實質是,如何在不可靠的通道上進行可靠的傳輸,這可能嗎?不可能。
但我們這世界並不是完美的世界,在很多情況下找不到完美的通訊通道。
所以我們就要「將就」一下了,通過不可靠的通道進行不可靠的通訊---起碼還可以通訊吧。
TCP就是為了解決如果在不可靠的通訊通道上「盡可能地」、「盡力地」進行通訊,「盡我之所能」地建立起一條「看似可靠」的鏈結。
為什麼是3次握手,而不是反覆地4、5、6次握手呢?3次握手以後,我對這條通道的「信心」就建立起來了:起碼就目前而言,這條通道是暢通的。
當然更多次的握手,會讓我對這條通道可靠性的信心越來越強,但3次是建立信心的最低次數。
3樓:徐方鑫
TCP的握手,其模型就是紅藍軍問題,該問題在於,要確保資料被傳輸到對方時,還不能被第三方篡改,所以隨機的序列號是解決這個問題的乙個最簡單的方式。
4樓:郭子淳
為什麼加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
5樓:
補充一下這個隨機序號吧
RFC1948中提出了乙個較好的初始化序列號ISN隨機生成演算法,簡單描述就是:
ISN = C +H(sourceIP, sourcePort, destIP, destPort)
H中的4個引數分別是:源IP,源埠號,目的IP,目的埠號。
6樓:
專業答案可以看:車小胖,簡單粗暴答案可以看:tombkeeper。下面我以自己語言盡量通俗易懂的回答一下。
TCP是可靠傳輸的協議。那麼是什麼機制使它可靠呢?其中兩點是:
確認應答(ACK)和序列號(當然不止這兩點)。ACK很好理解,TCP客戶端傳送資料後,服務端就會返回乙個ACK,表示已經收到了該資料。
為什麼加1
序列號是這樣的:序列號是按順序給傳送資料的每乙個位元組都標上編號。即是說,每個位元組對應乙個序列號。
如果傳送資料報序列號為1,資料長度為1位元組,則對方ACK返回為2。表示可以接收下乙個資料報
如果傳送資料報序列號為1,資料長度為節,則對方ACK會返回1001。則告訴傳送方可以傳送序列號為1001的資料報了。
總之,接收端是查詢了傳送端序列號和資料長度,然後把下一步應該接收的序列號(即加1)作為ACK返回。
為什麼隨機
然後說說為什麼要隨機?從0或1開始不好嗎?作死哦。
這樣讓黑客作案很方便了。反正大家都知道序列號是從1開始,我只要偽造乙個TCP資料報,修改下目的位址和埠,就可以對接收端進行攻擊。
7樓:車小胖
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。
tcp 協議中 為什麼syn會消耗乙個序號?
肖巨集輝 因為TCP的RFC規定了,SYN和FIN要占用segment的長度,所以在SYN和FIN包裡面,有你看不見,但是卻邏輯存在的乙個byte。既然有這麼乙個byte,那麼ACK 1也很正常。SEG.LEN the number of octets occupied by the data in...
乙個程式取50000個隨機數和十個程式各取5000個隨機數效果一樣嗎?
先來解答一下你的困惑,包括為什麼 openMP 多執行緒 srand rand 出來的結果一樣。因為 rand 一般使用的是偽隨機演算法。大多數的偽隨機演算法的工作原理都是根據乙個種子值 由 srand 設定 根據一定規則初始化出乙個初始狀態。在每次獲取隨機值時,根據另一組規則更新狀態,並計算出返回...
Java中如何隨機選取乙個長度為10的陣列中的5個不重複的數?
luoxn28 初始化N 陣列長度 10 每次 Random nextInt N 結果為m,然後將下標為m的資料和陣列最後乙個元素交換位置,然後N 繼續 Random nextInt N 直到找到5個資料即可,也就是陣列中最後5個元素。 Aetherus HashMap Boolean duplic...