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

为何Python Scapy构造的数据包存在额外数据?我仅需发送最后8字节

问题原因
  • 你用Scapy构造的IP()/TCP()/message结构是完整的三层+四层网络报文,其中IP()生成20字节IP头部、TCP()生成20字节TCP头部,你把整个结构转成bytes发送时,这40字节的头部就变成了多余内容,只有末尾8字节是你要的负载数据。
  • 你创建的是SOCK_STREAM类型的TCP socket,内核会自动处理TCP连接维护、IP/TCP头部封装逻辑,不需要你手动构造报文头,手动构造的头会被内核当成普通负载一起发出,导致内容不符合预期。
解决方案

直接发送你已经转成二进制的目标负载即可,不需要用Scapy构造报文结构,修改后的代码如下:

import time
import binascii
import socket
from openpyxl import load_workbook

filepath = "c:/Users/Don/PycharmProjects/HVACSCHEDULE-PLUS/Updates.xlsx"
wb = load_workbook(filepath)
print(wb.sheetnames)
sheet = wb['Sync']
updatedata = sheet["B1"].value
updatedata2 = updatedata.replace(" ", "")
print("This is Update Data", updatedata2)
message = binascii.a2b_hex(updatedata2)

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("192.168.1.47", 10001))
    time.sleep(150)
    print(message)
    s.send(message)
    print("Request sent!")
    s.close()
except Exception as e:
    print(f"An error occurred: {e}")

如果确实需要用Scapy自定义TCP报文参数(比如自定义序号、标志位等),需要使用原始套接字(raw socket)发送完整构造报文,避免内核重复封装,且需要自行处理TCP三次握手逻辑,普通场景下不推荐该方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 20:06:00