TCP服務器不回覆SYN的問題

我的問題發生環境:服務器

1.TCP服務器是虛擬機,IP地址是192.168.8.12。網絡

2.TCP客戶端是宿主機,IP地址是192.168.8.11。tcp

3.從宿主機(192.168.8.11)上啓動Socket,發現無響應。spa

4.從服務器(192.168.8.12)上抓包,發現能抓到來自宿主機(192.168.8.11)的SYN消息。code

5.然而服務器不響應SYN,ACK。blog

排查過程:ip

1、去網上找了找,可能的緣由之一就是時間戳的問題。路由

1 當客戶端發出的syn包帶有時間戳的狀況下,通過NAT轉換後,若是使用的端口被以前使用過,並且時間戳大於本次syn包中的時間戳。系統將會直接丟棄。形成本次連接沒法正常完成TCP/IP的3次握手。
2 解決的方法很簡單,分爲兩種:
3 在客戶端:關閉rfc1323
4 在服務端:設置sysctl.conf裏面tcp_timestamps=0也能夠只用命令sysctl -w net.ipv4.tcp_timestamps=0

嘗試了一下,在個人環境裏解決不了問題。開發

2、找不到其餘的緣由了,因爲以前個人客戶端是可以成功鏈接服務器的。字符串

我用了一個最直接的方法,從新寫了一個只鏈接的簡單的TCP客戶端連接例子。

奇怪的事情發生了,這個DEMO能連接成功!

3、步驟二是個好消息,我能夠抓包對比了。

失望:全部的TCP設置參數都是同樣的。

繼續分析包的上層內容。

起色:網絡層的MAC地址不同!

4、問題初步緣由找到了。

虛擬機不回覆SYN的緣由是這個時候的包的目的地不是虛擬機,虛擬機起了箇中轉做用。

目的地是哪兒呢?我掃描局域網內的機器,發現是個人網關地址。

5、進一步的緣由?

爲何看起來一樣的代碼,卻導向了不一樣的網絡目的地,涉及網關,那就是跨網段路由了啊?

6、真相只有一個!

1 手動寫的Demo,服務器的地址是靜態的字符串「192.168.8.12」。
2 出問題的程序,我從配置文件裏讀取的配置信息,而配置的地址是「192.168.1.12」(兩個開發環境的內網網段不同)。
3 簡單的總結緣由就是【粗心】。
相關文章
相關標籤/搜索