1. 程式人生 > >《TCP IP 詳解卷1:協議》閱讀筆記 - 第五章

《TCP IP 詳解卷1:協議》閱讀筆記 - 第五章

但是 選擇 路由轉發 匹配 -s 構圖 防止 余數 出現

閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的資料屬RFC官方文檔)。

第五章:Internet 協議

IP是TCP/IP協議族中的核心協議,TCP、UDP、ICMP、IGMP數據都通過IP數據報傳輸。IP提供了一種"盡力而為、無連接"的數據交付服務:盡力而為表示不保證IP數據報能成功到達目的地;無連接意味著IP不維護網絡單元中數據報相關的任何鏈接狀態信息,每個數據報獨立於其他數據報來處理,這也意味著IP數據報的可不按順序交付。

IPv4頭部

如下是IPv4的數據報結構圖:

技術分享圖片

這裏主要關註IPv4的頭部信息,一個典型的IPv4基本頭部(指不包括IP選項)包含20字節。包含:

1. 版本標識(IPv4為4,IPv6為6);

2. IHL(Internet頭部長度);

3. DC字段(服務類型字段),指定一個等效的通信類型字段,前6位是區分服務字段,後2位(ECN)是顯式擁塞通知字段或指示位;

4. 總長度,IPv4數據報的總長度,由於它是一個16位字段,所以可以算出IPv4數據報的最大長度是65535字節(理想化的最大,實際通信由多方因素計算後取最小值);

5. 標識字段,幫助標識由IPv4主機發送的數據報,避免數據報分片混淆;標誌是一個3位的控制字段,表示是否允許數據分片、該數據報是否是末尾的數據報;分片偏移字段給出該分片負載字節中的第一個字節在原始IPv4數據中的偏移量;

6. TTL(生存期)用於設置一個數據報可經過的路由器數量上限,每經過一臺路由器,該值減1,直至0,用於防止由於出現路由環路而導致的數據報循環;

7. 協議字段表示數據報有效載荷部分的數據類型,最常用值為17(UDP)和6(TCP);

8. 頭部校驗和字段僅計算IPv4頭部,不檢查數據報有效載荷的正確性;

9. 源IP地址和目標IP地址,數據通信的兩端地址。

IPv4支持一些可供數據報選擇的選項,填充在選項字段,選項有一個8位的類型字段標識:復制(1位)、類別(2位)、編號(5位)。

IPv4選項如下表:

技術分享圖片

IPv6頭部

如下是IPv6的頭部信息圖:

技術分享圖片

相對於IPv4頭部,少了一些信息,也多了一些信息,多了的信息包括:

  1. 流標簽以標識同一個流裏面的報文;

  2. 負載長度(對比標識字段)字段提供IPv6數據報的長度,不包括頭部長度,但包括IPv6擴展頭部;、

  3. 下一個頭部字段用來指明報頭後接的報文頭部的類型,若存在擴展頭,表示第一個擴展頭的類型,否則表示其上層協議的類型,它是IPv6各種功能的核心實現方法;

  4. 跳數限制(對比IPv4的TTL)

IPv6擴展頭部

擴展頭部和更高協議頭部與IPv6頭部鏈接起來構成級聯的頭部,每個頭部的下一個頭部字段標識緊跟著的頭部類型,類型值有:

技術分享圖片

如果存在擴展協議,則IPv6數據報看起來是這樣的:

技術分享圖片

IPv6選項

