1、Chapter 8Internet Protocol (IP)靜宜大學資工系蔡奇偉 副教授2006大綱n簡介nIP 資料報n分段n選項n檢查合 (checksum)nIfconfignnetstatPosition of IP in TCP/IP protocol suite簡介IP 提供的是屬於不可靠 (unreliable)、非連接導向 (connectionless) 的傳送服務。所謂的不可靠,是指它並不保證 IP 資料報可以成功地到達目的地。當錯誤發生時,例如路由器的暫存器滿了,IP 會提供一個簡單的錯誤處理演算法:把錯誤的資料報丟棄,並且嘗試送回一個 ICMP 訊息。任何需要可靠傳送
2、服務的功能,需要由較上層來提供 (如 TCP)。非連接導向,是指 IP 並不維護任何有關連續資料報的資訊。每個資料報都是個別處理。這表示 lP 資料報在傳送時並不一定是依照順序的。如果傳送端送出兩個連續的資料報 (先傳送 A,再傳送 B) 到同一個目的端,結果有可能是 B 比 A 先到達,理由是兩個資料報被個別地傳送,而且很可能經由不同的路徑。20位元Figure 8-2IP 資料報資料報位元組順序 (Byte Order)Byte2Byte3Byte1Byte0Little EndianBase Address+0 Byte0Base Address+1 Byte1Base Address+
3、2 Byte2Base Address+3 Byte3 如 Intel CPUBig EndianBase Address+0 Byte3Base Address+1 Byte2Base Address+2 Byte1Base Address+3 Byte0 如 PowerPC參見:http:/www.cs.umass.edu/verts/cs32/endian.htmlTCP/IP 採用 Big Endian 的位元組順序:傳送多位組型態的資料時,先傳送高位元組,後傳送低位元組。Byte2Byte3Byte1Byte0傳送順序: 1 2 3 4版本 (Version)這 4 位元定義 lP
4、協定的版本。目前使用第 4 版,所以位元值為 0100。這個欄位是告知機器上的軟體,日前資料包的格式為第 4 版的格式。版本欄位之解釋都必須依第 4 版的規範進行。若某一台電腦用別的版本,則所收到的資料包要被丟棄掉,而非以不正確解釋來處理。標頭長度 (Header Length)本欄定義標頭的總長度,單位是字單位是字 (word),而每個字為 4 個位元組。在沒有選項時,標頭長度為 20 個位元組,此時本欄數值為 5 (5 4 = 20),若選項全部都使用時,標頭長度為 15 (15 4 = 60)。差異服務 (Differentiated service)之前稱為服務類型 (Service
5、type)。 IETF 最近改變這 8 個位元的解釋意義,現在叫做差異服務。服務類型 (Service type)IPv4 沒使用此欄一次只能有一個位元為 1;若全為 0,表示正常類型。Figure 8-3差異服務 (Differentiated service)當最右邊 3 個位元都是 0 時,最左邊的 3 個位元的意義與服務類型中的優先權位元一樣。類別代碼點數分配單位1XXXX0IETF2XXX11地區性網路機構3XXX01暫時性實驗用當最右邊 3 個位元不全都是 0 時,這時前 6 個位元定義 64 種不同優先權的服務,由不同的網路相關人員分配,如右表。總長度 (Total length
6、) 本欄為 16 位元。定義包括 IP 資料包的標頭及資料總長度,單位是位元組單位是位元組。要找出上層送來資料的長度,可將總長度減去標頭長度。標頭長度以 HLEN 欄位的數值乘以 4 而獲得。資料長度 = 總長度 - 標頭長度因為總長度有 16 位元所以 lP 資料包總長度最大為 65535 (216 - 1) 個位元組,其中 20 到 60 個位元組為標頭,剩下的即為來自上層的資料。我們稍後再討論以下三個用於分段 (fragment) 的欄位: 辨識代碼 (Identification) 旗標 (Flags) 分段差量 (Fragmentation Offset)存活時間 (Time to
7、Live, TTL) 這個欄位是用來控制一個資料包所能經過的路由器個數。當來源端電腦送出資料包時,它設定一個 TTL 數值,這個數值大約是兩台電腦間可能通過的路由器數目的兩倍。路由器收到一個資料包後,將此資料包內的 TTL 數值減 1,如果減後的數值為0,該路由器就將這個資料包丟掉。網際網路上的路由器可能會壞掉,所以需要存活時間這一欄。倘若路由器壞掉,資料包可能在兩台或多合路由器間繞來繞去,形成資源的浪費,因此存活時間限制了一個資料包的生命,也防止由網路上突然跑出舊的資料包使得上層的協定如 TCP 感到不解。本欄另一用途是讓來源端限制封包旅行的距離。譬如,來源端要將封包限制在區域網路內,TTL
8、 值就存 1。這樣子,當這個封包到達第一個路由器時,數值被減為 0,即被丟掉。協定 (Protocol)這是一個 8 位元長的欄位。定義使用 IP 層服務的上層協定。IP 資料包可以包裝來自 TCP、UDP、ICMP 及 IGMP 等較高層的資料。這個欄位指定了 IP 資料包最終目的地要跑的協定。換言之,IP 協定是做多至一的多工運作,或一至多的解多工運作,這個欄位有助於資料在到達目的地後,很快地解出是給哪個上層協定用 (如下圖)。數值協定1ICMP2IGMP6TCP17UDP89OSPF檢查和 (Checksum) 檢查和是為封包在傳輸過程中可能遭受破壞所使用的一種驗証措施。送出者計算檢查和
9、的數值,然後將之與封包一起送出。接收者針對整個封包,包括檢查和本身,施以相同的計算程序,如果其結果正確,則接受該封包,否則便拒絕。我們稍後再細說 IP 檢查和的計算方式。來源位址 (Source address) 這 32 位元定義來源端的 lP 位址,這個欄位在 IP 資料包旅行過程都是不會變的。目的位址 (Destination address)這 32 位元定義目的端的 lP 位址,與來源位址相同,在IP 資料包旅行過程中都是不會變的。某到達之 IP 封包其前 8 位元為 01000010接收者為什麼得丟棄該封包?此封包中有錯誤。最左的 4 位元 0100 代表版本,這部分正確。後面 4
10、 位元(0010) 代表標頭長度為 2 4 = 8,這是錯誤的,因為最小的標頭長度,需為 20 位元組。可知這封包在傳輸過程有被破壞過。某 IP 封包其 HLEN 為 10002,問此封包攜帶多少位元組的選項?HLEN 值為 8,代表標頭的總長為 32 (84) 位元組。最前面 20 位元組為主要標頭,剩下的 12 位元組為選項。HLEN 為 5 表示標頭為 20 (54) 位元組,總長為 40 位元組,所以資料長度為 20 位元組 (40-20)。某 IP 封包其 HLEN 為 516,長度欄之值為002816,問此封包攜帶多少位元組的資料?某到達 IP 封包其前面幾個以 16 進制表示數字
11、如下, 問這個封包還可以經過幾個路由器,而不會被丟掉?其資料屬於哪一種上層協定? 45000028000100000102.要找到 TTL 值,我們要跳 8 個位元組,TTL 在第九位元組為 01,表示這個封包只能再旅行一個站。協定欄為 TTL 的下一個位元組,其值為 02 表示上層的協定是 IGMP。分段 (Fragmentation)資料包旅行要經過不同的網路,每個路由器從收到的訊框分解出 IP 資料包,經過處理將之再封裝成另一個訊框。路由器所收到的訊框格式與長短取決於該訊框所使用的實體網路協定。相同的,路由器要送出的訊框其格式與大小同樣取決於該訊框所使用的實體網路協定。例如,某路由器將一
12、乙太網路接到一個記號環網路 (token ring),那麼,它接收的訊框是乙太網路的訊框格式,而送出的訊框格式是記號環的格式。我們將資料包分成小段,使其能在這些網路上傳送,這個過程稱為分段 (fragmentation)。Figure 8-6MTU20 65535 bytes當一個資料包被分段後,每一小段有自己的標頭,這些小段中大部分的欄位是一樣的,只有一些欄位會改變。一個被分段過的資料包,如果遇到一個更小的網路可能會再被分段,換言之,一個資料包可能在到達最終目的地之前被分段好幾次。分段可能由來源端主機或路徑表裡的任何一台路由器來做,因為每個小段本身變成了一個獨立的資料包,所以將資料包再重組回
13、來的工作由目的主機來做。與 IP 資料包分段及重組有關的欄位包括:辨識代碼、旗標及分段差量。辨識代碼 (ldentification)這個 16 位元欄位用來辨識來自於某個來源電腦的資料包。辨識代碼與來源 lP 位址一起可以定義一個離開來源電腦的資料包。為了保證唯一性,IP 協定使用一個計數器來為資料包編號碼。當一個資料包被分段時,辨識欄中的數值被拷貝到所有分段,亦即所有分段有著相同的辨識號碼。目的端把相同辨識數值的所有分段組成原來的資料包。旗標 (Flags) 3 位元的欄位 第一個位元保留不用。 第二個位元稱為不要分段欄位 (do not fragment):1: 表示不要將此資料包分段0
14、: 表示如果有需要,該資料可被分段。 第三位元稱為尚有分段位元 (more fragment):1: 表示該資料包不是最後的分段。0: 表示此資料包為最後或是唯一的分段。Figure 8-7分段差量 (fragmentation offset) 這是一個 13 位元的欄位用來代表此一分段在整個資料包的相對位置。此數值代表該分段在原來資料包的位址差量,以以 8 個位元組為單位個位元組為單位(這樣做是因為差量欄只有 13 個位元,無法容納超過 8,191 的差量)。Figure 8-9分段範例某到達封包其 M 位元值為 0,這是哪個分段?我們知道封包遭分段嗎?如果 M 位元為 0,代表沒有其他分段
15、,這是最後一個分段。但是我們無法判斷原來的封包是否遭分段。某到達封包其 M 位元為 1,這是哪個分段?我們知道原來封包被分段嗎?如果M = 1 表示至少還有一個分段,目前這個分段可能是第一或是中間的一個分段,我們不知道這是第一個或是中間的。不過可以肯定的是原來的封包有被分段,因為 M 為 1。某到達封包其 M 值為 1,分段差量值為 0,這是哪種分段?因為 M = 1,所以,不是第一分段就是中間的分段,又因為差量值為 0,所以它是第一分個段。某到達封包其差量值為 100,問第一個位元組的號碼為何?能知道後一個位元組的號碼嗎?耍找到第一個位元組的號碼,需將差量值乘以 8。所以第一個位元組的號碼為
16、 800。我們無法知道最後一個位元組的號碼,除非能知道資料的長度。某到達封包其差量值為 100,HLEN 值為 5,長度欄之值為 100,問第一個位元組及最後一個位元組的號碼各為何?第一個位元組號碼為100 8 = 800。總長度為 100 位元組,標頭長度為 20 位元組 (5 4),表示資料為 80 位元組,第一個位元組號碼為 800,因此最後一個位元組號碼為 879。選項 (Options)選項 (option) 顧名思義不是每個資料包都需要,選項是給網路測試及除錯用。在 IP 標頭中,選項最多能佔 40 個位元組。雖然選項不是 IP 標頭必要的一部分,但是對選項的處理卻是 IP 軟體必
17、備的。也就是說,如果選項出現在標頭,所有以 IP 為標準的軟體必須都能夠處理它們。Figure 8-10格式下圖展示選項的格式:一個位元組稱為命令碼 (code),一個位元組的長度欄,及可變長度的資料欄。Length定義選項的總長度,包括命令碼及長度欄本身,這個欄位不是在所有的選項中都會出現。Figure 8-11選項的種類Figure 8-12無動作 (No operation, NO-OP)這個選項的長度為一個位元組,它作為兩個選項間的填充位元組之用。Figure 8-13選項結束 (End of option, END-OP)這個一個位元組的選項用來補在選項欄的最後面,作為最後的選項,而
18、且只能使用一次。在這個選項之後,接收者開始找尋封包酬載的資料。Figure 8-14記錄路徑 (record route)用來記錄資料包所經過的網際網路路由器。它可以記錄最多 9 個路由器的 IP 位址(因為選項最多只有 40 位元組)。指到第一個空白欄的位址來源端主機在選項資料欄建立放 IP 位址的欄位,在資料包離開來源端時,這些欄位都是空白的,此時指標內含數值為4,指向第一一個空自欄。當資料包旅行時,每個路由器會處理這個資料包並比較這個選項的指標值與長度值。假如指標值大於長度值,表示全部空白欄已被填滿,如果指標值小於長度值,則該路由器將資料包送出端的 IP 位址填入次一個空白欄。填入 IP
19、 後路由器將指標值加 4。Figure 8-15Figure 8-16嚴格來源端路徑 (strict source route)這個選項用來給來源端電腦預先指定資料包在網擦網路旅行時的路徑。送出者可以選一條有特定服務的路徑,如最低延遲或最大傳輸服務;或者選一條安全可靠的路徑。Figure 8-17如果指標值小於長度值,則路由器比較由指標指到的 IP 位址與資料包進入端的 IP 位址,如果一樣,該路由器就處理這個封包,路由器將指標指到的 IP 位址換成自己送出端的 IP 位址,並將指標加 4,然後送出這個資料包。如果兩個 IP 位址不一樣,這個資料包就被丟掉,然後給出錯誤訊息。Figure 8-
20、18寬鬆來源端路徑 (Ioose source route)這個選項與嚴格來源端路徑類似,不過它放寬了一些限制。寬鬆來源端路徑選項中的所有指定路由器資料包都必須經過,但是資料包可以也經過其他的路由器。時間印記 (timestamp)用來記錄路由器處理資料包的時間。用國際時間,從午夜開始計算,以千分之一秒 (msec) 為單位。知道資料包被處理的時間可以讓使用者或管理者追蹤網際網路上路由器的行為,可以預估資料包從一個路由器到另一個路由器的時間。我們說預估 (estimate),是因為路由器的時間可能沒有同步,儘管大家都使用國際時間。Figure 8-19用來記錄因為 IP 空位不夠,不能將時間記
21、下來的路由器個數。Figure 8-20旗標欄規範路由器的任務:0: 路由器填入時間到所提供的欄位表。1: 路由器填入送出端的 IP 位址與時間。3: 表示有提供 IP 位址,每個路由器必須檢查提供的 IP 位址,與資料包進入自己這端的 IP 位址,如果一樣, 路由器將原提供 IP 位址,換成自己送出端的 IP 位址 且填入時間。Figure 8-21檢查合 (Checksum)檢查和是為封包在傳輸過程中可能遭受破壞所使用的一種驗証措施。送出者計算檢查和的數值,然後將之與封包一起送出。接收者針對整個封包,包括檢查和本身,施以相同的計算程序,如果其結果正確,則接受該封包,否則便拒絕。傳送端檢查合
22、之計算傳送者將封包分成若干個 n 位元的段落 (n 通常是 16),之後以 1 補數算數,將這些段落加起來,而其合依然是 n 位元長,然後再求這個合的補數 (所有 0 變成 1,1 變成 0),其結果就成為檢查合。接收端檢查和之計算接收者將收到的封包分成而個段落,之後以 1 補數算數將這些段落加起來,然後再求這個和的補數,若結果為 0 則接受該封包,否則拒絕。Figure 8-22IP 封包使用的檢查合IP 封包依照上面的方法來計算檢查合。首先,把檢查合欄位的數值定為 0,接著將標頭分成 16 位元的段落,然後加在一起,再計算所得結果之 1 的補數,最後放入檢查合的欄位。IP 封包中的檢查合只
23、包含標頭部分,並不包括資料。其中有兩個原因,1. 所有將資料放到 IP 封包的較高層協定都有自己的檢查合,所以 IP 不必再檢查這些資料。2. 因為 IP 封包經過路由器時,只有標頭會改變,而資料並不會改變,所以檢查合只包含會改變的部分即可。Figure 8-24檢查合檢查合計算範例計算範例Figure 8-25檢查合檢查合計算範例計算範例(16 進位進位)ifconfig 指令Unix 系統在開機時,用 ifconfig 指令來設定網路介面的組態。開機完成後,ifconfig 也可以用來查詢網路介面的組態。Windows 系統雖然沒有 ifconfig 指令,但是它提供另一個指令 ipcon
24、fig 來查詢網路介面的組態。tsaybryce $ / /sbin/ifconfigsbin/ifconfigeth0 Link encap:Ethernet HWaddr 00:0F:EA:ED:93:E5 inet addr:140.128.10.65 Bcast:140.128.10.255 Mask:255.255.255.0 inet6 addr: 2001:e10:6440:0:20f:eaff:feed:93e5/64 Scope:Global inet6 addr: 2001:db8:0:f101:20f:eaff:feed:93e5/64 Scope:Global inet
25、6 addr: fe80:20f:eaff:feed:93e5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2397400 errors:0 dropped:0 overruns:0 frame:0 TX packets:1130904 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3156090221 (2.9 GiB) TX bytes:83083423 (79.2 MiB) I
26、nterrupt:185 Base address:0 xc000lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: :1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1130 errors:0 dropped:0 overruns:0 frame:0 TX packets:1130 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:
27、0 RX bytes:1216717 (1.1 MiB) TX bytes:1216717 (1.1 MiB)Linux ifconfig 執行畫面$ ifconfigvr0: flags=8843 mtu 1500 inet6 fe80:250:baff:fecc:f73e%vr0 prefixlen 64 scopeid 0 x1 inet 140.128.10.67 netmask 0 xffffff00 broadcast 140.128.10.255 ether 00:50:ba:cc:f7:3e media: Ethernet autoselect (100baseTX ) sta
28、tus: activefwe0: flags=108802 mtu 1500 options=8 ether 02:30:95:01:56:66 ch 1 dma -1plip0: flags=108810 mtu 1500lo0: flags=8049 mtu 16384 inet6 :1 prefixlen 128 inet6 fe80:1%lo0 prefixlen 64 scopeid 0 x4 inet 127.0.0.1 netmask 0 xff000000FreeBSD ifconfig 執行畫面C:Documents and Settingscwtsayipconfig/al
29、lWindows IP Configuration Host Name . . . . . . . . . . . . : warren Primary Dns Suffix . . . . . . . : Node Type . . . . . . . . . . . . : Unknown IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : NoEthernet adapter 區域連線: Connection-specific DNS Suffix . : Description . . .
30、 . . . . . . . . : Marvell Yukon 88E8001/8003/8010 PCIGigabit Ethernet Controller Physical Address. . . . . . . . . : 00-11-D8-24-BC-30 Dhcp Enabled. . . . . . . . . . . : No IP Address. . . . . . . . . . . . : 192.168.1.2 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . .
31、 . . . : 192.168.1.1 DNS Servers . . . . . . . . . . . : 192.168.1.1Windows ipconfig 執行畫面netstat 指令netstat 指令可以用來查詢網路介面、連線、與路由表等資訊。tsaybryce $ netstat -iKernel Interface tableIface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgeth0 1500 0 2952645 0 0 0 1464864 0 0 0 BMRUlo 16436 0
32、 1130 0 0 0 1130 0 0 0 LRULinux netstat 執行畫面$ netstat -iName Mtu Network Address Ipkts Ierrs Opkts Oerrs Collvr0 1500 00:50:ba:cc:f7:3e 505292 0 43006 0 0vr0 1500 fe80:1:250:b fe80:1:250:baff: 0 - 4 - -vr0 1500 140.128.10/24 webprog 264691 - 42993 - -fwe0* 1500 02:30:95:01:56:66 0 0 0 0 0plip0 1500 0 0 0 0 0lo0 16384 48 0 48 0 0lo0 16384 localhost.cs. :1 0 - 0 - -lo0 16384 fe80:4:1 fe80:4:1 0 - 0 - -lo0 16384 your-net localhost 48 - 48 - -FreeBSD netstat 執行畫面