3.5 ICMPv6 報文和報文型別

kmist發表於2024-04-05

目錄
  • 3.5 ICMPv6 報文和報文型別
  • 1. ICMPv6 報頭
  • 2. 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() 所有鄰居發現類函式都有這個函式處理。後文展開。

相關文章