【系統設計 20 概念】#01 網路基礎 — IP Address、TCP/IP、DNS、HTTP

測驗:網路基礎 — IP Address、TCP/IP、DNS、HTTP

共 5 題,點選答案後會立即顯示結果

1. DNS 的主要功能是什麼?

  • A. 加密網路傳輸,防止資料被竊聽
  • B. 將人類可讀的域名轉換為電腦可讀的 IP 位址
  • C. 確保資料封包按順序完整到達目的地
  • D. 定義客戶端與伺服器之間的請求與回應格式

2. 在 TCP 三次握手中,三個步驟依序發送的訊息是什麼?

  • A. ACK → SYN → SYN-ACK
  • B. SYN-ACK → ACK → SYN
  • C. SYN → SYN-ACK → ACK
  • D. ACK → ACK → SYN

3. 你的 API 回傳 HTTP 狀態碼 401 Unauthorized,這代表什麼?

  • A. 伺服器內部發生錯誤,無法處理請求
  • B. 請求的資源不存在
  • C. 伺服器知道你是誰,但你沒有存取權限
  • D. 使用者尚未登入或身份驗證失敗

4. 以下程式碼中,host="0.0.0.0"host="127.0.0.1" 的差別是什麼?

app.run(host=”0.0.0.0″, port=5000) # vs app.run(host=”127.0.0.1″, port=5000)
  • A. 0.0.0.0 只允許本機存取,127.0.0.1 允許外部連入
  • B. 0.0.0.0 監聽所有網路介面(外部可連入),127.0.0.1 只限本機存取
  • C. 兩者功能相同,只是寫法不同
  • D. 0.0.0.0 表示不指定 IP,系統會自動分配一個隨機 IP

5. 在設計錯誤重試機制時,為什麼收到 HTTP 4xx 狀態碼時不應該重試?

  • A. 因為 4xx 代表伺服器正在維修中,需要等待恢復
  • B. 因為 4xx 代表網路連線問題,重試可能導致封包重複
  • C. 因為 4xx 代表客戶端的請求有問題,用同樣的請求重試結果不會改變
  • D. 因為 4xx 代表 DNS 解析失敗,需要先清除 DNS 快取

**系列**:系統設計 20 概念(第 1 篇,共 5 篇)
**難度**:L2-進階
**前置知識**:無(從零開始)
**參考來源**:20 System Design Concepts Explained in 10 Minutes — NeetCode (YouTube)


一句話說明

網路通訊的四根支柱:IP 告訴你「找誰」、TCP 確保「送到」、DNS 幫你「查號碼」、HTTP 規定「怎麼對話」。


為什麼 Vibe Coder 需要懂這些?

你用 AI 生成了一個後端 API,部署到雲端後收到 502 Bad Gateway。你問 AI「怎麼修?」AI 回你一串包含 DNS、TCP timeout、HTTP status code 的解釋。

如果你不知道這些概念,AI 的回答跟天書沒兩樣。

這四個概念是所有網路應用的地基。不管你是用 AI 寫 API、架網站、還是設計系統,它們每天都在背後運作。搞懂它們,你才能:

  • 看懂 AI 幫你寫的網路相關程式碼
  • 讀懂錯誤訊息,知道問題出在哪一層
  • 在系統設計面試中,用正確的詞彙描述架構

1. IP Address — 網路上的門牌號碼

比喻

想像整個網際網路是一座超大城市。每棟建築(每台設備)都需要一個門牌號碼,別人才知道怎麼找到你。這個門牌號碼就是 IP Address。

核心概念

IP Address(Internet Protocol Address)是網路上每台設備的唯一識別碼。你的手機有一個、你家的路由器有一個、Google 的伺服器也有一個。

IPv4 vs IPv6:一句話區分

IPv4 IPv6
長相 192.168.1.1 2001:0db8:85a3::8a2e:0370:7334
格式 4 組數字,每組 0-255 8 組十六進位,用冒號分隔
數量 約 43 億個 幾乎無限(3.4 x 10^38)
現狀 快用完了,但還是主流 逐步普及中

白話翻譯:IPv4 是舊版門牌系統,號碼快發完了;IPv6 是新版,號碼多到用不完。目前大部分地方還在用舊版。

你會在哪裡遇到它

# 查看自己的 IP
curl ifconfig.me
# 可能回傳:203.45.67.89

