0.5 IP

網際網路協定,網路的一種關於資料的協定(封包交換)。

 IP是在TCP/IP協定中網路層的主要協定,主要是根據主機和目的主機的地址傳送資料。IP還定義了定址方法和資料的封裝結構 。第一個架構的主要版本,現在稱為IPv4,還是最主要的網際網路協定,世界各地正在積極部署IPv6。

資料在IP網際網路中傳送時會被封裝為資料包。IP協議的獨特之處在於:在封包交換網路中主機在傳輸資料之前,無須與先前未曾通信過的目的主機預先建立好一條特定的「通路」。網際網路協議提供了一種「不可靠的」資料包傳輸機制(也被稱作「盡力而為」);也就是說,它不保證資料能準確的傳輸。資料包在到達的時候可能已經損壞,順序錯亂(與其它一起傳送的封包相比),產生冗餘包,或者全部遺失。如果應用需要保證可靠性,一般需要採取其他的方法,例如利用IP的上層協定控制。

 

IP 協定功能

  • 在 Network Access Layer 與 Transport Layer 之間資料的轉送。

  • 進行封包的拆裝與重組。

  • 將封包傳送到目的主機,其中包含跨越多個網路找到目的主機所在的網路位址。

IP 協定特性

  • IP 是非連接服務

  • IP 無錯誤偵測功能

  • 封包次序可能錯亂

  • 封包可能被重複傳送

  • 不能驗證目的主機是否確實收到封包

IP 位址格式

  • 32 位元長度,分為四組,每組以 10 進位表示

    • dec3.dec2.dec1.dec0 (如 164.168.4.3)

  • 分為網路位址 (Network Address) 與主機位址 (Host Address)

    • 【Network Number, Host Number 】

  • 如 IP 位址為 164.168.4.3 則

    • 網路位址 = 164.168.0.0

    • 主機位址 = 0.0.4.3

 

子網路遮罩

  • 利用主機位址來擴充網路位址

  • 在 163.15.0.0 網路上分割為 8 個子網路

  • Subnet Mask = 255.255.224.0

  • 子網路為:163.15.0.0/19, 163.15.32.0/19, 163.15.64.0/19, 163.15.128.0/19, 163.15.160.0/19, 163.15.192.0/19, 163.15.224.0/19

 

Wireshark Lab: IP

在這個實驗中,要研究 IP 的協定 ,並把焦點放在 IP 的 datagram。執行 traceroute 程式並追蹤分析送出和收到的 IP datagram 。我們要研究 IP datagram 的各個部份,並詳細的學習 IP fragmentation 。

 

 

 

 

 

一、   從執行中的 traceroute 截取封包

 

 

 

在這個實驗中,為了追蹤 IP datagrams ,我們用 traceroute 送不同大小的 datagrams 給目的地 X 。回想一下 traceroute 的操作,一開始的傳送將 IP header 中的 time-to-live (TTL) 設為 1 並送出一個多個 datagrams ;再來將 TTL 的數值設為 2 送出一系列的一個或多個 datagrams 到同樣的目的地;再來將 TTL 的數值設為 3 送出一系列的一個或多個 datagrams 到同樣的目的地;以此類推。路由器每次收到datagram 要將 TTL 減少 1 (實際上, RFC791 表示路由器要將 TTL 減少至少 1 )。如果 TTL 的數值降到 0 ,路由器回傳一個 ICMP 訊息 (type 11 – TTL-exceeded) 給發送的主機。因為這些特性,一個 TTL 是 1 的 datagram (從一個主機執行的 traceroute 送出)會讓離發送主機 1 個 hop 距離的路由器傳 ICMP 訊息 (type 11 – TTL-exceeded) 給發送主機;一個 TTL 是 2 的 datagram 會讓離發送主機 2 個 hop 距離的路由器傳 ICMP 訊息 (type 11 – TTL-exceeded) 給發送主機;一個 TTL 是 3 的 datagram 會讓離發送主機 3 個 hop 距離的路由器傳 ICMP 訊息 (type 11 – TTL-exceeded) 給發送主機;以此類推。在這個方法下,主機執行的 traceroute 可以藉由查看 ICMP TTL-exceeded 訊息包含的來源 IP 位址知道在發送主機及目的地 X 之間的有通過的路由器身分。

 

 

 

 

 

我們要執行 traceroute 並送出各種長度的 datagrams

 

 

 

