我正在創建簡單的 TCP 模擬程式,它可以作為一個簡單的 TCP 服務器通過 IP,問題出在我收到 SYN 資料包時我編碼的代碼中,--> 我在我的程式服務器中完成了所有回應資料包的制定并創建了回應包并回復 SYN ACK 包。
但是在我用 SYN ACK 資料包回復后,我從客戶端套接字獲得了 RST 資料包。我不知道我的 TCP 或某些標頭有什么問題,使我的客戶端套接字只用 RST 資料包回復我的 SYN ACK 資料包。
我在互聯網上讀到 RST 資料包,它說主機上收到 RST 有兩個原因,但可能有更多原因
There are a few circumstances in which a TCP packet might not be expected; the two most common are:
The packet is an initial SYN packet trying to establish a connection to a server port on which no process is listening.
The packet arrives on a TCP connection that was previously established, but the local application already closed its socket or exited and the OS closed the socket.
所以我想知道在我的案例中給出的原因是什么。
當我在程式 IP 套接字上收到 SYN 資料包時
0000 45 00 00 3c 81 37 40 00 40 06 24 11 c0 a8 0a 14
0010 c0 a8 0a 0f ba 50 00 50 15 1a 68 41 00 00 00 00
0020 a0 02 fa f0 a3 ce 00 00 02 04 05 b4 04 02 08 0a
0030 de d7 fc f8 00 00 00 00 01 03 03 07
我用 SYN ACK 資料包回復。我的 TCP 資料包看起來像這樣
0000 45 00 00 28 00 64 40 00 40 06 a4 f8 c0 a8 0a 0f
0010 c0 a8 0a 14 00 50 ba 50 00 01 00 00 15 1a 68 41
0020 50 12 fa f0 e7 70 00 00
因此 TCP 中的欄位類似于上面的 20(IP 標頭) 20(TCP 標頭)位元組的資料包(SYN ACK),用于從我的代碼到客戶端套接字的 SYN ACK 回復。但不是從客戶端開始發送資料,我的客戶端開始發送 RST 資料包,在我的代碼中,我在將 SYN ACK 資料包從我的代碼發送到客戶端套接字后立即收到 RST 資料包。但是上面的標頭值是什么我得到了 RST 資料包(重置資料包)而不是從客戶端或至少我的客戶端套接字獲取一些資料 [connect()] 函式呼叫成功,如何從我的客戶端制作這個 RST 資料包發送消失,所以我的客戶端終于開始發送資料,我的服務器代碼開始獲取資料。任何人都可以看看上面的標題,請糾正我做錯了什么。感謝幫助
uj5u.com熱心網友回復:
我看不出這個資料包有什么本質上的錯誤,但必須在 SYN 的背景關系中獲取該資料包。SYN ACK中ACK的預期序列號是從SYN開始的序列號(ISN,即初始序列號)加1。
但是,ACK 不是 ISN 1,而是來自接收到的 SYN 的簡單 ISN。這意味著 SYN ACK 出現亂序,從而導致 RST。
uj5u.com熱心網友回復:
發送 RST 的一般原因是接收方找不到套接字,應該歸因于傳入的資料包。
常見情況包括:
- 埠不匹配:埠對沒有打開的套接字
- 序列號不匹配:ACK 號不正確,或者 ACK 號不適合發送方的視窗(此處發送方是收到 ACK 的一方,因為 ACK 是對發送方發送某些內容的回應)
根據 TCP 規范,設定了 SYN(以及 FIN)標志的資料包通過增加 1 的 ACK 編號進行確認,即,就好像這些標志占用了一個位元組的資料一樣。
考慮到接收到的 SYN 和發送的 SYNACK,可以看出,SYN 中的序列號是 ,15 1a 68 41而 SYNACK 中的 ACK 號也是15 1a 68 41,這是不SYN 1應該的。
PS:TCP 標頭的結構可以在例如wikipedia 中找到。可以在此答案中找到如何將資料包位元組與標頭欄位匹配的說明。此外,可以在此處找到發件人視窗的插圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/398079.html
上一篇:從while回圈匯出到csv檔案
