2

所以我有一个像下面这样的套接字:

sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("icmp"))

当我根据RFC4443发送一个正确构造的ICMP6 ECHO REQUEST,类型为128,代码为0(也是经过验证的校验和),数据包被目的地的堆栈丢弃,因为数据包格式不正确,显然,因为IPv6中的“下一个标头”字节每个 RFC 的标头设置为 1(# 表示 ICMP)。

两件事:1. 我知道 socket.getprotobyname("icmp") 使套接字 ICMP 与 IPv4 兼容(对吗?)... 2. Wireshark 将数据包读取为 IPv6,但协议作为 ICMP 而不是 ICMPv6...

要么将套接字设置为使用 protocolbyname("icmpv6") (这显然是无效的。除非有人知道正确的字符串......我已经尝试过 "icmp6" "icmpv6" 但可能有一些我可以尝试使用下划线) .

或者在我将数据包发送到 58 之前更改“下一个标头”字节。

LAST RESORT 手动构造数据包。

有人有想法吗?显然,我在 Python 方面不是最有经验的。

4

2 回答 2

4

这应该这样做:

socket.getprotobyname('ipv6-icmp')
于 2013-10-04T15:39:02.280 回答
1

对于遇到此问题的任何人, socket.getprotobyname('<proto>') 返回与 /etc/protocols (Unix) 和 /c/windows/system32/drivers/etc/protocols (Windows) 中的平面文件中列出的协议相对应的整数。去看一下!这是 IP 标头中唯一特定于其有效负载中的数据的字节。Unix 机器上的列表包含所有协议,至少在 mac 上是这样,而 Windows 仅包含最常见的协议。您也可以编辑此文件。

于 2013-10-05T20:23:13.283 回答