由於IPv4頭部空間的限制,那些來自IPv4的選項已停止使用,而IPv6可變長度的擴展頭部或編碼在特殊擴展頭部中的選項可適應當前更大的Internet。如果選項存在,可放入逐跳選項或目的地選項。

  1. 填充1和填充N:填充1選項(類型0)是唯一缺少長度字段和值字段的選項。它僅有1字節長,取值為0。填充N選項(類型1)向頭部的選項區域填充2字節或更多字節,對於n個填充字節,選項數據長度字段包含的值為(n-2)。

  2. IPv6超大有效載荷:IPv6超大有效載荷選項指定了一種有效載荷大於65535字節的IPv6數據報,稱為超大報文。超大有效載荷選項提供了一個32位的字段,用於攜帶有效載荷在65535~4294967295字節直接的數據報,當使用超大報文時,正常的敷在長度字段被設置位0。

  3. 隧道封裝限制:路由器想要將IPv6數據封裝在一條隧道中,它首先檢查隧道封裝限制選項是否存在並置位,如果不為0,則可進行隧道封裝,且新封裝的IPv6數據報必須包括這個選項,其值相對之前的封裝限制值減1,依次封裝遞減。

  4. 路由器警告:與IPv4的該選項一樣,指出包含需要路由器處理的信息。

  5. 快速啟動:適用於IPv4和IPv6,但目前建議僅用於專用網絡。選項包括發送者需要的以比特/秒為單位的傳輸速率的編碼值、QS TTL值和一些額外信息。

  6. CALIPSO:於在某些專用網絡中支持通用體系結構標簽IPv6安全選項。它提供了一種為數據報做標記的方法,包括一個安全級別標識符和一些額外的信息。

  7. 家鄉地址:當使用IPV6移動選項時,這個選項保存發送數據報的IPv6節點的"家鄉"地址。當遠離"家鄉"(典型位置的地址前綴)漫遊時,通常為該節點分配一個不同的IP地址。該選項允許這個節點提供自已正常的家鄉地址,以及它在漫遊時的新地址(通常是臨時分配)。當其他IPv6節點需要與移動節點通信時,它可以使用該節點的家鄉地址。如果家鄉地址選項存在,包含它的目的地選項頭部必須出現在路由頭部之後,並在分片和ESP頭部之前。

"家鄉"的概念來自典型位置的地址前綴,其設計目的是為了讓移動設備用戶,能夠從一個網上系統中,移動到另一個網上系統,但是設備的IP地址保持不變。這能夠使移動節點在移動中保持其連接性,實現跨越不同網段的漫遊功能。

Internet校驗和

Intenret校驗和是一個被校驗數據(如果被計算的字節數為奇數,用0填充)的16位反碼和的反碼,它能以相當高的概率確定接收的消息或其中的部內容是否與發送的相匹配。如果被計算數據包括一個校驗和字段,該字段在進行校驗和運算之前被設置為0,然後將計算出的校驗和填充到該字段。為了檢查一個包含校驗和字段(頭部、有效載荷等)的數據輸入是否有效,需要對整個數據塊(包括校驗和字段)同樣計算校驗和。由於校驗和字段本質上是其余數據校驗和的反碼,對正確接收的數據計算校驗和應產生一個值0。

發送的行為:

為了給輸出的數據報計算IPv4頭部校驗和,首先將數據報的校驗和字段值設置為0。然後,對頭部(整個頭部被認為是一個16位字的序列)計算16位二進制反碼和。這個16位二進制反碼和被存儲在校驗和字段中。二進制反碼加法可通過“循環進位加法”實現:當使用傳統(二進制補碼)加法產生一個進位時,這個進位以二進制值1加在高位。

接收的行為:

當一個IPv4數據報被接收時,對整個頭部計算出一個校驗和,包括校驗和字段自身的值。假設數據報沒有錯誤,計算出的校驗和值為0(值FFFF的反碼)。對於任何不正常的分組或頭部,分組中的校驗和字段值不為FFFF。

案例:

# 發送
消息:            E3 4F 23 96 44 27 99 F3 [00 00]    ← 校驗和字段 = 0000
二進制補碼和:     1E4FF
二進制反碼和:     E4FF + 1 = E500
二進制反碼:       ~(E500)=~(1110 0101 0000 0000) = 0001 1010 1111 1111 = 1AFF (校驗和)

# 接收
消息 + 校驗和 =  E34F + 2396 + 4427 + 99F3 + 1AFF = E500 + 1AFF = FFFF  
                ~(消息 + 校驗和) = 0000

路由頭部

IPv6路由頭部位發送方提供一種IPv6數據報控制機制,以控制數據報通過網絡的路徑。路由頭部包含一個8位的路由類型標識符和一個8位的剩余部分字段。路由類型標識符為0或者2,分別代表類型0(RH0)和類型2(RH2)。剩余部分字段指出還有多少段路由需要處理,也就是在到達最終目的地之前仍需訪問的中間節點數。

如下圖的路由轉發過程:

技術分享圖片

