Chapter 01

從網路分層開始理解 Web server

當你在瀏覽器輸入網址時,畫面上只看到一個網頁,但背後其實是一條經過 網路位址、連線埠、傳輸協定與應用層服務 的完整路徑。 本章的任務,就是把這條路徑中的底層角色先認清楚。

Why:為什麼要先學 TCP/IP?

很多人一開始學網頁會直接從 HTML 或 JavaScript 開始,但一旦碰到「為什麼 localhost 可以打開?」 「為什麼要用 80、443、3000、8000 這些 port?」就會開始混亂。原因是頁面只是 Web 技術最上層的呈現, 真正讓資料流動的底層,是整套 TCP/IP 協定族。

一句話先記住: Web server 是「應用層服務」,但它一定要依賴下層的 IP、Port、TCP 連線,才能和瀏覽器交換資料。

What:TCP/IP 分層與 Web 服務的位置

層級 主要工作 常見協定 / 技術 與 Web 的關係
Application Layer 處理應用程式的資料格式與服務邏輯 HTTP、HTTPS、DNS、SMTP Web server 就在這一層提供服務
Transport Layer 端到端傳輸、排序、重送、連線控制 TCP、UDP HTTP/1.1 與 HTTP/2 通常建立在 TCP 之上
Internet Layer 位址與封包路由 IP、ICMP 負責讓資料包知道要送去哪一台主機
Link / Hardware Layer 實體媒介、網卡、區域網路傳輸 Ethernet、Wi-Fi、MAC 負責資料在實際硬體上的移動
flowchart TB A[Browser / Client] --> B[HTTP Request] B --> C[TCP Connection] C --> D[IP Routing] D --> E[Web Server Process] E --> F[HTTP Response] F --> A

核心概念:IP、Port、Socket、Daemon

IP

主機在網路上的位址。它回答的是「要把封包送到哪一台電腦」。

Port

同一台電腦中的「服務入口」。它回答的是「資料進來後要交給哪個程式」。

Socket

把 IP 與 Port 綁在一起後,用來建立網路通訊端點的介面。

Daemon

在背景持續執行、等待請求的服務程式,例如 Nginx、Apache、資料庫服務。

Client

主動發出要求的一方,最常見的例子就是瀏覽器。

Server

被動等待連線、接到要求後回應的一方,也就是 Web server。

How:Client-Server 架構如何運作?

Client-Server 架構的核心很簡單:Client 主動請求,Server 被動等待並回應。 但實際上,這個「請求」會先經過 DNS 找到主機、經過 TCP 建立連線,最後才輪到 HTTP 傳送資料。

sequenceDiagram participant Client as Browser Client participant Server as Web Server Client->>Server: 連到 203.0.113.10:80 Server-->>Client: 接受 TCP 連線 Client->>Server: 傳送 HTTP Request Server-->>Client: 回傳 HTTP Response Client->>Client: 解析 HTML / CSS / JS
關鍵觀念: Web server 不是「把頁面存在某個神祕地方」就好,而是必須在一個可被連線的 IP / Port 上持續等待, 並且能理解收到的協定格式。

Example:最小 Socket Server 例子

Python Socket 伺服器

這個範例不是完整 Web server,但能幫你看到「程式綁定 IP / Port 並等待連線」的本質。

import socket

server = socket.socket()
server.bind(("127.0.0.1", 9000))
server.listen(1)

print("Server is listening on 127.0.0.1:9000")

client, address = server.accept()
print("Connected by", address)

client.sendall(b"hello from socket server")
client.close()
server.close()
$ python socket_demo.py Server is listening on 127.0.0.1:9000 Connected by ('127.0.0.1', 53410)
  • bind() 把程式綁到某個 IP 與 Port。
  • listen() 讓伺服器進入等待連線的狀態。
  • accept() 表示真的有 client 連進來了。
  • Web server 也是類似的概念,只是它懂得處理 HTTP,而不是只送出簡單字串。

Practice:練習與思考

練習 1

請說明網址 http://127.0.0.1:8000/index.html 中,IP、Port、Path 分別是什麼。

練習 2

如果同一台主機上有兩個服務都想用 8000 port,會發生什麼事?為什麼?

Troubleshooting:常見迷思

迷思 正確理解
有網頁就代表有 HTML 檔案 不一定,伺服器也可能即時產生內容,回傳動態頁面或 API 資料。
IP 就等於網站名稱 網站名稱通常是網域,仍需要 DNS 轉成 IP 才能連線。
Port 是檔案夾 Port 是服務的入口,不是檔案位置。

Summary:本章結論

  • Web server 位於應用層,但一定依賴底層 IP、Port 與 TCP 連線。
  • IP 負責找到主機,Port 負責找到服務,Socket 則是建立通訊端點。
  • Daemon 是背景等待請求的服務程式,Client-Server 則是最基本的互動架構。
下一章會接著回答:從瀏覽器輸入網址到看到畫面,中間到底發生了什麼?