為什麼要知道這些
你的 API 連不到資料庫,錯誤訊息是 Connection refused——這是第幾層的問題?
- 第 3 層(網路層):IP 路由問題,
ping看看 - 第 4 層(傳輸層):TCP 連線失敗,port 沒開?process 沒在聽?
- 第 7 層(應用層):連通了但 SSL 握手失敗?authentication 問題?
有分層概念,就知道往哪個方向 debug。
OSI 7 層 vs TCP/IP 4 層
OSI 7 層(理論模型):
| 層 | 名稱 | 例子 |
|---|---|---|
| 7 | 應用層 | HTTP, FTP, DNS |
| 6 | 表示層 | SSL/TLS, JPEG |
| 5 | 會話層 | 連線管理 |
| 4 | 傳輸層 | TCP, UDP |
| 3 | 網路層 | IP, ICMP |
| 2 | 資料鏈路層 | Ethernet, WiFi |
| 1 | 實體層 | 網路線, 光纖 |
TCP/IP 4 層(實際使用):
| TCP/IP 層 | 對應 OSI | 主要協議 |
|---|---|---|
| 應用層 | 5-7 | HTTP, HTTPS, DNS, SMTP |
| 傳輸層 | 4 | TCP, UDP |
| 網路層 | 3 | IPv4, IPv6 |
| 網路存取層 | 1-2 | Ethernet, WiFi |
TCP 3-way Handshake
TCP 建立連線需要三次握手,確保雙方都能發送和接收:
客戶端 伺服器
│────── SYN ────→ │ (1) 客戶端:我想連
│ ←─── SYN+ACK ──│ (2) 伺服器:好,我收到了,你能收到嗎?
│────── ACK ────→ │ (3) 客戶端:可以,連線建立
│ │
│═══ 資料傳輸 ════│
TIME_WAIT 狀態:連線關閉後的等待期(2 倍 MSL,約 1-4 分鐘)。高並發服務大量短連線時,TIME_WAIT 會佔用 port,需要調整 net.ipv4.tcp_tw_reuse。
Connection Refused vs Timeout:
Connection refused:server 在那個 IP,但沒有 process 在監聽那個 portConnection timeout:SYN 送出去沒有回應——可能是防火牆丟棄了 packet
TCP vs UDP
| TCP | UDP | |
|---|---|---|
| 連線 | 需要建立(3-way handshake) | 無連線 |
| 可靠性 | 保證順序、重傳遺失的 packet | 不保證,可能亂序或遺失 |
| 速度 | 慢(有 overhead) | 快 |
| 用途 | HTTP, 資料庫, 文件傳輸 | 視訊通話, DNS query, 遊戲 |
為什麼 DNS 用 UDP? DNS query 很小(幾十 bytes),一來一往就完成,不需要 TCP 的握手開銷——建立連線比傳輸資料還費事。
Port:讓一台機器跑多個服務
IP 定位到機器,Port 定位到機器上的服務。
0-1023:Well-known ports(HTTP 80, HTTPS 443, SSH 22, PostgreSQL 5432)1024-49151:Registered ports(應用程式常用)49152-65535:Dynamic ports(臨時 port,客戶端連線時使用)
# 查看哪個 port 被誰佔用
lsof -i :5432 # 哪個 process 在用 port 5432
netstat -tlnp # 所有正在監聽的 TCP port
ss -tlnp # 現代替代品(更快)深入的網路運維(負載均衡、CDN、DNS 管理)在 infra/network-edge I01 章節,本篇是讓你讀那個章節之前的基礎概念準備。