計算機網路原理(TCP/IP協議五):Internet協議
- IPv4和IPv6頭部
- IPv6擴充套件頭部
- IP轉發
- 移動IP
- IP資料報的主機處理
一、IPv4和IPv6頭部
IP是TCP/IP協議族中的核心協議,所有TCP、UDP、ICMP、IGMP資料都通過IP資料報傳輸。IP提供一種盡力而為、無連線的資料包交付服務。“盡力而為”的含義是不保證IP資料報能成功的到達目的地。雖然IP不是簡單的丟棄所有不必要流量,但它不對自己嘗試交付的資料提供保證。當某些錯誤發生時,比如一臺路由器臨時用盡緩衝區,IP提供一個簡單的錯誤處理方法:丟棄一些資料。任何可靠性必須有上層提供,例如TCP。IPv4和IPv6都是用盡力而為的基本交付模式。
然後是“無連線”意味者IP不維護網路單元中資料報相關的任何連線狀態資訊,每個資料報獨立於其他資料報來處理,這也意味著IP資料報可不按順序交付,如果一個主機向同一目的地傳送兩個連續的資料報,每個資料報可以獨立路由,通告不同路徑,並且可能到達的順序並不是傳送端當初傳送的順序。
此外,IP資料報也可能傳送其他問題,它們可能在傳輸過程中被複制,可能改變內容從而導致錯誤,所以在上層的一些協議需要處理這些潛在的問題,以便提供無差錯的交付。
1.1IPv4和IPv6的報文結構
IPv4資料報的首部大小是可變的,而IPv6的首部大小是固定的40位元組,下面來看具體欄位的解析:
版本:用於指定IP協議的不同版本,IPv4為4,IPv6為6。IPv4和IPv6除了版本欄位位置相同其他都不同,因此,這兩個協議不能直接互操作,主機或路由必須分別處理IPv4或IPv6(或兩者,稱為雙棧)。
Internet頭部長度(IHL):用來表示IPv4首部中32位字的數量,包括任何選項。由於它是一個4位的欄位,所以IPv4首部被限制為15個32位字,即60位元組。
服務型別(ToS):用於指定通訊型別,前6位(DS欄位)被稱為區分服務欄位,後2位(ECN)是顯示擁塞通知欄位或指示位,不同型別的資料報。例如時實資料報(如用於IP電話應用)與非時實流量(如FTP)。擁塞通知和指示位可以提供特定的等級服務,由網路管理員對路由器確定和配置策略。
總長度:即資料報長度,單位位元組,通過這個欄位和IHL可以確定IPv4的資料報的資料部分從哪裡開始,以及資料的長度。IPv4資料報的最大長度(包括首部)為65535位元組,IPv6的最大長度被限制為64KB,IPv6還支援一個超長度資料報選項,它理論上單個分組可支援4GB最大長度。一般情況下資料報很少超過1500位元組,該長度能使得IP資料報能被最大容量的乙太網幀的載荷欄位承載。乙太網會將短幀填充到最小長度(64位元組),雖然乙太網最小有效載荷為46位元組,但一個IPv4資料報也可能更小(20位元組),如果沒有總長度欄位,IPv4實現將無法知道一個46位元組的乙太網幀是一個IP資料報,還是經過填充的IP資料報。另外主機不需要接收大於576位元組的IPv4資料報,很多UDP協議傳輸資料的應用程式限制521位元組大小的資料,以避免576位元組的IPv4限制。
標識:傳送主機在每次傳送資料報時都將一個內部計數器加1,並將該計數器值複製到IPv4標識欄位,它與另外兩個欄位標誌和分片共同作用於分組分片的相關操作,在後期的IP分片相關部落格中會有詳細的介紹。
生存期(TTL):用於設定一個數據報可經過的路由器數量的上限,用來確保資料報不會永遠在網路中迴圈。傳送方將它初識化為某個值([RFC1122]建議為64,但128或255也不少見),每臺路由器在轉發資料報時將該值減1,當這個欄位的值到達0時,該資料報被丟棄,並使用一個ICMP訊息通知傳送方。
協議:用於表示資料報有效載荷部分的資料型別,也就是運輸層的協議。當資料報到達目的地時,用於確定交由上層哪個運輸層協議處理,例如TCP、UDP等。
頭部校驗和:用於幫助路由器檢測收到的IP資料報中的首部位元錯誤,注意它僅僅用於檢驗首部位元,而不是整個報文的位元。而且這個欄位只在IPv4中有,在IPv6中沒有這個欄位。將首部中的每2位元組當作一個數,用反碼算術對這些數求和,具體見後面的詳細介紹。
源和目的IP地址:當某源生成一個數據報時,它在源IP欄位中插入它的IP地址,在目的IP地址欄位中插入期最終目的地址,通常源主機通過DNS查詢來決定目的地址。
上面介紹了IPv4以及與IPv6共用的首部欄位,下面再來看看IPv6的擴充套件首部欄位:
流標籤:用於標識一條資料報的流,能夠對一條流中的某些資料報給出優先權,或者它能夠用來對某些應用(比如IP語音)的資料報給出更高的優先權,以優於來自其他應用(比如SMTP電子郵件)的資料報。
負載長度:即有效載荷長度,該16位元值作為一個無符號整數,給出了IPv6資料報中跟在定長的40位元組資料報首部後面的位元組數量。
下一個頭部:該欄位標識資料報中的內容需要交付給哪個協議(例如TCP或UDP),這個跟IPv4的協議欄位功能是一樣的。
跳數限制:轉發資料包的每條路由器將對該欄位的內容減一,如果跳數限制計數達到0則丟棄該資料報,與IPv4的生存期(TTL)欄位功能一樣。
1.2Internet校驗和
IPv4頭部校驗和與之前在鏈路層介紹的迴圈冗餘檢測CRC不同,為了給輸出的資料報計算IPv4校驗和,首先將資料報的校驗和設定為0,IPv4對首部計算16位二進位制反碼和,這個16位二進位制反碼和被儲存在校驗和欄位中。二進位制反碼加法可通過(迴圈進位加法)實現:當使用傳統(二進位制補碼)加法產生一個進位時,這個進位以二進位制1加在高位。當一個IPv4資料報被接收時,對整個頭部計算出一個校驗和,包括校驗和欄位自身的值,假設這個資料報沒有錯計算出的校驗和值為0(值FFFF的反碼)。用下面的例子來詳細解析:
假設某個IPv4資料報頭為:E3 4F 23 96 44 27 99 F3 [00 00],括號中的值就是校驗和。
校驗和初始值被設定為0,如示例;
然後,以16位元為單位,兩兩相加,那麼上面的示例可得:E34F+2396+4427+99F3=1E4FF;
如果計算結果大於0xFFFF,則將,高16為加到低16位上,對於上面的結果,即為0xE4FF+1=E500;
然後,將該值取反,即為~(E500)=1AFF,這個值就是傳送方傳送報文中的校驗和欄位的值;
當解決方受到資料報以後,如果資料報正常,那麼它的資料報頭應該是:E3 4F 23 96 44 27 99 F3 1A FF。
此時,前面16位元組的內容不變,等於E500,然後將E500與剛剛計算的校驗和1AFF相加;
如果結果為FFFF,那麼該資料報正常,沒有錯誤。
1.3DS欄位和ECN(即服務型別ToS位元組或IPv6流量類別)
在Internet協議中,也可以說是路由在轉發資料報時可能並不會單純的按照先到現轉發的方式來提供服務,而可能是服務型別來決定轉發的優先順序,這要具體看網路管理員對路由的配置策略。
DS欄位中的數字稱為分割槽服務程式碼點(DSCP),在通常情況下,如果資料報擁有一個分配的DSCP,該資料報在通過網路基礎設施交付過程中會保持不變。但是,某些策略可能導致一個數據報中的DSCP在交付過程中改變,也就是說在交付過程中可能因為網路基礎設施提供者的服務策略,對資料報的DS欄位值進行修改。
當資料報通過一臺具有內部排隊流量的路由器時,頭部中的2位ECN位用於為資料報標記擁塞識別符號,也就是說當路由器具備ECN感知能力的路由器會在轉發分組時設定這兩位。這種功能設計的作用是當分組被目的節點收到時,有些協議(TCP)會發現分組被標記並將這種情況通知傳送方,傳送方隨後會降低傳送速度,這樣可在路由器因為過載而被迫丟棄流量之前緩解擁塞。
ToS服務型別的欄位結構及其提供的功能和服務:
儘管原來的ToS(服務型別)沒有被廣泛的支援,但DS欄位結構仍然提供了一些對它們的相容能力,而且DS欄位在某種程度上延續並改進了ToS的相關功能,下面先來了解ToS的結構:
優先順序子欄位用於表示哪些分組具有更高的優先順序。D、T、R子欄位分別用於表示延時、吞吐量、可靠性,如果這些欄位值為1,分別表示低延時、高吞吐量、高可靠性。
優先順序的取值範圍是000(常規)~111(網路控制),表示優先順序依次遞增,它們都基於一個稱為多級優先與搶佔(MLPP)的方案,下面是ToS的優先順序子欄位各個值得具體優先級別:
簡單的來說優先順序的值越大,資料報被轉發的優先順序越高,路由器就會越先轉發它。DTR則是路由器描述它的傳輸效能,優先順序子欄位的值決定路由器轉發的順序,DTR被用於上層(傳輸層)的擁塞控制。
DS欄位與ECN欄位的結構及其提供的功能和服務:
在定義DS欄位時,優先順序的值已定義在[RFC2474]中,以提供有效的相容性。6位DS欄位儲存DSCP,提供對64個程式碼點的支援。特定DSCP值可通知路由器對接收的資料報進行轉發或特殊處理。不同型別的轉發處理表示為每跳行為(PHB),因此DSCP值可有效通知路由器哪種PHB被用於資料報。DSCP的預設值通常為0,對應常規的盡力而為的Internet流量。64個可能的DSCP值分為不同的用途,下面先來看DS欄位和ECN的結構:
這裡重點來關注DSCP,即SD欄位的6位,其中5位是標準的,表示當接收的資料報應轉發時,可以由一臺相容內部排隊的路由器按照其優先級別進行處理(即PHB)。DSCP值被分為三個池,包括:標準的優先級別、實驗/本地用途的(EXP/LU)優先級別、最終打算標準化的實驗/本地用途的(*)優先級別,下面是它們的具體格式:
通過上面的程式碼點字首就可以區分資料報的採用的是什麼標準的轉發優先順序,但這一般不是我們需要關注的,首先要了解的DS欄位如何相容之前的ToS(服務型別)的優先順序,在前面的ToS中介紹過它的優先順序由前3位決定,在DS中採用xxx000形式的程式碼點來支援之前ToS的部分優先順序欄位,至於相容哪些優先順序可以具體參考[RFC0791]。
然後再來看DSCP標準的優先順序和流量類別的具體程式碼點(二進位制值):
預設(BE):000 000,表示位盡力而為的優先順序,可以說它是優先順序最低的,也是一個特殊的CS,即ToS中的優先順序子欄位000也是優先順序最低的;
類選擇器(CS):aaa 000,用於相容ToS的優先順序子欄位。
確保轉發(AF):aaa bb0,DSCP標準定義的優先順序型別;
加速轉發(EF):101 110,DSCP標準定義的用於承載語音的流量,因為語音要求低延遲,低丟包率,是僅次於協議報文的最重要的報文,可以說它也是一種特殊的AF;
這裡我們需要重點關注的是確保轉發(AF)的流量類別,但需要注意的這裡確保轉發並不是一定保證資料報會被轉發,而是相對預設000000而言它有兩個機制來確保轉發,一個是轉發優先順序由五個程式碼點前三位決定,另一個是丟棄優先順序由五個程式碼點後兩位決定,因為第六個程式碼點是用來表示標準策略的。
DS欄位的優先順序(DSCP優先順序):由前三位二進位制就可以產生七個優先級別,因為000是預設的盡力而為,所以從001~111只有七個級別,二進位制數值越大表示的優先順序越高,最先被轉發。即111的優先順序最高,但它當前還沒有被準化,而是作為預留級別。
DS欄位的丟棄優先順序(DSCP丟棄優先順序):由後兩位二進位制可以產生4個優先級別,00~11可以表示4個級別,二進位制值越大表示優先順序越高,相對前三位相同的轉發優先順序,丟棄優先順序的二進位制值越大,越先被丟棄。(但這種丟棄肯定是相對預設的000000服務類別要可靠一些,最先被丟棄的肯定是預設000000的資料報)。
有這些不同的轉發優先順序和丟棄優先順序就組成了不同的DS服務型別,轉發級別越高丟棄級別越低的服務的費用也就有不同的差別,具體要看服務提供商(ISP)的服務而定。而另一方面,不同的服務型別一般也用來支援不同的資料流,在七個轉發優先順序和預設共八個應用型別:7預留(111)、6預留(110)、5語音(101)、4視訊會議(100)、3呼叫訊號(011)、2高優先順序資料(010)、1中優先順序資料(001)、0盡力服務資料(000),一般服務提供商就會基於不同的應用型別來提供流量服務,結合丟棄級別就會產生不同的服務資費標準,下面是不同的標準服務型別和對應的DS欄位值以及相關描述:
1.4IP選項
IP支援一些可供資料報選擇的選項,在IPv4初期階段Internet規模很小,來自惡意使用者的威脅關注較少。由於IPv4頭部大小的限制以及相關安全問題,在IPv6中,大部分選項已被刪除或改變,不再是IPv6基本頭部的一部分,而被放在IPv6頭部之後的一個或多個擴充套件頭部中。IP路由器接收到一個包含選項的資料報,通常需要對資料報進行特殊處理。在某些情況下,儘管IPv6路由器可以處理擴充套件頭部,但很多頭部被設計為僅由終端主機處理。在路由器中,帶選項或擴充套件的資料報不會像普通資料報那樣被快速轉發。
1.4.1IPv4的選項
關於IPv4的選項可以在相關描述性的RFC中找到,這個完整的列表會被定期更新,並可在[IPPARAM]中線上檢視。選項的範圍總是以32位為界,如果字元不夠用0填充,這確保IPv4頭部始終是32位的倍數(IHL欄位的要求)。如果選項存在,它在IPv4分組中緊跟在基本IPv4頭部之後。
選項標識(8位):選項由一個8位的型別欄位標識,這個欄位被細分為3個子欄位:
複製(1位):當值為0時表示僅在第一個分片中複製,當值為1時表示複製到所有分片;
類別(2位):00表示資料報控制、01表示保留、10表示排錯和管理、11表示保留。
編號(5位):各種選項的編號,用5位表示,比如00000是選項結束的編號、00001是無操作的選項(用於填充)的編號、00011是不嚴格的源路由(傳送方列出分組轉發時遍歷的路由器"航點",不嚴格表示可以包含其他航點)的編號、00100是時間戳(用於記錄分組的源和目的地的日期和時間)的編號、00111是記錄路由(在分組的頭部記錄經過的路由器)的編號、01001是嚴格路由(傳送方列出分組轉發時遍歷的路由器“航點”,嚴格表示所有航點都要按順序遍歷)的編號。關於更多選項的編號可以參考[IPPARAM]相關選項文件。
選項的長度欄位(8位):表示選項的總長度,大部分選項的總長度是可變的,但是單位元組不需要長度欄位,單位元組只有兩個編號分別為00000的選項結束和00001的無操作選項,其他選項都需要長度欄位;
選項的值:即記錄選項相對應的一些資料,這在以後的具體網路相關部落格中介紹。
二、IPv6擴充套件頭部
2.1IPv6擴充套件頭部
在IPv6中,那些由IPv4選項提供的特殊功能,通過在IPv6頭部之後增加的擴充套件頭部實現。IPv6中的擴充套件頭部僅由終端主機處理,僅有一個例外是在分組經過每個路由器中處理的選項,這個選項就是逐跳選項(HOPOPT)。
擴充套件頭部和更高層協議頭部與IPv6頭部連結起來構成級聯頭部,每個頭部中的下一個頭部欄位表示緊跟著的頭部的型別(即下一個頭部的協議型別),下面是一些常見的IPv6的級聯頭部結構:
下一個頭部欄位的可能值定義在[IP6PARAM]中,下面是IPv6下一個頭部欄位值可能表示看展頭部或其他協議頭部:
在下一個頭部中,除了逐跳選項(HOPOPT)的被指強制要求按照順序必須跟在IPv6的頭部後面,其他下一個頭部的順序是建議性的。除了“目的地選項”可以使用兩次以外,其他頭部都只能使用一次,第一次是指包含在IPv6頭部中的目的IPv6地址,第二次是(位置8)關於資料報的最終目的地。
2.2IPv6選項
在2.1中介紹了IPv6的擴充套件頭部的結構,這裡再來了解具體的選項,包括逐跳選項、目的地選項、路由、分片、移動等選項的具體報文格式及工作原理,封裝安全載荷、認證、ICMPv6會在以後的相關部落格中介紹。
2.2.1逐跳選項(H)與目的地選項(D)
前面介紹過逐跳選項是唯一由分組經過每個路由器處理的選項,且逐跳選項必須跟在IPv6的頭部後面。逐跳選項和目的地選項頭部出現可以超過一次,這些選項均被編碼為型別-長度-值(TLV)集合,TLV結構如下面的格式:
TLV結構的長度為2位元組(不包括選項資料),後面是可變長度的資料位元組,第一個位元組包括3個子欄位,當5位的型別子欄位無法由選項識別時,第一個子欄位給出了一個IPv6節點嘗試執行的動作。
動作:IPv6的TLV選項型別的2個高序位,表示如果這個選項沒有被識別時,一個IPv6節點是轉發還是丟棄該資料報,以及是否向傳送方返回一個訊息,提示這個資料報的處理結果,下面的具體的動作值和解析:
00:跳過選項,繼續處理;
01:丟棄這個資料報(沉默);
10:丟棄這個資料報,並向源地址傳送一個“ICMPv6引數問題”訊息;
11:與10相同,但僅在分組的目的地不是組播時,傳送這個ICMPv6訊息。這是因為一個發往組播目的地的資料報中包括一個未知選項,那麼大量節點將生成返回源節點的流量,這種情況就可以使用11這個動作來避免。
動作子欄位的靈活性在開發新的選項時有用,一個新的選項可攜帶在一個數據報中,並被那些無法理解它的路由器所忽略,這樣有助於促進新選項的增量部署。
Chg:當選項資料可能在資料報轉發過程中改變時,改變位(Chg)設定為1。
下面是逐跳選項與目的地選項的頭部型別以及欄位值的列表:
填充1與填充N:由於IPv6選項需要與8位元組的偏移量對齊,因此較小的選項用0填充到長度為8位元組。因為有的時候擴充套件頭部的選項資料並不是固定的,需要填充的長度要根據前面選項與8位元組長度對齊的差n作為基數,然後再減去填充N的頭部欄位2位元組長度,就是要填充的長度。為什麼要減去2位元組看前面的TLV結構就很容易理解了,選項型別佔用8位、選項長度欄位佔用8位,即選項頭部2位元組,所以實際填充長度就是n-2位元組。而填充1實際只有選項型別欄位,它沒有選項長度和值,實際上類似IPv4選項編號00000的選項一樣就用來表示選項結束,因為這個選項的選項型別所有位本來都是0,剛好8位。
超大有效載荷:這個選項的欄位內容和值就不多做解釋了,基於前面的TLV結構和表格中引數很容易理解,這個選項用來標註當前IPv6資料報為一個超大有效載荷的資料報,即資料報的有效載荷大於65535位元組,稱為超大報文。這個選項定義的超大報文無法用最大傳輸單元(MTU)小於64KB的鏈路連線的節點來實現,超大有效載荷選項提供了一個32位的欄位,用於攜帶有效載荷在65535~4294967295位元組之間的資料報。當一個用於傳輸的超大報文形成時,其正常負載長度欄位被設定為0,TCP協議使用負載長度計算校驗和,必須使用來自選項的長度值,而不是基本頭部中的長度欄位。
隧道封裝限制:隧道是指將一個協議封裝在另一個協議中,在前面鏈路層的點到點協議(PPP)中有介紹,隧道可以巢狀,從這個意義上說,一條隧道中的資料包本身也可以採用遞迴方式封裝在另一條隧道中。在傳送一個IP資料報時,傳送者通常無法控制最終用於封裝的隧道層,傳送者可使用這個選項設定一個限制,一臺路由器打算將一個IPv6資料報封裝在另一條隧道中,它首先檢查隧道封裝限制選項是否存在並置位。如果這個限制選項值為0時,該資料報被丟棄,並將一個“IPMPv6引數問題”訊息傳送到資料報源端(即之前的隧道入口點)。如果限制選項的值不為0,該資料報可進行隧道封裝,但新形成(封裝)的IPv6資料報必須包括一個隧道封裝限制選項,其值比封裝之前的資料報中的封裝限制選項值減1。實際上,封裝限制行動類似於IPv4的TTL和IPv6的跳數限制欄位,只不過採用隧道封裝層次代替轉發跳步。
路由器警告:指出資料報包含需要路由器處理的資訊,它與IPv4的路由器警告選項的目的相同[RTAOPTS]給出了這個選項的當前設定值。
快速啟動(QS):這個選項跟[RFC4782]定義的TCP/IP實驗性“快速啟動”程式配合使用,它適用於IPv4和IPv6,但目前建議僅用於專用網路,而不是全球性的Internet。選項包括髮送者需要的以位元/秒為單位的傳輸速率的編碼值、QS TTL值和一些額外資訊。如果沿途的路由器認為可以接受所需的速率,在這種情況下它們將遞減QS TTL,並在轉發資料包時保持所需的速率不變。如果路由器不同意(即僅支援的速率較低),它將該速率減小到一個可接受的速率。如果路由器不能識別QS選項,他將不遞減QS TTL,接收方將向傳送方提供反饋,包括收到的資料報的IPv4 TTL或IPv6跳數限制欄位和自己的QS TTL之間的差異,以及獲得的速率可能被沿途的尤其所調整。這個資訊被髮送放用於確定傳送速率。對於TTL值進行比較的目的是確保沿途每臺路由器產於QS談判,如果發現任何路由器遞減IPv4 TTL(或IPv4跳數限制)欄位,但沒有修改QS TTL值,則說明它沒有啟用QS。
CALIPSO:用於某些專用網路中支援通用體系結構標籤IPv6安全選項(CALIPSO)[RFC5570]。它提供了一種資料報做標記的方法,包括一個安全級別識別符號和一些額外的資訊,需要注意的是,它用於多級安全網路環境(例如政府、軍隊、銀行),其中所有資料的安全級別必須以某種形式的標籤註明。
家鄉地址:當使用IPv6移動選項時,這個選項儲存傳送資料報的IPv6節點的“家鄉”地址。移動IP規定了IP節點的一系列處理過程,這些節點可能改變自己的網路節點,同時不會斷開自己的高層網路連線。如果家鄉地址選項存在,包含它的目的地址選項頭部必須出現在路由頭部之後,並且在分片、認證和ESP頭部之前(如果這些頭部也存在)。
2.2.2路由頭部
IPv6路由頭部為傳送方提供了一種IPv6資料報控制機制,以控制(至少部分控制)資料報通過網路的路徑。目前,路由擴充套件頭部有兩個不同版本,分別稱為型別0(RH0)和型別2(RH2)。RH0處於安全方面的考慮已被否決[RFC5095],RH2被定義為與移動IP共同使用。為了更好的理解路由頭部,這裡先投論RH0,然後研究它為什麼被放棄,至於RH2在後面的移動IP中介紹,下面是RH0的路由擴充套件頭部結構圖:
目前已經廢棄的路由頭部型別0(RH0)涵蓋了IPv4的寬鬆和嚴格源路由和記錄路由選項,它在資料報轉發時由傳送方構造,其中包括轉發路徑上的IPv6節點地址,每個地址可以指定為一個寬鬆或嚴格的地址,一個嚴格的地址必須經過一個IPv6跳步到達,而一個寬鬆的地址可能經過一個或多個其他跳步到達。在IPv6基本頭部中,目的IP地址欄位修改為包含資料轉發的下一個轉發地址。
路由型別標識:對於RH0的路由型別識別符號為0,對於RH2該識別符號為2;
剩餘部分:表示還有多少段路由需要處理,也就是到達最終目的地之前仍需訪問的中間節點數;
在路由頭部欄位和路由地址值之間有一個32位的保留地址塊,由傳送方設定為0,並由接收方忽略。在資料轉發時,這些地址不能是IPv6組播地址。並且在IPv6中路由頭部在轉發過程中不會處理,直至目的IP地址欄位中包含的地址所在的節點。這時,剩餘部分欄位用於確定來自地址向量的下一跳地址,並將該地址與IPv6頭部中的目的IP地址欄位交換。因此,這個資料報轉發過程中,剩餘部分欄位將會變得越來越小。下面是一個路由轉發過程的路由頭部與IP頭部目的地址的交換示圖:
在上圖中可以看到資料報的源地址一直是S,目的地地址在經過不同的路由節點時會被路由頭部中的下一個節點地址替換,並且表示中間節點數的剩餘部分欄位(Left)值也隨著路由節點遞減。
根據上面對路由頭部的介紹,可以看到RH0很不安全,所以它已經被[RFC5095]廢棄了,因為RH0這種將路由節點地址全部記錄在路由頭部中,而且RH0允許在路由頭部的多個位置指定相同地址,很容易被用於增加DoS攻擊。這可能導致流量在一條特定路徑上的兩臺或多臺主機或路由之間重複轉發,大量的流量負載可能在網路中沿著特定路徑建立,與相同路徑上的其他流量競爭頻寬而造成干擾。因此RH0目前已過時,IPv6唯一支援的路由頭部是RH2。RH2與RH0基本相當,區別在於它只容納一個地址,而且路由型別欄位中使用的值不同,關於RH2在後面的移動IP中介紹。
2.2.3分片頭部
分片頭部用於IPv6源節點專案地傳送一個大於路徑MTU的資料報,對於路徑MTU以及如何確定它這是運輸層要處理的內容,但1280位元組是整個網路中針對IPv6定義的鏈路層最小MTU。在IPv4中,如果資料報大小超過下一跳MTU,任何主機或路由器可將資料報分片,IPv4頭部中第二個32位欄位表示分片資訊。在IPv6中,僅資料報的傳送者可以執行分片操作,在這種情況下需要新增一個分片頭部,IPv6分片頭部的資訊與IPv4頭部中的相同,只不過識別符號欄位是32位,而不是IPv4中採用的16位,這個更大的欄位提供了在網路中容納更多分片的能力,下面是IPv6的分片頭部結構:
下面來逐個瞭解分片頭部的各個欄位:
分片偏移量:有效載荷在原始資料報中以8位元組為單位的偏移量,第一個分片偏移量為0;
Res:在書中只描述了這個欄位的值為0,且會被接收端忽略(後期深入瞭解相關內容後再來補充);
M:表示當前分片是否是資料報的最後一片,最後一個分片的M欄位設定為0;
識別符號:用於表示分片屬於哪個資料報,具體這個識別符號的計算屬於運輸層的內容;
三、IP轉發
如果目的地是直接相連的主機或共享網路(例如乙太網),IP資料報直接傳送到目的地,不需要或者不使用用路由器。否則,主機將資料報傳送到一臺路由器(稱為預設路由器),由該路由器將資料報交付到目的地,這個簡單的方案適用於大多數主機配置。
這裡更多來討論複雜情況下轉發IP資料報,首先,當多數主機既可配置為路由器,也可配置為主機,很多家庭網路使用一臺連線到Internet的PC作為路由器(也可能是防火牆),主機與路由器處理IP資料報的區別在於:主機不轉發那些不由它生成的資料報,而路由器則相反。
在整個方案中,IP協議可接收一個數據報,他可來自同一主機的其他協議(TCP、UDP等),也可來自一個網路介面。IP層包括一些位於記憶體中的資訊,通常稱為路由表或轉發表,每次轉發一個數據報時需要從其中查詢資訊,當一個網路介面收到一個數據報時,IP模組首先檢查目的地址是否為自己的IP地址(與自己的某個網路介面相關的IP地址),或是它可以接收其流量的一些其他地址,例如IP廣播或組播地址。如果是自己可以接收的資料報,則將該資料報交給IPv4頭部協議欄位或IPv6頭部的下一個頭部欄位指定的協議模組。如果資料報的目的地不是本地IP模組使用的IP地址,那麼有兩種可能:①如果IP層配置為一臺路由器,則轉發該資料報(也就是作為一個輸出資料報處理);②資料報被默默丟棄。在某些情況下ICMP訊息可能傳送回源節點,以表明發生了一個錯誤。
3.1轉發表
首先來看路由表或轉發表的每個條目包含的欄位資訊:
目的地:它是一個32位欄位(或128位欄位,用於IPv6),用於與一個掩碼操作結果相匹配。針對有目的地的“預設路由”的情況,目的地可簡單設定為0;對於僅描述一個目的地的“主機路由”的情況,目的地可設定為完整長度的IP地址;
掩碼:它是一個32位欄位(或128位欄位,用於IPv6),用作資料報目的IP地址按位與操作的掩碼,其中的目的IP地址是要在轉發表中查詢的地址,掩碼結果與轉發表條目中多個目的地的進行比較;
下一跳:它是下一個IP實體(路由器或主機)的32位IPv4地址或128位IPv6地址,資料報將被轉發到該地址。下一跳實體通常在一個網路中由執行轉發查詢的系統所共享,這意味著它們共享同一網路字首;
介面:它包含一個由IP層使用的識別符號,以確定將資料報傳送到下一跳的網路介面。例如,它可能是一臺主機的802.11無線介面、一個有線的乙太網介面或一個與串列埠相關聯的PPP介面。如果轉發系統也是IP資料報的傳送,該欄位用於選擇資料資料報的源IP地址;
IP轉發逐跳進行,從路由表的欄位資訊可以看到,路由器和主機不包括到任何目的地的完整轉發路徑(除了那些直接相連的主機或路由器的目的地)。IP轉發只提供資料報傳送的下一跳實體的IP地址,它假設下一跳比執行轉發的系統“更接近”目的地,並且嚇一跳路由器與執行轉發的系統直接連線(即共享同一網路字首),它通常也假設與下一跳實體之間沒有“環路”,資料報不會在網路中迴圈,知道其TTL或跳數限制到期。由一個或多個路由協議來確保路由表正確,其中包括RIP、OSPF、BGP、IS-IS,更多可以參考[DC05]。
3.2IP轉發行動
當一臺主機或路由器中的IP層需要向下跳的路由器或主機發送一個數據報時,它首先檢查資料報中的目的IP地址(D),在轉發表中使用該值D來執行最長字首匹配演算法:
①在表中搜索具有以下屬性的所有條目:(D^mj)=dj,其中mj是索引為j的轉發條目ej的掩碼欄位值,dj是轉發條目ej的目的地欄位值。詳細收索匹配過程是,目的地的IP地址D與每個轉發表條目中的掩碼(mj)執行按位與,並將該結果與同一轉發條目中的目的地中的目的IP地址(dj)比較,如果滿足這個屬性,該條目(這裡為ej)與目的IP地址相“匹配”。當進行匹配時,該演算法檢視這個條目的索引(這裡為j),以及在掩碼mj中有多少位設定為1,設定為1的位數越多,說明匹配得“越好”。
②選擇最匹配得條目ek(即掩碼mk中最多位為1的條目),並將下一跳欄位nk作為轉發資料報的下一跳IP地址。
在某些情況下可能有多個條目是匹配的,例如當多個預設路由可用時會發生這種情況(如連線多個ISP時,稱為多宿主),在這種情況下協議標準沒有規定終端系統的具體行為,而是由具體作業系統的協議實現來決定。通常是簡單的選擇第一個匹配的結果,更復雜的系統可能嘗試在多個路由上平衡負載或拆分流量。
3.3直接交付與間接交付
簡單的來理解就是源和目的地主機之間是否有一箇中間路由或主機路由,當沒有中間的路由節點時,源主機通過自己的路由表獲得目的地主機的路由條目,並直接將資料報通過低層交換鏈路傳送給目的主機。而間接交付就是源主機上的路由表不能獲得目的主機的路由條目,需要中間的路由器來幫助它將資料報轉發到目的主機上。關於這部分內容在後面的網路層-資料平面中詳細介紹。
四、移動IP
移動IP是英特網工程任務組IETF開發的一種技術[RFC3344],該技術使得移動主機在各網路之間漫遊時,任然能夠保持其原來的IP地址不變。移動IP技術還為英特網中的非移動主機提供了相應的機制,使得它們能夠將IP資料報正確的傳送到移動主機。
4.1移動IP技術的相關基本概念
歸屬網路(家鄉網路HN):每個移動主機都有一個預設連線的網路或初始申請接入的網路,稱為歸屬網路(Home Network)。
歸屬地址(家鄉地址HoA):移動主機在歸屬網路中的IP地址在其整個行動通訊過程中是始終不變的,因此稱為永久地址(Permanent Address)或歸屬地址(Home Address)。
歸屬代理(家鄉代理HA):在歸屬網路中,代表移動主機執行移動管理功能的實體稱為歸屬代理(Home Agent)。歸屬代理通常就是連線歸屬網路上的路由器,然而它作為代理的特定功能則是在網路層完成的。
外地網路:移動主機當前漫遊所在的網路稱為外地網路(Foreign Network)或被訪問網路(Visited Network)。
外地代理(CA):在外地網路中,幫助移動主機執行移動管理功能的實體稱為外地代理(Foreign Agent)。
轉交地址(CoA):外地代理通常就是連線在外地網路上的路由器,外地代理會為移動主機提供一個臨時使用的術語外地網路的轉交地址。
4.2基本模型:雙向隧道
上圖是一個移動IP基本模型雙向隧道的示例結構圖,在示例中移動節點MN的HoA和CoA之間關聯,稱為行動網路(MN)繫結。在這個通訊基本模型中移動IP支援節點改變自己的網路連線點,同時保持網路連線操作的能力,移動節點的家鄉代理為移動服務轉發流量,並對路由加以優化,通過允許移動,以及在通訊節點之間直接通訊,從而提高路由效能。
基本模型工作在一個MN的CN不使用MIPv6協議的情況下,在整個網路中移動的情況下,這個模型稱為網路移動(NEMO[RFC3963])。當MN連線到網路中的一個新位置時,它接收自己的CoA,並向自己的HA傳送一個繫結更新訊息。這個HA使用一個繫結確認來響應。如果一切順利,這個MN和CA之間的流量通過MN的HA來路由,並使用一種雙向的IPv6分組隧道,稱為雙向隧道[RFC2473]。這些訊息通常使用IPsec的封裝安全有效負載(ESP)來保護,這樣做可以確保一個HA不會在接收到一個偽造的MN繫結更新時被欺騙。
在這個基本模式中,資料報的傳輸通訊方式是:
當移動節點向一個英特網上的某個主機發送資料報時:移動節點將資料報通過外地代理將資料報直接傳送給目的主機;
當英特網上的某個主機向處於外地網路中的移動節點發送資料報時:該資料報會首先發送給移動節點的家鄉代理,家鄉代理基於移動節點通過外地代理註冊的行動網路繫結資訊中的外地代理地址建立的隧道傳送給外地代理,外地代理通過報文中的目的地址(即移動節點家鄉地址)和基於漫遊的移動節點註冊的轉交地址資訊,將資料報傳送給移動節點。
簡單的來說,在這個模型中移動節點如果進入一個外地網路,它要向外地網路中的外地代理路由註冊一個轉交地址,作為移動節點在外地網路中的臨時通訊地址。並且外地代理需要基於移動節點的家鄉地址向移動節點的家鄉代理髮送一個註冊資訊,通過這個註冊資訊家鄉代理為漫遊的移動節點建立一個通訊隧道,這個通訊隧道可以簡單的看作是移動節點的家鄉地址與轉交地址的對映關係,基於這個對映關係,當家鄉代理接收移動節點的資料報時,家鄉代理就將資料報轉發給轉交地址。
4.3路由優化
在前面介紹了基於雙向隧道的移動IP服務模式,這種模式在移動節點接收資料時是非常低效的,特別是當給移動節點發送資料報的主機與移動節點很近時,雙向隧道會顯得很雞肋。
為了解決這個問題,移動節點和與其通訊的主機都在自身設定一個通訊代理轉發,在雙方各自的代理上註冊各自的資訊,當彼此通訊時,雙方直接通過彼此的代理向彼此收發資料,而不再通過移動節點的家鄉代理轉發。
同址轉換:移動主機需要執行額外的外地代理軟體,外地網路也需要提供相應的機制,是移動主機能夠自動獲取一個外地網路中的地址作為自己的IP地址和外地代理地址,這個地址被稱為同址轉交地址。有了這個地址,其他主機就可以直接向移動節點發送資料報了,而不需要再經過移動節點的家鄉代理進行轉發了。
三角形路由問題解決方法:三角形路由問題就是前面提到的當與移動節點通訊的主機與移動節點距離很近時,如果還經過家鄉代理轉發就會浪費網路頻寬資源,同時效率也很低。前面講過了同址轉換,但實際給移動主機發送資料報時還是移動節點的家鄉地址,如果只在移動節點的主機上設定一個代理,還不能完全解決問題。解決三角問題,就是在與移動節點通訊的其他主機上設定一個代理,通訊代理先從家鄉代理獲取移動節點的轉交地址,之後傳送給移動主機的IP資料報,都利用轉交地址直接通過IP隧道傳送給移動節點的主機外地代理,這樣就不用再通過移動節點的家鄉代理來轉發了。
上面這些路由解決方案也被稱為路由優化(RO),它實際上涉及很多安全問題,為了解決RO安全問題和可用的方法相當複雜,詳細可以參考[RFC6275]和[RFC4866]。
RO的操作實現分為兩個部分:一部分涉及註冊繫結的建立和維護,另一方面涉及所有繫結建立後的資料交換方法,為了與其他主機建立一個繫結,移動節點必須向每個於其通訊的其他主機證明自己的真實身份,這通過一個返回路由程式(RRP)來完成。通過前面的介紹可以知道,RRP不適用雙向隧道傳輸資料,但需要基於雙向隧道來建立地址對映關係。
RRP使用以下這些移動訊息,它們是IPv6移動擴充套件頭部的子型別:家鄉測試初識化(HoT1)、家鄉測試(HoT)、轉交測試初識化(CoT1)、轉交測試(CoT)。這些訊息向與移動節點通訊的主機驗證一個特定移動節點的家鄉地址(HoT1和HoT)和轉交地址(CoT1和CoT)可到達。參考下面基於RRP的RO通訊註冊過程示意圖來理解:
五、IP資料報的主機處理
雖然路由器再轉發分組時通常不會考慮將哪個IP地址放在分組的源IP地址和目的IP地址欄位中,但主機必須考慮它們。應用程式(例如Web瀏覽器)可能嘗試連線一臺指定的主機或伺服器,它們也可能有多個地址。因此,傳送資料報時使用哪個地址(和IP版本)就有問題。這裡需要探討一個更微妙的情況,如果流量到達一個錯誤的介面(即接收的資料報中存在未配置的目的的地址),是否接收發送到本地IP地址的流量。
5.1主機模式
確定一個單播資料報是否匹配一臺主機的IP地址並被處理,它取決於接收系統的主機模式[RFC1122],以及它是否為最相關的多宿主主機。這裡存在兩種情況:強主機模式和弱主機模式。
強主機模式:只有當目的IP地址與資料報到達的介面配置的IP地址匹配時,才會把資料報交付本地協議棧;
弱主機模式:一個數據報攜帶的目標地址與它到達的任何介面的任何本地地址匹配,無論它到達哪個網路介面,它都會被接收的協議棧處理。
以上的兩種主機模式也適應於傳送行為,主要傳送的資料報的源IP地址與介面配置地址的主機模式相匹配,該主機就可以將資料報從這個介面傳送出去。弱主機模式相對強主機模式存在一些安全問題,例如惡意使用者生成一個目的地址的分組,這個分組可能包括偽造("欺騙")的源IP地址,如果Internet將這個分組路由到目標主機,如果目標主機應用程式基於源IP地址的訪問控制決策,這樣目標主機就可能會跟一個偽造的終端進行通訊。
5.2地址選擇
當一臺主機發送一個IP資料報時,它必須將自己的IP地址寫入資料報的源IP地址欄位,在它已知多個地址的情況下,資料報的目的地確定一臺特定的目的主機。有些情況下源地址是已知的,因為它可以由一個應用程式提供,或者響應同一連線的前一個分組而傳送該分組。
在當前IP實現中,資料報的源IP地址和目的IP地址使用的IP地址,是通過一組稱為源地址選擇程式和目的地址選擇程式獲得的。從網路發展的歷史角度來看,大多數Internet主機只有一個IP地址用於外部通訊,因此選擇地址並不困難。隨著介面可使用多個地址和支援多個地址範圍的IPv6的使用,有些程式必須開始用。當兩臺實現IPv4和IPv6(“雙協議棧”主機見[RFC4213])的主機之間通訊時,這個情況變得更復雜。地址選擇失敗可能導致非對稱路由、不必要的過濾或丟棄分組。
[RFC3484]給出了IPv6預設地址的選擇規則,純IPv4主機通常不會面臨這樣複雜的問題,一般情況應用程式可以呼叫特定的API執行預設操作,但也可能遇到棘手的部署問題[RFC5220]。下面分別來了解預設地址選擇規則[RFC3484]和解決棘手的部署問題的源地址地址選擇演算法及目的地選擇演算法[RFC5220]:
預設地址選擇規則:
[RFC3484]中預設規則是優先在相同在相同範圍內選擇成對的源/目的地址,優先選擇更小而不是更大範圍以避免在其他地址可用時使用臨時地址,以及優先選擇具有更長的通用字首的成對地址。當全球地址有效時,優先選擇它而不是臨時地址。這個範圍也包括“管理覆蓋”預設規則的方法,預設選擇通過一個策略表來控制,它存在於每臺主機中。它是一個最長匹配字首查詢表,類似於IP路由使用的轉發表。
假設對於一個地址A,在該表中進行一次查詢過程,對A生成一個優先順序P(A),以及一個標籤L(A)。優先順序的數值越大,表示更加偏好;標籤用於相似地址型別的分組。例如,如果L(S)=L(D),該演算法傾向於使用該對(S,D)作為源/目的地址對,如果沒有規定其他策略,[RFC3484]建議使用下表中的策略值:
在這個表或一個管理配置引數在站點中配置的表,用於驅動地址選擇演算法。函式CPL(A,B)或“通用字首長度”,是在IPv6地址A和B中從最左邊的位開始一個最長通用字首的位長度。函式S(A)將IPv6地址A的範圍對映到一個數值,範圍越大,對映的值越大:
如果A是鏈路範圍,B是全球範圍,則S(A)<S(B);
函式M(A)將IPv4地址A對映為一個IPv4對映的IPv6地址,由於IPv4地址範圍是基於地址自身,因此需要定義以下關係S(M(169.254.xx))=S(M(127.xxx))<S(M(專用地址空間))<S(M(任何其他地址));
如果A地址是一個過期地址,而B是一個首選地址,則∧(A)<∧(B);
如果A是一個家鄉地址,則H(A)為真;如果A是一個轉交地址,則C(A)為真;
源地址選擇演算法:
[RFC5220]中源地址選擇演算法定義了一個源地址的候選集合CS(D),它基於一個特定的目的地址D。這裡有一個限制,如果任何D不是任播、組播、未指定地址地址的CS(D),使用符號R(A)表示地址A在集合CS(D)中的等級。A比B的等級更高(即RA(A)值更大),表示R(A)>R(B),意味者優先選擇A而不是B作為到達地址D的源地址,表示式R(A)*>R(B)表示在CS(D)中為A分配一個比B更高的等級。符號I(D)表示選擇到達目的地D的介面,符號@(i)是分配給介面i的集合。如果A是一個臨時地址,T(A)為布林值true,否則T(A)為false。
以下規則用於為目的地D建立A和B在CS(D)中的區域性順序:
1.優先選擇相同地址:if A=D,R(A)*>R(B);if B=D,R(B)*>R(A);
2.優先選擇適當範圍:if S(A)<S(B) and S(A)<S(D),R(B)*>R(A) else R(A)*>R(B);if S(B)<S(A) and S(B)<S(D),R(A)*>R(B) else R(B)*>R(A);
3.避免過期地址:if S(A)=S(B) ,{if ∧(A)<∧(B),R(B)*>R(A) else R(A)*>R(B)};
4.優先選擇家鄉地址:if H(A) and C(A) and - (C(B) and H(B)), R(A)*>R(B);if H(B) and C(B) and - (C(A) and H(A)), R(B)*>R(A); if(H(A) and - C(A)) and (- H(B) and C(B)), R(A)*>R(B); if (H(B) and - C(B)) and (-H(A) and C(A)),R(B)*>R(A);
5.優先選擇輸出介面:if A ∈ @(I(D)) and B ∈ @(I(D)), R(A)*>R((B)); if B ∈ @(I(D)) and A ∈ @(I(D)), R(B)*>R(A);
6.優先選擇匹配標籤:if L(A)=L(D) and L(B) ≠ L(D), R(A)*>R(B); if L(B) = L(D) and L(A) ≠ L(D), R(B)*>R(A);
7.優先選擇非臨時地址:if T(B) and -T(A), R(A)*>R(B); if T(A) and -T(B), R(B)*>R(A);
8.使用最長匹配字首:if CPL(A,D) > CPL(B,D), R(A)*>R(B); if CPL(B,D) > CPL(A,D), R(B)*>R(A)。
區域性順序規則可用於形成CS(D)中所候選地址的全域性順序。Q(D)表示為目的地D選擇一個最高等級的源地址,它由目的地地址選擇演算法來使用。如果Q(D)=∅(空),可能無法為目的地D確定源地址。
關於源地址在複雜情況下的選擇每個選擇規則基於演算法選擇合適的地址形成地址集合,按照前面的順序給出相應的優先順序的值,最終匹配地址就跟預設地址選擇方式一樣了,按照優先順序來選擇使用。簡單的來說就是:優先選擇相同地址,優先選擇適當範圍,避免過期地址,優先選擇家鄉地址,優先選擇輸出介面,優先選擇匹配標籤,優先選擇非臨時地址,使用最長匹配字首。
目的地址選擇演算法:
[RFC5220]目的地址選擇演算法也類似源地址選擇的方式,在源地址演算法中Q(D)是上面例子中為目的地D選擇的源地址。如果目的地B不可達,則令U(B)為布林值true。E(A)表示採用某些“封裝傳輸”(例如,隧道路由)可到達目的地A。集合SD(S)採用與前面的成對元素A和B相同的結構,那麼可以獲得以下規則:
1.避免不可用的目的地:if U(B) or Q(B)=∅,R(A)*>R(B); if U(A) or Q(A)=∅, R(B)*>R(A);
2.優先選擇匹配範圍:if S(A)=S(Q(A) and S(B) ≠ S(Q(B)), R(A)*>R(B);if S(B)=S(Q(B)) and S(A) ≠ S(Q(A)), R(B)*>R(A);
3.避免過期地址:if ∧(Q(A)) < ∧(Q(B)),R(B)*>R(A); if ∧(Q(B))< ∧(Q(A)),R(A)*>R(B);
4.優先選擇家鄉地址:if H(Q(A)) and C(Q(A)) and - (C(Q(A)) and H(Q(B))), R(A)*>R(B);if (Q(B)) and C(Q(B)) and - (C(Q(A)) and H(Q(A))), R(B)*>R(A); if (H(Q(A)) and - C(Q(A))) and (-H(Q(B)) and C(Q(B))), R(A)*>R(B); if (H(Q(B)) and - C(Q(B))) and (- H(Q(A)) and C(Q(A))), R(B)*>R(A);
5.優先選擇匹配標籤:if L(Q(A)) = L(A) and L(Q(B)) ≠ L(B),R(A)*>R(B); if L(Q(A)) ≠ L(A) and L(Q(B)) = L(B), R(B)*>R(A);
6.優先選擇更高優先順序:if P(A)>P(B),R(A)*>R(B); if P(A)<P(B),R(B)*>R(A);
7.優先選擇本地傳輸:if E(A) and -E(B), R(B)*>R(A);if E(B) and - E(A), R(A)*>R(B);
8.優先選擇更小範圍:if S(A)<S(B),R(A)*>R(B) else R(B)*>R(A);
9.使用最長匹配字首:if CPL(A, Q(A)) > CPL(B, Q(B)), R(A)*>R(B); if CPL(A,Q(Q)) < CPL(B,Q(B)),R(B)*>R(A);
10.否則保持等級順序不變;
還是跟源地址選擇演算法一樣,根據不同優先順序的演算法匹配地址並獲得相應的優先順序值,然後基於優先順序值確定目的地址。目的地址選擇的優先順序同樣跟上面的順序一樣,那麼目的地址選擇的優先順序是:避免不可用的目的地,優先選擇匹配範圍,避免過期地址,優先選擇家鄉地址,優先選擇匹配標籤,優先選擇更高優先順序,優先選擇本地傳輸,優先選擇更小範圍,使用最長匹配字首。