National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 30

協定分層與 TCP/IP

封包、分層與 TCP 的三向交握
Interaction 30 minute(s)

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、查路由表,再包上新的訊框往下一站送。下面的模擬器裡,每一個位元組都是依標準格式實際組出來的。

互動練習:一份網頁請求的封裝之旅

按「下一步」,從筆電的應用層開始,看資料單元每一步多了(或少了)哪一個標頭,以及下方各欄位的值與十六進位位元組。經過路由器時,黃色的列是被換掉的欄位。依任務走完一趟並回答問題,最後換成「DNS 查詢(UDP)」再封裝一次,比較 TCP 與 UDP 標頭的大小。

埠號:交給哪一個程式

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 ─────▶ 伺服器
  1. 三向交握(three-way handshake)建立連線(上圖):雙方交換各自的起始序號(實際上是隨機選的,避免和舊連線混淆,也讓別人更難偽造封包)。
  2. 序號與確認號:TCP 幫送出的每一個位元組編號。確認號(ack)是「下一個想收到的位元組編號」:收到編號 1001~1004 的 4 個位元組,就回 ack=1005。
  3. 逾時重送:送出後啟動計時器,時間到還沒收到確認,就重送同一段。接收端依序號把資料排好,重複的丟掉。
  4. 流量控制與壅塞控制:依接收端的處理能力(視窗大小)與網路擁擠程度,調整一次可以送多少。
  5. 結束時雙方各送一個 FIN、各回一個 ACK。

下面的程式用最簡單的方式模擬「送一段、等確認、遺失就重送」,看序號與確認號怎麼算。

序號、確認號與重送

每一段 4 個位元組。看 seq 與 ack 的關係:ack 永遠是 seq 加上這段的長度。第二段第一次送出時遺失,continue 讓迴圈回到開頭但 i 沒有加 1,所以用同一個序號重送同一段,最後接收端拿到完整、順序正確的資料。

UDP:簡單、快速、不保證

UDP(User Datagram Protocol)只在資料前面加上 8 個位元組的標頭:來源埠、目的埠、長度、檢查碼。 不建立連線、沒有序號、沒有確認、不重送。

TCP UDP
連線 先三向交握 不需要,直接送
可靠性 遺失會重送、依序交付 遺失就遺失、順序不保證
標頭大小 至少 20 位元組 8 位元組
適合 網頁、檔案下載、電子郵件:一個位元組都不能錯 DNS 查詢、即時語音與視訊、線上遊戲:重視即時,晚到的資料沒有用

用 UDP 的程式如果需要可靠性,要自己處理(例如 DNS 查不到回應就再問一次)。

互動練習:三向交握、遺失與重送

時間由上往下走,每條箭頭是一個封包。先按「三向交握」看 SYN、SYN-ACK、ACK,再回答確認號的問題;接著勾選「下一段遺失」後按「送出一段資料」,看 TCP 逾時重送與確認號的變化。然後切換成 UDP,同樣讓一段資料遺失,比較右邊「接收端的程式拿到」的內容,最後回答哪一種適合即時語音。

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 與應用層都不用改:這就是分層的好處。

想一想:分層與封裝

1.

筆電送出的訊框經過一台路由器(沒有做 NAT)到達伺服器。伺服器收到時,和筆電剛送出時比較,哪一項一定相同?

2.

伺服器怎麼知道收到的資料要交給 Web 伺服器程式,而不是郵件伺服器程式?

第 1 次作答

想一想:TCP 與 UDP

1.

TCP 三向交握依序是哪三個封包?

2.

下列哪一種應用最適合用 UDP?

3.

下面的程式模擬 TCP 的編號:起始序號 2001,依序送出兩段資料。最後會印出什麼?

seq = 2001
for data in ['ABC', 'DEFGH']:
    ack = seq + len(data)
    seq = ack
print(ack)
第 1 次作答

想一想:IPv4 與 IPv6

1.

IPv4 位址有幾個位元?最多大約有幾個位址?

2.

IPv6 位址 2001:0db8:0000:0000:0000:0000:0000:0001 的正確縮寫是?

第 1 次作答

重點整理

  • 協定是通訊雙方約定的規則;網路的工作分成好幾層,每層只負責一件事。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 位址。

這一課完成了!
Next lesson:網域名稱與 DNS
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。