路徑MTU
路徑MTU是源和目的間所有鏈路MTU中最小的MTU值。發送節點使用ICMPv6包過大信息發現路徑MTU。
1. 發送節點將路徑MTU設爲發送通信的接口連接鏈路的MTU。
2. 發送節點發送路徑MTU大小的數據包。
3. 如果某個中繼路由因爲轉發鏈路的MTU值小於數據包大小,則會丟棄數據包併發送ICMPv6包過大信息給發送節點,在包過大信息中包含了轉發失敗那條鏈路的MTU值。
4. 重複步驟2到4。
當收到從目的地址發送的ACK包時則路徑MTU確定。
多播監聽發現
MLD是路由器和節點間交換信息的一組方法,由RFC 2710定義,允許路由器發現各接口監聽的多播地址集。和IGMPv2類似,MLD僅發現那些至少有一個監聽者的多播地址列表,而不是每個多播地址的多播監聽者列表。
和IGMPv2不同的是,MLD使用ICMPv6信息代替專有信息結構。包括ICMPv6信息的130,131和132類型:
l 多播監聽質詢(Multicast Listener Query)
路由器使用多播質詢來獲取一條鏈路上的多播監聽者。存在兩種質詢信息:普通質詢(General Query)和多播地址質詢(Multicast-Address-Specific Query)。前者用於獲取所有多播地址的監聽者,後者用於獲取某個多播地址的監聽者。
l多播監聽報告(Multicast Listener Report)
多播監聽者使用多播監聽報告來報告正在監聽的多播通信情況,或者回應多播監聽質詢。
l多播監聽完成(Multicast Listener Done)
多播監聽者使用多播監聽完成來報告其對某個特定的多播地址不在感興趣。
下圖是MLD信息包的結構:
一個MLD信息包由IPv6包頭,下一跳選項擴展頭和MLD信息組成。RFC 2711規定下一跳選項擴展頭中必須包括IPv6路由器警報選項(Router Alert Option),用來確保路由器處理髮送到它不監聽的多播地址的MLD信息。
多播監聽質詢
MLD多播監聽質詢信息等同於IGMPv2的主機成員請求(Host Membership Query)信息。
在IPv6包頭中,源地址是發送請求的端口的本地鏈路地址,跳數限制置爲1。對普通質詢,目的地址是包括本地鏈路範圍內所有節點的多播地址(FF02::1);對多播地址質詢,目的地址是欲質詢的多播地址。
下面是MLD多播監聽質詢信息的結構:
MLD多播監聽質詢信息的類型字段置爲130,code字段置爲0。校驗值後是16位最大響應延遲,是等待MLD多播監聽報告信息的超時時間,隨後是16位的保留字段。最後的多播地址字段,普通質詢信息包會置爲未指明地址(::);多播地址質詢會置爲欲質詢地址。
多播監聽報告
MLD多播監聽報告信息等同於IGMPv2的主機成員報告(Host Membership Report)信息。
在IPv6包頭中,源地址是發送報告的端口的本地鏈路地址,跳數限制置爲1。目的地址是欲報告的多播地址。
下面是多播監聽報告信息的結構:
MLD多播監聽報告信息的類型字段置爲131,code字段置爲0。校驗值之後的最大響應延遲在多播監聽報告信息包中置爲0,最後的多播地址是欲報告的多播地址。
多播監聽完成
MLD多播監聽完成等同於IGMPv2的離開組(Leave Group)信息。
在IPv6包頭中,源地址是發送報告的端口的本地鏈路地址,跳數限制置爲1。目的地址是包含本地鏈路範圍內所有路由器的多播地址(FF02::2)。
下面是MLD多播監聽完成信息的結構:
MLD多播監聽完成信息的類型字段置爲132,code字段置爲0。校驗值後的最大響應延遲依舊置爲0,最後的多播地址是發送節點不在監聽的多播地址。
ICMPv6頭的前一包頭或擴展頭的下一頭字段值爲58。
下面是ICMPv6的結構:
Type-顯示信息類型,8位。
Code-區分同一信息類型的多個信息,8位,如此類型信息僅有一個,置爲0。
Checksum-信息的校驗值。
Message body-包含ICMPv6信息的特殊數據。
ICMPv6錯誤信息
爲減小帶寬損耗,ICMPv6的錯誤並不發送發生的每個錯誤,而是有限速(rate limited)。限速或者基於時間(每個源在每T毫秒[建議值爲1000]內發送一個錯誤信息),或者基於帶寬利用率(每個接口發送的錯誤信息速率不能超過鏈路帶寬的P%[建議值爲2])
目的地不可達
當數據包不能被轉發或送達到目的地時發送目的地不可達的ICMPv6包。
下圖是目的地不可達信息的結構:
目的地不可達包的類型字段置爲1,code字段從0到4。在校驗值後是32位的保留字段,然後是被丟棄數據包的節選,makes the entire IPv6 packet containing the ICMPv6 message no larger than 1280 bytes (the minimum IPv6 MTU).一個沒有擴展頭的ICMPv6數據包,丟棄數據包部分將有1280字節(1280字節減去40字節的IPv6頭和8字節的ICMPv6目的地不可達頭)。
下面是code字段不同值的含義
Code value |
Description |
0 |
路由表中沒有匹配目的地的路由項。 |
1 |
與目的地的通信被管理策略禁止。僅用於數據包被防火牆丟棄。 |
2 |
The address is beyond the scope of the source address. |
3 |
目的地不可達。一般是無法解析目的節點的鏈路層地址。(已到達目的子網) |
4 |
端口不可達。例如一個UDP包到達目的地址但沒有應用程序監聽此UDP端口。 |
包過大
當轉發鏈路的MTU值小於數據包的大小時將發送一個ICMPv6包過大信息。
下面是CMPv6包過大信息的結構:
包過大的類型字段置2,code字段置0,校驗值後是32位的MTU,保存轉發鏈路的MTU值,最後的丟棄數據包部分與目的地不可達信息的一致。
超時
當數據包的跳數限制字段(和TTL類似的Hop Limit字段)爲0是發送超時信息。
下圖是超時信息的結構:
超時信息的類型字段置3,code字段置0(當跳數限制字段爲0)或1(目的地重組碎片超時),校驗值後的保留字段和丟棄包部分與目的地不可達信息的一致。
參數錯誤
當IPv6的包頭或擴展頭中有錯誤時發送參數錯誤信息,避免進行進一步的處理。
下面是ICMPv6參數錯誤信息的結構:
參數錯誤信息的類型字段置4,code字段從0到2。校驗值後是32位的指示(Pointer)字段,標識錯誤發生地方的字節偏移量,隨後的丟棄數據包與前文一致。
下面是code字段不同值的含義:
Code value |
Description |
0 |
包頭或某個擴展頭的某個字段有錯誤。 |
1 |
一個不可識別的下一頭區域值。等同於IPv4的目的地不可達-協議不可達(Destination Unreachable-Protocol Unreachable)信息。 |
2 |
一個不可識別的IPv6選項。 |
ICMPv6報告信息
回寫請求
回寫請求/迴應信息用來檢查可連通性和路由問題,回寫請求信息發送給目的地請求回寫回應信息。
下面是回寫請求信息的結構:
回寫請求的類型字段置爲128,code字段置爲0,校驗值後是16位標識字段和16位序列號字段,被髮送主機用以匹配收到的回寫回應信息。最後的Data字段可以是任意的0或多個字節。
回寫回應
下面是回寫回應信息的結構:
回寫回應信息的類型字段置129,code字段置0,校驗值後也是16的標識字段和16位的序列號字段,最後的數據字段要和回寫請求信息的數據字段內容一致。
Value (in decimal) |
Header |
0 |
Hop-by-Hop Options Header |
6 |
TCP |
17 |
UDP |
41 |
Encapsulated IPv6 Header |
43 |
Routing Header |
44 |
Fragment Header |
46 |
Resource ReSerVation Protocol |
50 |
Encapsulating Security Payload |
51 |
Authentication Header |
58 |
ICMPv6 |
59 |
No next header |
60 |
Destination Options Header |
比較IPv4和IPv6的頭
IPv4 Header Field |
IPv6 Header Field |
版本 |
同樣字段但值不同 |
包頭長度 |
沒有,包頭長度恆定爲40字節 |
TOS |
被Traffic Class field替代 |
數據包全長 |
被負載長度取代,沒有全長字段 |
Identification |
從包頭去處,包含在分片擴展頭中 |
TTL |
被Hop Limit字段取代 |
Protocol |
被Next Header字段取代(沒有擴展頭是和Protocol一樣) |
包頭校驗值 |
去除,全包的比特級糾錯由鏈路層完成 |
Source Address |
一樣,除了長度 |
Destination Address |
一樣,除了長度 |
Options |
去處,被擴展頭取代 |
IPv6擴展頭
IPv4包頭包括所有可選項,路由器需要檢查它們,影響轉發效率。在IPv6中,傳輸和轉發選項都移到了擴展頭中,每個中繼路由器必須處理的擴展頭只有一個,就是下一跳選項(Hop-by-Hop Options)擴展頭,加快了包頭處理速度,並提高了轉發效率。
RFC 2460定義了下列擴展頭,所有的IPv6節點都必須支持:
l 下一跳選項頭
l目的選項頭(Destination Options header)
l路由頭(Routing header)
l分片頭(Fragment header)
l驗證頭(Authentication header)
lESP頭(Encapsulating Security Payload header)
一個標準IPv6的數據包不含擴展頭,但如果中繼路由器或目的要求特殊處理,發送主機會添加一個或多個擴展頭。每個擴展頭長度必須是8字節的倍數,如果不夠,就填充。
下圖是幾個示例:
擴展頭順序
擴展頭是按順序進行處理的。因爲下一跳選項頭是要被所有中繼節點處理的,所以它必須是第一個,對其他擴展頭這一原則同樣使用,RFC 2460規定了以下擴展頭的排列順序:
1.下一跳選項頭
2.目的選項頭(當路由頭存在時供中繼目的使用)
3.路由頭
4.分片頭
5.認證頭
6. ESP頭
7.目的選項頭(供最終目的使用)
IPv6 MTU
IPv6要求鏈路層最小必須支持1280字節的數據包。如果不能支持,則需要提供鏈路層的分片和重組機制。如果鏈路層支持可配置的MTU大小,IPv6推薦配置爲最少1500字節(也就是以太網封裝的IPv6 MTU),一個可配置MTU的例子是PPP鏈路的MRU(Maximum Receive Unit)。
和IPv4類似,IPv6使用ICMPv6的數據包過大(Packet Too Big)信息來發現路徑MTU(Path MTU Discovery)。
IPv6源主機可以利用分片擴展頭將超過路徑MTU大小的上層PDU負載分片。IPv6節點必須能重組1500字節以上的碎片包。
ICMPv6
同IPv4一樣,IPv6使用ICMP,不過同IP一樣升級到了版本6。繼承了大部分IPv4 ICMP功能,報告傳輸或轉發錯誤,併爲排錯提供簡單的回寫服務。
ICMPv6協議提供瞭如下框架:
l多播監聽發現(Multicast Listener Discovery, MLD)
MLD是3種ICMPv6信息的集合,用以取代IPv4的IGMPv2,管理子網內的多播成員。
l鄰居發現(Neighbor Discovery, ND)
ND是5種ICMPv6信息的集合,管理同一鏈路上的點到點通信。鄰居發現取代ARP、ICMPv4路由發現和ICMPv4重定向信息。
ICMPv6信息類型
l錯誤信息
目的節點或中繼路由使用錯誤信息報告IPv6數據包在傳輸或轉發過程中的錯誤。ICMPv6錯誤信息的8位類型字段值從0到127(最高位置0)。ICMPv6錯誤信息包括目的不可達、包過大、超時和參數錯誤(Destination Unreachable, Packet Too Big, Time Exceeded, and Parameter Problem)。
l報告信息
報告信息用來提供各種功能的診斷信息,例如MLD和ND。ICMPv6報告信息的8位類型字段值從128到255(最高位置1)。ICMPv6報告信息包括回寫請求和回寫回應(Echo Request and Echo Reply)。
IPv6和DNS
RFC 1886定義了爲IPv6設計的增強型DNS,增強了兩個新組件:
l主機地址資源記錄(Host address(AAAA) resource record)
l反向解析的IP6.ARPA域(IP6.ARPA domain for reverse queries)
注意:RFC 3152中的IP6.ARPA取代了RFC 1886的IP6.INT。
主機地址資源記錄
一個新的DNS資源記錄類型,AAAA(念做“quad A”)被用來解析完全限定域名(fully qualified domain name)到IPv6地址。例如
host1.microsoft.com IN AAAA FEC0::2AA:FF:FE3F:2A1C
IP6.ARPA域
IP6.ARPA域被用來創建IPv6的反向解析。爲反向解析提供名稱空間,在分層反向域名中,地址中的每個16進制數將被完全倒置。例如,FEC0::2AA:FF:FE3F:2A1C的反向查找域名名稱(reverse lookup domain name)是:
C.1.A.2.F.3.E.F.F.F.0.0.A.A.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.C.E.F.IP6.ARPA.
源和目的地址選擇
與IPv4不同,IPv6主機普遍的擁有多個地址,使得DNS名稱請求迴應信息(DNS Name Query Response message)中有多個IP地址,使得通信時源和目的地址的選擇更加複雜。一般而言,通過範圍和目的選擇地址。
RFC 3484定義要求一下算法:
l源地址選擇算法選擇與目的地址最合適的源地址
l目的地址選擇算法列出一個可能目的地址的列表,並按優先級排序
IPv4和IPv6的地址等價
IPv4 Address |
IPv6 Address |
多播地址 (224.0.0.0/4) |
多播地址(FF00::/8) |
多播地址 |
沒有 |
未指明地址是0.0.0.0 |
未指明地址是:: |
迴環地址是127.0.0.1 |
迴環地址是::1 |
公用IP地址 |
全局單播地址 |
自有IP地址(10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16) |
本地網絡地址 (FEC0::/10) |
自配置地址 (169.254.0.0/16) |
本地鏈路地址 (FE80::/64) |
書寫方式:點分十進制 |
書寫方式:冒號-16進制,前綴0壓縮,IPv4兼容地址依舊使用點分十進制表示 |
網絡位表示:點分十進制或前綴長度表示 |
網絡位表示:僅支持前綴長度表示 |
IPv6頭
IPv6頭中去掉了IPv4裏不常用的字段,提供更好的實時通信(real-time traffic)。
IPv6數據包結構
下面是IPv6的數據包結構:
IPv6頭
固定長度40個字節,細節後面介紹
擴展頭(Extension Headers)
支持0或多個變長的擴展頭。IPv6頭中的下一頭地址(Next Header)字段標明瞭下一個擴展頭,然後每個擴展頭都有下一頭地址字段標明下一個擴展頭,最後一個擴展頭的此字段用以標識負載內的上層協議(例如TCP,UDP或者ICMPv6)。
IPv6的擴展頭取代IPv4頭的可選字段,使IPv6能更好的支持未來的需求。與IPv4的可選字段不同,IPv6的擴展頭沒有大小限制,可以任意擴展。
上層協議數據單元
上層協議數據單元(PDU)通常包含上層協議頭和它的負載(例如ICMPv6、UDP或TCP)。
IPv6數據包的負載包括IPv6的擴展頭和上層PDU,一般的,支持65545字節大小,如果負載超過,需要使用Jumbo Payload option in the Hop-by-Hop Options extension header。
IPv6頭
下圖是RFC 2460定義的IPv6頭結構
各字段含義如下:
Vision-4位的IP協議版本號,置爲6
Traffic Class-數據包優先級,8位,類似IPv4的TOS,由RFC 3697定義。
Flow Label-標識數據包是從哪兒到哪兒的,需要中間路由器的支持,20位。用於標識那些需要特殊處理的數據通信,例如實時數據,默認置爲0。同一源和目的間可能有多個流,使用不同的Flow標識進行區分。
Payload Length-顯示IPv6的負載大小,16位,因此負載最大爲65535字節,超過此大小,the Payload Length field is set to 0 and the Jumbo Payload option is used in the Hop-by-Hop Options extension header.
Next Header-顯示第一個擴展頭(如果有)或者上層PDU協議號,8位。使用的上層協議號和IPv4一致。
Hop Limit-定義數據包能經過最大路由跳數,類似IPv4的TTL,8位。當Hop Limit等於0,數據包將被丟棄,併發送一個ICMPv6超時信息(Time Exceeded message)給源地址。
Source Address-源地址,128位
Destination Address-目的地址,128位。大多數時候目的地址是最終目的地址,但如果源路由擴展頭(Routing extension header)存在,目的地址可能是源路由列表的下一路由接口。(還是支持源路由)