gpt4 book ai didi

python - 在从 Python 原始套接字接收的数据包中交换了两个字节

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:21 25 4
gpt4 key购买 nike

我的 Python 程序正在从原始套接字接收 ICMP 目标不可达消息。使用以下代码创建套接字:

socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)

ICMP 目标不可达消息包含原始数据包一部分的副本。我遇到的问题是嵌入式 IPv4 header 中的 2 字节总长度字段在从套接字接收时交换了字节。因此,我的程序中的校验和检查失败。使用以下代码接收数据包:

packet, sockaddr = socket_.recvfrom(bufsize)

当我注意到校验和测试失败时,我使用 tcpdump 检查了数据包。这是一个例子:

11:54:36.377352 IP (tos 0xc0, ttl 64, id 36894, offset 0, flags [none], proto ICMP (1), length 112)
10.200.200.200 > 10.175.211.104: ICMP host 10.175.211.13 unreachable, length 92
IP (tos 0x0, ttl 63, id 49898, offset 0, flags [none], proto ICMP (1), length 84)
10.175.211.104 > 10.175.211.13: ICMP echo request, id 29449, seq 6, length 64
0x0000: 45c0 0070 901e 0000 4001 3807 0ac8 c8c8
0x0010: 0aaf d368 0301 fcfe 0000 0000 4500 0054
0x0020: c2ea 0000 3f01 fcea 0aaf d368 0aaf d30d
0x0030: 0800 403f 7309 0006 9b43 7718 e292 a89a
0x0040: 28cf 5283 dc65 8219 2778 837b 6c54 92f4
0x0050: 5092 e976 568c 6681 2afc 2b82 628d d0f6
0x0060: 2fa7 3493 1f48 9fdb ed98 2f53 da0e 87a6

然后我从我的 Python 代码中打印出数据包。这是来自 tcpdump 示例的相同数据包:

45,c0,5c,0,90,1e,0,0,40,1,38,7,a,c8,c8,c8,
a,af,d3,68,3,1,fc,fe,0,0,0,0,45,0,54,0,
c2,ea,0,0,3f,1,fc,ea,a,af,d3,68,a,af,d3,d,
8,0,40,3f,73,9,0,6,9b,43,77,18,e2,92,a8,9a,
28,cf,52,83,dc,65,82,19,27,78,83,7b,6c,54,92,f4,
50,92,e9,76,56,8c,66,81,2a,fc,2b,82,62,8d,d0,f6,
2f,a7,34,93,1f,48,9f,db,ed,98,2f,53,da,e,87,a6,

嵌入头的总长度字段是第 2 行的最后两个字节。来自 tcpdump 的 0054 和来 self 的程序的 5400。外部 IP header 的总长度字段也是错误的(5c00 与 tcpdump 中的 0070)。

我在跑...

Python 2.6.1(r261:67515,2010 年 6 月 24 日,21:47:49)[GCC 4.2.1 (Apple Inc. build 5646)] 在 Darwin 上

来自 tcpdump 的 ICMP 目标不可达数据包中的校验和字段是正确的。它的值为 fcfe。这是没有 out IP header 的数据包。

0x0010:            0301 fcfe 0000 0000 4500 0054
0x0020: c2ea 0000 3f01 fcea 0aaf d368 0aaf d30d
0x0030: 0800 403f 7309 0006 9b43 7718 e292 a89a
0x0040: 28cf 5283 dc65 8219 2778 837b 6c54 92f4
0x0050: 5092 e976 568c 6681 2afc 2b82 628d d0f6
0x0060: 2fa7 3493 1f48 9fdb ed98 2f53 da0e 87a6

让我感到困惑的是,只有总长度字段针对网络字节顺序进行了更正。其他多字节字段没有改变,打印出来和我的Python程序一样。例如,在 tcpdump 和我的打印输出中,总长度后的两个字节构成了值为 c2ea 的标识字段。我如何确定应该交换哪些字段以检查校验和?

最佳答案

这些字段可能是网络字节顺序(即 big-endian ),并且您使用的是小端机器。因此,需要字节交换。 struct library内置于 Python 中的应该可以帮助您解决 deserialization这些消息。请引用7.3.2.1. Byte Order, Size, and Alignment部分.

我建议引用 RFC每个正在使用的协议(protocol)(例如 RFC 791RFC 792)的文档,以进一步了解字段是如何序列化的。

关于python - 在从 Python 原始套接字接收的数据包中交换了两个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com