首页 文章

在实例化icmp ipv6之后,在v6 python套接字中设置'next header'字节

提问于
浏览
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方面最有经验的人 .

2 回答

  • 1

    这应该这样做:

    socket.getprotobyname('ipv6-icmp')
    
  • 4

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

相关问题