Python
Python 套接字:Linux 中的 TCP 錯誤,而相同的程序在 Windows10 上執行良好
我正在嘗試使用 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 淹沒。
我的問題:
- 差異的根源可能是什麼?我可以嘗試任何套接字選項嗎?
- 有沒有辦法比較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 錯誤,其時間戳低於前一個數據包。設備的硬體/韌體中可能存在錯誤,它會創建錯誤的時間戳。