關於計算機網路的 Wireshark 實驗

OctoNebula47發表於2020-12-26

資料鏈路層

實作一 熟悉 Ethernet 幀結構

使用 Wireshark 任意進行抓包,熟悉 Ethernet 幀的結構,如:目的 MAC、源 MAC、型別、欄位等。

在這裡插入圖片描述

✎ 問題
你會發現 Wireshark 展現給我們的幀中沒有校驗欄位,請了解一下原因。

Wireshark 抓包前,在物理層網路卡已經去掉了一些之前幾層加的東西,比如前導同步碼,FCS等等,之後利用校驗碼CRC校驗,正確時才會進行下一步操作,這時才開始進行抓包,因此,抓包軟體抓到的是去掉前導同步碼、FCS之外的資料,沒有校驗欄位。

實作二 瞭解子網內/外通訊時的 MAC 地址

  1. ping 你旁邊的計算機(同一子網),同時用 Wireshark 抓這些包(可使用 icmp 關鍵字進行過濾以利於分析),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?
  2. 然後 ping qige.io(或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?
  3. 再次 ping www.cqjtu.edu.cn (或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址又是多少?這個 MAC 地址又是誰的?
  1. ping 192.168.1.103
    在這裡插入圖片描述
    Wireshark 抓包結果
    在這裡插入圖片描述
    發出幀的目的 MAC 地址:54:b2:03:09:3a:11
    返回幀的源 MAC 地址:54:b2:03:09:3a:11
    這兩個地址都是本機 ping 的主機的 MAC 地址

  2. ping qige.io
    在這裡插入圖片描述
    Wireshark 抓包結果
    在這裡插入圖片描述
    發出幀的目的 MAC 地址和返回幀的源 MAC 地址都不是本機。

  3. ping www.cqjtu.edu.cn
    在這裡插入圖片描述
    驚喜吧!我連的校園網卻 ping 不通校園網

    ✎ 問題
    通過以上的實驗,你會發現:

    1. 訪問本子網的計算機時,目的 MAC 就是該主機的
    2. 訪問非本子網的計算機時,目的 MAC 是閘道器的
      請問原因是什麼?

因為無論是訪問子網內的IP還是訪問子網外的IP都需要經過校園網的主機。

實作三 掌握 ARP 解析過程

  1. 為防止干擾,先使用 arp -d * 命令清空 arp 快取
  2. ping 你旁邊的計算機(同一子網),同時用 Wireshark 抓這些包(可 arp 過濾),檢視 ARP 請求的格式以及請求的內容,注意觀察該請求的目的 MAC 地址是什麼。再檢視一下該請求的回應,注意觀察該回應的源 MAC 和目的 MAC 地址是什麼。
  3. 再次使用 arp -d * 命令清空 arp 快取
  4. 然後 ping qige.io (或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 arp 過濾)。檢視這次 ARP 請求的是什麼,注意觀察該請求是誰在回應。
  1. 用管理員開啟 cmd 再執行命令
    在這裡插入圖片描述

  2. ping 192.168.1.103
    在這裡插入圖片描述
    Wireshark 抓包結果
    在這裡插入圖片描述
    目的 MAC 地址:60:ee:5c:4d:ed:ee
    源 MAC 地址:94:b8:6d:e3:ee:95

    ✎ 問題
    通過以上的實驗,你應該會發現,

    1. ARP 請求都是使用廣播方式傳送的
    2. 如果訪問的是本子網的 IP,那麼 ARP 解析將直接得到該 IP 對應的 MAC;如果訪問的非本子網的 IP, 那麼 ARP 解析將得到閘道器的 MAC。
      請問為什麼?

    對於沒有配置預設閘道器的計算機要和其他網路中的計算機實現通訊,閘道器收到源計算機的ARP請求會使用自己的MAC地址與目標計算機的IP地址對源計算機進行應答,訪問非子網IP時是通過路由器訪問的,路由器再把發出去,目標IP收到請求後,再通過路由器埠IP返回去,那麼ARP解析將會得到閘道器的MAC。

網路層

實作一 熟悉 IP 包結構

使用 Wireshark 任意進行抓包(可用 ip 過濾),熟悉 IP 包的結構,如:版本、頭部長度、總長度、TTL、協議型別等欄位。

在這裡插入圖片描述

✎ 問題
為提高效率,我們應該讓 IP 的頭部儘可能的精簡。但在如此珍貴的 IP 頭部你會發現既有頭部長度欄位,也有總長度欄位。請問為什麼?

便於傳輸時的識別IP總長度,節省時間。當長度超過1500B時就會被返回鏈路層進行分段,重組時,會根據IP包的頭部進行重組得到原始資料。

實作二 IP 包的分段與重組

根據規定,一個 IP 包最大可以有 64K 位元組。但由於 Ethernet 幀的限制,當 IP 包的資料超過 1500 位元組時就會被髮送方的資料鏈路層分段,然後在接收方的網路層重組。
預設的,ping 命令只會向對方傳送 32 個位元組的資料。我們可以使用 ping 202.202.240.16 -l 2000 命令指定要傳送的資料長度。此時使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 進行過濾),瞭解 IP 包如何進行分段,如:分段標誌、偏移量以及每個包的大小等

在這裡插入圖片描述
在這裡插入圖片描述
這裡將包分成兩片,MF(more fragment)=1 表示後面“還有分片”的資料包。MF=0 表 示這已是若干資料包分片中的最後一個。包的大小可以通過 total length 可以看出,偏移量為 fragment offset

✎ 問題
分段與重組是一個耗費資源的操作,特別是當分段由傳送路徑上的節點即路由器來完成的時候,所以 IPv6 已經不允許分段了。那麼 IPv6 中,如果路由器遇到了一個大資料包該怎麼辦?

路由器只需丟棄該資料包,並向傳送方發回一個“分組太大”的ICMP差錯報文即可。

實作三 考察 TTL 事件

在 IP 包頭中有一個 TTL 欄位用來限定該包可以在 Internet上傳輸多少跳(hops),一般該值設定為 64、128等。
在驗證性實驗部分我們使用了 tracert 命令進行路由追蹤。其原理是主動設定 IP 包的 TTL 值,從 1 開始逐漸增加,直至到達最終目的主機。
請使用 tracert www.baidu.com 命令進行追蹤,此時使用 Wireshark 抓包(用 icmp 過濾),分析每個傳送包的 TTL 是如何進行改變的,從而理解路由追蹤原理。

在這裡插入圖片描述
在這裡插入圖片描述
追蹤一個地址,TTL 減一

✎ 問題
在 IPv4 中,TTL 雖然定義為生命期即 Time To Live,但現實中我們都以跳數/節點數進行設定。如果你收到一個包,其 TTL 的值為 50,那麼可以推斷這個包從源點到你之間有多少跳?

14跳。因為TTL的原始值是離得最近的2的整次冪,為64。

傳輸層

實作一 熟悉 TCP 和 UDP 段結構

  1. 用 Wireshark 任意抓包(可用 tcp 過濾),熟悉 TCP 段的結構,如:源埠、目的埠、序列號、確認號、各種標誌位等欄位。
  2. 用 Wireshark 任意抓包(可用 udp 過濾),熟悉 UDP 段的結構,如:源埠、目的埠、長度等。
  1. TCP 抓包結果
    在這裡插入圖片描述

  2. UDP 抓包結果
    在這裡插入圖片描述

✎ 問題
由上大家可以看到 UDP 的頭部比 TCP 簡單得多,但兩者都有源和目的埠號。請問源和目的埠號用來幹什麼?

在一PC機上,一個程式對應一個埠。埠的作用就是用來唯一標識這個程式。源埠標識發起通訊的那個程式,目的埠標識接受通訊的那個程式。有了埠號,接受到報文後才能夠知道將報文傳送到哪個程式。

實作二 分析 TCP 建立和釋放連線

  1. 開啟瀏覽器訪問 qige.io 網站,用 Wireshark 抓包(可用 tcp 過濾後再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕獲,待頁面顯示完畢後再多等一段時間使得能夠捕獲釋放連線的包。
  2. 請在你捕獲的包中找到三次握手建立連線的包,並說明為何它們是用於建立連線的,有什麼特徵。
  3. 請在你捕獲的包中找到四次揮手釋放連線的包,並說明為何它們是用於釋放連線的,有什麼特徵。
  1. 抓包結果
    在這裡插入圖片描述
  2. 三次握手建立連線的包
    在這裡插入圖片描述
    建立 TCP 連線就是通訊的雙方需要完成“三次握手”,連線中的一對 Socket 是由網際網路地址標誌符和埠組成的,視窗大小主要用來做流控制,最後的序列號是用來追蹤通訊發起方傳送的資料包序號,接收方可以通過序列號向傳送方確認某個資料包的成功接收。
  3. 四次揮手釋放連線的包
    在這裡插入圖片描述
    因為 TCP 是全雙工通訊的 (1)第一次揮手 因此當主動方傳送斷開連線的請求(即FIN報文)給被動方時,僅僅代表主動方不會再傳送資料包文了,但主動方仍可以接收資料包文。(2)第二次揮手 被動方此時有可能還有相應的資料包文需要傳送,因此需要先傳送 ACK 報文,告知主動方“我知道你想斷開連線的請求了”。這樣主動方便不會因為沒有收到應答而繼續傳送斷開連線的請求(即 FIN 報文)。 (3)第三次揮手 被動方在處理完資料包文後,便傳送給主動方 FIN 報文;這樣可以保證資料通訊正常可靠地完成。傳送完 FIN 報文後,被動方進入 LAST_ACK 階段(超時等待)。(4)第四揮手 如果主動方及時傳送 ACK 報文進行連線中斷的確認,這時被動方就直接釋放連線,進入可用狀態。

✎ 問題一
我們上面提到了釋放連線需要四次揮手,有時你可能會抓到只有三次揮手。原因是什麼?

當第二次揮手時,會將第三次傳送停止傳送資料的標識順帶,所以有可能只抓到三次揮手。

應用層

實作一 瞭解 DNS 解析

  1. 先使用 ipconfig /flushdns 命令清除快取,再使用 nslookup qige.io 命令進行解析,同時用 Wireshark 任意抓包(可用 dns 過濾)。
  2. 你應該可以看到當前計算機使用 UDP,向預設的 DNS 伺服器的 53 號埠發出了查詢請求,而 DNS 伺服器的 53 號埠返回了結果。
  3. 可瞭解一下 DNS 查詢和應答的相關欄位的含義
  1. 清理快取、解析、抓包
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
  2. 如下圖所示
    在這裡插入圖片描述
  3. DNS 查詢和應答的相關欄位的含義
    在這裡插入圖片描述

✎ 問題
你可能會發現對同一個站點,我們發出的 DNS 解析請求不止一個,思考一下是什麼原因?

為了使伺服器的負載得到平衡(因為每天訪問站點的次數非常多)網站就設有好幾個計算機,每一個計算機都執行同樣的伺服器軟體。這些計算機的IP地址不一樣,但它們的域名卻是相同的。這樣,第一個訪問該網址的就得到第一個計算機的IP地址,而第二個訪問者就得到第二個計算機的IP地址等等。這樣可使每一個計算機的負荷不會太大。

實作二 瞭解 HTTP 的請求和應答

  1. 開啟瀏覽器訪問 qige.io 網站,用 Wireshark 抓包(可用http 過濾再加上 Follow TCP Stream),不要立即停止 Wireshark 捕獲,待頁面顯示完畢後再多等一段時間以將釋放連線的包捕獲。
  2. 請在你捕獲的包中找到 HTTP 請求包,檢視請求使用的什麼命令,如:GET, POST。並仔細瞭解請求的頭部有哪些欄位及其意義。
  3. 請在你捕獲的包中找到 HTTP 應答包,檢視應答的程式碼是什麼,如:200, 304, 404 等。並仔細瞭解應答的頭部有哪些欄位及其意義。
  1. 抓包結果
    在這裡插入圖片描述
  2. 分析

✎ 問題
重新整理一次 qige.io 網站的頁面同時進行抓包,你會發現不少的 304 程式碼的應答,這是所請求的物件沒有更改的意思,讓瀏覽器使用本地快取的內容即可。那麼伺服器為什麼會回答 304 應答而不是常見的 200 應答?

瀏覽器和伺服器有一個協商的過程,伺服器告訴瀏覽器當前請求的資源上一次修改的時間是這個時間。瀏覽器第二次傳送請求的時候,告訴瀏覽器我上次請求的資源現在還在自己的快取中,如果你那邊這個資源還沒有修改,就可以不用傳送應答體給我了。伺服器根據瀏覽器傳來的時間發現和當前請求資源的修改時間一致,就應答304,表示不傳應答體了,從快取裡取。

相關文章