l   Windows.-Windows提供的 tracert 程序(在 ICMP Wireshark 實驗使用過)不能改變 ICMP echo request(ping) 訊息的大小。有個比較好的 Windows traceroute 程式叫 pingplotter ,在 http://www.pingplotter.com 有免費版本跟共享軟體版本兩種可供使用。下載並安裝 pingplotter ,然後測試執行 traceroutes 你最愛的幾個網站。 pingplotter 中 ICMP echo request 訊息的大小可以使用選單 Edit-> Options->Packet Options並填在 Packet Size 的欄位來做改變。封包大小的初始值為 56 bytes 。一旦  送出了一系列 TTL 增加的封包,在過了追蹤的間隔時間之後,送出的程序會將 TTL 重設為 1 。 pingplotter 追蹤的間隔時間和間隔數可以改變。

 

 

 

l   Linux/Unix.- Unix traceroute 的命令列中送到目的地的 UDP datagram 可以設定 datagram 的 byte 數,這個數值輸入在 traceroute 命令列中名字或是目的位址的後面。舉例來說,要送出 2000 bytes 的 traceroute datagrams 到 gaia.cs.umass.edu 命令列會長這樣:

 

%traceroute gaia.cs.umass.edu 2000

 

 

 

執行以下操作:

 

l   開啟 Wireshark 並開始截取封包 (Capture->Start) 然後在 Wireshark 截取封包選項的畫面上按 OK (我們在這邊還不用選任何選項)。

 

l   如果你使用的是 Windows 系統,開啟 pingplotter 並在“Address to Trace Window”中輸入一個目的地的名字。在 “# of times to Trace” 輸入 3 ,才不會得到太多的資料。選擇選單上的選項 Edit->Advanced Options->Packet Options 並在 Packet Size 輸入 56 再按下 OK 。然後按下 Trace 按鈕。你應該會看到一個 pingplotter 視窗看起來就像這個

 

 

 

圖.1 pingplotter

 

接下來,送一個比較長的 datagrams ,選擇 Edit->Advanced Options->Packet Options 並輸入 2000 在 Packet Size 欄位並按下 OK 。然後按 Resume 按鈕。

 

 

 

接下來,送一個比較長的 datagrams ,選擇 Edit->Advanced Options->Packet Options 並輸入 3500 在 Packet Size 欄位並按下 OK 。然後按 Resume 按鈕。

 

 

 

停止 Wireshark 追蹤

 

 

 

l   如果你用的是 Unix 系統,輸入三個 traceroute 命令,一個用 56 bytes的長度,一個用 2000 bytes的長度,最後一個用 3500 bytes的長度。

 

 

 

停止 Wireshark 追蹤

 

 

 

 

 

二、   查看截取到的追蹤

 

在你的追蹤當中,你應該可以看到你的電腦送出一系列的 ICMP Echo Request (在使用 Windows 的電腦上) 或是 UDP segment (在使用 Unix 的電腦上),且從經過的路由器收到回傳的 ICMP TTL-exceeded 訊息。在下面的問題中,我們假設你使用的是 Windows 電腦;相對的問題對 使用 Unix 的電腦來說也是一樣清楚的。如果可能的話,回答問題時應該交出你追蹤封包的答案輸出。對輸出註釋解釋你的答案。要輸出一個封包,使用 File->Print ,點選 Selected packet only ,點選 Packet summary line ,並選擇回答問題所需的最少的封包細節。

 下面圖片實驗數據的目標 X 使用 hinet.net 做測試

 

 

 

 

圖.2 ICMP Echo Request message IP information

 

  1.選擇第一個從你的電腦傳送的 ICMP Echo Request 訊息,並展開封包細節視窗中的 Internet Protocol 。你電腦的 IP 位址是?

 

答案:我的電腦 IP 位址是192.168.0.53

 

  2.在 IP packet header 中, 上層協定的值是甚麼?

 

答案:這邊的上層協定指的 ICMP ,值是 1 。

 

 3.IP header 有多少 bytes ? IP datagram 的有效負載有多少 bytes?解釋為何有效負載是這個這麼多的 bytes。.

 

答案:IP header 有20 bytes。 IP datagram 總長度有56 bytes。有效負載等於總長度減掉 header 的長度所以是36 bytes。

 

 4.這個 IP datagram 是否有被分割?解釋為何(沒)被分割。

 

答案:展開 Flags 可以看到 More fragments 的值為 0 ,代表沒有被分割。

 

 

 

接下來,按下橫列標題的 Source 讓封包照 IP source address 排序;在 Source 旁邊應該會出現一個小小的向下箭頭。如果箭頭是向上,再按一次橫列標題的 Source 。選擇第一個從你電腦傳出的 ICMP Echo Request 訊息,並展開在 “details of selected packet header” 視窗的 Internet Protocol portion 。 在“listing of captured packets” 視窗中,你應該可以看到所有後續的 ICMP 訊息(也許穿插著其他在你電腦執行的的協定)在你的第一個 ICMP 之後。使用向下的箭頭在你的電腦傳送的 ICMP 訊息中移動。

 

 5.在 IP datagram 的欄位中在你的電腦傳送的一系列 ICMP 訊息一直在改變?

 

