【系統設計 30 概念】#01 網路基礎 — 從 Client-Server 到 HTTP

測驗:網路基礎 — 從 Client-Server 到 HTTP

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

1. 在 Client-Server 架構中,下列哪個說法是正確的?

  • A. Client 只能是瀏覽器,不能是手機 App
  • B. 一台電腦只能扮演 Client 或 Server 其中一種角色
  • C. 一台電腦可以同時是 Client 也是 Server,取決於它在跟誰溝通
  • D. Server 主動發送資料給 Client,Client 被動接收

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

  • A. 加密使用者的網路連線,防止資料被竊聽
  • B. 將人類可讀的域名(如 google.com)翻譯成電腦用的 IP 位址
  • C. 把使用者的請求分散到多台伺服器上
  • D. 隱藏使用者的真實 IP 位址以保護隱私

3. Proxy(正向代理)和 Reverse Proxy(反向代理)的關鍵差異是什麼?

  • A. Proxy 用來加速網頁載入,Reverse Proxy 用來加密連線
  • B. Proxy 架設在伺服器端,Reverse Proxy 架設在使用者端
  • C. Proxy 處理 HTTPS 請求,Reverse Proxy 處理 HTTP 請求
  • D. Proxy 隱藏使用者的身份保護 Client,Reverse Proxy 隱藏伺服器的身份保護 Server

4. 當你在開發時看到 Server running on http://127.0.0.1:3000,這代表什麼?

  • A. 伺服器在你自己的電腦上跑起來了,在 port 3000 監聽
  • B. 伺服器部署在遠端 IP 127.0.0.1 的機器上
  • C. 伺服器正在等待 DNS 解析完成
  • D. 伺服器已經公開上線,全世界都能透過這個地址訪問

5. 關於 HTTP 狀態碼,下列哪個配對是正確的?

  • A. 401 表示伺服器內部錯誤,500 表示沒有登入
  • B. 200 表示資料已建立,201 表示請求成功
  • C. 4xx 系列表示 Client 端的問題,5xx 系列表示 Server 端的問題
  • D. 404 表示沒有權限訪問,403 表示找不到資源

系統設計聽起來很嚇人,但其實就是理解「東西怎麼連在一起的」。
這篇從最基礎的 6 個概念開始,讓你看懂任何系統架構圖的第一層。

這篇文章教什麼?

當你看到系統架構圖,上面畫著瀏覽器、伺服器、箭頭、各種方塊——你是不是常常不知道它們到底在幹嘛?

讀完這篇,你會看懂:

  • 瀏覽器和伺服器之間怎麼溝通
  • 為什麼輸入網址就能連到正確的網站
  • 架構圖上的 Proxy 和 Reverse Proxy 分別在保護誰
  • 為什麼有些網站比較快、有些比較慢

這 6 個概念是所有系統設計的地基,後面的 Load Balancer、CDN、資料庫設計全部建立在這些基礎之上。


概念 1:Client-Server Architecture

一句話說明

所有 Web 應用的基本運作模式:一邊發請求,一邊給回應。

最小範例

你(Client)                    餐廳(Server)
    |                               |
    |------- 「我要一份牛排」------->|
    |                               |  (處理訂單、烹飪)
    |<------ 「這是你的牛排」--------|
    |                               |

翻譯:Client 就是「要東西的那一方」,Server 就是「給東西的那一方」。

你會在哪裡遇到

  • 瀏覽器就是 Client,你訪問的網站伺服器就是 Server
  • 手機 App 是 Client,後端 API 是 Server
  • 你用 AI 工具時,你的介面是 Client,AI 模型的伺服器是 Server

看懂架構圖

當你在架構圖上看到這樣的東西:

[Browser] ---HTTP Request---> [Web Server]
[Browser] <--HTTP Response--- [Web Server]
Code language: CSS (css)

翻譯:瀏覽器發送一個 HTTP 請求給伺服器,伺服器處理完後把結果送回來。就這樣,沒有更複雜的了。

