天天看點

Understanding IPv6 第5章——ICMPv6

寫在前面:

一直監督自己寫讀書筆記的原因是因為之前也讀過很多書,但是沒有做筆記。導緻過了一段時間之後啥也沒記住,感覺像沒讀一樣。但是最近又漸漸的發現,我這樣的讀書筆記就是簡單的把書上的内容照搬過來,意義也不大,對效率倒是影響不少。而且将來也不太可能用這個筆記來複習,因為看原書效果可能更好,有目錄,也有細節。是以從今天起開始改變一下風格,隻大概列一下目錄。以及自己對于一些關鍵點的了解或者說疑惑。

2018.05.06

ICMPv6和ICMPv4的作用一樣,用來報告封包在傳遞過程中的錯誤和提供請求響應服務。

ICMPv6為鄰居節點發現群組播偵聽發現提供了資料包架構結構。

ICMPv6分為兩類:

1. 錯誤類 中間路由器或目标節點報告封包在傳遞過程中遇到的錯誤。如主機不可達,封包過大。類型範圍為0-127

2. 消息類 提供問題定位和其他附加功能,如MLD和ND。類型範圍為128-255

ICMPv6 header

IP封包頭的HEADER字段值58表示ICMPv6。ICMPv6頭部結構如下:

Understanding IPv6 第5章——ICMPv6

Type,Code和ICMPv4中字段意思一緻。

Checksum 需要添加在上一章介紹過的僞頭部。

ICMPv6 Error Messages

ICMPv6封包(加IP頭部)長度都不會超過1280位元組,即IPv6要求的鍊路層最小MTU。

錯誤消息有以下幾種:

1. Destination Unreachable

印象中就隻有路由不可達這一種,但是實際上有多達6種目的不可達:

路由不可達

與目的位址的通信被管理者禁止

超過位址的範圍:我了解為比如是一個源位址是私網位址的封包,需要通過一個公網接口轉發,就是超過了位址的範圍。

位址不可達:無法解析對外連結路層位址

端口不可達

源位址未通過出入口政策的檢查

配置到拒絕路由

2. packet too big

當封包的長度超過鍊路層MTU時報此錯誤,并會在封包在包含鍊路層MTU

3. time exceed

hop limit 字段變為0或者封包組裝逾時會發送此錯誤。code分别為0和1

4. Parameter Problem

在解析的過程中出錯。會一個指針指向出錯的位置,哪怕這個位置已經超出能夠包含的原封包。

錯誤分成三種

0 頭部某個字段出錯

1 無法識别的header字段

2 無法識别的選項

ICMPv6 Information Messages

和IPv4中的定義一樣,用來進行故障定位。有echo request, 和echo reply兩種。

每個請求有兩個辨別此請求的字段:identifier,一般每個程式的辨別都會不一樣 ,sequence Number,辨別具體的請求。

echo request可以發往多點傳播位址,RFC4443規定了此類請求應該被響應。源位址選擇接收此請求的接口上的一個單點傳播位址。

Path MTU Discovery

在不分片的前提下,發送單個封包的的長度越大,則效率越高,因為頭部等不是有效載荷。PMTU用來發現整個路徑的最小MTU。原來非常簡單,先發送大小為本機接口MTU的封包,收到ICMPv6的packet too big封包之後再調整包的大小。直到未收到packet too big封包或收到了确認或響應。

如果不支援PMTU,那麼就必須發送大小為最小鍊路MTU——1280位元組的包。

當PMTU發生變化時,如果是變小,那麼收到packet too big封包後很快就能調整包的大小。但是當PMTU變大之後,需要主動探測才能發現,RFC1981要求收到packet too big封包5分鐘之後才能嘗試,推薦值為10。

參考

understanding IPv6

深入解析IPv6 第3版

繼續閱讀