web app專案打包
資料鏈路層
實作一 熟悉 Ethernet 幀結構
使用 Wireshark 任意進行抓包,熟悉 Ethernet 幀的結構,如:目的 MAC、源 MAC、型別、欄位等。
聯網方式:WLAN(無線區域網)
可以看到目的MAC還有源MAC以及欄位等
問:你會發現 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;