《計算機網路實驗課程》——Wireshark實驗

clyrjj發表於2020-12-25

一、介紹

Wireshark 實驗
本部分按照資料鏈路層、網路層、傳輸層以及應用層進行分類,共有 10 個實驗。需要使用協議分析軟體 Wireshark 進行,請根據簡介部分自行下載安裝。

二、準備

請自行查詢或使用如下參考資料,瞭解 Wireshark 的基本使用:

  • 選擇對哪塊網路卡進行資料包捕獲
  • 開始/停止捕獲
  • 瞭解 Wireshark 主要視窗區域
  • 設定資料包的過濾
  • 跟蹤資料流

三、資料鏈路層

實作一
熟悉 Ethernet 幀結構
使用 Wireshark 任意進行抓包,熟悉 Ethernet 幀的結構,如:目的 MAC、源 MAC、型別、欄位等。
在這裡插入圖片描述
在捕獲選項裡選擇wlan,我的聯網方式選擇的無線區域網。
在這裡插入圖片描述
可以看到目的MAC與源MAC還有type:ipv4

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

答: Wireshark 抓取的包會自動過濾四個位元組的校驗欄位。
實作二
瞭解子網內/外通訊時的 MAC 地址
1、ping 你旁邊的計算機(同一子網),同時用 Wireshark 抓這些包(可使用 icmp 關鍵字進行過濾以利於分析),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?

在這裡插入圖片描述
傳送幀的目的MAC
在這裡插入圖片描述
返回幀的源MAC
在這裡插入圖片描述
目的MAC就是虛擬機器的實體地址

2、然後 ping qige.io(或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?
在這裡插入圖片描述
傳送幀的目的MAC
在這裡插入圖片描述
返回幀的源MAC
在這裡插入圖片描述
這個MAC地址時閘道器的。

問題? 通過以上的實驗,你會發現: 訪問本子網的計算機時,目的 MAC 就是該主機的 訪問非本子網的計算機時,目的 MAC 是閘道器的
請問原因是什麼?

答:原因是在子網內不需要經過閘道器,所以MAC是主機的,而訪問外網的時候,都是通過 mac 地址送到閘道器處,然後出了閘道器再通過 IP 地址進行查詢。

實作三
掌握 ARP 解析過程
1、為防止干擾,先使用 arp -d * 命令清空 arp 快取(需要以管理員身份執行命令列)

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

回應的源mac
在這裡插入圖片描述

問題? 通過以上的實驗,你應該會發現, 1、ARP 請求都是使用廣播方式傳送的 2、如果訪問的是本子網的 IP,那麼 ARP解析將直接得到該 IP 對應的 MAC;如果訪問的非本子網的 IP, 那麼 ARP 解析將得到閘道器的 MAC。 請問為什麼?

答:
如果訪問的是我所處的本子網的ip,ARP 快取中沒有該 IP,那麼就是傳送一個廣播,在子網中找尋這個 IP,如果有 那麼ARP解析協議將會直接得到該ip對應的Mac地址;如果訪問的是非本子網的ip,那麼ARP解析將直接得到閘道器的mac地址。因為要想訪問對方,在處於同一子網的條件下,應該知道對方的MAC地址,但是不處於同一子網,就需要對方所處子網閘道器的mac地址。

網路層

實作一
熟悉 IP 包結構

使用 Wireshark 任意進行抓包(可用 ip 過濾),熟悉 IP 包的結構,如:版本、頭部長度、總長度、TTL、協議型別等欄位。
在這裡插入圖片描述
可以觀察到
版本:IPV4;頭部長度:20 bytes總體長度:56;存活時間TTL:64s;協議型別UDP;頭部校驗和:0xff69。
ip包結構的釋義:

版本號(Version):長度4位元。標識目前採用的IP協議的版本號。一般的值為0100(IPv4),0110(IPv6)
IP包頭長度Header
Length長度4位元。這個欄位的作用是為了描述IP包頭的長度,因為在IP包頭中有變長的可選部分。該部分佔4個bit位,單位為32bit(4個位元組),即本區域值=
IP頭部長度(單位為bit)/(84),因此,一個IP包頭的長度最長為“1111”,即154=60個位元組。IP包頭最小長度為20位元組。
IP包總長Total Length長度16位元。 以位元組為單位計算的IP包的長度 (包括頭部和資料),所以IP包最大長度65535位元組。
識別符號Identifier長度16位元。該欄位和Flags和Fragment
Offest欄位聯合使用,對較大的上層資料包進行分段(fragment)操作。路由器將一個包拆分後,所有拆分開的小包被標記相同的值,以便目的端裝置能夠區分哪個包屬於被拆分開的包的一部分。
標記(Flags):長度3位元。該欄位第一位不使用。第二位是DF(Don’t
Fragment)位,DF位設為1時表明路由器不能對該上層資料包分段。如果一個上層資料包無法在不分段的情況下進行轉發,則路由器會丟棄該上層資料包並返回一個錯誤資訊。第三位是MF(More
Fragments)位,當路由器對一個上層資料包分段,則路由器會在除了最後一個分段的IP包的包頭中將MF位設為1。 片偏移(Fragment
Offset):長度13位元。表示該IP包在該組分片包中位置,接收端靠此來組裝還原IP包。
生存時間(TTL):長度8位元。當IP包進行傳送時,先會對該欄位賦予某個特定的值。當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。如果TTL減少為0,則該IP包會被丟棄。這個欄位可以防止由於路由環路而導致IP包在網路中不停被轉發。
協議Protocol長度8位元。標識了上層所使用的協議。 頭部校驗Header
Checksum:長度16位。用來做IP頭部的正確性檢測,但不包含資料部分。
因為每個路由器要改變TTL的值,所以路由器會為每個通過的資料包重新計算這個值

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

答:
這樣做恰恰可以節省時間提高效率,因為有頭部長度欄位和總長度欄位是為了方便上層將 IP 包中的資料提取出來,接收端需要讀資料,接收資料當長度超過1500B時就會被返回鏈路層進行分段,所以標明就是必要的

實作二
IP 包的分段與重組

根據規定,一個 IP 包最大可以有 64K 位元組。但由於 Ethernet 幀的限制,當 IP 包的資料超過 1500 位元組時就會被髮送方的資料鏈路層分段,然後在接收方的網路層重組。

預設的,ping 命令只會向對方傳送 32 個位元組的資料。我們可以使用 ping 202.202.240.16 -l 2000 命令指定要傳送的資料長度。此時使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 進行過濾),瞭解 IP 包如何進行分段,如:分段標誌、偏移量以及每個包的大小等

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
可以看到,包總長:total length 分段標誌:Flags;偏移量:Fragment Offset

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