重點提醒

一台電腦可以同時是 Client 也是 Server。例如你的後端伺服器,對瀏覽器來說它是 Server,但當它去跟資料庫要資料時,它又變成了 Client。

[瀏覽器]  --請求-->  [後端伺服器]  --請求-->  [資料庫]
 Client              Server/Client            Server

概念 2:IP Address

一句話說明

網路上每台電腦的唯一地址,就像每棟房子的門牌號碼。

最小範例

142.250.185.206    ← 這是 GoogleIP 地址
192.168.1.1        ← 這通常是你家路由器的 IP
127.0.0.1          ← 這永遠是指「你自己的電腦」(localhostCode language: CSS (css)

為什麼要知道這個

當你在開發時看到這些東西,不要慌:

你會看到的 意思
localhost 你自己的電腦
127.0.0.1 同上,就是 localhost
0.0.0.0 「所有網路介面都接受」,通常在啟動伺服器時用
192.168.x.x 內網 IP,只有同一個區域網路的人看得到
其他 IP 外網 IP,全世界都能連到(如果有開放的話)

看懂架構圖

[Client: 203.1.2.3] -----> [Server: 142.250.185.206]
Code language: CSS (css)

翻譯:IP 位址 203.1.2.3 的電腦,正在連線到 IP 位址 142.250.185.206 的伺服器。

Vibe Coder 日常

當你跑 npm run devpython -m uvicorn main:app 看到:

Server running on http://127.0.0.1:3000
Code language: JavaScript (javascript)

這表示:你的伺服器在你自己的電腦上跑起來了,在 port 3000 上監聽。只有你自己能訪問。


概念 3:DNS(Domain Name System)

一句話說明

把人類看得懂的網址,翻譯成電腦看得懂的 IP 位址。

最小範例

你輸入:google.com
DNS 翻譯:google.com → 142.250.185.206
瀏覽器實際連線到:142.250.185.206
Code language: CSS (css)

類比:DNS 就像手機的通訊錄。你不需要記住朋友的電話號碼(IP),只要記住名字(域名),通訊錄(DNS)會幫你查到號碼。

完整流程

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

1. 瀏覽器:「www.example.comIP 是什麼?」
     ↓
2. 先查本機快取(之前查過嗎?)
     ↓ 沒有
3. 問 DNS 伺服器
     ↓
4. DNS 回答:「93.184.216.34」
     ↓
5. 瀏覽器用 93.184.216.34 連線到伺服器
     ↓
6. 伺服器回傳網頁內容
Code language: CSS (css)

為什麼要知道這個

  1. 部署網站時:你需要設定 DNS,把你的域名指向伺服器的 IP
  2. 出問題時:「DNS 還沒生效」是很常見的問題,因為 DNS 記錄更新需要時間(幾分鐘到 48 小時)
  3. 看架構圖時:DNS 通常是請求到達伺服器之前的第一步

看懂架構圖

[使用者] --google.com--> [DNS] --142.250.185.206--> [Google Server]
Code language: CSS (css)

翻譯:使用者輸入 google.com,DNS 查到對應的 IP,然後瀏覽器就用這個 IP 去連 Google 的伺服器。


概念 4:Proxy 與 Reverse Proxy

一句話說明

Proxy 藏住「誰在問」,Reverse Proxy 藏住「誰在答」。

最小範例:Proxy(正向代理)

                    Proxy
[你的電腦] ----> [代理伺服器] ----> [目標網站]
                     ↑
              目標網站只看到
              代理伺服器的 IP,
              不知道是你在訪問
Code language: CSS (css)

類比:像是請朋友幫你去買東西。店家只看到你朋友,不知道東西是你要的。

用途

  • 繞過網路限制(VPN 就是一種 Proxy)
  • 隱藏你的真實 IP
  • 公司監控員工上了哪些網站

最小範例:Reverse Proxy(反向代理)

                          Reverse Proxy
[使用者] ----> [反向代理伺服器] ----> [實際的後端伺服器 A]
                    |           ----> [實際的後端伺服器 B]
                    |           ----> [實際的後端伺服器 C]
                    ↑
              使用者只看到
              反向代理的 IP,
              不知道後面有幾台伺服器
Code language: JavaScript (javascript)

類比:像是飯店的前台。你不會直接進廚房找廚師,而是告訴前台你要什麼,前台決定交給哪個廚師處理。

用途

  • 保護後端:外部使用者不知道後端伺服器的真實 IP
  • 負載均衡:把請求分散到多台伺服器
  • SSL 終止:統一處理 HTTPS 加密
  • 快取:存放常用的回應,加速訪問

一張表搞懂差異

Proxy(正向代理) Reverse Proxy(反向代理)
保護誰 Client(使用者) Server(後端伺服器)
藏住誰 使用者的身份 伺服器的身份
誰知道它的存在 Client 知道(主動設定) Client 不知道(透明的)
常見例子 VPN、公司網路代理 Nginx、Cloudflare、AWS ALB

看懂架構圖

當你在架構圖上看到 Nginx 或 Cloudflare 出現在使用者和後端之間,那就是 Reverse Proxy:

[使用者][Cloudflare / Nginx][你的 API Server]
Code language: CSS (css)

翻譯:使用者的請求先經過 Nginx(反向代理),Nginx 再轉發給實際的後端伺服器。


概念 5:Latency(延遲)

一句話說明

資料從 A 到 B 再回來所花的時間。越短越好。

最小範例

你(台北)---請求---> 伺服器(東京)
           50ms
你(台北)<--回應--- 伺服器(東京)
           50ms

總延遲(Round-trip):約 100ms
你(台北)---請求---> 伺服器(美國東岸)
           150ms
你(台北)<--回應--- 伺服器(美國東岸)
           150ms

總延遲(Round-trip):約 300ms

延遲的主要來源

來源 說明 大概的時間
物理距離 光速也需要時間,越遠越慢 跨洲 100-300ms
網路跳轉 資料經過多少個路由器 每跳 1-10ms
伺服器處理 伺服器計算回應需要時間 看複雜度,1ms-數秒
資料大小 傳輸的資料越大越久 看頻寬

為什麼要知道這個

  1. 選伺服器位置:如果你的使用者在台灣,伺服器放東京比放美國快很多
  2. 理解 CDN:CDN 就是把內容複製到全球各地的伺服器,讓使用者連到最近的那台,降低延遲
  3. 效能問題:使用者抱怨「網站好慢」,延遲是第一個要檢查的因素

看懂架構圖

[台灣使用者] --30ms--> [CDN 節點:東京] --已快取--> 直接回應
[台灣使用者] --30ms--> [CDN 節點:東京] --沒快取--> [原始伺服器:美國] --150ms-->
Code language: CSS (css)

翻譯:CDN 在東京有一份快取,台灣使用者只需要 30ms 就能拿到內容。如果東京沒有快取,才需要再花 150ms 去美國的原始伺服器拿。


概念 6:HTTP / HTTPS

一句話說明

Client 和 Server 溝通時使用的語言規則(協定)。HTTPS 是加密版本。

最小範例

一個 HTTP 請求長這樣:

GET /api/users HTTP/1.1        ← 方法 + 路徑 + 版本
Host: example.com              ← 要連的伺服器
Authorization: Bearer xxx      ← 身份驗證(如果需要的話)

伺服器的回應:

HTTP/1.1 200 OK                ← 狀態碼:200 表示成功
Content-Type: application/json ← 回應的資料格式

{"users": [...]}               ← 實際的資料
Code language: HTTP (http)

必看懂:HTTP 方法

你會在 API 和程式碼中不斷看到這些:

方法 做什麼 類比
GET 拿資料 「給我看菜單」
POST 建立新資料 「我要點一份新餐」
PUT 整個替換資料 「把我的餐改成全新的」
PATCH 部分更新資料 「飲料換成可樂就好」
DELETE 刪除資料 「取消這份訂單」

必看懂:HTTP 狀態碼

伺服器回應時會帶一個數字,告訴你結果如何:

狀態碼 意思 你的反應
200 成功 一切正常
201 已建立 POST 成功,新資料建好了
301 永久轉移 網址搬家了
400 你的請求有問題 檢查你送出的資料
401 沒有登入 要先登入/帶 token
403 沒有權限 你登入了但沒資格做這事
404 找不到 網址打錯了,或資源不存在
500 伺服器壞了 不是你的問題,是伺服器出錯

快速記法

  • 2xx:成功
  • 3xx:轉址
  • 4xx:你的問題(Client 端錯誤)
  • 5xx:伺服器的問題

HTTP vs HTTPS

HTTP:
[你] ----「密碼是 1234」----> [伺服器]
          ↑ 任何人都能偷看

HTTPS:
[你] ----「@#$%^&*」-------> [伺服器]
          ↑ 加密過,偷看也看不懂
         (SSL/TLS 加密)
Code language: CSS (css)
HTTP HTTPS
加密 沒有 有(SSL/TLS)
安全性 資料裸奔 資料加密傳輸
網址 http:// https://
現在的狀況 幾乎不用了 標準配備

重點:現在幾乎所有網站都用 HTTPS。如果你看到瀏覽器顯示「不安全」,那就是因為該網站還在用 HTTP。


6 個概念串在一起

現在讓我們看看,當你打開瀏覽器輸入 https://www.google.com 時,這 6 個概念怎麼一起運作:

1. [你的瀏覽器]Client)想訪問 google.com
        ↓
