L01 觀察本機通訊
本實驗使用的程式:L01-local-http.py。文中指令以課程根目錄為工作目錄;建議下載教材套件,解壓後在 computer-networking 目錄執行。
目標與驗證範圍
辨認 TCP 的來源/目的端點,觀察 HTTP 方法、狀態、標頭與回應內容,區分本機 loopback 實驗與家庭網路的真實路徑。本實驗已提供可自行結束的示範,以及方便封包觀察的分開啟動方式。
環境:Python 3.10 以上,僅使用標準函式庫。程式與本文件都在 labs/,下列指令由課程根目錄執行;Windows 可用 py -3 替換 python3。服務繫結 127.0.0.1,以作業系統分配的空閒埠啟動。
執行前預測
- 客戶端與服務端的 IP 是否相同?它們的埠是否相同?
- 本次路徑是否會經過家庭的 AP、閘道或 NAT?
- 若收到 HTTP 200,最多可以證明哪些步驟成功?
- 如果回應包含中文字,Content-Length 計算字元數還是 bytes?
步驟 A:一個指令完成示範
在課程目錄執行:
python3 labs/L01-local-http.py
程式會啟動本機 HTTP 服務,建立一個客戶端 TCP 連線,請求 /lesson,讀完回應,然後結束服務。輸出是一份 JSON 觀察紀錄。實際埠與時間每次可不同。
紀錄欄位包括 method、request_path、response_headers,以及 client_endpoint、server_endpoint、status、content_length、received_bytes、elapsed_ms 及 response。檢查服務端看到的客戶端埠,是否和客戶端紀錄一致。
步驟 B:分開啟動,方便觀察
第一個終端:
python3 labs/L01-local-http.py --serve
記下印出的埠,例如 54321。第二個終端用實際埠執行:
python3 labs/L01-local-http.py --client 54321
可以重複請求;觀察客戶端來源埠是否改變。完成後,在第一個終端按 Ctrl-C 結束服務。
若你已有 Wireshark,可在適當的 loopback 介面觀察,使用 tcp.port == 54321 作顯示篩選。介面名稱及擷取權限依平臺而異。這是延伸觀察,必修部分以程式紀錄完成;程式紀錄本身沒有擷取或證明完整的 TCP 握手封包。
紀錄表
| 項目 | 第一次 | 第二次 | 解釋 |
|---|---|---|---|
| 客戶端 IP/埠 | 自行填寫 | 自行填寫 | 是否同一個連線? |
| 服務端 IP/埠 | 自行填寫 | 自行填寫 | 是否同一個服務? |
| HTTP 狀態 | 自行填寫 | 自行填寫 | 應用層結果 |
| 宣告/收到 bytes | 自行填寫 | 自行填寫 | 說明 parser 依 Content-Length 讀取;不足會報 IncompleteRead,並非獨立線路完整性測試。 |
| elapsed_ms | 自行填寫 | 自行填寫 | 包含哪些工作? |
受控制的故障
先正常請求 /lesson,再請求 /missing:
python3 labs/L01-local-http.py --client 54321 --path /missing
預期收到 HTTP 404。TCP 與 HTTP 交換仍可能成功,只是服務沒有該資源。結束服務後再用同一個埠請求;通常會遇到 connection refused,但若該埠被其他服務接手,結果可能不同。記下例外種類,並將「沒有連線」與「有連線但應用回覆失敗」分開。
判讀與交付
繳交兩次成功紀錄、一個 404 紀錄、服務關閉後的結果,以及約 200 字的解釋。說明本實驗為什麼沒有驗證外部 DNS、NAT、TLS 或遠端路由。不要把本機 elapsed_ms 解讀為單向網路延遲。
評分:預測 20%、紀錄完整 30%、故障區分 30%、證據範圍 20%。