- A+
所属分类:linux技术
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()
所有邻居发现类函数都有这个函数处理。后文展开。