2. [DNS]google.com 翻譯成 142.250.185.206IP Address)
        ↓
3. 瀏覽器用 HTTPSHTTP + 加密)發送請求
        ↓
4. 請求可能經過 [Reverse Proxy]Google 的負載均衡器)
        ↓
5. Reverse Proxy 把請求轉給某一台 [Server]
        ↓
6. 整個過程的來回時間就是 [Latency]
        ↓
7. Server 處理完畢,把網頁內容回傳給瀏覽器(HTTP ResponseCode language: CSS (css)

這就是整個 Web 運作的骨架。之後學到的 Load Balancer、CDN、API Gateway 都是在這個骨架上加東西。


Vibe Coder 檢查點

看到系統架構圖時,確認你能回答這些問題:

  • [ ] 哪個是 Client?哪個是 Server?
  • [ ] 資料走什麼路徑?中間經過哪些節點?
  • [ ] 有沒有 Reverse Proxy?它在做什麼(負載均衡?SSL?快取?)
  • [ ] 伺服器在哪個地理位置?使用者在哪?延遲會是問題嗎?
  • [ ] 用的是 HTTP 還是 HTTPS?資料有加密嗎?

AI 對話速查表

我想了解… 跟 AI 說
某個架構圖的意思 「這張架構圖裡,請求從使用者到伺服器經過哪些步驟?每個元件的角色是什麼?」
DNS 怎麼設定 「我買了一個域名 example.com,伺服器 IP 是 x.x.x.x,幫我設定 DNS」
要不要加 Reverse Proxy 「我的 Node.js API 直接暴露在外面,要不要加一層 Nginx 當 Reverse Proxy?好處是什麼?」
延遲問題 「我的使用者在台灣,伺服器在美國,延遲大概多少?有什麼方法降低?」
HTTPS 設定 「幫我的網站加上 HTTPS,我用的是 Nginx + Let’s Encrypt」

小結

這篇涵蓋的 6 個概念是系統設計的地基:

  1. Client-Server:一邊問、一邊答,所有 Web 應用的基本模式
  2. IP Address:每台電腦在網路上的地址
  3. DNS:把域名翻譯成 IP 的電話簿
  4. Proxy / Reverse Proxy:正向代理保護使用者,反向代理保護伺服器
  5. Latency:資料來回的時間,距離越近越快
  6. HTTP/HTTPS:Client 和 Server 溝通的語言,HTTPS 是加密版

記住:系統設計不是在背名詞,而是理解「資料怎麼從 A 到 B」。掌握這 6 個基礎概念,你就能看懂大部分架構圖的第一層了。

下一篇:我們會進入 API Design、REST、GraphQL,看看 Client 和 Server 之間具體怎麼「說話」。

進階測驗:網路基礎 — 從 Client-Server 到 HTTP

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

1. 你的網站部署在美國伺服器上,但主要使用者都在台灣。使用者反映網站載入很慢。根據你學到的概念,最可能的原因和最優先的改善方向是什麼? 情境題

  • A. 伺服器處理能力不足,應該升級伺服器的 CPU 和記憶體
  • B. 物理距離導致的延遲(Latency),應優先考慮使用 CDN 或將伺服器搬到離使用者更近的地區
  • C. DNS 解析太慢,應該更換 DNS 供應商
  • D. 沒有使用 HTTPS 導致連線被限速,應該加上 SSL 憑證

2. 你的團隊有一個 Node.js API 伺服器直接暴露在公網上。最近遭受了大量惡意請求攻擊。根據文章中的概念,最適合加入哪個元件來改善這個狀況? 情境題

  • A. 加一層 Proxy(正向代理),隱藏伺服器的 IP 位址
  • B. 更改伺服器的 DNS 記錄,讓攻擊者找不到伺服器
  • C. 加一層 Reverse Proxy(如 Nginx 或 Cloudflare),作為進入後端的控制入口,過濾惡意流量
  • D. 把 HTTP 改成 HTTPS,加密後攻擊者就無法發送惡意請求

3. 你買了一個新域名 myapp.com,伺服器 IP 是 45.67.89.10。設定好 DNS 記錄後,你發現在瀏覽器輸入 myapp.com 還是顯示「找不到網站」。等了 30 分鐘後網站就正常了。最合理的解釋是什麼? 情境題

  • A. 伺服器的 IP 位址設定錯誤,30 分鐘後管理員修正了
  • B. HTTPS 憑證需要時間生效,30 分鐘是 SSL 處理時間
  • C. Reverse Proxy 需要時間初始化,30 分鐘後才能正確轉發請求
  • D. DNS 記錄更新需要時間傳播(propagation),之前的快取還是舊資料,等快取過期後就能解析到新的 IP

4. 你的前端應用呼叫後端 API,收到以下回應。根據狀態碼判斷,問題出在哪一方?該怎麼處理? 錯誤診斷

POST /api/orders HTTP/1.1 Host: myshop.com Content-Type: application/json {“product_id”: “abc”, “quantity”: -3} —回應— HTTP/1.1 400 Bad Request {“error”: “quantity must be a positive number”}
  • A. Server 端錯誤,伺服器無法處理 JSON 格式,需要修復後端程式碼
  • B. Client 端錯誤(400),前端送出的資料有問題(quantity 是負數),需要在前端加上輸入驗證
  • C. 權限問題(類似 401),使用者需要先登入才能建立訂單
  • D. 資源不存在(類似 404),product_id “abc” 在資料庫中找不到

5. 你看到以下架構圖,其中有一個設計問題。哪個描述正確指出了問題? 錯誤診斷

[使用者瀏覽器] –HTTP(未加密)–> [Nginx Reverse Proxy] –HTTP–> [API Server] | v [資料庫:存放使用者密碼]
  • A. 使用者到 Nginx 之間使用 HTTP 而非 HTTPS,傳輸的資料(包括密碼)沒有加密,任何人都能在中間攔截偷看
  • B. Nginx 不應該放在使用者和 API Server 之間,這會增加不必要的延遲
  • C. API Server 和資料庫之間缺少 Reverse Proxy,資料庫不夠安全
  • D. 缺少 DNS 設定,使用者無法透過域名訪問這個架構

發佈留言

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