Python Socket发送带空格REST动词开头的TCP消息延迟发送问题求助
Python Socket发送TCP数据的异常现象排查
在使用Python Socket发送TCP数据时发现一个特殊异常:当在新连接中发送以"PUT "、"POST "、"DELETE "或"GET "(带空格)开头的TCP数据包时,消息要等到Socket关闭时才会发送。
具体细节
- 发送其他内容(所有测试过的内容)均正常,可立即发送;
- 先发送其他内容,再发送"PUT "等消息时,发送正常;
- 在"PUT "消息后发送其他内容,同样无法立即发送;
- 空格是必要条件:仅"POST"无空格时发送正常,空格后的内容不影响延迟,比如"POST some more data"也无法立即发送;
socket.sendall调用立即返回,但TCP数据包直到Socket关闭才发送,已通过Wireshark抓包确认;- 尝试设置
TCP_NODELAY选项无效。
测试代码
import socket from time import sleep sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("198.18.2.2", 8764)) sock.sendall(b"PUT ") sleep(10)
上述代码中,"PUT "会在10秒后才发送,发送端Wireshark抓包日志如下:
No Time Source Destination Len Info 1 0.000000 198.18.2.1 198.18.2.2 TCP 66 59465 → 8764 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM 2 0.000813 198.18.2.2 198.18.2.1 TCP 60 8764 → 59465 [SYN, ACK] Seq=0 Ack=1 Win=512 Len=0 MSS=1460 3 0.000976 198.18.2.1 198.18.2.2 TCP 54 59465 → 8764 [ACK] Seq=1 Ack=1 Win=64240 Len=0 4 10.003259 198.18.2.1 198.18.2.2 TCP 58 "PUT " (0x50 0x55 0x54 0x20) 5 10.003331 198.18.2.1 198.18.2.2 TCP 54 59465 → 8764 [FIN, ACK] Seq=5 Ack=1 Win=64240 Len=0 6 10.004227 198.18.2.2 198.18.2.1 TCP 60 8764 → 59465 [ACK] Seq=1 Ack=5 Win=508 Len=0 7 10.011112 198.18.2.2 198.18.2.1 TCP 60 8764 → 59465 [FIN, ACK] Seq=1 Ack=6 Win=508 Len=0 8 10.011318 198.18.2.1 198.18.2.2 TCP 54 59465 → 8764 [ACK] Seq=6 Ack=2 Win=64240 Len=0
疑问
目前无法确定根因,这类REST动词似乎被特殊处理,是Python?Windows?还是TCP层面的问题?
后续排查更新
- 发送完整HTTP消息
"PUT /file.txt HTTP/1.1\r\nHost: 198.18.2.2\r\nConnection: close\r\nContent-Length: 0\r\n\r\n"可立即发送; - 将服务器部署在本地主机,发送此类特定消息可正常立即收发;
- 推测存在拦截类机制,会暂存类HTTP消息直到内容"完整",因处于企业环境,安全软件/防火墙是重点排查方向;
- 设备连接拓扑:PC(客户端)<->Linux路由器<->µC(服务器)。
内容的提问来源于stack exchange,提问作者Sloothword
相关产品推荐
相关产品推荐