答:丟棄並返回主機失敗訊息。

實作三
考察 TTL 事件
在 IP 包頭中有一個 TTL 欄位用來限定該包可以在 Internet上傳輸多少跳(hops),一般該值設定為 64、128等。

在驗證性實驗部分我們使用了 tracert 命令進行路由追蹤。其原理是主動設定 IP 包的 TTL 值,從 1 開始逐漸增加,直至到達最終目的主機。

請使用 tracert www.baidu.com 命令進行追蹤,此時使用 Wireshark 抓包(用 icmp 過濾),分析每個傳送包的 TTL 是如何進行改變的,從而理解路由追蹤原理。

在這裡插入圖片描述
基本原理是TTL遞增從而實現路由追蹤

傳輸層

實作一
熟悉 TCP 和 UDP 段結構

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

由上到下分別可以觀察到源埠、目的埠、序列號、確認序列號、4位首部長度、ACK(URG、ACK、PSH、PST、SYN、FIN)、校驗和、緊急指標。

2、用 Wireshark 任意抓包(可用 udp 過濾),熟悉 UDP 段的結構,如:源埠、目的埠、長度等。
在這裡插入圖片描述
從上到下依次看到源埠、目的埠、校驗碼。

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

答:埠是確定資料到達使用者的哪個程式的一種標識,IP 只到達子網閘道器,MAC 只到達子網下的指定主機,所以需要埠。

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

