計算機網絡綜合實驗指南
本實驗將結合《計算機網絡自頂向下》前三章的核心概念,通過實際操作加深對應用層、運輸層和網絡層的理解。實驗涵蓋?HTTP/TCP抓包分析、DNS解析觀察、網頁性能評估及簡單Socket編程,幫助你將理論轉化為實踐。
實驗準備
-
工具:
-
Wireshark(下載鏈接)
-
Chrome 瀏覽器
-
Python 環境(推薦安裝?Python 3.x)
-
-
網絡環境:確保能訪問互聯網(如訪問?
http://example.com
)。
實驗任務 1:使用 Wireshark 捕獲 HTTP/TCP 流量
目標:觀察 TCP 三次握手、HTTP 請求/響應、TCP 四次揮手。
步驟:
-
啟動 Wireshark:
-
選擇監聽的網絡接口(如 Wi-Fi)。
-
設置過濾條件:
tcp.port == 80
(僅捕獲 HTTP 流量)。 -
點擊?藍色鯊魚鰭按鈕?開始抓包。
-
-
觸發 HTTP 請求:
-
打開瀏覽器,訪問?
http://example.com
。
-
-
停止抓包:
-
返回 Wireshark,點擊?紅色方塊按鈕?停止捕獲。
-
-
分析數據包:
-
TCP 三次握手:
-
查找前三個 TCP 包(Flags: SYN → SYN-ACK → ACK)。
-
點擊 SYN 包,查看?Transmission Control Protocol?下的?
Sequence Number
?和?Acknowledgment Number
。
-
-
HTTP 請求/響應:
-
查找?
GET / HTTP/1.1
?請求包,展開?Hypertext Transfer Protocol?查看請求頭。 -
找到狀態碼為?
200 OK
?的響應包,查看響應內容。
-
-
TCP 四次揮手:
-
過濾?
tcp.flags.fin == 1
,觀察 FIN 和 ACK 包的交互。
-
-
驗證問題:
-
三次握手中,Client 和 Server 的初始序列號(ISN)分別是多少?
-
HTTP 響應包中的?
Content-Type
?是什么? -
四次揮手中,哪一方先發送了 FIN 包?
實驗任務 2:分析 DNS 查詢
目標:理解域名解析過程,觀察 DNS 協議交互。
步驟:
-
清空 DNS 緩存(可選):
-
Windows:
ipconfig /flushdns
-
macOS/Linux:
sudo dscacheutil -flushcache
-
-
捕獲 DNS 流量:
-
在 Wireshark 中設置過濾條件:
dns
。 -
在瀏覽器中訪問一個新域名(如?
http://neverssl.com
)。
-
-
分析 DNS 數據包:
-
查找?DNS Query?和?DNS Response。
-
展開?Domain Name System,查看查詢類型(如 A 記錄)、響應 IP 地址。
-
注意事務 ID(Transaction ID)如何匹配請求與響應。
-
驗證問題:
-
DNS 查詢的類型是 A 記錄還是 AAAA 記錄?
-
域名解析耗時多少毫秒?(查看?
Time
?列) -
DNS 響應中返回的 IP 地址是什么?
實驗任務 3:使用 Chrome 開發者工具分析網頁性能
目標:評估網頁加載性能,識別關鍵耗時階段。
步驟:
-
打開 Network 面板:
-
Chrome 中按?
F12
?→ 切換到?Network?標簽。 -
勾選?Disable cache(避免緩存干擾)。
-
-
捕獲網頁加載過程:
-
訪問一個復雜網頁(如?
http://www.nytimes.com
)。 -
觀察所有請求的加載順序和時間線。
-
-
分析性能瓶頸:
-
按?Time?列排序,找到耗時最長的請求。
-
點擊該請求 → 查看?Timing?標簽,分析各階段耗時:
-
Queuing:請求排隊時間。
-
DNS Lookup:DNS 查詢耗時。
-
Initial connection:TCP 握手 + SSL 握手(HTTPS)。
-
Content Download:下載內容耗時。
-
-
驗證問題:
-
頁面加載共發起了多少個請求?
-
耗時最長的請求是哪種類型(JS、圖片、XHR)?
-
該請求的?
Content Download
?階段耗時多少?
實驗任務 4:編寫簡單的 Socket 程序
目標:體驗 TCP/UDP 通信,理解協議差異。
步驟:
-
TCP 客戶端/服務端通信:
-
服務端代碼(Python):
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 8080)) s.listen() conn, addr = s.accept() print(f"Connected by {addr}") data = conn.recv(1024) print(f"Received: {data.decode()}") conn.send(b"Hello from server!") conn.close()
-
客戶端代碼(Python):
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 8080)) s.send(b"Hello from client!") data = s.recv(1024) print(f"Received: {data.decode()}") s.close()
-
運行觀察:
-
先啟動服務端,再運行客戶端,查看控制臺輸出。
-
-
-
UDP 客戶端/服務端通信:
-
服務端代碼:
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('0.0.0.0', 8080)) data, addr = s.recvfrom(1024) print(f"Received from {addr}: {data.decode()}") s.sendto(b"Hello from UDP server!", addr)
-
客戶端代碼:
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(b"Hello from UDP client!", ('localhost', 8080)) data, addr = s.recvfrom(1024) print(f"Received: {data.decode()}") s.close()
-
運行觀察:
-
注意無需建立連接,直接發送數據。
-
-
驗證問題:
-
TCP 和 UDP 在代碼中有何關鍵區別?
-
如果先啟動客戶端再啟動服務端,TCP 和 UDP 的行為有何不同?
-
UDP 服務端能否收到客戶端消息?為什么?
實驗總結與拓展
知識點回顧:
-
應用層:HTTP/DNS 協議格式、網頁性能優化。
-
運輸層:TCP 可靠傳輸機制(握手、揮手)、UDP 無連接特性。
-
工具使用:Wireshark 抓包、Chrome 開發者工具分析。
拓展挑戰:
-
使用 Wireshark 捕獲 HTTPS 流量(需導入瀏覽器證書)。
-
修改 Socket 程序,實現多客戶端并發通信(TCP 多線程)。
-
分析 HTTP/2 與 HTTP/1.1 的流量差異(如多路復用)。