一、背景
192.168.15.81(linux機器)機器訪問192.168.0.139(linux機器)的任意端口,建立的tcp連接成功,但是連接會莫名奇妙的消失,導致Connection reset的錯誤。
192.168.5.81的mac地址:6C:92:BF:0B:2F:9D(linux)
192.168.0.139的mac地址:未知(linux)
192.168.15.186的mac地址:44-47-C6-37-7D-A6(window)
二、wireshark抓包分析
在linux下執行抓包命令:tcpdump –i eth1 host 192.168.0.139 –w /iflytek/raw.cap,會抓去和0.139上的tcp報文傳遞,如圖所示:
報文分析:15.81和0.139三次握手成功,但是15.81像0.139發送一段Request,Connect(1), Connect的時候,連接莫名奇妙的消失了,導致0.139像15.81發送RST(連接復位)。這個連接到底被誰偷走了呢?答案是:15.81,0.139或者是中間經過的路由均可以斷掉連接。
三、問題排查
機器問題排查
寫了一個簡單的socket程序進行測試, 加入一臺機器192.168.15.186進行測試,15.81~0.139,0.139~15.81,15.81~15.186,15.186~15.81,15.186~0.139,0.139~15.186,程序如下圖:
Reader Writer
1、15.81~0.139發送數據
數據流:15.81-->81網卡-->交換機—>路由1—>交換機—>139網卡—>0.139。
前提條件:將Reader部署到0.139上,Writer部署到15.81上,採用遠程debug的方式控制程序的執行進度,遠程debg命令:java –Xdebug–Xrunjdwp:transport=dt_scoket,address=8555,server=y,suspend=y –jar ****.jar
發送數據:11,21,31,檢測tcp連接正常,不會被斷掉。
發送數據:122,2123,32232,檢測tcp連接,消失了,原因不明。
結果解釋:說明tcp連接15.81~0.139發送數據不能超過兩個字節,這也說明了上文抓包中的過程,因爲三次我手發送的是空包,所以握手可以建立,但是當15.81像0.139發送Connect的包時,tcp連接斷掉了,所以,0.139回覆了RST。
2、0.139 ~ 15.81發送數據
數據流:0.139-->139網卡-->交換機—>路由2—>交換機—>81網卡—>15.81。
前提條件:同上。
發送數據:11,21,31,檢測tcp連接正常,不會被斷掉。
發送數據:122,2123,32232,檢測tcp連接,不會被斷掉。
結果解釋:這個很奇怪,像是單向連通,0.139可以向15.81發送數據,但是15.81不能像0.139發送數據。
3、15.186~0.139發送數據
數據流:15.186-->186網卡-->交換機—>路由1—>交換機—>139網卡—>0.139。
前提條件:同上。
發送數據:11,21,31,檢測tcp連接正常,不會被斷掉。
發送數據:122,2123,32232,檢測tcp連接,不會被斷掉。
結果解釋: 說明15.186可以向0.139發送數據。
4、0.139 ~ 15.186發送數據
數據流:0.139-->139的網卡-->交換機—>路由1—>交換機—>186網卡—>15.186。
前提條件:同上。
發送數據:11,21,31,檢測tcp連接正常,不會被斷掉。
發送數據:122,2123,32232,檢測tcp連接,不會被斷掉。
結果解釋: 說明0.139和15.186是通的。
5、15.81~15.186發送數據
數據流:15.81-->81的網卡-->交換機—>186網卡—>15.186。
前提條件:同上。
發送數據:11,21,31,檢測tcp連接正常,不會被斷掉。
發送數據:122,2123,32232,檢測tcp連接,不會被斷掉。
結果解釋: 說明15.81和15.186是通的。
6、15.186~15.81發送數據
數據流:15.186-->186的網卡-->交換機—>81網卡—>15.81。
前提條件:同上。
發送數據:11,21,31,檢測tcp連接正常,不會被斷掉。
發送數據:122,2123,32232,檢測tcp連接,不會被斷掉。
結果解釋: 說明15.81和15.186相互之間是可以聯通的,側面的反應15.81這臺機器是沒有問題的。
結論:上述測試說明兩臺機器是沒有問題的,肯定是路由的問題。
路由問題排查
Ip限制:對調15.81和15.186的ip,發現沒有效果,可能與ip沒有關係。
Mac地址:mac不能對掉,沒法排查,最後確實是mac地址的問題。
本文希望給大家一個解決connection reset的問題的思路。