1、開啟瀏覽器訪問 qige.io 網站,用 Wireshark 抓包(可用 tcp 過濾後再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕獲,待頁面顯示完畢後再多等一段時間使得能夠捕獲釋放連線的包。

在這裡插入圖片描述

2、請在你捕獲的包中找到三次握手建立連線的包,並說明為何它們是用於建立連線的,有什麼特徵。
在這裡插入圖片描述
通過發出 SYN 訊號請求連線,然後伺服器端回應 ACK 確認收到請求,然後主機再發出一個確認訊號。第一次握手時只有 SYN = 1 ,第二次握手時只有 SYN = 1 且 ACK = 1 ,第三次握手時只有 ACK = 1 。

3、請在你捕獲的包中找到四次揮手釋放連線的包,並說明為何它們是用於釋放連線的,有什麼特徵。
在這裡插入圖片描述
首先發出 FIN 訊號請求斷開,然後伺服器端回應一個 ACK 確認訊號,然後又發出一個 FIN 訊號,這裡將 ACK 和 FIN 合併成立一個包,然後主機回應一個 ACK 確認訊號,即可斷開連線。

問題一? 去掉 Follow TCP Stream,即不跟蹤一個 TCP 流,你可能會看到訪問 qige.io
時我們建立的連線有多個。請思考為什麼會有多個連線?作用是什麼?

答:用多個連線來開充當多個傳輸通道,加快了傳輸資料的速度。

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

答:原因是將第二次、第三次揮手發出的包合併為了一個。

應用層

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

DNS應答欄位含義
1.QR:查詢/應答標誌。0表示這是一個查詢報文,1表示這是一個應答報文
2.opcode,定義查詢和應答的型別。0表示標準查詢,1表示反向查詢(由IP地址獲得主機域名),2表示請求伺服器狀態
3.AA,授權應答標誌,僅由應答報文使用。1表示域名伺服器是授權伺服器
4.TC,截斷標誌,僅當DNS報文使用UDP服務時使用。因為UDP資料包有長度限制,所以過長的DNS報文將被截斷。1表示DNS報文超過512位元組,並被截斷
5.RD,遞迴查詢標誌。1表示執行遞迴查詢,即如果目標DNS伺服器無法解析某個主機名,則它將向其他DNS伺服器繼續查詢,如此遞迴,直到獲得結果並把該結果返回給客戶端。0表示執行迭代查詢,即如果目標DNS伺服器無法解析某個主機名,則它將自己知道的其他DNS伺服器的IP地址返回給客戶端,以供客戶端參考
6.RA,允許遞迴標誌。僅由應答報文使用,1表示DNS伺服器支援遞迴查詢
7.zero,這3位未用,必須設定為0
8.rcode,4位返回碼,表示應答的狀態。常用值有0(無錯誤)和3(域名不存在)清除快取

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

答:DNS不止一個的原因是DNS解析過程是先從瀏覽器的DNS快取中檢查是否有這個網址的對映關係,如果有,就返回IP,完成域名解析;如果沒有,作業系統會先檢查自己本地的hosts檔案是否有這個網址的對映關係,如果有,就返回IP,完成域名解析;如果沒有,電腦就要向本地DNS伺服器發起請求查詢域名;本地DNS伺服器拿到請求後,先檢查一下自己的快取中有沒有這個地址,有的話直接返回;沒有的話本地DNS伺服器會從配置檔案中讀取根DNS伺服器的地址,然後向其中一臺發起請求;直到獲得對應的IP為止。

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

post:q請求的方法,
Host:
也就是是你要訪問的主機的名字;
Connection:keep-alive
值代表的意思是保持連線。這樣子有利於在你訪問的網頁中有很多圖片等其他資源的時候,可以使用同一個TCP連線接收,而不是針對每一個檔案都建立一次TCP/IP的連線。這個也就是課本上面說的“持久連線”。
user-Agent:包含發出請求的使用者資訊
Accept-Encoding:請求的編碼格式
Accept-Language:請求語言
在這裡插入圖片描述
請在你捕獲的包中找到 HTTP 應答包,檢視應答的程式碼是什麼,如:200, 304, 404 等。並仔細瞭解應答的頭部有哪些欄位及其意義。
在這裡插入圖片描述
200:交易成功;
304:客戶端已經執行了GET,但檔案未變化;
404:沒有發現檔案、查詢或URl;
HTTP/1.1 200 OK\r\n——相應行資訊
Cache-Control: no-cache\r\n——快取控制
Connection: close\r\n——連線狀態
Content-Length: 192\r\n——包的長度
Content-Type: application/multipart-formdata\r\n——響應的內容型別
Date: Thu, 24 Dec 2020 13:25:01 GMT\r\n——時間資料

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

答:200(成功) 伺服器已成功處理了請求。通常,這表示伺服器提供了請求的網頁。如果是對您的 robots.txt 檔案顯示此狀態碼,則表示 Googlebot 已成功檢索到該檔案。304(未修改)自從上次請求後,請求的網頁未修改過。伺服器返回此響應時,不會返回網頁內容。如果網頁自請求者上次請求後再也沒有更改過,您應將伺服器配置為返回此響應(稱為 If-Modified-Since HTTP 標頭直接讀本地快取,可以節省寬頻資源。

總結

真該在考試之前就把實驗做完,做完實驗真的受益匪淺。讓我對計算機網路的分層有了更深的理解,掌握了各層的構成與以及各種協議的作用。

相關文章