IPv6的延伸標頭 Extended Header

IPv4的時代要使用一些特殊的功能(如通知或控制)有兩種方式,1. IPv4 Option,2. ICMPv4


IPv4 Option
需要在IPv4標頭的最後面再加上各種 OPTION,這個動作會造成IPv4標頭長度不固定。
(IPv4標頭最小是20 bytes,最大是60 bytes)
IPv4不常用Option功能,因為處理Option可能會消耗到寶貴的CPU資源


IPv4 Option 格式
Option Type - 指定這個 option 是做甚麼用的,Option Type 又分成3個小項目
    Copied- 如果這個封包會被分割,是否要把這個option複製到全部分割後的IPv4標頭內,1 = Yes,0 = No
    Option Class - option的分類,雖然2 bits可以分成四類,目前只有 0 Control和2 Debugging and Measurement,這兩個有用到
    Option Number - 接續上面的分類(class),指定在類別內的功能

Option Length - 0 or 1 byte - 整個Option的大小,包含option的標頭,單位是byte
Option Data - 0 or any bytes - 這個 option 要傳送的資料


可以用Windows Ping功能的 -r -s -k -j參數,這些參數會設定IPv4 Option,最常用的應該是 -r 功能
Record Route - 紀錄一路上經過的路由器數量和IP,因IPv4封包上限限制紀錄的最高數量是9
底下的圖片是使用wireshark抓Ping -r 的截圖,只截取Option的部分
圖片的上方是 Echo 下面是 Reply



底下的網址有IPv4 option列表
http://www.networksorcery.com/enp/protocol/ip.htm#Options



ICMPv4 (這邊會用 v4 是為了要跟 ICMPv6 區別)
另一種方式是使用ICMP,通常是用來通知主機或路由器網路上發生了錯誤,還有常用的Ping功能也是ICMP的一部份

這邊有很完整的ICMPv4介紹
http://www.pcnet.idv.tw/pcnet/network/network_ip_icmp.htm





IPv6把 Option從原始標頭移掉,改成延伸標頭 (Extended Header),並加強了ICMP的功能 (像是把ARP功能加到ICMPv6上面) (IPv6標頭固定是 40 bytes)
底下是IPv4和IPv6的標頭格式


IPv4 


IPv6



IPv6不只把Option移除,也移除了封包分割(Fragment),IPv6把這些功能都放到延伸標頭內,這樣就可以保持IPv6標頭大小固定,提升處理速度,而想要增加功能時再使用延伸標頭,因此 Next Header欄位就變得很重要

通常只有 Destination Address 這台機器 (目的地主機) 需要處裡延伸標頭,但是延伸標頭有Hop-by-Hop時,沿路的每一台路由器都要處理延伸標頭

Destination Address 是Multicast時,每一個收到封包的主機都需要處理延伸標頭

使用延伸標頭除了可以提升處理速度外,在開發新的標頭時,可以不用修改IPv6標頭,像模組化的方式,使用延伸標頭就好,MIPv6 (Mobility) 就是一個例子

延伸標頭一定是 8 bytes 的倍數

底下的表格是IPv6會用到的標頭,延伸標頭有順序性,如果有多個延伸標頭同時出現,需要依照順序擺放 (這部分就交給寫程式的人)

Header Type
Order
Next Header
Reference
IPv6 Header
1
41
RFC 2460 RFC 2473
Hop-By-Hop (HOPOPT)
2
0
RFC 2460,必須接在IPv6 Header後面
Destination
3,8
60
RFC 2460
Routing
4
43
RFC 2460 RFC 5095
Fragment
5
44
RFC 2460
Authentication (AH)
6
51
RFC 4302
ESP
7
50
RFC 4303
Mobility (MIPv6)
9
135
RFC 6275
No Next Header
Last
59
RFC 2460
ICMPv6
Last
58

TCP
Last
6

UDP
Last
17

未來有更新延伸標頭會更新在 RFC 6564



延伸標頭的通用格式
為了讓不同廠商都能準確讀取/辨識未來可能會開發出的種種延伸標頭,訂定了一個標準格式



Next Header - 告訴主機下一個標頭是甚麼
Header Length - 整個延伸標頭的長度,單位是 8 bytes。不包括第一個 8 bytes
DATA - 內含的資料,依不同標頭有不同格式



標頭介紹 :
No Next Header
Hop-By-Hop Option
Destination Option
Routing
Fragment
ESP & AH
MIPv6