# ping 一個網站,看它的 IP
ping google.com
# PING google.com (142.250.185.206)
Code language: CSS (css)
# AI 幫你寫的 Flask 應用可能包含這行
app.run(host="0.0.0.0", port=5000)
# ↑ 0.0.0.0 表示「監聽所有 IP 位址」,讓外部也能連進來
# 如果寫 127.0.0.1 就只有本機能存取
Code language: PHP (php)

必看懂 vs 知道就好

必看懂

  • 127.0.0.1localhost — 指的是「這台電腦自己」
  • 0.0.0.0 — 監聽所有網路介面
  • IP 是一串數字,人類記不住,所以需要 DNS(下面會講)

知道就好

  • 子網路遮罩(Subnet Mask)
  • NAT(Network Address Translation)
  • 公有 IP vs 私有 IP 的細節

2. TCP/IP — 確保包裹完整送達的快遞系統

比喻

你在網路上傳一張照片,這張照片會被切成很多小包裹(packet)分別寄出。TCP 就像一個超級負責的快遞員:他會確認每個包裹都送到了,順序也沒亂,少了任何一個都會重寄。

核心概念

TCP(Transmission Control Protocol)是一種傳輸協定,它搭配 IP 一起工作:

  • IP 負責定址:知道要送去哪裡
  • TCP 負責可靠傳輸:確保資料完整、按順序到達

兩個合在一起就是 TCP/IP,它是網際網路通訊的基礎。

三次握手:建立連線的暗號

TCP 在正式傳資料之前,客戶端和伺服器要先「交換暗號」確認雙方都在線。這個過程叫 Three-Way Handshake(三次握手)

客戶端                          伺服器
   |                               |
   |--- SYN(嘿,我想連線)------->|   第 1 次
   |                               |
   |<-- SYN-ACK(好,我也準備好了)-|   第 2 次
   |                               |
   |--- ACK(收到,開始傳吧!)---->|   第 3 次
   |                               |
   |====== 開始傳輸資料 ===========|
Code language: HTML, XML (xml)

白話翻譯

  1. 客戶端說:「嘿,你在嗎?我想跟你講話。」(SYN)
  2. 伺服器說:「在啊,我也準備好了。」(SYN-ACK)
  3. 客戶端說:「好,那我們開始吧!」(ACK)

三次握手之後,連線才正式建立,資料才開始傳送。

TCP vs UDP:快遞 vs 廣播

TCP UDP
可靠性 保證送達,遺失會重傳 不保證,丟了就丟了
速度 較慢(要確認每個包裹) 較快(丟出去就不管了)
適用場景 網頁瀏覽、檔案傳輸、API 呼叫 直播串流、線上遊戲、DNS 查詢
比喻 掛號信(有簽收回條) 傳單(塞進信箱就走)

你會在哪裡遇到它

# AI 幫你寫的 WebSocket 連線
import websockets

async def connect():
    async with websockets.connect("ws://localhost:8765") as ws:
        await ws.send("Hello")
# ↑ WebSocket 底層用的是 TCP,所以連線是可靠的
Code language: PHP (php)
# 檢查某個 port 有沒有在監聯
netstat -tlnp | grep 8080
# t = TCP, l = listening, n = 用數字顯示, p = 顯示程序
Code language: PHP (php)

必看懂 vs 知道就好

必看懂

  • TCP = 可靠但較慢,UDP = 快但不保證送達
  • 三次握手的概念(面試常考)
  • Port(連接埠):IP 是門牌,Port 是房間號。一台電腦可以同時跑多個服務,靠 Port 區分

知道就好

  • TCP 的流量控制(Flow Control)
  • 壅塞控制(Congestion Control)
  • 封包的詳細結構

3. DNS — 網際網路的電話簿

比喻

你想打電話給朋友,但你只記得他的名字,不記得電話號碼。怎麼辦?翻電話簿。DNS 就是網際網路的電話簿:你輸入 google.com(名字),它幫你找到 142.250.185.206(電話號碼/IP)。

核心概念

DNS(Domain Name System)負責把人類看得懂的域名轉換成電腦看得懂的 IP 位址

為什麼需要它?因為人類記不住 142.250.185.206,但記得住 google.com

DNS 查詢流程:一步步找到電話號碼

當你在瀏覽器輸入 www.example.com 時,背後發生了這些事:

