"OSError: [WinError 10022] An invalid argument was supplied" when trying to send TCP SYN packet (python)

"OSError: [WinError 10022] An invalid argument was supplied" when trying to send TCP SYN packet (python)

目前正在尝试使用原始套接字在 python 上进行握手过程,但由于某些原因,我无法发送任何使用 TCP 协议接收 OSError 的数据包:[WinError 10022] 提供了无效参数。这是我的代码:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.sendto(packet, ('8.8.8.8', 80))

作为数据包,我尝试使用 scapy 的 TCP 数据包,使用其他库成功发送后来自 wireshark 的 TCP 字节以及手工制作的字节串:

def chksum(packet: bytes) -> int:
    if len(packet) % 2 != 0:
        packet += b'[=11=]'

    res = sum(array.array("H", packet))
    res = (res >> 16) + (res & 0xffff)
    res += res >> 16

    return (~res) & 0xffff


class TCPPacket:
    def __init__(self,
                 src_host:  str,
                 src_port:  int,
                 dst_host:  str,
                 dst_port:  int,
                 flags:     int = 0):
        self.src_host = src_host
        self.src_port = src_port
        self.dst_host = dst_host
        self.dst_port = dst_port
        self.flags = flags

    def build(self) -> bytes:
        packet = struct.pack(
            '!HHIIBBHHH',
            self.src_port,  # Source Port
            self.dst_port,  # Destination Port
            0,              # Sequence Number
            0,              # Acknoledgement Number
            5 << 4,         # Data Offset
            self.flags,     # Flags
            8192,           # Window
            0,              # Checksum (initial value)
            0               # Urgent pointer
        )

        pseudo_hdr = struct.pack(
            '!4s4sHH',
            socket.inet_aton(self.src_host),    # Source Address
            socket.inet_aton(self.dst_host),    # Destination Address
            socket.IPPROTO_TCP,                 # PTCL
            len(packet)                         # TCP Length
        )

        checksum = chksum(pseudo_hdr + packet)

        packet = packet[:16] + struct.pack('H', checksum) + packet[18:]

        return packet

所以真的不知道为什么我的套接字不喜欢任何数据包

我发现了问题所在。 Windows 不允许使用原始套接字发送 TCP 数据包,因此此代码永远不会工作。可能可以用 scapy 或使用其他库来编写相同的代码,但这不是我需要的,所以让它工作的唯一方法是 运行 on linux。仍然不确定数据包创建是否正确,但带有原始套接字的 TCP 协议在 linux.

上确实可以正常工作