題 具有PSH的重傳序列,ACK標誌意味著什麼(以及虛假的重傳)?


我在服務器上 192.168.0.2 並希望進行HTTP調用 192.168.0.1(兩個服務器都是RPis並運行Linux(raspbian))。

curl -XGET http://192.168.0.1:8081/api

API上 192.168.0.1 (我正在調用)是我的(基於的Python腳本) bottle)並且大部分時間都在工作。 HTTP偵聽部分有時會神秘地掛起,這會導致 curl 呼叫上面掛,然後超時。

我跑了 tcpdump 當API沒有響應時,在192.168.0.1(接收服務器,承載API的那個)上 wireshark 分析在呼叫發起後立即顯示一些重傳:

enter image description here

通常這種行為的原因是什麼? (如果有“通常”原因)。

注1:我將根據需要修改API,以便為Web服務器部分記錄更多數據,但由於掛起的不可重現性,我懷疑它是它的錯(其他部分(線程)工作得很好而且有沒有任何線程崩潰)。

注意2:重新啟動服務器(也可能重新啟動腳本本身(我不會這樣做,因為我寧願重啟機器))修復了問題。


4
2018-01-08 15:54


起源




答案:


具有PSH的重傳序列,ACK標誌意味著什麼(以及虛假的重傳)?

通常這種行為的原因是什麼? (如果有“通常”   原因)。

PSH ACK Wireshark Trace

(另見 ServerFault - 在我的期間PHA確認    連接

ACK表示發送帶有ACK的數據包的機器是   承認它從其他機器收到的數據。在   TCP,一旦建立連接,由任一個發送的所有數據包   side將包含一個ACK,即使它只是重新確認數據   它已經被承認了。

PSH是發件人的指示,如果是接收機器的話   TCP實施尚未提供它收到的數據   正在讀取數據的代碼(程序或程序使用的庫),   它應該在那時這樣做。引用RFC 793,官方   TCP規範:

在連接上流動的數據可以被認為是流的   字節。發送用戶在每個SEND呼叫中指示是否有數據   應立即推送該呼叫(以及任何先前的呼叫)   通過設置PUSH標誌直到接收用戶。

允許發送TCP從發送用戶收集數據   以便利的方式將這些數據分段發送,直到推送為止   函數發出信號,然後它必鬚髮送所有未發送的數據。當一個   接收TCP看到PUSH標誌,它不能等待更多的數據   在將數據傳遞給接收進程之前發送TCP。


虛假重傳

如果您看到虛假重傳,則表示發件人   以為包丟失並再次發送,即使是   接收方為它發送了一個確認包。


可能的原因

  • 服務器和客戶端計算機之間的配置錯誤
  • TCP數據包的跳轉路徑上任何發送方和接收方之間的配置錯誤
  • 防火牆規則或數據包過濾器阻止數據

附加故障排除

  • 發生這種情況時也請檢查服務器日誌
  • 在服務器上使用Wireshark運行TCP跟踪,以查看問題發生時這些數據包的外觀

6
2018-01-08 17:38