No Next Header
這不是一個標頭,而是IPv6裡面Next Header欄位的值,如果IPv6的Next Header填入59 (十進位),表示後面沒有標頭了,這個標頭是最後一個
這個功能比較特別,這是以IPv6的觀點來看,IPv6會認為後面的Payload是空的,但這不代表後面沒有資料了,如果後面還有資料必須忽略不處理



Hop-By-Hop Option
沿路的每一台設備都要執行裡面的資料
每一台收到這個封包的路由器都應該要打開來看看,看自己要做甚麼事情,包含目的地主機
目前用在Jumbogram、MLD (Multicast Listener Discovery)和 RSVP (Resource Reservation Protocol)(使用router alert)

IPv4時代,路由器必須要解讀部分的Payload才能知道這個封包是不是有一些資料要給沿路的路由器,這種處理方式會降低處理速度 (後來有開發出Router Alert Option解決這個問題)
IPv6使用Hop-by-Hop標頭,告訴路由器這個封包內含資訊需要路由器特別處理,當沒有Hop-by-Hop標頭時,路由器可以直接轉送封包,不用做額外的解讀。而且路由器只要解讀到Hop-by-Hop就好,不用繼續解讀下去 (有Routing標頭時例外)

Jumbogram (194)
原本IPv6標頭可以支援到64K的MTU,但如果有需要超過,就要使用這個功能,可支援從65536到4,294,967,295 (4G) 的MTU大小
當IPv6封包帶有Jumbogram Option時,IPv6的Payload Length設定為 0
Jumbo Payload Length 有32位元,單位是byte
定義在RFC2675

Router Alert (5)
Router Alert在IPv4時就存在,當時是IPv4的Option 20
功能是告訴轉送封包的路由器 (從來源到目的地的會經過的全部路由器),這個封包有重要資料需要路由器仔細檢查。這些資料可能是用來更新路由器的某些紀錄
對於不支援這個功能的路由器則直接轉送不用檢查,有效的區分支援和不支援的路由器,盡量不降低路由器處理效能

IPv6世界有在用Router Alert 的有RSVP和MLD,MLD是IPv6的Multicast路由機制
(IPv4的Multicast機制有PIM)



Destination Option
通知目的地主機需要執行某些特定的工作
這個標頭比較特別,可以同時出現兩次
A. 一個是在Routing標頭前面
B. 另一個是在上層標頭前 (如TCP或UDP)

當在Routing標頭前面,routing標頭內所列的每一台路由器都需要執行Destination所提供的資訊
在上層標頭前,只有最終接收的主機需要執行Destination所提供的資訊
目前有在用這個功能的有MIPv6 和 RFC 2473 的 Tunnel encapsulation Limit Option(限制通到的封裝次數)



Routing
在IPv4叫做Loose Source Route (有些會翻譯成鬆散的來源路由)
功能是,讓來源主機可以指定路由的路徑
通常選擇路由的路徑是路由器的工作,而選擇的方法是依據Destination Address,這個功能可以讓發送訊息的主機自行選擇路徑
在IPv4的世界裡通常路由器不接受這個功能,因為當惡意人員使用偽造IP來源加上這個功能有機會突破防火牆

因安全理由,Routing Type 0 已被推翻,文獻紀錄在RFC 5095

MIPv6 (Mobility) 會使用到這個功能,使用Routing Type 2



Fragment
封包分割,當要發送的封包大於MTU (Maximum transmission unit),需要將封包分割成MTU的大小,通常MTU的單位是 byte
IPv4的時候是路由器執行這個功能,然後目的地主機重組分割的封包
IPv6是由發送端主機進行封包切割,目的地主機重組分割的封包
但是發送端主機怎麼知道路徑中不同路由器所設定的MTU大小呢??
靠的是 Path MTU Discovery,這個功能可以探測路徑中的MTU大小,如果要發送的封包大於偵測到的MTU,則發送端主機就會進行封包切割

PS : IPv4的最小MTU是576 bytes最大是1500(可以超過),IPv6是1280 bytes到最大64K (65535 bytes)

RFC 2460定義IPv6的MTU最小是1280,並建議使用1500或更大

RFC2675定義,IPv6傳輸的MTU超過 65535 則需要使用Jumbo frame Option,這個功能在Hop-by-Hop內,最大可到4G。如果上層是TCP,需要調整MSS Option和URG flag
(並非每台設備都支援Jumbo frame功能)

在RFC 894定義 IPv4最大MTU是1500,超過就是Jumbo frame,Jumbo frame的大小依廠商不同而不同,一般最大都可以到9000,Jumbo frame通常用在特殊需求的網路上,如資料中心

MTU的算法是從IP標頭以後,不包含ethernet標頭



ESP & AH