你的瀏覽器
   |
   |  1. 先查本機快取(之前查過嗎?)
   |     → 沒有
   |
   |  2. 問本地 DNS 伺服器(通常是你的 ISP)
   |     → 不知道
   |
   |  3. 問根域名伺服器(Root Server)
   |     → 「.com 的事去問 .com 伺服器」
   |
   |  4. 問 .com 頂級域名伺服器(TLD Server)
   |     → 「example.com 的事去問它的授權伺服器」
   |
   |  5. 問 example.com 的授權伺服器(Authoritative Server)
   |     → 「www.example.com 的 IP 是 93.184.216.34」
   |
   |  6. 拿到 IP,建立連線!
   ↓

白話翻譯:就像問路一樣,一個人指一個,最後總會找到目的地。而且找到之後會記住(快取),下次就不用再問了。

你會在哪裡遇到它

# 手動查 DNS(看某個域名對應的 IPnslookup google.com
# 或
dig google.com

# 回傳類似:
# google.com.    300    IN    A    142.250.185.206
# ↑ 域名         ↑ TTL(快取秒數)   ↑ IP 位址
Code language: CSS (css)
# 本機 DNS 設定檔(有時需要手動指定 DNS)
# /etc/hosts 檔案可以手動對應域名和 IP
127.0.0.1    localhost
192.168.1.100    my-local-server
# ↑ 這就是最簡易的「本機 DNS」
Code language: PHP (php)

DNS 常見紀錄類型

紀錄類型 用途 範例
A 域名 → IPv4 example.com → 93.184.216.34
AAAA 域名 → IPv6 example.com → 2606:2800:...
CNAME 域名 → 另一個域名(別名) www.example.com → example.com
MX 郵件伺服器指向 example.com → mail.example.com

必看懂 vs 知道就好

必看懂

  • DNS 是域名到 IP 的翻譯服務
  • DNS 查詢有快取機制,不是每次都重新查
  • nslookupdig 可以手動查 DNS

知道就好

  • DNS 的階層式架構細節
  • DNSSEC(DNS 安全擴充)
  • DNS over HTTPS (DoH)

4. HTTP — 客戶端和伺服器的對話規則

比喻

你去餐廳吃飯。你(客戶端)跟服務生(伺服器)之間有一套溝通規則:你看菜單點餐(請求),服務生上菜(回應)。HTTP 就是網路世界裡,客戶端和伺服器之間的點餐規則

核心概念

HTTP(HyperText Transfer Protocol)定義了客戶端與伺服器之間怎麼交換資料。整個過程就是:

客戶端(瀏覽器/App)                    伺服器
       |                                  |
       |--- HTTP 請求(我要什麼)-------->|
       |                                  |
       |<-- HTTP 回應(給你東西 + 狀態)--|
       |                                  |

每次你在瀏覽器開啟一個網頁,背後就是一次(或多次)HTTP 請求和回應。

HTTP 請求方法:四種基本動作

方法 用途 餐廳比喻
GET 讀取資料 「請給我菜單」
POST 新增資料 「我要點一份牛排」
PUT 更新(覆蓋)資料 「把我的牛排換成雞排」
DELETE 刪除資料 「取消那份雞排」

一個 HTTP 請求長什麼樣

GET /api/users/42 HTTP/1.1
Host: example.com
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUz...
Code language: HTTP (http)

逐行翻譯

GET /api/users/42 HTTP/1.1       # 用 GET 方法,要 /api/users/42 這個資源
Host: example.com                # 對象伺服器是 example.com
Accept: application/json         # 我想收到 JSON 格式的回應
Authorization: Bearer eyJ...     # 這是我的身份證明(token)
Code language: PHP (php)

HTTP 狀態碼:伺服器的回話

伺服器回應時會附帶一個三位數的狀態碼,告訴你結果如何:

範圍 意思 常見代碼 白話翻譯
2xx 成功 200 OK 「沒問題,給你」
201 Created 「已幫你建立好了」
204 No Content 「做好了,但沒東西要給你」
3xx 重新導向 301 Moved Permanently 「搬家了,去新地址找」
304 Not Modified 「跟上次一樣,用快取就好」
4xx 客戶端錯誤 400 Bad Request 「你的請求我看不懂」
401 Unauthorized 「你誰?先登入」
403 Forbidden 「我知道你是誰,但你沒權限」
404 Not Found 「查無此人/頁面」
429 Too Many Requests 「你問太快了,慢一點」
5xx 伺服器錯誤 500 Internal Server Error 「我自己壞了」
502 Bad Gateway 「我後面的伺服器壞了」
503 Service Unavailable 「我在維修中」

