Wireshark實驗

不想學習的崽子發表於2020-12-26

一、資料鏈路層

實作一 熟悉 Ethernet 幀結構

1.使用 Wireshark 任意進行抓包,熟悉 Ethernet 幀的結構,如:目的 MAC、源 MAC、型別、欄位等。
在這裡插入圖片描述
在這裡插入圖片描述

2.問題:Wireshark 展現給我們的幀中沒有校驗欄位,請了解一下原因。
原因:有時校驗和會由網路卡計算,這時wireshark抓到的本機傳送的資料包的校驗和都是錯誤的,所以預設關閉了WireShark自己的校驗。

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

1.ping 你旁邊的計算機(同一子網),同時用 Wireshark 抓這些包(可使用 icmp 關鍵字進行過濾以利於分析),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?

在這裡插入圖片描述

發出幀的目的 MAC 地址以及返回幀的源 MAC 是80-C5-F2-C0-2A-CD,這個MAC地址是旁邊主機的MAC地址
在這裡插入圖片描述

2.然後 ping qige.io (或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?

在這裡插入圖片描述
在這裡插入圖片描述

3.再次 ping www.cqjtu.edu.cn (或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址又是多少?這個 MAC 地址又是誰的?

在這裡插入圖片描述

在這裡插入圖片描述
可以看到請求超時,未傳送資訊。發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是c2:68:e6:04:6d:53,是閘道器的MAC地址

3.問題
通過以上的實驗,你會發現:
訪問本子網的計算機時,目的 MAC 就是該主機的
訪問非本子網的計算機時,目的 MAC 是閘道器的
請問原因是什麼?
原因:ARP代理,訪問非子網計算機時是通過路由器轉接的,MAC地址是接入路由器埠的地址,再通過路由器發給相應計算機。

實作三 掌握 ARP 解析過程

1.為防止干擾,先使用 arp -d * 命令清空 arp 快取

在這裡插入圖片描述
發現出現問題:ARP項刪除失敗:請求的操作需要提升

解決方法:右擊Windows鍵→選擇Window PowerShell(管理員),進入管理員端,輸入arp -d即可

在這裡插入圖片描述

2.ping 你旁邊的計算機(同一子網),同時用 Wireshark 抓這些包(可 arp 過濾),檢視 ARP 請求的格式以及請求的內容,注意觀察該請求的目的 MAC 地址是什麼。再檢視一下該請求的回應,注意觀察該回應的源 MAC 和目的 MAC 地址是什麼。

在這裡插入圖片描述
在這裡插入圖片描述

3.再次使用 arp -d * 命令清空 arp 快取

4.然後 ping qige.io (或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 arp 過濾)。檢視這次 ARP 請求的是什麼,注意觀察該請求是誰在回應。

在這裡插入圖片描述

6.問題
通過以上的實驗,你應該會發現,ARP 請求都是使用廣播方式傳送的
如果訪問的是本子網的 IP,那麼 ARP 解析將直接得到該 IP 對應的 MAC;如果訪問的非本子網的 IP, 那麼 ARP 解析將得到閘道器的 MAC。請問為什麼?
原因:ARP代理,訪問非子網IP時是通過路由器訪問的,路由器再把發出去,目標IP收到請求後,再通過路由器埠IP返回去,那麼ARP解析將會得到閘道器的MAC。由於ARP表被清空,所以首先是通過廣播建立ARP表來得到對方的MAC地址。在同一子網內不需要通過路由器進行通訊,所以得到是對方主機的Mac地址。訪問外網時,也是通過廣播的,需用路由器進行轉發訊息,所以得到閘道器Mac地址。

二、網路層

實作一 熟悉 IP 包結構

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

在這裡插入圖片描述

IP包結構詳解
版本號(Version):長度4位元。標識目前採用的IP協議的版本號。一般的值為0100(IPv4),IPv6的值(0110)
服務型別(Type of Service):長度8位元。這個子段可以拆分成兩個部分:Precedence和TOS。TOS目前不太使用。而Precedence則用於QOS應用。(TOS欄位的詳細描述RFC 1340 1349)
IP包頭長度(Header Length):長度4位元。這個欄位的作用是為了描述IP包頭的長度,因為在IP包頭中有變長的可選部分。IP包頭最小長度為20位元組,由於變長的可選部分最大長度可能會變成24位元組。
IP包總長(Total Length):長度16位元。IP包最大長度65535位元組。
識別符號(Identifier):長度16位元。該欄位和Flags和Fragment Offest欄位聯合使用,對大的上層資料包進行分段(fragment)操作。
標記(Flags):長度3位元。該欄位第一位不使用。第二位是DF位,DF位設為1時表明路由器不能對該上層資料包分段。如果一個上層資料包無法在不分段的情況下進行轉發,則路由器會丟棄該上層資料包並返回一個錯誤資訊。第三位是MF位,當路由器對一個上層資料包分段,則路由器會在除了最後一個分段的IP包的包頭中將MF位設為1。
分段序號(Fragment Offset):長度13位元。該欄位對包含分段的上層資料包的IP包賦予序號。由於IP包在網路上傳送的時候不一定能按順序到達,這個欄位保證了目標路由器在接受到IP包之後能夠還原分段的上層資料包。到某個包含分段的上層資料包的IP包在傳送時丟失,則整個一系列包含分段的上層資料包的IP包都會被要求重傳。
生存時間(TTL):長度8位元。當IP包進行傳送時,先會對該欄位賦予某個特定的值。當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。如果TTL減少為0,則該IP包會被丟棄。這個欄位可以防止由於故障而導致IP包在網路中不停被轉發。
協議(Protocol):長度8位元。標識了上層所使用的協議。
頭部校驗(Header Checksum):長度16位,由於IP包頭是變長的,所以提供一個頭部校驗來保證IP包頭中資訊的正確性。
起源和目標地址(Source and Destination Addresses ):這兩個地段都是32位元。標識了這個IP包的起源和目標地址。

2.問題
為提高效率,我們應該讓 IP 的頭部儘可能的精簡。但在如此珍貴的 IP 頭部你會發現既有頭部長度欄位,也有總長度欄位。請問為什麼?
原因:便於傳輸時的識別IP總長度,節省時間,當長度超過1500B時就會被返回鏈路層進行分段。

實作二 IP 包的分段與重組

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

識別符號(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包。

2.問題
分段與重組是一個耗費資源的操作,特別是當分段由傳送路徑上的節點即路由器來完成的時候,所以 IPv6 已經不允許分段了。那麼 IPv6 中,如果路由器遇到了一個大資料包該怎麼辦?
方法:轉發至能支援該資料包的出鏈路上。IPv6的資料只在源端分片,目的端重組,中間路由器收到超過它MTU的資料會傳送ICMPv6告訴源主機它的MTU大小,並把資料拋棄.

實作三 考察 TTL 事件

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

在這裡插入圖片描述

路由追蹤:
從我們源主機發出去的資料包在到達目的主機的路上要經過許多個路由器的轉發,在傳送資料包的時候源主機會設定一個TTL的值,每經過一個路由器TTL就會被減去一,當TTL為0的時候該資料包會被直接丟棄(不再繼續轉發),併傳送一個超時ICMP報文給源主機。
參考資料:Traceroute(路由追蹤)的原理及實現 - lclc - 部落格園
https://www.cnblogs.com/lcword/p/9862539.html

2.問題
在 IPv4 中,TTL 雖然定義為生命期即 Time To Live,但現實中我們都以跳數/節點數進行設定。如果你收到一個包,其 TTL 的值為 50,那麼可以推斷這個包從源點到你之間有多少跳?
答:Windows作業系統的ICMP回顯應答的 TTL 欄位值為 128,所以128-50=78,則這個包從源點到你之間有78跳.

三、傳輸層

實作一 熟悉 TCP 和 UDP 段結構

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

用 Wireshark 任意抓包(可用 udp 過濾),熟悉 UDP 段的結構,如:源埠、目的埠、長度等。

在這裡插入圖片描述

2.問題
由上大家可以看到 UDP 的頭部比 TCP 簡單得多,但兩者都有源和目的埠號。請問源和目的埠號用來幹什麼?
作用:在一臺機器上,一個程式對應一個埠。埠的作用就是用來唯一標識這個程式。源埠標識發起通訊的那個程式,目的埠標識接受通訊的那個程式。有了埠號,接受到報文後才能夠知道將報文傳送到哪個程式。

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

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

在這裡插入圖片描述

2.請在你捕獲的包中找到三次握手建立連線的包,並說明為何它們是用於建立連線的,有什麼特徵。

答:
1)客戶端傳送的TCP報文中以[SYN]作為標誌位,並且客戶端序號Seq=0;
2)伺服器返回的TCP報文中以[SYN,ACK]作為標誌位;並且伺服器端序號Seq=0;確認號Ack=1(“第一次握手”中客戶端序號Seq的值+1);
3)客戶端再向伺服器端傳送的TCP報文中以[ACK]作為標誌位;其中客戶端序號Seq=1(“第二次握手”中伺服器端確認號Ack的值);確認號Ack=1(“第二次握手”中伺服器端序號Seq的值+1)。