IPsec是一個安全規範的框架,並未定義加密和金鑰交換等機制
IKE是金鑰管理,包含金鑰交換和保管,IKE有兩個版本,v1和v2
IPv6使用v2,定義於RFC 4301
雖然IPv6內建這兩個延伸標頭,但不是每家廠商或型號都有撰寫ESP/AH功能
完整的 IPsec 相關知識可以參考微軟的網站
https://www.microsoft.com/taiwan/technet/columns/profwin/13-IPSec-1.mspx


AH
身份驗證和資料完整性



Next Header - 告訴主機下一個標頭是甚麼

Header Length - 整個延伸標頭的長度,單位是 4 bytes。不包括第一個 8 bytes

Reserved - 保留,裡面的值應該都是 0

SPI - 任意32位元的值,用來確認進來的SA屬於那一條 Flow。1 - 255 由IANA保留。0 保留給本機特定狀況使用,並且不應該在正常狀況使用

Sequence number - 單純做為封包的計數用,功能是防止重送攻擊。由傳送者設定這個值,每次遞增 1 ,第一個封包從 1 開始,當達到232時歸零,重頭計數。在Multicast下此功能無法使用,因為AH不用同步多個傳送者的封包計數。

Integrity check value - 就是checksum,依建立SA時選擇的演算法而有不同的長度。此值一定是 4 bytes的倍數
checksum計算下列欄位 :
AH標頭之前,不會因為傳輸過程而變動的欄位,或抵達目的地時,可預測的IP標頭與延伸標頭欄位。例如Routing延伸標頭的最後一個位址會納入計算
IPv6標頭的Traffic class、flow label、Hop limit不納入計算
AH標頭所有欄位
AH之後所有延伸標頭
ESN high order bit (或著說高順序位元,或著說把數值改成 2 進位靠左邊的位元)
(Extended Sequence Number,加長到64位元,前32位元依然用在封包計數)
所有跟完整性演算法有關的參數






ESP
封包加密和資料完整性
ESP幾乎可以做到AH全部的功能,一般使用ESP即可





SPI - 任意32位元的值,用來確認進來的SA屬於那一條 Flow。1 - 255 由IANA保留。0 保留給本機特定狀況使用,並且不應該在正常狀況使用

Sequence number - 單純做為封包的計數用,功能是防止重送攻擊。由傳送者設定這個值,每次遞增 1 ,第一個封包從 1 開始,當達到232時歸零,重頭計數。在Multicast下此功能無法使用,因為ESP不用同步多個傳送者的封包計數。

Payload - 加密的資料和 IV (Initialization Vector,初始向量,用來加強加密效果)

Padding - 將封包填充到 4 bytes 的倍數,這是加密機制所需的最小封包

Next Header - 告訴主機下一個標頭是甚麼,如果是 59 (No Next Header) 則表示這個封包是傀儡封包









MIPv6
這個是給行動網路使用,以達到移動中連線不中斷的功能
當使用者在A地連上4G行動網路,接著使用者移動到B地,因為B地使用的IP範圍不一樣,重新配置新的IP給使用者,這個時候舊的TCP連線要如何在不終斷的狀況下使用B地派發的新IP,此時就要用到MIPv6
MIPv6主要靠Tunnel和route optimization (通道和路由最佳化)完成這些工作






錯誤狀況 :
無法辨識 Next Header
Route標頭錯誤 - Route Type 錯誤
Route標頭錯誤 - MTU太大


無法辨識 Next Header
當接收的主機發現Next Header 的數值自己不能辨識時,會丟棄這個封包並回傳ICMPv6的Parameter Problem封包


Route標頭錯誤 - Route Type 錯誤
處理Route標頭的主機不能辨識Route Type時,會有兩個選項
A. segment left欄位的數值為0,略過route標頭,繼續處理下一個標頭
B. segment left欄位的數值為 1 以上,丟棄封包並回傳ICMPv6的Parameter Problem Code 0


Route標頭錯誤 - MTU太大
如果含有Route標頭的封包因為MTU超過轉送設備 (通常是路由器) 的限制,丟棄封包並回傳ICMPv6的Packet Too Big
注意 : 防火牆千千萬萬不能檔這個ICMPv6訊息。Packet Too Big是進行MTU偵測的重要回饋訊息,內含路由器可傳送的最大MTU,如果阻擋,後面的電腦就不知道自己的MTU太大






參考資料
IPv6解析  Silvia Hagen著









留言

此網誌的熱門文章

WPA_supplicant的設定方式

DOS指令 -- SET和變數

Nginx server 和 location 優先順序