你會在哪裡遇到它

# AI 幫你寫的 FastAPI 路由
@app.get("/users/{user_id}")          # GET 方法,讀取使用者資料
async def get_user(user_id: int):
    user = await db.get(user_id)
    if not user:
        raise HTTPException(status_code=404)  # 找不到就回 404
    return user                               # 找到就回 200 + 資料

@app.post("/users/")                  # POST 方法,新增使用者
async def create_user(user: UserCreate):
    new_user = await db.create(user)
    return new_user                           # 回 201 Created
Code language: PHP (php)
// AI 幫你寫的前端 fetch 請求
const response = await fetch("/api/users/42", {
  method: "GET",                    // 讀取資料
  headers: {
    "Content-Type": "application/json",  // 告訴伺服器我送的是 JSON
    "Authorization": "Bearer xxx"        // 帶上身份驗證
  }
});

if (response.ok) {                  // status 200-299 都算 ok
  const data = await response.json();
} else if (response.status === 404) {
  console.log("找不到使用者");       // 404 = 不存在
}
Code language: JavaScript (javascript)

HTTP vs HTTPS

HTTPS 就是 HTTP + 加密(TLS/SSL)。想像你在餐廳點餐時,用密語跟服務生溝通,旁邊的人聽不懂。

現在幾乎所有網站都應該用 HTTPS。如果你看到瀏覽器網址列有鎖頭標示,就是 HTTPS。

必看懂 vs 知道就好

必看懂

  • GET 讀取、POST 新增、PUT 更新、DELETE 刪除
  • 狀態碼的大類:2xx 成功、4xx 你的錯、5xx 伺服器的錯
  • 請求 = 方法 + 路徑 + 標頭 + 內容

知道就好

  • HTTP/2 與 HTTP/3 的差異
  • CORS(跨來源資源共用)的細節
  • Content Negotiation

全局流程:從輸入網址到看到網頁

現在把四個概念串在一起。當你在瀏覽器輸入 https://www.example.com/about 時:

1. DNS 解析
   瀏覽器問 DNS:「www.example.com 的 IP 是多少?」
   DNS 回答:「93.184.216.34」

2. TCP 連線
   瀏覽器對 93.184.216.34 的 443 Port 發起三次握手
   (443 是 HTTPS 的預設 Port)

3. TLS 加密握手
   雙方交換加密金鑰,建立安全通道

4. HTTP 請求
   瀏覽器送出:GET /about HTTP/1.1

5. HTTP 回應
   伺服器回傳:200 OK + 網頁的 HTML 內容

6. 瀏覽器渲染網頁
   你看到了頁面!

這整個過程通常在幾百毫秒內完成。


系統設計面試為什麼考這些?

在系統設計面試中,面試官不會直接問你「TCP 三次握手是什麼」,但他們期望你在討論架構時自然地使用這些概念

  • 討論「為什麼 API 回應慢」時 → 你要知道每次請求都有 DNS 查詢 + TCP 握手的開銷
  • 設計「即時聊天系統」時 → 你要知道 WebSocket 基於 TCP,而非 HTTP 的請求/回應模式
  • 討論「CDN 怎麼加速」時 → 你要知道 DNS 可以把使用者導向最近的伺服器
  • 處理「錯誤重試機制」時 → 你要知道 5xx 才需要重試,4xx 重試也沒用

Vibe Coder 檢查點

當你看到 AI 幫你寫的網路相關程式碼時,確認以下幾點:

  • [ ] host="0.0.0.0" vs host="127.0.0.1" — 是要對外開放還是只限本機?
  • [ ] Port 號有沒有跟其他服務衝突?(常見:80/HTTP、443/HTTPS、3000/React、5432/PostgreSQL、8080/API)
  • [ ] HTTP 方法有沒有用對?讀取用 GET,新增用 POST,別搞混
  • [ ] 錯誤處理有沒有區分 4xx 和 5xx?該重試的重試,不該重試的顯示錯誤訊息
  • [ ] API 是用 HTTP 還是 HTTPS?生產環境一定要 HTTPS

本篇重點回顧

概念 一句話解釋 記憶關鍵字
IP Address 網路上的門牌號碼 IPv4 快用完,IPv6 接班中
TCP/IP 確保資料完整送達的快遞系統 三次握手、可靠傳輸
DNS 把域名翻譯成 IP 的電話簿 域名 → IP,有快取
HTTP 客戶端和伺服器的對話規則 GET/POST/PUT/DELETE、狀態碼

