【问题标题】:Why the bytes stream got by python socket.recvfrom is different from that crawled by WireShark?为什么 python socket.recvfrom 得到的字节流与 WireShark 爬取的字节流不同?
【发布时间】:2019-02-16 16:30:51
【问题描述】:

我使用 python 套接字发送一个 DNS 查询数据包套接字并监听响应。最后,我通过socket.recvfrom(2048)函数得到了一个DNS响应包,正如预期的那样。但奇怪的是,我将响应包与Wireshark抓取的包进行比较,发现有很多不同。

在第二张图片中会发现差异为3f

Wireshark抓取的DNS响应包(高亮部分)

socket.recvfrom(2048)得到的DNS响应包

创建插座部分代码:

    ipv = check_ip(dst)
    udp = socket.getprotobyname(Proto.UDP)
    if ipv == IPV.ERROR:
        return None
    elif ipv == IPV.IPV4:
        return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
    elif ipv == IPV.IPV6:
        return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, udp)
    else:
        return None

接收DNS响应包部分代码:

    remained_time = 0
    while True:
        remained_time = self.timeout - timeit.default_timer() + sent_time
        readable = select.select([sock], [], [], remained_time)[0]
        if len(readable) == 0:
            return (-1, None)

        packet, addr = sock.recvfrom(4096)

【问题讨论】:

  • 请发布文字,而不是文字的图片。并告诉我们您发现有趣的差异部分。它们在我看来差不多。
  • 你的意思是编码不同吗?
  • 不,我的意思是字节流本身。将突出显示的部分与第二张图片中的字节进行比较。在第二张图片中将发现差异为3f

标签: python sockets recvfrom


【解决方案1】:

字节 0x3F 是 ASCII '?' 字符。这通常意味着数据被视为文本并通过不支持正在转换的字节的字符集转换。

请注意,0x3F 仅替换 > 0x7F(ASCII 支持的最后一个字节)的字节。 0x80-0xFF 范围内的非 ASCII 字节受字符集解释的影响。

这是有道理的,因为您使用的是返回stringrecvfrom() 版本,因此需要将接收到的字节转换为Python 的默认string 编码。

由于您需要原始字节,因此请使用 recvfrom_into() 填充预分配的 bytearray,例如:

packet = bytearray(4096)
remained_time = 0
while True:
    remained_time = self.timeout - timeit.default_timer() + sent_time
    readable = select.select([sock], [], [], remained_time)[0]
    if len(readable) == 0:
        return (-1, None)
    nbytes, addr = sock.recvfrom_into(packet)

然后您可以根据需要使用packet 最多nbytes 字节数。

【讨论】:

  • 非常感谢!似乎仍有一些字节低于0x7f 并转换为0x3f。比如第一张图片中的shifen·com被翻译成第二张图片中的shifen?·?+
  • @TreeSimith 回到我关于“通过 不支持正在转换的字节的字符集转换的观点​​。无论使用什么字符集来生成 @987654338 @ 显然没有在它们出现的上下文中为字节 0x6E0x63 定义任何字符。您还会注意到 string 包含不在源字节中的 0x16 字符。您的数据是转换为string 时会损坏,因此请放弃转换。
猜你喜欢
  • 2020-12-24
  • 2013-02-12
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多