Learning Objectives
- 說明協定與分層的意義,對照 OSI 七層模型與 TCP/IP 模型
- 描述資料從應用層往下封裝、到對方再一層層解封裝的過程,以及路由器轉送時改了哪些欄位
- 說明埠號的用途,以及 TCP 三向交握、序號與確認號、遺失重傳的運作
- 比較 TCP 與 UDP 的差異與適用情境,認識 IPv4 與 IPv6 位址
這一課要回答的問題
你在手機上傳一則訊息,它會先經過家裡的 Wi-Fi 基地台、路由器、電信業者的光纖,可能還跨過海底電纜,才到達伺服器。 沿路的設備來自不同廠商、用不同的線路,卻都能正確合作;中途有封包遺失,訊息也不會少一個字。
這一課回答:
- 網路上的設備怎麼說「同一種語言」?什麼是協定?
- 為什麼要把網路的工作分層?每一層負責什麼?
- 一份資料送出去之前,被包上了哪些東西?
- TCP 怎麼保證資料完整、順序正確?什麼時候改用 UDP?
協定與分層:OSI 模型與 TCP/IP 模型
協定(protocol)是雙方事先約定好的規則:資料的格式、每個欄位的意思、誰先說話、出錯了怎麼處理。
網路的工作很多,所以拆成好幾層,每一層只負責一件事,只和上下相鄰的層打交道。 就像寄包裹:你只管把東西裝箱、寫上地址;貨運公司決定走哪條路;司機只管開車。換了車種,你寄東西的方式不用改。
兩個常見的分層模型:
| OSI 模型(7 層) | TCP/IP 模型 | 負責的事 | 例子 | 資料單元 |
|---|---|---|---|---|
| 7 應用層、6 展示層、5 會議層 | 應用層 | 提供給程式使用的服務 | HTTP、DNS、SMTP | 資料 |
| 4 傳輸層 | 傳輸層 | 把資料交給對方的哪一個程式(埠號);TCP 確保可靠 | TCP、UDP | 資料段(segment) |
| 3 網路層 | 網路層(網際網路層) | 依 IP 位址跨網路找到對方的主機 | IP | 封包(packet) |
| 2 資料連結層 | 網路存取層 | 在同一段線路上把資料交給下一站(MAC 位址) | 乙太網路、Wi-Fi | 訊框(frame) |
| 1 實體層 | (同上) | 把位元轉成電壓、光或無線電波 | 網路線、光纖 | 位元 |
TCP/IP 模型常把最下面拆成資料連結層與實體層,合起來說「五層」,本課的模擬器就用五層。
歷史:
- OSI 模型由國際標準組織(ISO)在 1984 年發布(ISO 7498),現在主要用來教學與討論,各層的名稱大家都通用。
- 實際在網際網路上運作的是 TCP/IP:IP 的規格是 1981 年 9 月的 RFC 791,TCP 是 1981 年的 RFC 793(2022 年 8 月由 RFC 9293 取代),UDP 是 1980 年 8 月的 RFC 768。
- 1983 年 1 月 1 日,ARPANET 依計畫(RFC 801)停用舊的 NCP 協定、全面改用 TCP/IP,常被視為今天網際網路的重要起點。
RFC(Request for Comments)是網際網路標準的文件系列,每份都有編號,任何人都可以在網路上免費閱讀。
封裝與解封裝
送出資料時,每往下一層,就在前面加上這一層的標頭(header),像把信裝進信封、再放進包裹箱:
應用層 [ HTTP 請求 ]
傳輸層 [TCP][ HTTP 請求 ]
網路層 [IP][TCP][ HTTP 請求 ]
資料連結層 [乙太][IP][TCP][ HTTP 請求 ][FCS]
這個過程叫封裝(encapsulation)。對方收到後從外到內一層一層拆開,叫解封裝:每一層只讀自己那一層的標頭, 再依標頭裡的欄位決定交給上面哪一個協定(IP 標頭的「協定」欄位、TCP 標頭的「目的埠號」)。
中途的路由器只拆到網路層:讀目的 IP、查路由表,再包上新的訊框往下一站送。下面的模擬器裡,每一個位元組都是依標準格式實際組出來的。
埠號:交給哪一個程式
IP 位址找到對方的電腦,但一台伺服器上可能同時跑著網頁、郵件、遠端登入好幾個程式。 傳輸層用埠號(port number,16 位元,0~65535)區分要交給哪一個程式。
| 埠號 | 服務 |
|---|---|
| 80 | HTTP(網頁) |
| 443 | HTTPS(加密的網頁) |
| 53 | DNS(網域名稱查詢) |
| 22 | SSH(加密的遠端登入) |
| 25 | SMTP(郵件伺服器之間傳送郵件) |
IANA 把埠號分成三段(RFC 6335):0~1023 是系統埠(常見服務固定使用)、1024~49151 是使用者埠(可向 IANA 登記)、 49152~65535 是動態埠(用戶端臨時挑一個來用)。瀏覽器連到網站時,目的埠是 443,來源埠則是作業系統臨時挑的。
「IP 位址+埠號」決定了通訊的一端,像 203.0.113.80:443;一條 TCP 連線由兩端的位址與埠號一起識別。
TCP:可靠的傳輸
IP 只負責「盡力送」:封包可能遺失、重複、順序亂掉,IP 不保證。TCP(Transmission Control Protocol)在這之上提供可靠的傳輸:
用戶端 ── SYN seq=x ────────────────▶ 伺服器
用戶端 ◀── SYN-ACK seq=y, ack=x+1 ─── 伺服器
用戶端 ── ACK seq=x+1, ack=y+1 ─────▶ 伺服器
- 三向交握(three-way handshake)建立連線(上圖):雙方交換各自的起始序號(實際上是隨機選的,避免和舊連線混淆,也讓別人更難偽造封包)。
- 序號與確認號:TCP 幫送出的每一個位元組編號。確認號(ack)是「下一個想收到的位元組編號」:收到編號 1001~1004 的 4 個位元組,就回 ack=1005。
- 逾時重送:送出後啟動計時器,時間到還沒收到確認,就重送同一段。接收端依序號把資料排好,重複的丟掉。
- 流量控制與壅塞控制:依接收端的處理能力(視窗大小)與網路擁擠程度,調整一次可以送多少。
- 結束時雙方各送一個 FIN、各回一個 ACK。
下面的程式用最簡單的方式模擬「送一段、等確認、遺失就重送」,看序號與確認號怎麼算。
序號、確認號與重送
每一段 4 個位元組。看 seq 與 ack 的關係:ack 永遠是 seq 加上這段的長度。第二段第一次送出時遺失,continue 讓迴圈回到開頭但 i 沒有加 1,所以用同一個序號重送同一段,最後接收端拿到完整、順序正確的資料。
UDP:簡單、快速、不保證
UDP(User Datagram Protocol)只在資料前面加上 8 個位元組的標頭:來源埠、目的埠、長度、檢查碼。 不建立連線、沒有序號、沒有確認、不重送。
| TCP | UDP | |
|---|---|---|
| 連線 | 先三向交握 | 不需要,直接送 |
| 可靠性 | 遺失會重送、依序交付 | 遺失就遺失、順序不保證 |
| 標頭大小 | 至少 20 位元組 | 8 位元組 |
| 適合 | 網頁、檔案下載、電子郵件:一個位元組都不能錯 | DNS 查詢、即時語音與視訊、線上遊戲:重視即時,晚到的資料沒有用 |
用 UDP 的程式如果需要可靠性,要自己處理(例如 DNS 查不到回應就再問一次)。
IPv4 與 IPv6
IPv4 位址 32 位元,最多 2³² = 4,294,967,296 個(約 43 億)。手機、筆電、伺服器、物聯網裝置越來越多,位址早就不夠: IANA 在 2011 年 2 月把最後的大區塊分配出去。NAT 讓很多裝置共用一個位址,延緩了問題,但也讓「從外面直接連到某台裝置」變得麻煩。
IPv6 位址 128 位元,數量約 3.4 × 10³⁸ 個。目前的規格是 2017 年 7 月的 RFC 8200(取代 1998 年 12 月的 RFC 2460)。
IPv6 位址寫成 8 組、每組 4 個十六進位數字,用冒號隔開,有兩條縮寫規則:
完整寫法 2001:0db8:0000:0000:0000:0000:0000:0001
規則 1 每組開頭的 0 可以省略 → 2001:db8:0:0:0:0:0:1
規則 2 一段連續全 0 的組寫成 ::(只能用一次)→ 2001:db8::1
2001:db8::/32 是保留給文件與教材的範例位址(RFC 3849)。
| IPv4 | IPv6 | |
|---|---|---|
| 長度 | 32 位元 | 128 位元 |
| 寫法 | 192.0.2.10 |
2001:db8::10 |
| 位址數量 | 約 43 億 | 約 3.4 × 10³⁸ |
| 自動設定 | DHCP | 可以自己依網路前綴產生位址,也可用 DHCPv6 |
目前許多網路同時支援兩種位址(雙協定堆疊,dual stack),兩者會共存很長一段時間。 不論用哪一種,上面的 TCP、UDP 與應用層都不用改:這就是分層的好處。
想一想:分層與封裝
筆電送出的訊框經過一台路由器(沒有做 NAT)到達伺服器。伺服器收到時,和筆電剛送出時比較,哪一項一定相同?
伺服器怎麼知道收到的資料要交給 Web 伺服器程式,而不是郵件伺服器程式?
想一想:TCP 與 UDP
TCP 三向交握依序是哪三個封包?
下列哪一種應用最適合用 UDP?
下面的程式模擬 TCP 的編號:起始序號 2001,依序送出兩段資料。最後會印出什麼?
seq = 2001
for data in ['ABC', 'DEFGH']:
ack = seq + len(data)
seq = ack
print(ack)
想一想:IPv4 與 IPv6
IPv4 位址有幾個位元?最多大約有幾個位址?
IPv6 位址 2001:0db8:0000:0000:0000:0000:0000:0001 的正確縮寫是?
重點整理
- 協定是通訊雙方約定的規則;網路的工作分成好幾層,每層只負責一件事。OSI 模型有 7 層,實際運作的 TCP/IP 常以 4 層或 5 層說明。
- 送出時一層一層加上標頭(封裝),對方一層一層拆開(解封裝):應用層資料 → TCP/UDP 資料段 → IP 封包 → 乙太網路訊框 → 位元。
- 路由器只處理到網路層:依目的 IP 轉送,換上新的訊框(MAC 位址改變),TTL 減 1;IP 位址與埠號不變(做 NAT 的路由器會改來源位址)。
- 埠號(16 位元)決定交給哪一個程式;80 是 HTTP、443 是 HTTPS、53 是 DNS。
- TCP 用三向交握建立連線,用序號與確認號追蹤每個位元組,逾時沒收到確認就重送;UDP 不建立連線、不重送,適合重視即時的應用。
- IPv4 位址 32 位元已經不夠用;IPv6 位址 128 位元,寫成 8 組十六進位數字,可以用
::縮寫。
下一課看應用層最常用到的一個服務:你輸入網址時,電腦怎麼透過 DNS 查到伺服器的 IP 位址。