電腦網路與 Internet 通訊

L01 觀察本機通訊

本實驗使用的程式:L01-local-http.py。文中指令以課程根目錄為工作目錄;建議下載教材套件,解壓後在 computer-networking 目錄執行。

目標與驗證範圍

辨認 TCP 的來源/目的端點,觀察 HTTP 方法、狀態、標頭與回應內容,區分本機 loopback 實驗與家庭網路的真實路徑。本實驗已提供可自行結束的示範,以及方便封包觀察的分開啟動方式。

環境:Python 3.10 以上,僅使用標準函式庫。程式與本文件都在 labs/,下列指令由課程根目錄執行;Windows 可用 py -3 替換 python3。服務繫結 127.0.0.1,以作業系統分配的空閒埠啟動。

執行前預測

  1. 客戶端與服務端的 IP 是否相同?它們的埠是否相同?
  2. 本次路徑是否會經過家庭的 AP、閘道或 NAT?
  3. 若收到 HTTP 200,最多可以證明哪些步驟成功?
  4. 如果回應包含中文字,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%。