3.請在你捕獲的包中找到四次揮手釋放連線的包,並說明為何它們是用於釋放連線的,有什麼特徵。

答:
1)服務端停止提出終端連結請求 。
2)客戶端收到請求並回復。
3)客戶端提出中斷連線請求。
4) 伺服器收到請求並回復。

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

原因:在傳輸層的TCP三次握手建立完全之後,傳輸層還需要進行相關的資料傳輸和認證,所以存在其他連線。
作用:對傳輸其他資料以及認證。

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

原因:
1)某一方在收到對方中斷的請求後將回復和自己的中斷請求放在一個包裡進行傳輸了。
2)第二次握手和第三次揮手合併了,FIN報文用在本端沒有資料傳送給對方時,關閉從本端到對端的連線。但是並不影響從對方到本端的連線,也就是說本端仍然可以接收對方的資料。即傳送通道關閉,接收通道正常。
如果對方收到本端FIN報文時,對方的接收通道就會關閉。此時,如果對方也沒有資料發給本端,那麼對方也會傳送FIN給本端,用於關閉從對方到本端的連線,這時候就可能出現ACK和FIN合在一起的情況。
當然,如果對方仍然有資料傳送,那麼就等資料發完,再發FIN來關閉連線,這時候就是四次揮手了。

四、應用層

