一、ipv6的基本格式
ipv6報文格式從簡單性來看,比ipv4較簡單,而且ipv6的基本頭部的長度是固定的。相較與ipv4,ipv6去掉了一些頭部,把這些頭部全部弄到了後面的擴展投不中。ipv6的報文格式如下:
version:4bits 版本號 ipv6爲6
Traffic Class: 8 bits,傳輸類別,可用於源節點或轉寄路由器標識和區分IPV6包中的不同類別或優先級;類似於實現IPV4的TOS/DIFF
Flow Label:20bits 流標籤,數據流是指從某特定的源節點向某特定的目的節點發送的數據包序列。當源節點希望中間的路由器對數據包進行一些特殊處理時,就可以使用數據流標籤,不支持數據流標籤的可以賦值爲0;
Payload Length: 16bits unsigned integer, ipv6的載荷長度,首部以外的長度(包括擴展首部)
Next Header:8 bits 指明緊跟IP首部後面的下一個首部的類型
Hop Limit:8bits unsigned integer,在每個傳輸此包的節點處減1,如果跳數限制減到0,就拋棄此包
Source Address:128 bit 源地址
Destnation Address:128 bit 目的地址
二、擴展首部格式:
1、下面是幾個擴展首部的例子:
+-----------------------+--------------------------------------------
| ipv6 header | tcp header + data
| |
| next header = tcp |
| |
+-----------------------+---------------------------------------------
+-----------------------+-----------------------+-----------------------------
| ipv6 header | routing header | tcp header + data
| | |
| next header = | next header = tcp |
| routing | |
| | |
+-----------------------+------------------------+-------------------------------
一般情況下(hop-by-hop選項首部例外),擴展首部在數據包的傳遞過程中,中間的任何節點不會檢測和處理,一直到這個ipv6首部中目的地址所標識的那個節點。
特例:hop-by-hop選項首部,攜帶了包的傳送路徑中的每個節點都必須檢測和處理的信息。包括源節點和目的節點。如果HOP-BY-HOP選項首部存在,就必須緊跟在ipv6首部後面。
2、擴展首部出現的順序
當在同一個包中使用多個擴展首部時,建議按如下順序排列這些擴展首部:
ipv6 header
hop-by-hop options header (HOP-BY-HOP首部)
destionaion options header (目的地址選項首部)
routing header (路由首部)
fragment header (分片首部)
authentication header (認證首部)
encapsulating security payload header 封裝安全載荷首部
destination options header (目的地址選項首部)
upper-layer header 上層協議首部
3、選項
在hop-by-hop和目的地址選項首部,包含若干個以類型-長度-值格式進行編碼的選項,格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+------------------
| option type | opt data len |options data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+------------------
Option type: 8bit,標識選項類型;
Opt data len: 8bit 選項數據字段的長度;
Option data:可變長度,依選項類型而不同的數據;
選項類型的最高兩個比特,指明當IPV6節點無法識別這個選項時的處理方式:
00: 跳過這個選項,繼續處理首部
01:丟棄這個包
10:丟棄這個包,並給源地址發送一個“參數錯誤”的icmp,同時指針指向無法識別的選項類型
11:丟棄這個包,並且如果目的地址不是組播地址時,給源地址發送一個參數錯誤的icmp,同時指針指向無法識別的選項類型
選項的第三個比特:
0:選項數據不會改變選路
1:選項數據可能改變選路
4、Hop-by-Hop選項頭部
用IPV6首部的”下一個首部“爲0(0x00)來標識,此選項頭部用於傳送在數據包的傳送路徑中每個節點都必須檢測的可選信息。格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | hdr ext len | |
| |
. .
. options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next header: 8bits, 緊跟在hop-by-hop選項首部後面的首部類型式
Hdr Ext len:8 bits hop-by-hop選項首部的長度,不包括開始的8個八位組
options: 可變長度,包含一個或多個TLV的選項
5、路由首部
next header = 43標識;用於IPV6源節點列出到目的節點的路徑中所應"訪問"的一個或多箇中間節點,格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next header: 8bit 緊跟在路由首部後面的首部類型
Hdr Ext Len: 8bit 路由首部長度,不包括開始的8個八位組
Routing Type: 8bit 標識路由頭部類型
Segements left:8bit 到達目的節點前仍然應當訪問的中間節點數
type-specific data: 可變長度,格式由路由類型(routing type)來決定
6、分片首部
next header = 44標識;在ipv6中,只有源節點纔可以分片,中間路由器不能分片,當發送的數據包長度大於MTU時,就需要分片,分片首部的格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | reserved | fragment offset | Res | m |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
next header: 8bit 同上
reserved : 3bit,保留
fragment offset: 13bit,分片偏移量。首部後面的數據相對於原包中可分片部分的開始位置處的偏移量
Res:2bit,保留,用0填充,接收時忽略
M flag:標識是否還有分片(1: 分片;0:最後一個分片)
Identification:32 bit,標識符
例子如下圖:
7、目的選項首部
next header = 60標識,用於攜帶僅需要目的節點檢測的可選信息。格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | hdr ext len | |
| |
. .
. options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
next header: 8bit 同上
Hdr Ext Len: 8bit 目的選項首部長度,不包括開始的8個八位組
options:可變長度。一個或多個TLV格式的選項
8、無下一個首部:
next header = 59 (0x3b)