Skip to main content
 首页 » 编程设计

Python icmpv6 客户端

2025年05月04日8think

我正在开发一个简单的 icmpv6 客户端,我在校验和方面遇到了一些问题 这是代码,wireshark 显示校验和设置不正确, 回溯显示错误,如 pcs.FieldBoundsError: 'Value must be between 0 and 65535'

import pcs, sys 
from socket import * 
from pcs.packets.ethernet import * 
from pcs.packets.ipv6 import * 
from pcs.packets.icmpv6 import * 
 
class packet: 
    def __init__(self, src, dst, mac): 
        self.src = src 
        self.dst = dst 
        self.mac = mac 
 
    def construct(self): 
        e               = ethernet() 
        e.src           = ether_atob("de:de:de:de:de:de") 
        e.dst           = ether_atob(self.mac) 
        e.type          = ETHERTYPE_IPV6 
 
        ip6               = ipv6() 
        ip6.version       = 6 
        ip6.traffic_class = 0 
        ip6.flow          = 0   
        ip6.length        = 8              # icmpv6 packet length 
        ip6.next_header   = IPPROTO_ICMPV6 
        ip6.hop           = 255 
        ip6.src           = inet_pton(AF_INET6, self.src) 
        ip6.dst           = inet_pton(AF_INET6, self.dst) 
 
        icmp6           = icmpv6(ICMP6_ECHO_REQUEST) 
        icmp6.code      = 0 
        icmp6.id        = 0xf0 
        icmp6.seq       = 1 
        icmp6.mtu       = 1280 
        icmp6.checksum  = 0 
 
        ip6.length      = len(icmp6.getbytes()) 
        ip6.flow        = len(ip6.getbytes()) + ip6.length 
 
        icmp6.checksum  = icmp6.cksum(ip6) 
        pkt = pcs.Chain([e, ip6, icmp6]) 
 
        s = pcs.PcapConnector('eth0') 
        s.write(pkt.bytes, len(pkt.bytes)) 
 
if __name__=='__main__': 
    p = packet(sys.argv[1], sys.argv[2], sys.argv[3]) 
    p.construct()                      

请您参考如下方法:

这似乎与一个bug有关在导致错误校验和计算的 python-pcs 中。剪掉错误位应该有效:

cs = icmp6.cksum(ip6) & 0xffff