所以我有一个像下面这样的套接字:
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 方面不是最有经验的。