實驗描述:
在本實驗中,我們將研究 IP 協議,重點關注 IP 數據報(IP datagram)。我們將通過分析在執行 traceroute 程序發送和接收的一系列 IP 數據報的過程來完成這個實驗(traceroute 程序本身則是在 Wireshark ICMP 實驗中進行了更詳細的探討),我們將研究 IP datagram 中的各個字段(fields),並詳細研究 IP fragmentation 的方法。
實驗過程:
捕獲執行 traceroute 的數據包
爲了生成本實驗的一系列 IP 數據報,我們將使用 traceroute 程序向不同的目的地 X 發送不同大小的數據報。回想一下,traceroute 通過
首先發送一個或多個帶有生存時間(TTL: Time-to-Live)字段設置爲 1 的數據報;
然後發送一個或多個帶有生存時間(TTL: Time-to-Live)字段設置爲 2 的數據報到同一個目的地;
然後發送一個或多個帶有生存時間(TTL: Time-to-Live)字段設置爲 3 的數據報到同一個目的地,
以此類推,直到目的地真正收到此數據報爲止。
回想一下,路由器必須將每個接收到的數據報中的 TTL 減 1。如果 TTL 達到 0,路由器會向來源主機發送 ICMP 消息。由於這種行爲,
TTL 爲 1 的數據報(由執行 traceroute 的主機發送)將導致距發送方一次跳躍的路由器,將 ICMP TTL 超出的消息發送回發送方主機;
以TTL 爲 2 發送的數據報將導致距離爲兩次跳躍的路由器,將 ICMP 消息發送回發送方主機;
以 TTL 爲 3 發送的數據報將導致距離爲兩次跳躍的路由器,將 ICMP 消息發送回發送方主機,等等。
以這種方式,執行 traceroute 的主機可通過查看包含ICMP TTL 超出消息的數據報中的來源 IP 地址來獲知其自身與目的地 X 之間的路由器的身份。
我們想要運行 traceroute 並讓它發送各種長度的數據報
Windows 操作系統:Windows 提供的 tracert 程序(曾被使用於我們的 ICMPWireshark 實驗中)不允許更改 tracert 程序發送的 ICMP echo 請求(ping)消息的大小。因此,一個更好的 Windows traceroute 程序是 pingplotter,可在 http://www.pingplotter.com 上以免費版和共享軟件版本獲得。
下載並安裝pingplotter,並通過對您喜歡的站點執行些 traceroute 來測試它。通過選擇菜單項 Edit-> Options-> Packet Options 然後填寫 Packet Size 字段,可以在pingplotter 中顯式設置 ICMP echo 請求消息的大小。默認數據包大小爲 56 個字節。一旦 pingplotter 發送了一系列具有遞增的 TTL 值的數據包,它會在等待 Trace Interval 時間後再次以 TTL 爲 1 重新啓動發送進程。同時,我們可以在 pingplotter 中明確設置 Trace Interval 的值和間隔數。(備註:PinPlotter 5 需要使用到 Standar 版或是 Professional 版才能夠自定義 packet 參數,有 14 天的試用版可以使用)
具體的步驟:
- 啓動 Wireshark 並開始數據包捕獲(Capture-> Start),然後在 Wireshark 數據包捕獲選項屏幕上按 OK(我們不需要在此處選擇任何選項)。
如果您使用的是 Windows 平臺,請啓動 pingplotter 並在“要跟蹤的地址窗口(Address to Trace Window)”中輸入目標的名稱。在“要跟蹤的次數(“# of times to Trace)”字段中輸入 3,這樣您就不會收集太多數據。選擇菜單項編輯 - >高級選項 - >數據包選項(Edit->Advanced Options->Packet Options),然後在數據包大小字段中輸入值 56,然後按確定。然後按 Trace 按鈕。你應該看到一個看起來像這樣的 pingplotter 窗口:(備註:新版 PingPlotter5 中沒有跟蹤次數的設定,可以在 count 到達 3 的時候按下暫停鍵,停止收集數據包)
我先給個下載鏈接:http://xiazai.zol.com.cn/detail/28/277370.shtml#hotArticle
-
輸入要跟蹤的地址:
www.gotokeep.com
-
將包的大小設置爲56Byte
-
點擊new trace開始運行(當運行到Count=3時右擊抓取的數據手動pause)
-
重複以上兩步 兩次,分別設置包的大小爲2000Byte和3500Byte
2000Byte:
3500Byte:
上面的過程其實就是:開啓WireShark,然後進行三次以不同的包的大小(56、2000、3500 Bytes),來跟蹤同一個網站,同時抓取其中的數據包來進行IP協議的分析。
如果您無法在實際的網絡連接上運行 Wireshark,則可以下載在作者的某臺Windows 計算器上執行上述驟時捕獲的數據包跟蹤文件。當您探索下面的問題時,即使您已經捕獲了自己的跟蹤數據並使用它,如同您自己的跟蹤數據一般,您也可能會發現下載此跟蹤數據對你的實驗很有幫助。
所以說我自己的數據沒有抓取好,步驟有點搞亂了,所以我也用的官方提供的數據包。
在您的跟蹤數據包中,您應該能夠看到**計算器發送的一系列的 ICMP Echo 請求訊息(在 Windows 下)**或 UDP 區段(在 Unix 下)以及由中間路由器發送到計算器的 ICMP TTL 超出的訊息。在下面的問題中,我們假設您使用的是 Windows 機器;對於 Unix 機器的相應問題應該是清楚的。
這是我自己的在實驗過程中(在windows下),抓取的包:
這是官方提供的包,下面的回答問題都是基於這個數據包:
> PingPlotter是通過ICMP協議發送不同TLL值的ping包,來計算和獲取訪問網站的所經過路由。
TTL是存活時間,每經過一次路由器,TLL-1,當其減爲0的時候,路由會丟帶這個包並且發出TLL超時給原始的發出者,防止死包耗盡網絡資源。然後每次PingPlotter都會發送起始從TLL=1的數據包,然後逐漸增大TTL,用來獲取所訪問網站經過的路由。但是有些路由會因爲安全不迴應這些包,所以還會看到有些請求沒有回覆,而TLL會持續增加獲取下一條路由的回覆。
回答問題:
- 選擇計算機發送的第一個 ICMP Echo Request 消息,然後在 packet details window 中展開數據包的 Internet 協議部分。您的計算機的 IP 地址是多少?
答:IP地址:192.168.1.102
- 在 IP header 中,上層協議字段的值是多少?
答:上層協議就是ICMP(如果是Unix下做的實驗就是UDP),值爲1。
IP中封裝的ICMP本身就是值爲1的。
- IP header 有多少 bytes? IP datagram 的有效負載中有多少 bytes? 說明如何確定 payload bytes 的數。
答:Header Length:20 bytes IP數據報總長度 = IP頭長度 + IP數據長度(就是有效負載)
IP datagram payload bytes:64bytes
方法1:
IP datagram payload bytes = Total Length - Header Length = 84 - 20 = 64
方法2:
IP數據報的有效負載,這裏裝的就是ICMP數據報,所以看ICMP佔多少字節即可。
- 此 IP 數據報是否已被分段(fragmented)?解釋您如何確定數據報是否已被分段(fragmented)。
答:
這裏的IP數據報沒有被分段, 因爲Fragment offset = 0,分段的偏移量爲0,所以沒有分段,而且More fragments也是爲Not set,表示沒有設置分段。
接下來,通過單擊 Source 列標題,根據 IP 源地址對跟蹤的數據包進行排序,一個小的向下箭頭應出現在 Source 旁邊,如果箭頭指向上方請再次單擊“Source column header”。選擇計算器發送的第一個 ICMP Echo Request 消息,然後展開“details ofselected packet header”窗口中的 Internet 協議部分。在“listing of captured packets”窗口中,您應該在第一個 ICMP 下面看到所有後續 ICMP 消息(可能還有計算器上運行的其他協議發送的其他散佈數據包),使用向下箭頭瀏覽計算器發送的 ICMP 消息。
- 在您的計算器發送的這一系列 ICMP 消息中,IP 數據報中的哪些字段 一直在改變?
答:發送的ICMP Echo(ping)request:標識號Identification、校驗和Header checksum、存活時間TTL 不會改變
- 哪些字段保持不變? 哪個字段必須保持不變? 哪些字段必須更改? 爲什麼?
答:
- 描述您在 IP datagram 的 Identification field 中的值中所看到的下一步(數據包仍按來源地址排序)查找最近的(第一跳)路由器發送到您的計算器的一系列 ICMP TTL 超時的回覆訊息。
答:每個IP數據報的標識號是不同的,用於區分每個IP數據報和處理IP分片。
- ID 字段和 TTL 字段的值是多少?
答:這道題問的是 第一個返回超時路由返回給我們的IP報信息,因爲只有IP纔有TTL生存時間。
ID字段:0xa60b
TTL字段:244
- 對於最近(第一跳)路由器發送到您的計算器的所有 ICMP TTL 超出的回覆,哪些值是否保持不變?爲什麼?
答:【沒看懂】
單擊“時間”列,再次按時間對數據包列表進行排序。
- 在將 pingplotter 中的數據包大小更改爲 2000 後,查找計算機發送的第一個ICMP Echo Request 消息。該消息是否已碎片化爲多個 IP 數據報?(如果計算機具有以太網接口,則數據包大小爲2000 會導致碎片。)
答:
可以很明顯的看到原本的IP數據報已經被分段爲三個部分,#363、#364、#365
- 打印出碎片 IP 數據報的第一個片段。 IP 頭中的哪些信息表明數據報已碎片化? IP 頭中的哪些信息表明這是第一個片段還是後一個片段? 這個 IP 數據報有多長?
答:
如下圖就是IP數據報的第一個片段,其中的Flags已經表明了數據報已被分段,可以根據Flags下面的偏移量來判斷是第一個數據報片段,這個IP數據報的長度爲1500字節(20字節的報頭+1480字節的數據段)
- 打印出碎片 IP 數據報的第二個片段。 IP 標頭中的哪些信息表明這不是第一個數據報片段? 是否還有更多的片段? 你是如何知道的?
答:同上面一個可以看IP報頭中的Flags字段中的展開項中的偏移量來確定這是第二個數據段。根據#365片段中可以看出363~365這三個片段屬於一個一個數據報的分段。
- 在第一個和第二個片段中,IP 標頭中哪些字段發生了變化?
答:Flags字段和Checksum校驗和字段發生了變化。
14.從原始數據報創建了多少個片段?
答:三個片段
- 片段中 IP 標頭中的哪些字段發生了變化?
答:總長度Total Length、標誌Flags、首部校驗和Header checksum
參考資料:
https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES