ICMPv6 套接字的原理与用途ICMPv6 协议角色ICMPv6RFC 2463是IPv6的核心协议不仅处理错误报告如ICMPv6_DEST_UNREACH还承担了IPv4中ARP协议的功能邻居发现协议NDP如路由公告RA和邻居请求NS。套接字类型通过socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)创建原始套接字可直接收发ICMPv6报文用于NDP协议的实现如邻居请求响应路径MTU发现Packet Too Big报文路由器重定向处理 。关键套接字选项ICMP6_FILTER选项用于设置过滤器仅接收特定类型的ICMPv6报文。例如structicmp6_filterfilter;ICMP6_FILTER_SETBLOCKALL(filter);ICMP6_FILTER_SETPASS(ND_NEIGHBOR_SOLICIT,filter);setsockopt(sockfd,IPPROTO_ICMPV6,ICMP6_FILTER,filter,sizeof(filter));这将只接收邻居请求报文类型136。校验和偏移IPV6_CHECKSUM通过setsockopt设置校验和计算位置引用[2]intoffset2;// 校验和数据偏移量setsockopt(sockfd,IPPROTO_ICMPV6,IPV6_CHECKSUM,offset,sizeof(offset));非负值内核自动计算/校验-1由应用层处理仅用于原始套接字。示例代码框架#includenetinet/icmp6.h#includenetinet/in.hintmain(){intsockfdsocket(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6);// 设置ICMPv6过滤器structicmp6_filterfilter;ICMP6_FILTER_SETBLOCKALL(filter);ICMP6_FILTER_SETPASS(ICMP6_ECHO_REQUEST,filter);setsockopt(sockfd,IPPROTO_ICMPV6,ICMP6_FILTER,filter,sizeof(filter));// 启用内核校验和计算intcsum_offset2;setsockopt(sockfd,IPPROTO_ICMPV6,IPV6_CHECKSUM,csum_offset,sizeof(csum_offset));// 接收/发送报文逻辑略close(sockfd);return0;}注意事项权限需求创建原始套接字通常需要root权限。操作系统差异BSD系如OpenBSD的选项名可能为ICMP6_FILTER而Linux实现遵循RFC。报文结构ICMPv6报文头包含类型1字节、代码1字节和校验和2字节其后为具体载荷如NDP选项。