
我有兩台伺服器,我使用自己的嵌入式系統和 LwIP 來連接到這些伺服器。
我的 LwIP 嵌入式系統是客戶端,我有 server1 和 server2。我連接到 server1 並在連接到 server2 之前結束連線。
流程的進一步細分:
- 用戶端與 server1 建立新套接字
- Client傳送DNS封包取得server1的ip位址;收到來自 AP 的 ACK
- 客戶端發送TCP SYN資料包;
- Server1發送TCP SYN-ACK並執行一些資料傳輸
- 客戶端透過發送TCP RST封包結束與server1的連線;並關閉套接字
- 用戶端與 server2 建立新套接字
- Client傳送DNS封包取得server2的ip位址;收到來自 AP 的 ACK
- 客戶端向伺服器2發送TCP SYN資料包
- Server2發送TCP SYN-ACK並執行一些資料傳輸
- 客戶端透過發送TCP RST封包結束與server2的連線;並關閉套接字
然而,有時伺服器2沒有回應客戶端的SYN封包,這是在步驟9。我檢查了幾個論壇,例如:
[1]為什麼伺服器不發送 SYN/ACK 封包來回應 SYN 封包
[2]伺服器未發送 SYN/ACK 封包來回應 SYN 封包
我的程式碼沒有啟用視窗縮放。我無法檢查伺服器,因為它是私人伺服器,所以我不太確定它是否被刪除。我的環境非常吵雜且繁忙,有許多路由器和通訊設備。這個問題只發生在吵雜的環境中,在乾淨的環境中則不會出現。
身為客戶我可以做什麼來解決這個問題?
答案1
關於為什麼有時你的伺服器不使用 SYN-ACK 應答的一些想法:
- 發送 SYN 封包時,伺服器上的應用程式將停止:這可能會導致崩潰,然後透過程式的自動重新啟動機制設法再次運作。當伺服器應用程式停止或崩潰時,tcp 偵聽套接字將關閉,因此作業系統不會應答。
- 您的伺服器在找回您的客戶端時遇到了一些麻煩。這可能是一些路由問題或不對稱路由(這會破壞防火牆)。
- 如果用戶端和伺服器位於同一網路上,這可能是第 2 層問題,例如生成樹協定或 ARP。
- 網路中丟包:您的 SYN 或 SYN ACK 封包被丟棄。
- 伺服器不堪重負,有時無法回覆您的 SYN 封包。
可能有很多事情會導致伺服器不應該回答 SYN 封包。
我將要做的 :
- 在伺服器上執行一些 tcpdump 來驗證網路:伺服器是否收到 SYN 封包或網路事先有問題?伺服器是否產生並發送 SYN ACK 封包?並從那裡開始工作。
- 如果您無權存取伺服器,請在最近的路由器/防火牆上執行相同的操作。
- 聯絡有權存取伺服器的人員。