Python

Python 套接字:Linux 中的 TCP 錯誤,而相同的程序在 Windows10 上執行良好

  • May 17, 2021

我正在嘗試使用 python 套接字通過 TCP/IP 與商用電源設備進行通信。

我嘗試在同一網路介面上同時使用虛擬 linux(centos8stream)和虛擬 windows10,它們都在同一台物理電腦上執行。兩者都有python3.9。

我想像 tcp/ip 套接字在兩個作業系統中都可以正常工作,但我只在 linux 中遇到了一些通信問題:

  • 幾次嘗試後,發送和接收之間的延遲變得更長(2 秒而不是 0.14 秒)
  • 有時我會超時,根本無法與設備通信。

我讓 Wireshark 在兩個作業系統中執行:

  • 在 Windows 中沒有異常消息(很少有 TCP 重傳)
  • 在 linux 中,經過一段時間(或有時立即)wireshark 會被 TCP Dup Ack、TCP Fast Retransmission 和 TCP Spurious Retransmissions 淹沒。

我的問題:

  1. 差異的根源可能是什麼?我可以嘗試任何套接字選項嗎?
  2. 有沒有辦法比較linux和windows10中的網路參數?

連續讀取設備標識的範常式序:

import socket
from time import sleep,time
HOST = '10.27.4.50'
PORT = 4444

#Create object and open the connection
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))

client.settimeout(5)

# Read identification
message=(b'*IDN?\r\n')

for i in range(5):
   start_time = time()
   client.sendall(message)
   rep=client.recv(1024)
   print("Trial {}, delay: {} seconds ".format(i,time() - start_time))
   sleep(1)

client.close()

視窗:

Trial 0, delay: 0.17121100425720215 seconds
Trial 1, delay: 0.10957813262939453 seconds
Trial 2, delay: 0.17148327827453613 seconds
Trial 3, delay: 0.13976049423217773 seconds
Trial 4, delay: 0.14109373092651367 seconds

linux(看到最後一條消息需要更長的時間才能收到響應,這對應於 TCP 錯誤的開始)

Trial 0, delay: 0.15080499649 seconds
Trial 1, delay: 0.143104076385 seconds
Trial 2, delay: 0.170531988144 seconds
Trial 3, delay: 0.183187961578 seconds
Trial 4, delay: 2.0480530262 seconds

注意:我還嘗試了一台物理 linux 機器,也有同樣的問題。

我認為問題與 tcp 時間戳有關。在 linux 中,預設情況下 tcp_timestamp 是啟用的,在 windows 中它是禁用的。

在 linux 上禁用 tcp 時間戳,可以解決問題:

sysctl -w net.ipv4.tcp_timestamps=0

相反,在 Windows 上啟用時間戳會重現我在 linux 上觀察到的相同問題。

netsh int tcp set global timestamps=enabled

進一步探勘,我看到設備發送數據包時開始發生諸如 Dup Ack 之類的 tcp 錯誤,其時間戳低於前一個數據包。設備的硬體/韌體中可能存在錯誤,它會創建錯誤的時間戳。

引用自:https://serverfault.com/questions/1061780