答案:Identification, Time to live and Header checksum 一直在改變

 

 6.那些欄位保持不變?哪個欄位必須保持不變?哪個欄位又必須要變?為什麼?

 

答案:

 

保持不變的欄位

 

Version (全部都使用 IPv4 )

 

header length (都是 ICMP 的封包)

 

source IP (都是從同一個源頭送出的)

 

destination IP (都要送到同一個目的地)

 

Differentiated Services (所有封包使用的都是同一個 ICMP 的類別)

 

Upper Layer Protocol (都是 ICMP 的封包)

 

 

 

必須保持不變的欄位.

 

Version (全部都使用 IPv4 )

 

header length (都是 ICMP 的封包)

 

source IP (都是從同一個源頭送出的)

 

destination IP (都要送到同一個目的地)

 

Differentiated Services (所有封包使用的都是同一個 ICMP 的類別)

 

Upper Layer Protocol (都是 ICMP 的封包)

 

 

 

必須變的欄位

 

Identification (IP 封包需要有不同的 ID)

 

Time to live (traceroute 在後續封包的 TTL 每次增加 1)

 

Header checksum (header 改變, checksum 就會跟著改變)

 

 7.描述你在圖中看到的  IP datagram 裡 Identification 欄位的值

 

答案:每次 ICMP Echo (ping) 都會增加

 

 

 

 

 

接下來 (還是依照 source address 排序) 找出從最近 (第一次 hop) 的路由器回傳到你的電腦中一系列的 ICMP TTLexceeded

 

 

 

 

 

圖.3 ICMP TTL exceeded reply, IP information

 

 8.Identification 和 TTL 的值是?

 

答案:

 

Identification:1945

 

TTL:255

 

 9.從最近的路由器 (第一次 hop) 回傳到你的電腦的 ICMP TTLexceeded 中的值是否保持不變?為什麼?

 

答案:

 

identification 在每一個 ICMP TTL-exceeded replies 中都會改變,因為 identification 是一個獨特的值。當兩個或更多的 IP datagrams有相同的 identification 值時,代表這些 IP datagrams 是一個大的 IP datagram 的 fragments。

 

TTL 不變,因為第一個 hop 的路由器 TTL 值都是相同的。

 

 

 

Fragmentation

 

按下 Time 列讓封包依照時間做排序

 

 

 

 

 

圖.4 ICMP Echo Request pkt size = 2000, first fragment

 

 10.找出你將 pingplotter 的 Packet Size 改成 2000 之後的第一個從你電腦傳送出的 ICMP Echo Request 訊息。是否有分割成多於一個的 IP datagram ?

 

答案:有,這個封包被切割成多於一個的 IP datagram。

 

 11.印出分割的 IP datagram 中第一個 fragment 。在 IP header 的哪邊可以看出這個 datagram 有被分割。在 IP header 的哪邊可以看出這個是第一個 fragment 或是之後的 fragment。

 

答案:Flags 的 more bit 被設為 1 ,代表這個 datagram 有被分割。 fragment offset 是 0 ,我們可以知道這是第一個 fragment。第一個 datagram 在 header 中可以看出總長度是 1500 。

 

 

 

 

 

圖.5  ICMP Echo Request pkt size = 2000, second fragment

 

 12.輸出第二個被分割的 fragment 。在 IP header 中哪邊可以看出這不是第一個 datagram fragment ? 還有更多的 fragments 嗎 ? 你怎麼看出來的 ?

 

答案:我們可以從 fragment offset 是 1480 看出他不是第一個 fragment ,然後從 more fragments flag 是 0 看出這是最後一個 fragment。

 

 13.在第一個和第二個 fragment 之間有哪些 IP header 的欄位有改變?

 

答案:total length, flags, fragment offset, checksum.

 

 

 

 

 

現在找出在你改變封包大小為 3500 時從你電腦傳送的第一個 ICMP Echo Request 訊息

 

 

 

 

 

圖.6ICMP Echo Request pkt size = 3500, first fragment

 

 

 

圖.7 ICMP Echo Request pkt size = 3500, second fragment

 

 

 

圖.8ICMP Echo Request pkt size = 3500, third fragment

 

 14.最初的 datagram 產生出多少個 fragments ?

 

答案: 封包大小改為 3500 之後,最初的 datagram 產生出 3 個 fragment。

 

 15.在這些 fragments 有哪些欄位被改變?

 

答案:三個封包中 IP header 欄位都不一樣的是 fragment offset, checksum 。我們可以看到前兩個封包和最後一個封包中有改變的是 tatal length 還有 flags。前兩個封包的 total 長度是 1500, more fragments 設為 1 ,而最後一個封包的 total length 是 540 , more fragments 設為 0 。