You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中正确拆分HTTP请求为固定大小的TCP数据包?

在Python中拆分TCP数据包的正确方法

TCP是字节流协议,本身不存在“固定大小数据包”的概念——操作系统会根据网络MTU等因素自动分片传输。但如果你需要手动控制每次发送的字节数(比如固定512字节),只要在同一个TCP连接上分批发送即可,这样所有分片都会属于同一个流,服务器能按正确顺序重构请求。

实现步骤与代码示例

  1. 将HTTP请求转换为字节串
  2. 建立到目标节点的TCP连接(复用同一个socket)
  3. 按512字节拆分数据,循环发送每个分片
import socket

# 定义要发送的HTTP请求
http_request = (
    "GET / HTTP/1.1\r\n"
    "Host: 127.0.0.1\r\n"
    "Accept: text/html\r\n"
    "Accept-Encoding: gzip, deflate, br\r\n"
    "Accept-Language: en-US,en;q=0.9\r\n\r\n"
)
# 编码为字节串
raw_data = http_request.encode("utf-8")

def send_fixed_chunks(sock, data, chunk_size=512):
    # 按指定大小拆分数据并发送
    for start in range(0, len(data), chunk_size):
        end = start + chunk_size
        chunk = data[start:end]
        # 使用sendall确保整个分片被发送(避免缓冲区未满导致的部分发送)
        sock.sendall(chunk)

# 建立TCP连接并发送数据
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcp_socket:
    # 连接到下一个节点的IP和端口
    tcp_socket.connect(("127.0.0.1", 80))
    # 分块发送请求
    send_fixed_chunks(tcp_socket, raw_data)
    # 如需接收响应,可添加如下代码
    # response = tcp_socket.recv(4096)
    # print(response.decode("utf-8"))

关键注意事项

  • 复用同一个socket:所有分片必须通过同一个已建立连接的socket发送,这是保证在同一TCP流的核心。如果每次发送都新建socket,才会导致不同流、服务器无法重组的问题。
  • 使用sendall():相比send(),sendall()会自动处理网络缓冲区满的情况,循环发送直到整个分片完成传输,避免数据丢失。
  • TCP的顺序保障:TCP协议本身会保证字节的顺序交付,只要是同一连接,服务器收到的字节顺序和发送顺序完全一致,无需额外处理排序问题。

内容的提问来源于stack exchange,提问作者pekusbill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:12:35