路由頭部指定了經過的路由路徑:R1、R2、R3、D;Left字段位剩余部分字段。由於R0的地址在數據報中不存在,因此R0沒有修改路由頭部或地址。當數據報到達R1時,將基本頭部的目的地址和路由頭部的第一個地址交換,並將剩余部分字段遞減1。

分片頭部

分片頭部用於IPv6源節點向目的地發送一個大於路徑MTU的數據報,1280字節是整個網絡中針對IPv6定義的鏈路層最小MTU。

在IPv4中,如果數據報大小超過下一跳MTU,任何主機或路由器都可以將該數據分片,而在IPv6中僅數據報的發送者可以執行分片操作,這種情況下就需要添加一個分片頭部。

在分片過程中,輸入的數據報稱為“原始數據報”,它由兩部分組成: “不可分片部分”和“可分片部分”。

不可分片部分包括IPv6頭部和任何在到達目的地之前需由中間節點處理的擴展頭部(即包括路由頭部之前的所有頭部,如果有逐跳選項擴展頭部,則是該頭部之前的所有頭部);可分片部分包括數據報的其余部分(即目的選項頭部、上層頭部和有效載荷數據)。當原始數據報被分片後,將會產生多個分片,其中每個分片都包含一個原始數據報中不可分片部分的副本,但是需要修改每個IPv6頭部的負栽長度字段,以反映它所描述的分片的大小。在不可分片部分之後,每個新的分片都包含一個分片頭部,其中包含一個分片相應的分片偏移字段(例如第一個分片的偏移量為0),以及一個原始分組的標識符字段的副本。最後一個分片的M(更多分片)位字段設置為0。

數據報分片過程如圖:

技術分享圖片

1個3960字節的有效載荷被分為3個1448字節或更小的分片,每個分片包含一個帶相同的標識符字段的分片頭部,除了最後一個分片,所有分片的更多分片(M)字段設置為1。偏移量以8字節為單位,例如最後一個分片包含的數據是從原始數據開始處偏移(362*8)=2896字節。

IP轉發

主機和路由器處理IP數據報的區別在於:主機不轉發那些不是由它生成的數據報,但路由器會。
IP轉發表包含以下信息:

  1. 目的地:32位字段,,用於與一個掩碼操作結果相匹配。用於發送到所有目的地的默認路由情況下,地址全設為0。

  2. 掩碼:32位字段,用作數據報目的IP地址按位與操作的掩碼。

  3. 下一跳:下一個IP實體的32位IPv4地址或者128位的IPv6地址,數據報將被轉發到這。

  4. 接口:它包含一個由IP層使用的標識符,以確定將數據報發送到下一跳的網絡接口。

IP轉發逐跳進行,當一臺主機或路由器中的IP層需要向下一跳的路由器或主機發送一個數據報時,它首先檢查數據報中的目的IP地址(D)。在轉發表中使用該值D來執行最長前綴匹配算法:在表中搜索具有以下屬性的所有條目:(D^mj)=dj。

  1. 其中mj是索引為j的轉發條目ej的掩碼字段值,dj是轉發條目ej的目的字段值。

  2. 這意味著目的IP地址D與每個轉發表條目中的掩碼mj執行按位與,並將該結果與同一個條目中的目的地dj比較。

  3. 如果滿足這個屬性,該條目ej與目的IP地址進行"匹配"。

  4. 當進行匹配時,該算法查看這個條目的索引j,以及在掩碼mj中有多少位設置為1。設置為1的位數越多,說明匹配的越好。

  5. 選擇最匹配的條目ek(即掩碼mk中最多位為1的條目),將其下一跳字段nk作為轉發數據報的下一跳IP地址。

如果轉發表中沒有發現匹配的條目,這個數據報則無法交付。

移動IP

基於上文中提到的"家鄉"的概念,移動IP的實現方案依賴於一種特殊類型的路由器,被稱為"家鄉代理",用於為移動節點提供路由。MIPv6的復雜性主要涉及信令消息以及如何保證它們的安全,這些消息使用各種形式的移動擴展頭部,因此移動IP自身實際上是一種特殊協議。

下圖顯示了MIPv6運行中涉及的實體,大部分適用於MIPv4。

技術分享圖片

