CCIE 學習 基礎篇 (二) IPv6 基礎
一、概述
延緩IPv4地址耗盡的短期方案之一為NAT(Network Access Translation)。NAT技術在延緩IPv4地址耗盡問題方面非常成功,在大多數網路設計中已經成為一個標準部分。
NAT技術的缺陷:把原來具有開放、透明、對等特點的Internet變成了看上去更像一個具有客戶-伺服器(Client-Server)結構的網路的巨大集合。而使用者則只在外圍連線到Internet的”邊緣層“,Internet向它們提供服務。使用者很少對Internet的整體資源做出貢獻。更多的從某種經濟的角度看,Internet的使用者僅僅成為了消費者,而不是生產者。
推動IPv6發展的兩個基本動力:1、 諸如移動IP協議(Mobile IP)、服務質量保證(QoS)、端到端的安全、網格計算(Grid Computing)、點到點網路互連等核心概念的新型應用。NAT技術遏制了這些領域的創新,因而摒棄NAT技術的惟一手段是提供充足的並且易用使用的公共IP地址。 2、擁有眾多人口的國家的快速的現代化發展,例如中國和印度。有些國家不得不繼續保留一個具有4~5層NAT技術的網路層次架構,以支援對IPv4地址的需求。
二、IPv6地址
IPv6地址與IPv4的地址區別不僅表現於地址長度不同,更重要的是表示格式和功能組織差別非常大。
不像IPv4地址字首可以通過點分十進位制、十六進位制地址掩碼或位計數方式來表示,IPv6協議的字首始終通過位計數的方式來標識。一個有全0組成的IPv6地址可以被簡寫為一個雙冒號。有兩種例項使用了全0地址。第一是預設地址,是全0的形式,並且長度也是0,即, ::0/0。第二個全0的IPv6地址的例項是未指定地址(unspecified address),未指定地址使用在某些鄰居發現協議中。與缺失地址的區別在於長度不同: ::0/128.
IPv6的地址型別:單播(Unicast)、任意播(Anycast)和多播(Multicast)。
IPv6通用的單播地址格式:
全球路由字首(48) | 子網ID (16) | 介面ID (64) |
多播地址:
多播地址標識一組裝置——一個多播組(multicast group)。在一個數據包中,多播地址只能作為目的地址,從來不會出現在源地址中。多播傳送實際是IPv6的一個基本的操作,尤其是對於即插即用特性的一些功能,如路由器發現和地址自動配置等,這些功能是鄰居發現協議的一部分。
多播地址格式如下圖所示:
多播字首 (0xFF) | 標記(4) | 範圍(4) | 組ID(112) |
0x0 | 保留 |
0x1 | 節點本地 |
0x2 | 鏈路本地 |
0x5 | 地區本地 |
0x8 | 組織本地 |
0xE | 全球 |
0xF | 保留 |
三、IPv6包頭格式
版本(4) | 流量類別(8) | 流標籤(20) | |
有效載荷長度(16) | 下一報頭(8) | 跳數限制(8) | |
源地址 | |||
目的地址 |
版本(version):4位的欄位,用來指出IP協議的版本
流量類別(Traffic Class): 8位的欄位,相當於ToS欄位
流標籤(Flow Lable):IPv6獨有的欄位,長度為20位,這個欄位的目的是允許位特定的業務流打上標籤。資料包不僅始發於相同的源和達到相同的目的地,而且在源和目的地都屬於相同的應用。區分不同的流可以帶來幾方面的優點:可以提供更精細的服務類別區分的顆粒,在平衡業務流通過多條路徑時可以確保屬於同一個流的資料包能夠總是轉發到相同的路徑上,以便避免對資料包進行重新排序。流(微分流,microflows)可以用源地址、目的地址加上源和目的埠的組合來確定。但是為了識別源和目的埠,Router必須能夠看到IP報頭的上層——TCP或UDP報頭——增加了轉發處理的複雜性,並可能影響Router的效能。到目前為止,如何使用流標籤目前還存在爭論,因此目前Router總是忽略此欄位。
有效載荷長度(Playload Length):不包含報頭的長度,因為報頭長度固定為40位元組
下一包頭(Next Header):指出了跟隨該IPv6報頭後面的報頭,與IPv4中的協議報頭類似
跳數限制(Hop Limit):與IPv4協議中的生存時間(TTL)類似
在IPv6報頭中,很明顯缺少的一個欄位是IPv4報頭中包含的校驗和欄位。在現代傳輸介質的可靠性全面提高的今天(無線介質除外)——由於上層協議通常攜帶位元組的錯誤校驗和恢復機制,IPv6報頭本身的校驗和就體現不出太多的價值,因此被去掉。
四、IPv6擴充套件報頭
與IPv4報頭相比,IPv6報頭更加簡潔和高效,把不常用的選項欄位放到了擴充套件報頭中,這樣做可以在2個方面提高效率:
1)資料包僅僅需要傳送各自資料包所需要的資訊,不需要傳送用不著的欄位
2)可以定義新的擴充套件報頭來增加新的可選功能。
目前有以下幾個擴充套件報頭:
1)逐條可選項(Hop-by-Hop Options)——傳送必須被轉發路徑中的每一個節點都檢驗處理的資訊,目前有2個選項:路由器警告和超大包有效載荷選項。
2)路由選擇(Routing):類似於IPv4中的源路由選項,列出在達到目的地路徑中資料包所要經過的節點列表來提供源路由選擇的功能
3)分段(Fragment):與IPv4不同,IPv6只有在發起該資料包的節點能夠對資料包進行分段,中間節點對報文不分段。因此源節點要麼使用路徑MTU發現(Path MTU Discovery,PMD),要麼不發出大於1280的資料包。IPv6協議規定所有鏈路必須能夠支援最小1280的資料包
4)封裝安全載荷(Encapsulating Security Payload, ESP)——用於有效載荷的加密封裝
5)認證報頭(Authentication Header,AH)——用於資料包必須在源於目的節點之間進行認證的情況
6)目的地可選項(Destination Options)——用於傳送僅僅被目的節點,或者可能是路由選擇報頭中列出的節點檢驗處理的資訊。
建議的擴張報頭順序如下:
1.IPv6 報頭, 1)逐條可選項 2)目的地可選項(只有在路由選擇報頭中指定的中間路由器才必須處理這個報頭)3)路由選擇 4)分段 5)認證 6)ESP 7)目的地可選項 8)上層報頭
五、ICMPv6
如IPv4類似,IPv6也需要一個控制協議來交換與處理錯誤和資訊的訊息。IPv6也使用ICMP來實現這個功能。在IPv4中ICMP使用的協議號是1,而在IPv6中協議中ICMPv6使用的下一報頭值為58.
如ICMPv4,ICMPv6也使用一組型別與程式碼值得組合來標識一般的型別和子型別。
型別(8) | 程式碼(8) | 校驗和(16) |
可變欄位(依賴於ICMPv6的型別) |
1 | 目的不可達 | |
0 | 沒有到達目的地的路由 | |
1 | 和目的地通訊被管理員禁止 | |
2 | 不是鄰居 | |
3 | 地址不可達 | |
4 | 埠不可達 | |
2 | 0 | 資料包長度太大 |
3 | 超時 | |
0 | 傳輸中超出跳數限制 | |
1 | 分片的重組時間超時 | |
4 | 引數問題 | |
0 | 遇到錯誤的報頭欄位 | |
1 | 遇到不可識別的下一報頭型別 | |
2 | 遇到不可識別的IPv6選項 | |
128 | 0 | ECHO請求 |
129 | 0 | ECHO回覆 |
130 | 0 | 組成員請求 |
131 | 0 | 組成員報告 |
132 | 0 | 組成員減少 |
ICMPv6除了基本的錯誤和資訊訊息外,還使用了一組單獨的由基本的IPv6協議ICMPv6訊息鄰居發現協議
六、鄰居發現協議(Neighbor Discovery Protocol, NDP)
IPv6協議除了顯著的增加了地址空間之外,另一個顯著的特徵即是其即插即用特性。鄰居發現協議(NDP)就是使用以下的功能來實現這些即插即用特性:
1)路由器發現(Router Discovery)——當一個節點連線到一個IPv6的鏈路時,它能夠發現本地的路由器,而不必藉助於DHCP
2)字首發現(Prefix Discovery)——當一個節點連線到IPv6的鏈路時,能夠發現分配給該鏈路的字首
3)引數發現(Parameter Discovery)——節點能夠發現它所連線的鏈路的引數,例如鏈路的MTU和條數限制等。
4)地址自動配置(Address Autoconfiguration)——節點能夠確定它的完整地址,同樣不需要DHCP
5)地址解析(Address Resolution)——不需要地址解析協議(ARP)就能夠發現所連線鏈路上其他節點的鏈路層地址
6)下一跳確定(Next-hop Determination)——一條鏈路上的節點能夠確定到達目的節點的下一跳鏈路層節點,或者是本地目的地節點,或者是到達目的地節點的路由器
7)鄰居不可達檢測(Neighbor Unreachable Detection)——節點能夠檢測到鏈路上的鄰居何時不再可達,鄰居可能其他主機也可能是一臺路由器。
8)地址衝突檢測(Duplicate Address Detection)——節點能夠檢測到它所要使用的地址是否已經被所在鏈路上的其他節點佔用
9)重定向(Redirect)
NDP訊息通常應該在鏈路本地的範圍內收發,因此,封裝NDP訊息的資料包也始終使用IPv6鏈路本地地址,或者使用鏈路本地範圍內的多播地址。為了增加更進一步的安全性,承載所有NDP訊息的IPv6資料包的跳數限制為255,如果所受到的資料包中有跳數限制的值小於255,說明至少經過了一臺路由器,因而該資料包將被丟棄。這樣可以阻止NDP受到不與本地鏈路相連的源節點的攻擊或欺騙。
NDP訊息
NDP使用ICMPv6協議來交換一些必要的訊息,RFC2461中詳細說明了以下5個新的ICMPv6訊息:
1)路由器通告(Router Advertisement,RA)訊息——有Router發起,用了通告這些Router的存在和鏈路細節的引數,如鏈路字首、鏈路MTU,以及跳數限制等。可以週期的發生,也可用於答覆路由器請求訊息。
2)路由器請求(Router Solicitation, RS)訊息——由主機發起,用了請求Router傳送一個RA
3)鄰居請求(Neighbor Solicitation,NS)訊息——鄰居請求訊息由節點主機發起,用來請求另一臺逐句的鏈路層地址,也用來實現諸如地址衝突檢測和鄰居不可達檢測的功能
4)鄰居通告(Neighbor Advertisement,NA)訊息——節點發送一個鄰居通告訊息來響應鄰居請求訊息。如果一個節點改變了它的鏈路層地址,那麼它能夠通過傳送一個位請求的鄰居通告訊息來通告這個地址。
5)重定向(Redirect)訊息——重定向訊息的使用和IPv4小相同,只不過從基本的ICMPv6協議中抽取了一部分移到了NDP中。
NDP RA訊息格式:
型別(8bit) | 程式碼(8bit) | 校驗和(16bit) | ||
跳數限制 | M | O | 保留 | 路由器生存時間 |
可達時間 | ||||
重傳時間 | ||||
可選項 |
型別是134,程式碼是0.源地址總是始發這個資料包的介面的IPv6鏈路本地地址。如果是週期傳送,則目的地址是所有節點的多播地址(FF02::1),如果是應當一個RS訊息,則目的地址是發起請求的節點的鏈路本地地址。
跳數限制(Hop Limit)——如果該值被設定,那麼鏈路上的節點將再它始發到鏈路上的所有資料包都設定該值。如果沒有跳數限制,則為0
M——管理地址的配置標記,如果設定了該值,則始發路由器就會利用DHCPv6協議來告訴鏈路上的主機使用有狀態地址自動配置。否則,鏈路上的地址使用無狀態地址自動配置。
O——其他的有狀態配置標記。當設定該位,始發Router告訴所在鏈路上的主機使用DHCPv6來獲取其他的鏈路資訊。M和O可以一起使用
路由器生存時間——當是一臺預設路由器時,該欄位才設定為非0的值。再這種情況下,該欄位指定為該預設路由器的存活時間,以秒為單位
可達時間——(Reachable Time)用於實現NDP中鄰居不可達檢測功能的欄位。當一個節點確認它的鄰居是可達後,可達時間會指定一個時間值,在該時間內,這個節點假定它的鄰居是可達的,以毫秒為單位
重傳時間——(Retransmit Timer)——用於實現NDP協議裡有關地址解析和鄰居不可達功能的欄位,它指定了重傳鄰居請求的最小時間。
Ra的可選項可以包括以下內容:
1)傳送RA的Router介面的鏈路層地址
2)所在鏈路的MTU說明
3)分配給鏈路的一個或多個字首,是無狀態地址自動配置的基本資訊,告訴鏈路上的主機該鏈路的字首資訊
NDP RS訊息格式:
型別(8bit) | 程式碼(8bit) | 校驗和(16bit) |
保留 | ||
可選項 |
型別是133,程式碼值為0.封裝RS的IPv6資料包的源地址,要麼是始發該訊息的介面所分配的IPv6地址,要麼是一個用::0表示的未指定地址(在沒有分配地址的情況下)。目的地址是所有路由器多播地址(FF02::2).
可選欄位包括了始發該訊息介面的鏈路層地址。但如果封裝資料包的源地址是未指定的,則不一定包括源鏈路層地址。
NDP NS訊息格式:
型別(8bit) | 程式碼(8bit) | 校驗和(16bit) |
保留 | ||
目標地址 | ||
可選項 |
型別值為135,程式碼是0.源地址要麼是始發該訊息的介面所分配的IPv6地址,要麼是::表示的未指定地址(為地址衝突檢測而傳送的鄰居請求訊息的時候)。目的地址是對應於目標地址的一個被請求節點的多播地址,或者就是目標地址。
目標地址(target Address)——指請求目標的IPv6地址。目標地址永遠不可能是一個多播地址。
可選項包括始發該請求訊息的介面的鏈路層地址。
NDP NA訊息格式:
型別(8bit) | 程式碼(8bit) | 校驗和(16bit) | |||
R | S | O | 保留 | ||
目標地址 | |||||
可選項 |
R——Router標記,如果設定了該位,則表示始發該訊息的節點是一臺路由器。這一欄位用於在鄰居可達性檢測期間已經變為主機的Router
S——是一個請求標記
O——過載標記。當設定該位時,表示鄰居通告訊息中的資訊超出了任何現有鄰居的緩衝條目,需要更新所快取的鏈路層地址。沒有被置位時,說明鄰居通告訊息沒有超出現有鄰居的快取條目。
目標地址——如果是為響應一個NS而發的NA,則目標地址就是NS中的目標地址。否則就是始發節點的地址。
可選項可包含目標鏈路層地址。即始發NA節點的鏈路層地址。
NDP Redirect訊息格式:
型別(8bit) | 程式碼(8bit) | 校驗和(16bit) |
保留 | ||
目標地址 | ||
目的地地址 | ||
可選項 |
目標地址——更好的第一條地址——通常是鏈路上的另一臺路由器的鏈路本地地址
目的地址——被重定向到目標地址的IPv6目的地址。
可選項包括目標地址的鏈路層地址。
可選項的TLV: type:1.源鏈路層地址 2.目標鏈路層地址 3.字首資訊 4.重定向的報頭 5.MTU
1)、路由器發現(Router Discovery)
Router 通過在相連的鏈路上週期性地傳送路由器通告訊息(RA),表明它的存在,並通過RA通告所配置的所有引數。大概用到RA訊息最多的鏈路就是廣播鏈路了,例如乙太網,鏈路上的主機可以收到RA,因而可以學到有關鏈路的必要訊息。
RA傳送的週期是4~1800S,預設為600S。同時規定了RA訊息通告的最小週期是200S,這些通告將在最大值和最小值之間波動以防止鏈路上的同步。未經請求的RA訊息的源地址是傳送該訊息的路由器介面的鏈路本地IPv6地址,而目的是所有節點的多播地址(FF02::1)。
Cisco Router上,只要使用IPv6 Unicast-routing使IPv6有效,就可以再乙太網和FDDI介面上自動地傳送RA訊息。預設的間隔是200s,並可通過命令IPv6 ND ra-interval進行更改,預設條件下,所傳送的路由器通告訊息的路由器生存時間是1800S,並可以通過ipv6 nd ra-lifetime進行改變。如果不希望將鏈路上的某臺路由器作為預設路由器,可以使用該命令將該路由器的生存時間設定為0.可達時間預設為0(未指定),並可以通過IPv6 nd reachable-time進行改變。重傳計時欄位設定為0(未指定),並可以通過ipv6 nd ns-interval進行改變。M標記和O標記可以分別通過命令ipv6 nd managed-config-flag和ipv6 nd other-config-flag來設定。如果禁止某個介面傳送RA訊息,可以通過ipv6 nd suppress-ra來使其無效。
新加入鏈路的主機可以傳送RS訊息去請求鏈路引數,而不必等待200S,RS的目的地址是路由器的多播地址(FF02::2)。當一臺路由器收到一條RS時,它即會發送(有一個5s的延時)一條RA訊息作為迴應。當
當主機收到RA時,將這個Router新增到它的預設Router列表中(除非這個Router將生存時間設定為0,而不能作為預設路由器)
2)地址自動配置(Stateless Address Autoconfiguration)
介面ID加上FE80::即可組成一個鏈路本地地址,可以再鏈路本地進行通訊,而想在更大範圍內進行通訊,需要一個全域性地址,可以通過2種途徑進行獲取:有狀態或者無狀態的地址自動配置。有狀態配置需要藉助於DHCPv6伺服器,無狀態介面ID加上RA訊息中的字首資訊即可組成一個IPv6地址。
3)地址衝突檢測(Duplicate Address Detection)
無論一臺裝置如何獲取這個地址,在使用之前都應進行地址衝突檢測以保證唯一性。
已經獲取一個新地址的節點會把這個新的地址歸類為臨時狀態的地址。在DAD完成之前不能使用此地址。這個節點會發生一個把目標地址欄位設定為該地址的NS訊息來驗證。NS訊息的源地址是未指定地址,而它的目的地址是被請求節點的多播地址。
一個被請求節點的多播地址由字首FF02:0:0:0:0:1:FF00::/104前導,加上目標地址的最後24位組成。
4)鄰居地址解析(Neighbor Address Resolution)
IPv4節點希望和本地鏈路上的另一個IPv4節點通訊時,必須首先發現目的節點的鏈路層地址。IPv4通過ARP來獲得此地址,而IPv6則使用NDP獲取MAC地址。
當一個節點獲得目的節點的IPv6地址時,通過其字首即可判斷目的節點是否是本地鏈路上的鄰居,還是本地鏈路以外的節點並因此需要通過預設路由器才能到達。如果是後一種情況,這個節點應該已經學習到預設路由器的鏈路層地址。但如果是本地鏈路上,則首先查詢鄰居快取是否已經學到次地址。IPv6中的鄰居快取與IPv4協議中的ARP快取非常類似,記錄了網路層的地址和與之關聯的鏈路層地址。
如果一個地址不在鄰居快取中,它也顯示在表中但被標記為不完全的(Incomplete),這表示正在進行該地址的地址解析處理。這樣,主機會發送一個NS訊息到目標節點相關聯的被請求節點的多播地址。NS訊息中應包含源鏈路層可選項(型別1),這樣被請求的節點就會了解到請求節點的鏈路層地址,並由此知道傳送作為答覆的NA訊息傳送到哪個節點。如果RA包含了重傳計時器不為0的值,那麼根據指定的時間間隔可以傳送多個鄰居請求。如果未指定,則NS將會每1000ms重傳一次,直到收到一個NA為止。如果傳送了3個NS後,仍為收到NA,則解析失敗。
假如被請求的節點存在並且NS訊息有效,則回覆一個NA訊息。直到收到相應的NA訊息,傳送請求的節點才能夠將目標節點的鏈路層地址新增到鄰居快取的條目中,並把不完全(Incomplete)狀態更改為可達的(Reachable)狀態。
在Cisco Router上,可以通過Show IPv6neighbors來檢視鄰居快取,
5)私有地址(Privacy Address)
無狀態地址自動配置可能會產生安全問題:即使一臺裝置從一個子網移到另一個子網,它的介面ID也始終保持不變,那麼它就能夠被追蹤,至少這是一個私密的問題。更為嚴重的是,他們可以利用浙西追蹤以及儲存有關你的活動和位置的記錄,來進行犯罪交易。
在RFC3041中,通過定義IPv6私有地址來解決該安全問題。私有地址就是通過偽隨機數字演算法生成的介面ID。介面ID大約一天變化一次,也會在節點獲取一個新的IPv6地址時改變。
但一個經常變化的地址對於可達性是不實際的。希望與你通訊的節點,以及DNS伺服器必須通過一個或一些靜態地址瞭解你所在位置。因此,標準的無狀態配置的IPv6地址保留了你的公共地址;任何一個需要向你傳送資料包的節點都是用這個地址作為目的地址,但當你傳送返回的資料包時,卻使用的私有地址。
6)鄰居不可到達性的檢測
事實上一個鄰居快取條目可以具有一下5種狀態:
1.Incomplete——該狀態說明正在進行鄰居地址的解析處理。一個NS訊息已經為該條目傳送被請求節點的多播地址,但還沒有收到相應的鄰居通告訊息
2.Reachable——該狀態說明地址已經被確認是可到達的。“目前被確認”的意思是在Router RA訊息中的Reachable Time欄位指定的時間內,已經收到了某些可達性的訊息。如果RA中沒有指定Reachable time,那麼將使用30s作為預設的可達時間
3.Stale——該狀態說明自從收到最新的有關到達目的地的可達性肯定的確認後,已經經歷了Reachable Time所指定的時間
4.Probe——該狀態是指沒經過Retransmit Time時間或每1000Ms(未指定Retransmit Time),節點就會通過向目的節點發送NS訊息來搜尋可達性的確認
5.Delay——當一個數據包傳送到一個處於Stale狀態的目的節點時,這個地址就進入到該狀態。如果該地址在Delay狀態等待了5s,在這段時間內還沒收到有關可達性的確認,則鄰居就轉到到Probe狀態。這個狀態是在節點發出搜尋的鄰居請求訊息之前,給上層協議一個確認可達性的機會的優化措施。
對於鄰居可達性的確認,可通過以下兩種方法來確認:
1.來自上次協議的“提示(Hint)”,例如一個TCP訊息的ACK等
2.通過RA或NA得到有關目的地址的響應,這是必要的,因為某些上次協議如UDP,本身沒有確認機制。
鄰居步可達性檢測不僅僅要確認從鄰居到本地節點的一方的可達性,而且要確認從本地到鄰居方向的可達性,確保雙向的可達性,基於這個原因,一個未經請求的NA或RA並不能改變鄰居快取條目的狀態到Reachable,因為所收到的訊息僅僅說明始發節點到本地節點的單向可達性。只有收到一個傳輸層訊息的遠端響應訊息(如TCP的ACK包),或者一個響應請求訊息的NA或RA,才能確認雙向的可達性。