簡介
1883定義了ipv6的協議,不過作廢了,在2460又重新做了定義,區別不大,只是有個別字段做了擴充。
2373和2374對ipv6的格式做了規定。
ipv6是下一代ip地址協議,比ipv4的地址更長,可以表示更多地址段。不過由於ipv6地址太長,不方便記憶,並且ipv4的基礎設施太過根深蒂固,所以目前還沒有完全普及。雖然很多企業或者高校都使用或者支持了ipv6,但是目前還是以ipv4爲主。
ipv6還會帶來性能問題,因爲地址從32位編程128位,增加了匹配解析的時間。
但是ipv6精簡了head,一些不是必須的標識都放置到擴展字段,比如ip分片,因爲並不是每一個數據包都需要ip分片,所以ipv4 head中必須包含分片字段就浪費了很多空間。
由於ipv6地址邊長,可表達的ip地址增多,理論上可以爲地球上所有介入的設備分配一個ip地址,也就是大家都可以直接互聯,而不需要ipv4這種有一個跳板機,只能通過跳板機連接其他機器。ipv4之所以有跳板機和中間路由,就是因爲不能爲每個設備分配唯一ip地址,因爲地址有重複,只能通過路由器等設備,一層層分發。從這方面來說,ipv6減少了中間步驟,有更好的傳輸率。
協議頭
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class | Flow Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Source Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
version 版本 4bit
內容是6,標識ipv6
Traffic Class 數據流類型 8bit
1883與2460的區別也就是這個標識。標識當前數據流是視頻,還是音頻等分類。
Flow Label 流標識符 20bit
Payload Length 數據長度 16bit 無符號
表示有多少字節。這裏需要注意,payload長度不包括ipv6的固定頭,但是包括擴展的頭長度。按照rfc2460所述,是從固定頭向後所有數據都叫做payload(有效載荷)。
Next Header 下一個頭 8-bit
就是指明ipv6包含的payload是什麼協議,在這裏會說明(tcp/udp)。
Hop Limit 8-bit
沒轉發一次,減1,當爲0時,丟掉改包。
Source Address 源地址 128-bit
Destination Address 目標地址 128-bit
ipv6 擴展頭
ipv6擴展頭有幾種類型,數據格式都會有一個next header,標明下一個擴展是什麼內容,或者說下一塊數據是什麼內容
+---------------+------------------------
| IPv6 header | TCP header + data
| |
| Next Header = |
| TCP |
+---------------+------------------------
標準的ipv6頭,next header是tcp,下面緊跟的是tcp數據
+---------------+----------------+------------------------
| IPv6 header | Routing header | TCP header + data
| | |
| Next Header = | Next Header = |
| Routing | TCP |
+---------------+----------------+------------------------
增加了一個routing擴展,所以固定頭的next header是routing。routing header後面是tcp,所以next header是tcp
+---------------+----------------+-----------------+-----------------
| IPv6 header | Routing header | Fragment header | fragment of TCP
| | | | header + data
| Next Header = | Next Header = | Next Header = |
| Routing | Fragment | TCP |
+---------------+----------------+-----------------+-----------------
增加了routing和分片
每個擴展頭長度必須是8的倍數。目前有如下擴展
Hop-by-Hop Options
Routing (Type 0)
Fragment
Destination Options
Authentication
Encapsulating Security Payload
後兩個擴展由rfc2402和rfc2406定義
ipv6擴展頭順序
ipv6如果有多個擴展頭,需要按照一下數據設置:
IPv6 header
Hop-by-Hop Options header
Destination Options header (note 1)
Routing header
Fragment header
Authentication header (note 2)
Encapsulating Security Payload header (note 2)
Destination Options header (note 3)
upper-layer header
擴展頭格式
擴展頭格式定義了兩種,一個是逐跳選項頭和目標選項頭。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
| Option Type | Opt Data Len | Option Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
Option Type 8-bit identifier of the type of option.
Opt Data Len 8-bit unsigned integer. Length of the Option
Data field of this option, in octets.
Option Data Variable-length field. Option-Type-specific
data.
Opetion Type
最高的兩位表明了,如果無法解析當前擴展頭內容,如何處理。
00 - skip over this option and continue processing the header.
01 - discard the packet.
10 - discard the packet and, regardless of whether or not the
packet's Destination Address was a multicast address, send an
ICMP Parameter Problem, Code 2, message to the packet's
Source Address, pointing to the unrecognized Option Type.
11 - discard the packet and, only if the packet's Destination
Address was not a multicast address, send an ICMP Parameter
Problem, Code 2, message to the packet's Source Address,
pointing to the unrecognized Option Type.
最高位的第三位表明了當前擴展頭是否可以在傳輸中修改
0 - Option Data does not change en-route
1 - Option Data may change en-route
擴展頭設置,必須嚴格按照順序,解析也同樣要嚴格按照順序執行,不可跳過特定擴展而解析下一個。
除了表示路由的,每種擴展頭只能有一個。
擴展頭必須字節對齊,具體對齊規則,請參考rfc2460
Hop-by-Hop Options Header 逐跳選項頭
逐跳擴展會攜帶一些信息,每一個路由都需要對信息進行檢測
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next Header
8-bit selector
下一個數據的類型
Hdr Ext Len
8-bit unsigned integer
擴展數據長度,表示幾個字節,不包含第一個字節。
Options
可變長度。擴展內容。必須字節對齊。
Routing Header 路由擴展頭
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next Header
8-bit selector
下一個數據類型
Hdr Ext Len
8-bit unsigned integer
數據長度,表示多少字節。不包括第一個字節。
Routing Type
8-bit
路由類型
Segments Left
8-bit unsigned integer
剩餘路由數量
type-specific data
可變長度
Fragment Header 分片擴展頭
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Reserved | Fragment Offset |Res|M|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next Header
8-bit selector
Reserved
8-bit reserved field
保留字段,填充0
Fragment Offset
13-bit unsigned integer
距離原始數據開頭的字節數偏移
Res
2-bit reserved field
保留字段,填充0
M flag
1 = more fragments
0 = last fragment.
Identification
32 bits
用來標識是哪一組分片,或者說是屬於哪一個數據包。必須與其他分片id區分,在可能存活的聲明週期內不可以重複。
Destination Options Header 目的擴展頭
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
用來爲接收數據端傳遞額外信息
Next Header
8-bit selector
Hdr Ext Len
8-bit unsigned integer
表示多少字節長度,不包括第一個字節
Options
可變長度
https://www.rfc-editor.org/rfc/rfc1883.html
https://www.rfc-editor.org/rfc/rfc2373.html
https://www.rfc-editor.org/rfc/rfc2374.html
https://www.rfc-editor.org/rfc/rfc2460.html
https://www.rfc-editor.org/rfc/rfc2402
https://www.rfc-editor.org/rfc/rfc2406
https://en.wikipedia.org/wiki/IPv6