1. 一臺可能移動的主句稱為移動節點(MN),與它通信的主句稱為通信節點(CN)。

2. MN被賦予一個由家鄉網絡的網絡前綴獲得的IP地址,被稱為家鄉地址HoA。

3. 當它漫遊到一個可訪問的網絡時,它被賦予另外一個地址,稱為轉交地址CoA。

4. 當一個CN與一個MN通信時,該流量需要通過MN的家鄉代理HA來路由,並使用一種雙向的IPv6分組隧道,稱為雙向隧道。

這些消息通常由IPsec的封裝安全有效負載(ESP)來保護。

基於雙向隧道的MIPv6可能出現低效的路由,可使用路由優化(RO)方法來處理,這需要被涉及的各個節點都支持該功能。

路由優化涉及到一個通信註冊過程,一個MN將當前的CoA通知給相應的CN,允許它們執行無須HA協助的路由。操作分為兩部分:一部分涉及註冊綁定的建立和維護;一部分涉及所有綁定建立後的數據報交換方法。

為了與CN建議綁定,MN必須向每個CN證明自己的"真實身份",通過返回路由程序RRP完成這些。

RRP中,MN和CN通過家鄉代理HA進行信息轉發,以達到身份認證。如圖所示:

技術分享圖片

家鄉測試初始化(HoTI)、家鄉測試(HoT)、轉交測試初始化(CoTI)和轉交測試(CoT),數字表示順序。

HoT消息經由HA發送到MN,消息中包含稱為令牌的隨機字符串, MN使用它形成一個加密密鑰,這個密鑰被用於生成發送給CN的經過認證的綁定更新。

IP數據報的主機處理

對於主機如何處理接收或發送的數據報,存在兩種模式:強主機模式和弱主機模式。

對於接收行為:

  強主機模式中,只有當"目的IP地址字段中包含的IP地址"與"數據報到達的接口配置的IP地址"匹配時,才同意把將數據報交付本地協議棧。

  弱主機模式中,"數據報攜帶的目的地址"與"它到達的任何接口的任何本地地址"匹配,無論它到達哪個網絡接口,它都會被接收的協議棧處理。

對於發送行為:

  強主機模式中,只有在"數據報的源IP地址"所對應的網絡接口才可以發送數據報。

  弱主機模式中,無論哪個網絡接口都可以發送數據報。

在Windows系統中,強主機模式是IPv4和IPv6發送和接收的默認模式;Linux中默認采用弱主機模式;BSD(含 Mac OS X)采用強主機模式。

當一臺主機發送一個IP數據報時,它必須將自已的IP地址寫入數據報的源IP地址字段,在它已知多個地址的情況下,數據報的目的地址確定一臺特定的目的主機。
當前IP實現中,數據報的源IP地址和目的IP地址是通過"源地址選擇程序和目的地址選擇程序"獲得的。

源地址選擇程序

算法說明:

  1. 該算法定義了一個源地址的候選集合CS(D),基於一個特點的目的地址D(除去任播、組播和未指定地址)。

  2. 符號R(A)表示地址A在集合CS(D)中的等級,A比B的等級高,則R(A)>R(B),意味著優先選用A作為到達地址D的源地址。

  3. R(A)*>R(B)表示在CS(D)中為A分配一個比B更高的等級。

  4. I(D)表示選擇到達目的D的接口(通過最長匹配前綴轉發算法獲取)。

  5. @i是分配給接口i的地址集合。

  6. 如果A是一個臨時地址,T(A)為布爾值true,否則為false。

  7. Q(D)表示目的地D選擇一個最高等級的源地址,如果Q(D)=φ(空),可能無法為目的地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(B) 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).

目的地址選擇程序

算法說明:

  1. Q(D)是為目的地D選擇的源地址

  2. 如果目的地B不可到達,則U(B)為布爾值true

  3. E(A)表示采用某些"封裝傳輸"可到達目的地A

  4. 集合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(B)) 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(A)) < CPL(B,Q(B)), R(B) *> R(A).

  10. 否則,保持等級順序不變

這些算法(源地址和目的地址選擇)傾向於選擇範圍有限、永久性的地址。

《TCP IP 詳解卷1:協議》閱讀筆記 - 第五章