下一篇預告

【系統設計 20 概念】#02 將繼續探索更多系統設計的核心概念。有了網路基礎的地基,我們才能往上蓋更複雜的架構。

進階測驗:網路基礎 — IP Address、TCP/IP、DNS、HTTP

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你部署了一個 API 服務,但外部使用者無法存取 情境題

你用 AI 生成了一個 Flask API 並部署到雲端伺服器。在伺服器上用 curl localhost:5000 可以正常存取,但從你的筆電連到伺服器的公開 IP 時卻連不上。你檢查了防火牆,確認 port 5000 已開放。

AI 幫你生成的啟動程式碼如下:

app.run(host=”127.0.0.1″, port=5000)

最可能的原因與修正方式是什麼?

  • A. Port 5000 被其他服務占用,改用 port 8080
  • B. host="127.0.0.1" 只監聽本機,改為 host="0.0.0.0" 以接受外部連線
  • C. Flask 不支援遠端連線,需要改用 FastAPI
  • D. 需要先設定 DNS 紀錄將域名指向伺服器 IP

2. 你正在設計一個即時多人遊戲的通訊架構 情境題

你的遊戲需要每秒傳送玩家的位置資訊給其他玩家。偶爾丟失一兩個位置封包是可以接受的(下一個封包馬上就會更新),但延遲必須盡可能低。同時,遊戲內的購買交易必須確保資料完整送達,不能遺失。

關於通訊協定的選擇,以下哪個方案最合適?

  • A. 全部使用 TCP,因為要保證所有資料都送達
  • B. 全部使用 UDP,因為遊戲需要低延遲
  • C. 位置資訊用 UDP(低延遲、丟了沒關係),購買交易用 TCP(必須完整送達)
  • D. 位置資訊用 TCP,購買交易用 UDP,因為交易資料量小、速度快

3. API 回應慢,你需要判斷瓶頸在哪一層 情境題

你的前端應用呼叫後端 API 時,第一次請求需要 3 秒才收到回應,但之後的請求只需要 200 毫秒。你懷疑是 DNS 或 TCP 連線建立的開銷。

根據文章中描述的完整請求流程,以下哪個分析最準確?

  • A. 是 HTTP 方法選錯了,GET 比 POST 慢,應該全部改用 POST
  • B. 第一次請求需要 DNS 解析 + TCP 三次握手 + TLS 握手,後續請求可以使用快取和持續連線,所以快很多
  • C. 是伺服器第一次啟動較慢,跟 DNS 和 TCP 無關
  • D. 是 IPv4 的問題,改用 IPv6 可以解決第一次請求慢的狀況

4. 前端收到 403 Forbidden,但開發者認為是未登入的問題 錯誤診斷

小明的前端應用在呼叫 API 時收到 403 Forbidden。他認為是 token 過期導致未登入,所以他在錯誤處理中把 403 當成「需要重新登入」來處理:
if (response.status === 403) { // 重新導向到登入頁面 window.location.href = “/login”; }

這個錯誤處理有什麼問題?

  • A. 應該用 response.ok 來判斷,不該直接檢查 status 數字
  • B. 403 是伺服器錯誤,應該顯示「伺服器維修中」的提示
  • C. 403 表示「伺服器知道你是誰,但你沒有權限」,不是未登入。未登入應該是 401。重新登入不會解決權限不足的問題
  • D. 403 和 401 是一樣的意思,這個處理方式沒有問題

5. API 使用了錯誤的 HTTP 方法 錯誤診斷

AI 幫小華生成了以下 API 路由來刪除使用者。前端呼叫後,使用者確實被刪除了,但小華的同事在程式碼審查時指出有問題:
@app.post(“/users/{user_id}/delete”) async def delete_user(user_id: int): await db.delete(user_id) return {“message”: “deleted”}

這段程式碼的問題是什麼?最佳修正方式為何?

  • A. 應該使用 GET 方法,因為刪除只是一個查詢動作
  • B. 應該使用 DELETE 方法搭配路徑 /users/{user_id},而非用 POST + 路徑中寫 delete
  • C. 應該使用 PUT 方法,因為刪除是一種「更新狀態」
  • D. 程式碼沒有問題,POST 可以用於所有操作

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *