Chapter 8 網際網路通訊協定
目標 本章結束後,您將能夠: 了解資料包的格式和欄位 了解為什麼需要分段及相關的欄位 了解 IP 資料包中可獲得的各種選項 可以去執行檢查碼的計算 了解 IP 套件中的各模組及其交互運作的情況
8.1 資料包 在 IP 層的封包稱為資料包 ( datagram ),為一不固定長度的封包,包括標頭 ( header ) 及資料 ( data ) 這兩個部分。 標頭有 20 到 60 個位元組長,包含傳送路徑的重要訊息。
在第四版的 IP 中,優先權欄位並未被使用。 請注意: 在第四版的 IP 中,優先權欄位並未被使用。
總長度欄位定義了資料包的總長度, 包括標頭。 請注意: 總長度欄位定義了資料包的總長度, 包括標頭。
範例1 某一個到達的 IP 封包,其最前面 8 個位元為: 01000010 接收者會移除該封包,為什麼? 解答 此封包中有錯誤。最左的 4 位元 ( 0100 ) 代表版本,這部分正確。後面 4 位元 ( 0010 ) 代表標頭長度為 2 × 4 = 8 位元組,這是錯誤的,因為最小的標頭長度,需為 20 位元組, 這封包在傳輸過程已經被破壞。
範例2 某 IP 封包其 HLEN 為 1000 ( 二進制 ),請問此封包攜帶多少位元組的選項?
範例3 某 IP 封包其 HLEN 之值為 ( 5 )16,總長度欄之值為 ( 0028 )16,請問此封包攜帶多少資料?
範例4 某一個到達的 IP 封包,其前面幾個位元組以十六進制表示為: 4500 0028 0001 0000 0102 …. 請問這個封包還可以經過幾個路由器,而不會被移除? 其資料屬於哪一種上層通訊協定? 解答 要找到 TTL 值,我們要跳 8 個位元組,TTL 在第 9 位元組為01,表示這個封包只能再漫遊一個站台。通訊協定欄為 TTL的下一個位元組,其值為 02 表示上層的協定是 IGMP ( 見表8.4 )。
8.2 分段 一個訊框 ( frame ) 的格式與大小取決於該訊框所使用的實體網路通訊協定。一個資料包可能需要被分段 ( fragment ) 來符合該通訊協定的規定。 本節所討論的主題包括: 最大傳輸單元 ( MTU ) 與分段有關的欄位
範例5 某個到達的封包,其 M 位元值為 0。請問它是第一個片段,或是最後一個片段,或是中間的片段?我們是否能知道此封包有沒有被分段過?
範例6 某個到達的封包,其 M 位元值為 1。請問它是第一個片段,或是最後一個片段,或是中間的片段?我們是否能知道此封包有沒有被分段過? 解答 如果 M=1 表示至少還有 1 個片段, 目前這個片段可能是第一或是中間的一個片段, 我們不知道這是第一個或是中間的。 不過可以肯定的是原來的封包有被分段過,因為 M 為 1。
範例7 某個到達的封包,其 M 位元值為 1,分段差量值為 0。請問它是第一個片段,或是最後一個片段,或是中間的片段?
範例8 某個到達的封包,其分段差量值為 100。請問它的第一個位元組的編號為何?我們是否能知道最後一個位元組的編號為何? 解答 要找到第一個位元組的編號,需將分段差量值乘以 8。 所以第一個位元組的編號為 800。 我們無法知道最後一個位元組的編號, 除非我們知道資料的長度。
範例9 某個到達的封包,其分段差量值為 100,HLEN值為 5,長度欄之值為 100。請問它的第一個位元組和最後一個位元組的編號為何? 解答 第一個位元組的編號為100 × 8 = 800。 因為總長度為 100 位元組,而標頭長度為 5 × 4 = 20 位元組, 所以表示資料為 80 個位元組。 第一個位元組的編號為 800, 因此最後一個位元組的編號為 879。
8.3 選項 IP 資料包的標頭可分為兩個部分,分別是固定的部分及可變的部分。可變的部分所包含的選項 ( option ) 可達 40 個位元組長。 本節所討論的主題包括: 格式 選項種類
範例10 在 IP 標頭的 6 個選項中,有哪些必須拷貝到每一個片段? 解答 檢查每個選項之命令碼的第一個位元 ( 最左邊那個位元 )。 無動作:命令碼為000000001;不用拷貝。 選項結束:命令碼為00000000;不用拷貝。 記錄路由:命令碼為00000111;不用拷貝。 嚴格受控來源端路由:命令碼為10001001;要拷貝。 寬鬆受控來源端路由:命令碼為10000011;要拷貝。 時間戳記:命令碼為0100100;不用拷貝。
範例11 在 IP 標頭的 6 個選項中,有哪些是作為資料包控制用,有哪些用來作為偵錯及管理用? 解答 檢查每個選項之左邊的第二及第三位元。 無動作:命令碼為000000001;資料包控制。 選項結束:命令碼為00000000;資料包控制。 記錄路由:命令碼為00000111;資料包控制。 嚴格受控來源端路由:命令碼為10001001;資料包控制。 寬鬆受控來源端路由:命令碼為10000011;資料包控制。 時間戳記:命令碼為0100100;偵錯及管理。
範例12 在 UNIX 的系統工具中,有一個稱為 ping 的指令可以讓我們檢查 IP 封包的漫遊動作。我們會在下一章討論 ping 程式的細節,在這個範例中,我們先說明如何使用 ping 程式來檢查某個主機是否存在網路上。我們 ping 一台位於 De Anza College 的伺服器,名稱為 fhda.edu。結果顯示此主機的 IP 位置為153.18.8.1。 結果也顯示了使用的位元組個數。
範例13 我們可以在使用 ping 指令時加上 –R 的選項,來執行記錄路由。 結果也顯示了介面及 IP 位址。
範例14 在 UNIX 的系統工具中,traceroute 程式也可以使用來追溯某個封包的路徑選擇。 結果顯示了所經過的 3 個路由器。
範例15 traceroute 程式也可以使用來執行寬鬆受控來源端路由。選項 –g 可能讓我們定義從來源端到目的端之間所要經過的路由器。下面說明了我們可以傳送一個封包到 fhda.edu 伺服器,並要求此封包要經過 IP 位址為 153.18.251.4 的路由器。
範例16 traceroute 程式也可以使用來執行嚴格受控來源端路由。選項 –G 強迫此封包要經過定義在命令列中的路由器。下面說明了我們可以傳送一個封包到 fhda.edu 伺服器,並強迫此封包只能經過 IP 位址為153.18.251.4 的路由器。
8.4 檢查碼 TCP/IP 通訊協定組之中,大部分的通訊協定所使用的錯誤偵測方法稱為檢查碼 ( checksum )。檢查碼是針對封包在傳輸過程中可能遭受破壞所使用的一種保護措施。檢查碼算是封包所加入的一些多餘的訊息。 本節所討論的主題包括: 傳送端檢查碼的計算 接收端檢查碼的計算 IP 封包使用的檢查碼
請注意: 傳送端計算檢查碼的步驟: 將封包分成 k 個段落,每個段落有 n 個位元。 將所有的段落以 1 的補數運算的方法加起來。 再求上面結果的補數值即為檢查碼。
範例17 圖8.24 說明 IP 標頭的檢查碼計算過程,這個 IP 標頭沒有選項欄,標頭被分成數個 16 位元的段落,各段落被加總起來,然後再求其補數,最後的結果填入檢查碼的欄位。 接下一張投影片
範例18 讓我們以十六進制再做一次。 每一列有 4 個十六進制數字,首先我們計算總和的部份。 注意如果所加的結果超過一個數字的大小,要進位到左邊的數字。 將總和的部份做補數運算以求檢查碼,因為我們是以十六進制計算,所以 E 的補數是 1,而 4 的補數是 B,圖8.25 說明了這些運算。 注意答案 8BB1 與範例17的結果一樣。 接下一張投影片
8.5 IP 套件 我們介紹一個簡化過的 IP 軟體套件設計,來說明它的各個模組及模組之間交互關係。此 IP 套件包括 8 個模組。 本節所討論的主題包括: 添加標頭模組 處理模組 佇列 路由表 轉送模組 MTU表格 分段模組 重組表格 重組模組