3.5 ICMPv6 报文和报文类型
3.5 ICMPv6 报文和报文类型
1. ICMPv6 报头
ICMPv6的报头由 type(8bit)\ code(8bit)\ checksum(16bit) 和 可变数据组成,由于可变数据太多,这里暂不罗列,由具体协议展开。

struct icmp6hdr {
__u8 icmp6_type;
__u8 icmp6_code;
__sum16 icmp6_cksum;
...
}
在 ICMPv6 的消息分类中,Type字段的最高位为0时(0-127),表示错误消息,为1时(128-255),表示信息消息。ICMPv4 中则使用error字段来表示。
2. ICMPv6 报文类型
下面是ICMPv6 报文的类型。(部分)

在 ICMPv6 中,没有像 ICMPv4 一样的数组icmp_pointers[]来注册各种消息的处理函数,而是使用一个大的 switch 来选择不同消息类型的处理函数。
| TYPEID | 消息类型 | 处理函数 |
|---|---|---|
| 1 | ICMPV6_DEST_UNREACH | icmpv6_notify |
| 2 | ICMPV6_PKT_TOOBIG | icmpv6_notify |
| 3 | ICMPV6_TIME_EXCEED | icmpv6_notify |
| 4 | ICMPV6_PARAMPROB | icmpv6_notify |
| 128 | ICMPV6_ECHO_REQUEST | icmpv6_echo_reply |
| 129 | ICMPV6_ECHO_REPLY | ping_rcv |
| 130 | ICMPV6_MGM_QUERY | igmp6_event_query |
| 131 | ICMPV6_MGM_REPORT | igmp6_event_report |
| 132 | ICMPV6_MGM_REDUCTION | -- |
| 133 | NDISC_ROUTER_SOLICITATION | ndisc_rcv |
| 134 | NDISC_ROUTER_ADVERTISEMENT | ndisc_rcv |
| 135 | NDISC_NEIGHBOUR_SOLICITATION | ndisc_rcv |
| 136 | NDISC_NEIGHBOUR_ADVERTISEMENT | ndisc_rcv |
| 137 | NDISC_REDIRECT | ndisc_rcv |
处理函数进行归纳有:
查询处理: icmpv6_echo_reply() \ ping_rcv() \ igmp6_event_query() \ igmp6_event_report()
差错处理: icmpv6_notify()
邻居发现函数处理:ndisc_rcv() 后文展开。
icmpv6_echo_reply()负责处理echo请求。ping_rcv()负责处理echo应答。这个方法同ICMPv4 共用,是个双栈函数。igmp6_event_query()负责处理组播侦听者查询,后文展开。igmp6_event_report()负责处理组播侦听者报告, 后文展开。icmpv6_notify()负责处理接收到的错误消息,并且统计。ndisc_rcv()所有邻居发现类函数都有这个函数处理。后文展开。
浙公网安备 33010602011771号