2014-11-03 103 views
5

我有一個非常奇怪的網絡問題。實際的網絡配置非常複雜,因爲我使用Openstack和Docker來構建虛擬網絡。然而,這個問題並不存在,因爲我正在捕獲主機的接口,並以正確的方式看到所有數據包......但由於某些原因,我不知道,似乎TCP忽略了它們,儘管它們有已收到:它不會爲它們發送ACK,也不會將數據發送給應用程序。TCP接收數據包,但它忽略它們

在我的試驗中,我向主機(192.168.4.100)的服務器碼頭(IP 192.168.4.3)發送了一個HTML頁面的HTTP GET請求。

我看到捕捉上192.168.4.100使用Wireshark的是:

192.168.4.100 -> SYN -> 192.168.4.3 
192.168.4.3 -> SYN, ACK -> 192.168.4.100 
192.168.4.100 -> ACK -> 192.168.4.3 

192.168.4.100 -> GET/HTTP/1.1 -> 192.168.4.3 
192.168.4.3 -> ACK -> 192.168.4.100 
192.168.4.3 -> Fragment 1 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 

192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 

192.168.4.100 -> ACK of Fragment 1 -> 192.168.4.3 

192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 

192.168.4.100 -> ACK of Fragment 2 -> 192.168.4.3 

192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 
192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 

192.168.4.100 -> ACK of Fragment 3 -> 192.168.4.3 

這實際上是一個很大的問題,因爲有GET請求,並與當下一致的最後一個ACK約40秒應用程序(在這種情況下是telnet)獲取數據。

我已經檢查所有的校驗和,它們是正確的......

所以其實我不知道爲什麼會這樣,做些什麼!我嘗試過使用不同的操作系統作爲主機(Windows 8手機,MAC OSX,Ubuntu 14.04,...),但沒有任何變化。 如果我從虛擬網絡的另一個泊塢窗發送相同的請求,一切工作正常。

關於問題可能是什麼的任何想法?

謝謝!

PS在這裏你可以看到捕獲的截圖:

enter image description here

更新

一兩件事,我覺得會很有意思的是,我做了一個類似的拍攝,但是當一個HTTP請求從192.168.4.3發送到192.168.4.100。在192.168.4.100接口上再次捕獲捕獲,並且似乎192.168.4.100再次忽略它接收到的數據包(例如,查看三次握手)。我發現沒有理由再次。

enter image description here

+0

1.您在哪裏拍攝?在服務器還是客戶端? 2.機器之間的MTU是多少? 3.每個片段的大小是多少? 4.響應的大小是多少? – Malt 2014-11-03 14:57:09

+0

1 - 正如我所說,我捕獲主機192.168.4.100的接口; 2 - MTU是1454,因爲它們之間有一個GRE隧道;這些片段的長度是1454,但是最後的長度是327字節。 – mgaido 2014-11-03 15:05:42

+0

你可以將整個捕捉髮布在某個地方嗎?我想看看時間和一些TCP/IP標頭......如果它包含任何專有的東西,您可以刪除HTTP負載。只是捕獲看起來很奇怪,如果它真的被捕獲在客戶端。 – Malt 2014-11-03 15:11:27

回答

1

我設法解決了我的問題。我在這裏發佈解決方案,如果有人遇到同樣的問題,這個解決方案很有用

問題是,我禁用了TSO(TCP-分割的卸載)上的虛擬橋到我的碼頭工人附接有該命令:

ethtool -K IFACE_NAME tso off 

它關閉只TSO,而校驗和卸載仍然存在。很明顯,這會產生一些問題,儘管Wireshark向我展示了TCP校驗和是確定的,但事實上並非如此。所以主機由於錯誤的TCP校驗和而忽略了數據包。

要關閉TSO和校驗過,我只是用命令:

ethtool --offload IFACE_NAME rx off tx off 

現在一切正常。

相關問題