測驗:網路基礎 — IP Address、TCP/IP、DNS、HTTP
共 5 題,點選答案後會立即顯示結果
1. DNS 的主要功能是什麼?
2. 在 TCP 三次握手中,三個步驟依序發送的訊息是什麼?
3. 你的 API 回傳 HTTP 狀態碼 401 Unauthorized,這代表什麼?
4. 以下程式碼中,host="0.0.0.0" 和 host="127.0.0.1" 的差別是什麼?
5. 在設計錯誤重試機制時,為什麼收到 HTTP 4xx 狀態碼時不應該重試?
**系列**:系統設計 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.1或localhost— 指的是「這台電腦自己」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)白話翻譯:
- 客戶端說:「嘿,你在嗎?我想跟你講話。」(SYN)
- 伺服器說:「在啊,我也準備好了。」(SYN-ACK)
- 客戶端說:「好,那我們開始吧!」(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(看某個域名對應的 IP)
nslookup 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 查詢有快取機制,不是每次都重新查
nslookup或dig可以手動查 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"vshost="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 服務,但外部使用者無法存取 情境題
curl localhost:5000 可以正常存取,但從你的筆電連到伺服器的公開 IP 時卻連不上。你檢查了防火牆,確認 port 5000 已開放。
AI 幫你生成的啟動程式碼如下:
最可能的原因與修正方式是什麼?
2. 你正在設計一個即時多人遊戲的通訊架構 情境題
關於通訊協定的選擇,以下哪個方案最合適?
3. API 回應慢,你需要判斷瓶頸在哪一層 情境題
根據文章中描述的完整請求流程,以下哪個分析最準確?
4. 前端收到 403 Forbidden,但開發者認為是未登入的問題 錯誤診斷
403 Forbidden。他認為是 token 過期導致未登入,所以他在錯誤處理中把 403 當成「需要重新登入」來處理:
這個錯誤處理有什麼問題?
5. API 使用了錯誤的 HTTP 方法 錯誤診斷
這段程式碼的問題是什麼?最佳修正方式為何?