3.5 ICMPv6 报文和报文类型

3.5 ICMPv6 报文和报文类型

1. ICMPv6 报头

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

image-20240331123223221

struct icmp6hdr {

	__u8		icmp6_type;
	__u8		icmp6_code;
	__sum16		icmp6_cksum;
	...
}

在 ICMPv6 的消息分类中,Type字段的最高位为0时(0-127),表示错误消息,为1时(128-255),表示信息消息。ICMPv4 中则使用error字段来表示。

2. ICMPv6 报文类型

下面是ICMPv6 报文的类型。(部分)

image-20240331140444535

在 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() 所有邻居发现类函数都有这个函数处理。后文展开。
posted @ 2024-04-05 18:01  kmist  阅读(381)  评论(0编辑  收藏  举报