Python Requests 拆分 TCP 数据包

标签 python tcp python-requests

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

当用 bash 的 curl 尝试时,一切正常。对于 python,使用 requestsurllib3-library,我从 API 收到错误响应。 POST 请求包含 header 中的信息和请求正文中的 json。

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

enter image description here

Wireshark 毫无问题地重新组合了它们,并且它们似乎都包含 header 和 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"}'

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))

最佳答案

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

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

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

关于Python Requests 拆分 TCP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50213271/

相关文章:

python - 如何从字典列表中获取字典的数据

具有持久 TCP 服务器套接字的 Java 应用程序高可用性/故障转移

python - 多线程套接字客户端冲突

python - 操作系统错误 : Could not find a suitable TLS CA certificate bundle

python - 如何在 SSH 中发送 HTTP 请求?

python - 如何使用 BeautifulSoup 和请求抓取受密码保护的网站

python - 计算列中的天数 groupby

python - 在 Python 中比较样本均值与随机分类

python - 我如何在 Python 中序列化 json?

vb.net 服务器 - 多个客户端不断处理不同的信息