計算機網路實驗二

第一百一十三顆流星發表於2020-12-26

1、 資料鏈路層

實作一:熟悉 Ethernet 幀結構

使用 Wireshark 任意進行抓包,熟悉 Ethernet 幀的結構

✎ 問題
你會發現 Wireshark 展現給我們的幀中沒有校驗欄位,請了解一下原因。
答:因為wireshark把這2個都給過濾了。在物理層上網路卡要先去掉前導同步碼和幀開始定界符,然後對幀進行CRC檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目 的硬體地址是否符合自己的接收條件(目的地址是自己的物理硬體地址、廣播地址、可接收的多播硬體地址等),如果符合,就將幀交“裝置驅動程式”做進一步處 理。這時我們的抓包軟體才能抓到資料,因此,抓包軟體抓到的是去掉前導同步碼、幀開始分界符、FCS之外的資料。

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

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

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

然後 ping qige.io

再次 ping www.cqjtu.edu.cn

答:
訪問本子網的計算機時,目的 MAC 就是該主機的
訪問非本子網的計算機時,目的 MAC 是閘道器的

實作三: 掌握 ARP 解析過程

1,為防止干擾,先使用 arp -d * 命令清空 arp 快取
2.ping 你旁邊的計算機(同一子網),同時用 Wireshark 抓這些包(可 arp 過濾),檢視 ARP 請求的格式以及請求的內容,注意觀察該請求的目的 MAC 地址是什麼。再檢視一下該請求的回應,注意觀察該回應的源 MAC 和目的 MAC 地址是什麼。

3.再次使用 arp -d * 命令清空 arp 快取
然後 ping qige.io (或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 arp 過濾)。檢視這次 ARP 請求的是什麼,注意觀察該請求是誰在回應。

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

2、網路層

實作一:熟悉 IP 包結構

使用 Wireshark 任意進行抓包(可用 ip 過濾),熟悉 IP 包的結構,如:版本、頭部長度、總長度、TTL、協議型別等欄位。
版本號(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位元。標識了上層所使用的協議。
以下是比較常用的協議號:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF
頭部校驗Header Checksum:長度16位。用來做IP頭部的正確性檢測,但不包含資料部分。 因為每個路由器要改變TTL的值,所以路由器會為每個通過的資料包重新計算這個值。

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

答:因為ipv4裡包頭的長度是可變的,我們的包頭裡既有可選的部分,也有不可選的部分。

實作二:IP 包的分段與重組

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

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

當需要進行分片時,在每個資料包片的首部存放著該資料包的標識、標誌位和片偏移,在進行重組時,標識用來分辨該資料包片的原資料包是哪個,標誌位中的MF用來分辨這是不是原資料包的最後一片,片偏移用來分辨這個資料包片相對原資料包的位置。通過這幾個欄位,可以穩定的完成資料包的分片與重組操作

實作三: 考察 TTL 事件

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

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

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

3、 傳輸層

實作一:熟悉 TCP 和 UDP 段結構

用 Wireshark 任意抓包(可用 tcp 過濾),熟悉 TCP 段的結構,如:源埠、目的埠、序列號、確認號、各種標誌位等欄位。

用 Wireshark 任意抓包(可用 udp 過濾),熟悉 UDP 段的結構,如:源埠、目的埠、長度等。
(1)TCP報文段(segment)
(1)源地址埠:16位欄位,傳送該報文段的主機中應用程式的埠號
(2)目的埠地址:
(3)序號:32位欄位。指派給本報文段第一個資料位元組的編號,TCP傳輸保證連線性,傳送的每個位元組都要編上號。序號就是告訴終點,報文段中的第一個位元組是序列中的哪個。建立連線時,發收雙發使用各自的隨機數產生器產生一個初始序號(ISN),通常,兩個方向的ISN是不同的。
(4)確認號:32位欄位定義了接收方期望從對方接受的位元組編號。如果報文段的接收方成功的接受了對方發過來的編號x的位元組,那麼返回x+1作為確認號,確認號可以和資料捎帶一起傳送。
(5)HLEN(首部長度):4位,指出TCP首部一共有多少個4位元組,所以範圍是5~15
(6)控制:定義了6中不同的控制位或者標誌位。
(2)UDP
UDP的分組稱使用者資料包:它有8位元組的固定首部
(1)總長度:16位欄位,定義了使用者資料包的總長度為0~65535位元組。但實際長度肯定比65535小,因為使用者資料包要放在總長度為65535的IP資料包中,封裝在IP資料包中。因此UDP長度=IP長度-IP首部長度。
(2)檢驗和:增加一個偽首部,對於UDP協議來說協議欄位的值為17。若在傳輸過程中這個值發生改變,接收端計算檢驗和就能檢測出來。UDP使用檢驗和是可選的,如果不計算就將這16位全部填0.

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

答:源埠,目的埠是確定資料在使用者的程式的位置。

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

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

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

答:因為瀏覽器在訪問qige.io的時候運用多個埠同時與qige.io建立連線來提高速度。

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

答:在長連線中假如抓包的時間不夠長, 那麼可能連線還沒釋放所以抓不到。

4、 應用層

實作一:瞭解 DNS 解析

先使用 ipconfig /flushdns 命令清除快取,再使用 nslookup qige.io 命令進行解析,同時用 Wireshark 任意抓包(可用 dns 過濾)。
可以看到當前計算機使用 UDP,向預設的 DNS 伺服器的 53 號埠發出了查詢請求,而 DNS 伺服器的 53 號埠返回了結果。

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 解析請求不止一個,思考一下是什麼原因?

答:計算機域名解析伺服器有多個,會同時發出請求。

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

開啟瀏覽器訪問 qige.io 網站,用 Wireshark 抓包(可用http 過濾再加上 Follow TCP Stream),不要立即停止 Wireshark 捕獲,待頁面顯示完畢後再多等一段時間以將釋放連線的包捕獲。
請在你捕獲的包中找到 HTTP 請求包,檢視請求使用的什麼命令,如:GET, POST。並仔細瞭解請求的頭部有哪些欄位及其意義。
請在你捕獲的包中找到 HTTP 應答包,檢視應答的程式碼是什麼,如:200, 304, 404 等。並仔細瞭解應答的頭部有哪些欄位及其意義。
狀態碼:
1xx:接收到請求且正在處理
2xx:請求正常處理完畢:eg:200 OK
3xx:重定向狀態,表示瀏覽器需要進行附加操作
4xx:伺服器無法處理這個請求 eg :404 Page Not Found
5xx:伺服器處理出錯 eg:502 Bad Gateway
✎ 問題
重新整理一次 qige.io 網站的頁面同時進行抓包,你會發現不少的 304 程式碼的應答,這是所請求的物件沒有更改的意思,讓瀏覽器使用本地快取的內容即可。那麼伺服器為什麼會回答 304 應答而不是常見的 200 應答?
答:瀏覽器和伺服器有一個協商的過程,伺服器告訴瀏覽器當前請求的資源上一次修的時間。再次傳送請求時告訴瀏覽器還有上次請求資源的快取,如果資源不變,不必再傳。伺服器根據瀏覽器傳來的時間發現和當前請求資源的修改時間一致後應答304。

相關文章