數據鏈路層
實作一 熟悉 Ethernet 幀結構
使用 Wireshark 任意進行抓包,熟悉 Ethernet 幀的結構,如:目的 MAC、源 MAC、類型、字段等。
聯網方式:WLAN(無線局域網)
可以看到目的MAC
還有源MAC
以及ipv4
問:你會發現 Wireshark 展現給我們的幀中沒有校驗字段,請了解一下原因。
答:Wireshark在抓包時,校驗字段會被過濾掉,
實作二 了解子網內/外通信時的 MAC 地址
1.ping qige.io
(或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址是多少?這個 MAC 地址是誰的?
子網網關的物理地址
2.再次 ping www.cqjtu.edu.cn
(改為百度,學校的ping不過去)(或者本子網外的主機都可以),同時用 Wireshark 抓這些包(可 icmp 過濾),記錄一下發出幀的目的 MAC 地址以及返回幀的源 MAC 地址又是多少?這個 MAC 地址又是誰的?
子網網關的物理地址
問: 通過以上的實驗,你會發現:
- 訪問本子網的計算機時,目的 MAC 就是該主機的
- 訪問非本子網的計算機時,目的 MAC 是網關的
請問原因是什么?
原因是訪問外網的時候,都是通過 mac 地址送到網關處,然后出了網關再通過 IP 地址進行查找;接收到非子網的計算機返回的數據都是先到網關,網關再根據目的 mac 送到本機。
實作三 掌握 ARP 解析過程(一台電腦無法操作)
通過以上的實驗,你應該會發現,
- ARP 請求都是使用廣播方式發送的
- 如果訪問的是本子網的 IP,那么 ARP 解析將直接得到該 IP 對應的 MAC;如果訪問的非本子網的 IP, 那么 ARP 解析將得到網關的 MAC。
請問為什么?
如果訪問的是所處的本網子網的ip,ARP 緩存中沒有該 ip,那么就會發送一個廣播,在子網中找尋這個ip,如果有 那么ARP解析協議將會直接得到該ip對應的Mac地址;如果訪問的是非本子網的ip,那么ARP解析將直接得到網關的Mac地址。因為要想訪問對方,在處於同一子網的條件下,應該知道對方的Mac地址,但是不處於同一子網,就需要對方所處子網網關的Mac地址。
網絡層
實作一 熟悉 IP 包結構
使用 Wireshark 任意進行抓包(可用 ip 過濾),熟悉 IP 包的結構,如:版本、頭部長度、總長度、TTL、協議類型等字段。
問:為提高效率,我們應該讓 IP 的頭部盡可能的精簡。但在如此珍貴的 IP 頭部你會發現既有頭部長度字段,也有總長度字段。請問為什么?
答:ip頭部長度字段和總長度字段是為了方便將上層將ip包里的數據取出來,從而可以讓明白包的開始
實作二 IP包的分段與重組
根據規定,一個 IP 包最大可以有 64K 字節。但由於 Ethernet 幀的限制,當 IP 包的數據超過 1500 字節時就會被發送方的數據鏈路層分段,然后在接收方的網絡層重組。
缺省的,ping
命令只會向對方發送 32 個字節的數據。我們可以使用 ping 202.202.240.16 -l 2000
命令指定要發送的數據長度。此時使用 Wireshark 抓包(用 ip.addr == 202.202.240.16
進行過濾),了解 IP 包如何進行分段,如:分段標志、偏移量以及每個包的大小等
問:分段與重組是一個耗費資源的操作,特別是當分段由傳送路徑上的節點即路由器來完成的時候,所以 IPv6 已經不允許分段了。那么 IPv6 中,如果路由器遇到了一個大數據包該怎么辦?
答:轉發或者直接丟棄該數據包
實作三 考察TTL事件
在 IP 包頭中有一個 TTL 字段用來限定該包可以在 Internet上傳輸多少跳(hops),一般該值設置為 64、128等。
在驗證性實驗部分我們使用了 tracert
命令進行路由追蹤。其原理是主動設置 IP 包的 TTL 值,從 1 開始逐漸增加,直至到達最終目的主機。
請使用 tracert www.baidu.com
命令進行追蹤,此時使用 Wireshark 抓包(用 icmp
過濾),分析每個發送包的 TTL 是如何進行改變的,從而理解路由追蹤原理。
在 IPv4 中,TTL 雖然定義為生命期即 Time To Live,但現實中我們都以跳數/節點數進行設置。如果你收到一個包,其 TTL 的值為 50,那么可以推斷這個包從源點到你之間有多少跳?
答:50跳
傳輸層
實作一 熟悉TCP和UDP建立和釋放連接
-
用 Wireshark 任意抓包(可用 tcp 過濾),熟悉 TCP 段的結構,如:源端口、目的端口、序列號、確認號、各種標志位等字段。
-
用 Wireshark 任意抓包(可用 udp 過濾),熟悉 UDP 段的結構,如:源端口、目的端口、長度等。
問:由上大家可以看到 UDP 的頭部比 TCP 簡單得多,但兩者都有源和目的端口號。請問源和目的端口號用來干什么?
答:源端口和目的端口是用來確認某一個應用程序,IP 只能到達子網網關,MAC 地址到達子網下的指定主機,而端口號是達到主機上的某個應用程序。
實作二 分析TCP建立和釋放連接
-
打開瀏覽器訪問 qige.io 網站,用 Wireshark 抓包(可用 tcp 過濾后再使用加上
Follow TCP Stream
),不要立即停止 Wireshark 捕獲,待頁面顯示完畢后再多等一段時間使得能夠捕獲釋放連接的包。 -
請在你捕獲的包中找到三次握手建立連接的包,並說明為何它們是用於建立連接的,有什么特征。
它們的長度都很短。通過發出 SYN 信號請求連接,然后服務器端回應 ACK 確認收到請求,然后主機再發出一個確認信號。第一次握手時除了 SYN = 1 外其余的標志都為 0 ,第二次握手時除了 SYN = 1 且 ACK = 1 外其余的標志都為 0 ,第三次握手時除了 ACK = 1 外其余的標志都為 0
-
請在你捕獲的包中找到四次揮手釋放連接的包,並說明為何它們是用於釋放連接的,有什么特征。
它們的長度都很短。這里四次揮手為什么只抓到了三個包呢?原始是將第二次、第三次揮手合並成了一個包,所以只看到了三個包。首先發出 FIN 信號請求斷開,然后服務器端回應一個 ACK 確認信號,然后又發出一個 FIN 信號(這里將 ACK 和 FIN 合並成立一個包),然后主機回應一個 ACK 確認信號,即可斷開連接。
問一:去掉
Follow TCP Stream
,即不跟蹤一個 TCP 流,你可能會看到訪問qige.io
時我們建立的連接有多個。請思考為什么會有多個連接?作用是什么?答:開辟了多個通道加快了傳輸的速度
問二: 我們上面提到了釋放連接需要四次揮手,有時你可能會抓到只有三次揮手。原因是什么?
答:第二次和第三次揮手時發出的包合並成了一個
應用層
應用層的協議非常的多,我們只對 DNS 和 HTTP 進行相關的分析。
實作一 了解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 解析請求不止一個,思考一下是什么原因?
答:DNS不止一個的原因是DNS解析過程是先從瀏覽器的DNS緩存中檢查是否有這個網址的映射關系,如果有,就返回IP,完成域名解析;如果沒有,操作系統會先檢查自己本地的hosts文件是否有這個網址的映射關系,如果有,就返回IP,完成域名解析;如果沒有,電腦就要向本地DNS服務器發起請求查詢域名;本地DNS服務器拿到請求后,先檢查一下自己的緩存中有沒有這個地址,有的話直接返回;沒有的話本地DNS服務器會從配置文件中讀取根DNS服務器的地址,然后向其中一台發起請求;直到獲得對應的IP為止
實作二 了解HTTP的請求和應答
-
打開瀏覽器訪問 qige.io 網站,用 Wireshark 抓包(可用http 過濾再加上
Follow TCP Stream
),不要立即停止 Wireshark 捕獲,待頁面顯示完畢后再多等一段時間以將釋放連接的包捕獲。 -
請在你捕獲的包中找到 HTTP 請求包,查看請求使用的什么命令,如:
GET, POST
。並仔細了解請求的頭部有哪些字段及其意義。
-
請在你捕獲的包中找到 HTTP 應答包,查看應答的代碼是什么,如:
200, 304, 404
等。並仔細了解應答的頭部有哪些字段及其意義。
200:交易成功;
304:客戶端已經執行了GET,但文件未變化;
404:沒有發現文件、查詢或URl;