Python 请求拆分 TCP 数据包

Chr*_*n H 5 python tcp python-requests

我正在尝试使用 python 编写 HTTP POST 请求脚本。

使用 bash 中的 curl 尝试它时,一切正常。使用 python,使用 therequestsurllib3-library,我收到来自 API 的错误响应。POST 请求包含标头中的信息和请求正文中的 json。

我注意到,当我用 Wireshark 拦截数据包时,curl 请求(正在工作)是一个长度为 374 字节的数据包。python-request(这里requestsurllib3这里没有区别)被分成 2 个单独的数据包,长度分别为 253 和 144 字节。

在此处输入图片说明

Wireshark 可以毫无问题地重新组装它们,它们似乎都在标题和 POST 正文中包含完整信息。但是我试图通过一个不是很有帮助的“处理请求时出错”的 API 连接到答案。

由于 253 字节不能成为 TCP 数据包的限制,这种行为的原因是什么?有没有办法解决这个问题?

编辑:

重击:

curl 'http://localhost/test.php' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' -H 'Content-Type: application/json' -d '{"key1":"value1","key2":"value2","key3":"value3"}'
Run Code Online (Sandbox Code Playgroud)

Python:

import requests, json

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
"Content-Type": "application/json"}

data = {"key1":"value1", "key2":"value2", "key3":"value3"}

r=requests.post("http://localhost/test.php", headers=headers, data=json.dumps(data))
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 3

TCP 是一个数据流,而不是一系列消息。将数据流分段为数据包应该与数据流的解释无关,无论是发送者还是接收者。如果接收者实际上根据数据包的分段表现不同,则接收者已损坏。

虽然我见过这样损坏的系统,但我也见过更多的系统由于不同的原因而不喜欢该请求,例如错误的用户代理、缺少接受标头或类似的情况。我建议您先检查一下,然后再得出结论,这一定是数据流的分段。

至于为什么curl和requests的行为不同:可能curl首先构造完整的请求(标​​头和正文)并发送它,而requests首先构造标头并发送它,然后发送正文,即执行两次写入操作,这可能会导致两个数据包。