應用層的協議非常的多,我們只對 DNS 和 HTTP 進行相關的分析。

實作一 瞭解 DNS 解析

1.先使用 ipconfig /flushdns 命令清除快取,再使用 nslookup qige.io 命令進行解析,同時用 Wireshark 任意抓包(可用 dns 過濾)。

ipconfig /flushdns

在這裡插入圖片描述

nslookup qige.io

在這裡插入圖片描述
在這裡插入圖片描述

2.你應該可以看到當前計算機使用 UDP,向預設的 DNS 伺服器的 53 號埠發出了查詢請求,而 DNS 伺服器的 53 號埠返回了結果。

3.可瞭解一下 DNS 查詢和應答的相關欄位的含義

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

4.問題
你可能會發現對同一個站點,我們發出的 DNS 解析請求不止一個,思考一下是什麼原因?
原因:例如,對域名www.bilibili.com進行解析就會出現這樣的結果。產生這樣的結果是為了使bilibili這個伺服器的負載得到平衡(因為每天訪問這個站點的次數非常多)。因此這個網站就設有好幾個計算機,每一個計算機都執行同樣的伺服器軟體。這些計算機的IP地址當然都是不一樣的,但它們的域名卻是相同的。這樣,第一個訪問該網址的就得到第一個計算機的IP地址,而第二個訪問者就得到第二個計算機的IP地址等等。這樣可使每一個計算機的負荷不會太大。

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

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

在這裡插入圖片描述

2.請在你捕獲的包中找到 HTTP 請求包,檢視請求使用的什麼命令,如:GET, POST。並仔細瞭解請求的頭部有哪些欄位及其意義。

3.請在你捕獲的包中找到 HTTP 應答包,檢視應答的程式碼是什麼,如:200, 304, 404 等。並仔細瞭解應答的頭部有哪些欄位及其意義。

部分狀態程式碼、狀態資訊的含義
100 Continue 初始的請求已經接受,客戶應當繼續傳送請求的其餘部分。(HTTP 1.1新)
200 OK 一切正常,對GET和POST請求的應答文件跟在後面。
201 Created 伺服器已經建立了文件,Location頭給出了它的URL。
204 No Content 沒有新文件,瀏覽器應該繼續顯示原來的文件。
301 Moved Permanently 客戶請求的文件在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。
302 Moved Temporatily 類似於301,但新的URL應該被視為臨時性的替代,而不是永久性的。
400 Bad Request 請求出現語法錯誤。
401 Unauthorized 客戶試圖未經授權訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據此顯示使用者名稱字/密碼對話方塊,然後在填寫合適的Authorization頭後再次發出請求。
403 Forbidden 資源不可用。伺服器理解客戶的請求,但拒絕處理它。通常由於伺服器上檔案或目錄的許可權設定導致。
404 Not Found 無法找到指定位置的資源。這也是一個常用的應答
500 Internal Server Error 伺服器遇到了意料不到的情況,不能完成客戶的請求。
501 Not Implemented 伺服器不支援實現請求所需要的功能。例如,客戶發出了一個伺服器不支援的PUT請求。
502 Bad Gateway 伺服器作為閘道器或者代理時,為了完成請求訪問下一個伺服器,但該伺服器返回了非法的應答。

✍ 建議:
HTTP 請求和應答的頭部欄位值得大家認真的學習,因為基於 Web 的程式設計中我們將會大量使用。如:將使用者認證的令牌資訊放到頭部,或者把 cookie 放到頭部等。

4.問題
重新整理一次 qige.io 網站的頁面同時進行抓包,你會發現不少的 304 程式碼的應答,這是所請求的物件沒有更改的意思,讓瀏覽器使用本地快取的內容即可。那麼伺服器為什麼會回答 304 應答而不是常見的 200 應答?
原因:瀏覽器和伺服器有一個協商的過程,伺服器告訴瀏覽器當前請求的資源上一次修改的時間是這個時間。瀏覽器第二次傳送請求的時候,告訴瀏覽器我上次請求的資源現在還在自己的快取中,如果你那邊這個資源還沒有修改,就可以不用傳送應答體給我了。伺服器根據瀏覽器傳來的時間發現和當前請求資源的修改時間一致,就應答304,表示不傳應答體了,從快取裡取。

相關文章