系統設計 · 計算機網路系列 · 入口地圖

TCP/IP 分層模型與封包的旅程

在瀏覽器打一行網址、按下 Enter,畫面就出現了——這中間,一小塊資料被層層包上信封、穿過交換器與路由器、抵達地球另一端的伺服器,再原路拆封回來。這篇是整個「計算機網路」系列的地圖:先建立 TCP/IP 分層的心智模型,看懂「封裝/解封裝」,再標出後續每一篇會深入哪一層。

TCP/IP 分層模型 Encapsulation 封包旅程 系列導覽
01

總覽與定位

從「輸入網址到畫面出現」切入,看清網路為什麼要分層、開發者為什麼該懂。

先做一個大家每天都在做、卻很少細想的動作:在瀏覽器輸入 https://example.com、按下 Enter,一秒不到畫面就渲染出來。這背後其實是一場橫跨數千公里的接力:

  • 你的電腦得先問「example.com 的 IP 到底是多少?」(這是 DNS 的工作);
  • 然後和伺服器建立一條可靠的連線、把 HTTP 請求送出去(這是 TCP 的工作);
  • 請求被切成一個個小資料塊,穿過家用路由器、ISP、無數台路由器才到達伺服器(這是 IP 的工作);
  • 每一小段路,資料又是靠網卡與 MAC 位址在實體線路上一跳一跳傳的(這是乙太網/Link 層的工作)。

沒有人能把上面每一件事都塞進同一段程式或同一顆晶片裡。於是網路被設計成分層(layered):每一層只解決一件事、只跟上下相鄰的層打交道。你寫 fetch() 時只碰最上面的應用層,底下的可靠傳輸、定址、路由、實體訊號,全被抽象掉了——這正是分層的威力。

座標這篇在系列中的位置

這是「計算機網路」系列的入口地圖。目標不是把每層講到底,而是先建立一張心智模型:有哪幾層、各管什麼、資料如何逐層封裝與拆解。看完你會知道後面幾篇(IP 定址與子網路、區域網路與設備、NAT/Port Forwarding、DNS)各自在補哪一層的細節。

一句話答法網路太複雜,無法一次解決,於是切成數層、每層只管一件事並向上隱藏細節;開發者日常只碰最上層,但懂得下面每層在做什麼,才能定位跨網路的問題。

02

為什麼要分層

分層=分工+抽象。理解這個原則,比背 OSI 七層重要一百倍。

分層的核心思想只有一句:把一個大問題拆成數個獨立的小問題,每一層只解決一件事,並對上層隱藏內部細節。它帶來三個實際好處:

  • 關注點分離:寫應用的人不必懂電磁訊號,設計網卡的人不必懂 HTTP。
  • 可替換:把 Wi-Fi 換成有線、把 IPv4 換成 IPv6,上層應用完全不用改——因為層與層之間只靠固定的介面溝通。
  • 好定位問題:出事時能分層排查——「連得上但很慢」「解析不到網域」「同網段互通、跨網段不通」各自指向不同層。
別踩不要陷入 OSI 七層背誦

課本常教 OSI 七層(實體/資料鏈結/網路/傳輸/會談/表現/應用),它是很好的教學參照,但真實世界跑的是 TCP/IP 四層模型。本篇(與整個系列)以四層為主軸;OSI 的會談/表現/應用在實務上多半併進「應用層」看待。比起硬背層數,更該記住的是「每層職責」與「封裝」這兩件事。

一個好用的類比是寄一封跨國信件:你只管寫信(應用層);信裝進信封、寫上收件人(傳輸/定址);郵局分揀、決定走哪條運輸路線(路由);最後靠貨車、飛機一段段實際運送(實體鏈路)。每一環只認識自己那層的資訊——貨車司機不會拆信讀內容,就像路由器不在乎你的 HTTP 寫了什麼。

一句話答法分層是「分工+抽象」:每層只做一件事、只跟相鄰層以固定介面溝通,換掉任一層都不影響其他層;真實跑的是 TCP/IP 四層,OSI 七層是教學參照。

03

TCP/IP 四層模型

四層、四種職責、四種「資料單位」的名字。這張表是整個系列的骨架。

由上而下四層,每層都有代表協定,也有專屬的「資料單位(PDU)」名稱。資料在同一層彼此對話時的稱呼會變——這不是咬文嚼字,看懂名字就能一眼判斷「現在講的是哪一層」:

▲上應用層 Application產生使用者要傳的資料,定義應用彼此的對話格式。HTTP/DNS/TLS。資料單位:Message/資料
│傳輸層 Transport端到端傳輸:用 port 區分是哪個程式,並(TCP)提供可靠、有序、重傳。TCP/UDP。資料單位:Segment(TCP)/Datagram(UDP)
│網路層 Internet跨網路定址與路由:用 IP 位址找到「哪一台主機」,決定封包一跳跳怎麼走。IP/ICMP。資料單位:Packet
層解決的問題定址靠什麼代表協定資料單位
應用 Application應用之間要傳什麼、怎麼講—(URL/網域名)HTTP、DNS、TLS、SMTPMessage
傳輸 Transport送到「哪個程式」、要不要可靠PortTCP、UDPSegment / Datagram
網路 Internet送到「哪一台主機」、怎麼跨網路IP 位址IP、ICMPPacket
鏈路 Link相鄰設備間怎麼實際搬位元MAC 位址Ethernet、Wi-Fi、ARPFrame

記憶法:Port 找「哪個程式」、IP 找「哪台主機」、MAC 找「下一個相鄰設備」——三種位址各司其職,正對應三個不同的層。

關鍵「哪台主機」與「哪個程式」是兩件事

IP 只負責把封包送到某一台主機;到了主機還要靠 port 判斷該交給哪個程式(443 給 web server、22 給 SSH)。這就是為什麼傳輸層與網路層必須分開——後續「NAT/Port Forwarding」正是玩弄這組 IP+port 的藝術。

一句話答法TCP/IP 四層=應用(HTTP,講什麼)/傳輸(TCP·UDP,用 port 送到哪個程式、要不要可靠)/網路(IP,用位址送到哪台主機並路由)/鏈路(Ethernet·MAC,相鄰設備間搬位元);資料單位依序是 Message→Segment→Packet→Frame。

04

封裝與解封裝

分層是「概念」,封裝(encapsulation)是它在資料上的「具體動作」。這是本篇的靈魂。

資料往下走一層,那一層就在前面(有時也在後面)貼上自己的 header,把上層交來的東西整個當成「不透明的酬載(payload)」包起來——這叫封裝。接收端反過來,每往上走一層就拆掉對應的 header,讀出裡面的酬載交給上層——這叫解封裝。兩邊完全對稱,像一組俄羅斯娃娃。

關鍵洞察:每一層只看得懂、也只在乎自己那層的 header。路由器讀 IP header 就夠了,它根本不拆你的 TCP/HTTP;交換器只看 MAC。這種「各層互不干涉」正是分層能成立的原因。而封裝是要付代價的——每一層貼上去的 header 都是實實在在的 byte。下面這個拆解器讓你調 payload 大小與各層選項,把代價算到個位數:

互動 · 一筆資料在線路上佔多少 byte
應用層 payload1200 B
路徑 MTU1500 B
網路層版本IPv4 · 20 B

看 payload 那一段的寬度佔比:payload 拉到 1 byte 時,整條線幾乎全是 header——這就是「小封包的 overhead」。另外注意兩件常被搞混的事:VLAN 標籤不佔 MTU(MTU 量的是 IP 層以上的 payload,所以加 VLAN 只讓每個 frame 變長、不會讓 MSS 變小);UDP 被 IP 分片時只有第一片帶得到 UDP header,後面幾片在 IP 眼裡只是無名的 byte 串。模型已計入乙太網最小訊框 64 B 的 padding 與每個 frame 的前導碼+訊框間隔 20 B。

陷阱封裝不是加密

「包起來」只是把上層資料當成 payload 附上 header,內容並沒有被加密——用 Wireshark 抓包就能一層層看光。真正的加密是應用層的 TLS(HTTPS)在幹的事,跟分層封裝是兩碼子事。別把 encapsulation 和 encryption 搞混。

一句話答法封裝=資料每下一層就被貼上該層 header 當成不透明 payload 包起來(Link 層另加尾端 FCS);解封裝是收端反向對稱地逐層拆 header;每層只認得自己的 header,這就是分層能成立的根本。

05

封包的旅程,與它卡在哪一層

把封裝放進真實地形:資料不是點對點直達,而是一跳跳穿過設備——而不同設備只拆到不同的層。

回到開頭那個 HTTP 請求。它從你的電腦出發,中間至少會經過家用/機房的路由器,最後抵達伺服器。這裡藏著一個最能鞏固分層心智模型的事實:不同設備只把封包往上拆到不同的層——

  • 交換器 Switch:只拆到鏈路層(第 2 層),看 MAC 就轉發。
  • 路由器 Router:拆到網路層(第 3 層),讀 IP、查路由表決定下一跳,然後換上新 frame header 再送出。
  • 端點主機(你的電腦/伺服器):一路拆到應用層,因為資料就是要交給上面的程式。

把這三種角色排成一列,就是一個請求的實際地形:

你的電腦
end host
應用
傳輸
網路
─Frame─▸
路由器
router · L3
應用
傳輸
網路
─換新 Frame─▸
伺服器
end host
應用
傳輸
網路

看中間那一格:路由器的「應用」與「傳輸」是灰的——它拆到網路層讀完目的 IP 就轉發,上層內容對它是不透明的 payload。IP 位址一路不變,MAC 每一跳都換,所以箭頭上寫的是「換新 Frame」。

這張圖也是排錯時最有用的一張圖。當「連不上」發生時,資深工程師做的第一件事不是重開機,而是把症狀壓到某一層:能 ping 通卻連不上 port、DNS 解得出來卻沒反應、小請求正常但大檔案會卡住——每一種組合都指向不同的層。下面的診斷器讓你把手上量到的每一項填進去,它會算出嫌疑落在哪一層、哪幾層已經被排除,以及下一個最該量的是什麼:

互動 · 分層診斷器 填入你量到的每一項,看問題被壓到哪一層
網域解不解得出 IP
ping 預設閘道
ping 目的 IP
連那個 port(nc / telnet)
伺服器端有沒有在聽那個 port
TLS 握手
大封包 / 大 body
目的地跟你同網段嗎
應用層 傳輸層 網路層 鏈路層

嫌疑百分比是把每條被觸發的規則加減出來的分數正規化而成,不是查表:改任何一格都會讓五條長條同時重算。被壓到 0 分的層會標成「已排除」——排除比指認更有價值,因為它讓你不必再去量那一層。最下方的「下一個該量什麼」是算出來的:它把每個還沒量的檢查項的每一種可能結果都代進去重算一次分佈,挑能把不確定度(以 bit 計)壓最多的那一個。

串起來從網址到畫面,各層各司其職

DNS(應用層)先把網域換成 IP → TCP(傳輸層)三次握手建立可靠連線 → HTTP 請求被逐層封裝 → IP(網路層)帶著它跨網路路由、經多台路由器 → Ethernet/Wi-Fi(鏈路層)在每一段實體鏈路上搬移 → 伺服器反向解封裝、回應,畫面於是出現。每一步都對應這篇的某一層。

一句話答法封包不是直達,而是一跳跳接力:交換器只拆到第 2 層(MAC)、路由器拆到第 3 層(IP,換新 frame 再轉發)、只有端點主機才拆到應用層——這正是分層與封裝在真實網路中的體現。

06

系列地圖:接下來往哪走

這篇是地圖,不是終點。把後續每一篇對回它主要深入的那一層。

有了四層心智模型,後面的主題就不再是零散知識,而是「補完某一層的細節」。下表是這個系列的導覽——遇到卡住的概念,先問自己「這是哪一層的問題?」:

後續主題主要深入的層它回答的核心問題
IP 定址與子網路網路 Internet(L3)IP 位址怎麼分?子網路遮罩、CIDR 是什麼?如何判斷兩台是不是同網段?
區域網路與設備鏈路 Link(L2)+網路(L3)Hub/Switch/Router 差在哪?MAC 與 ARP 如何在區網內找到對方?
NAT/Port Forwarding網路(L3)+傳輸(L4 port)一個公網 IP 如何讓整個家庭上網?外網怎麼連回內網的服務?
DNS應用 Application網域名如何一層層解析成 IP?遞迴/迭代查詢、快取與 TTL 怎麼運作?

動線建議:先網路層(IP/子網路)→ 鏈路層與設備(區網怎麼通)→ NAT(跨內外網)→ DNS(名字怎麼變 IP)。每一篇都會回頭指這張分層圖。

一句話答法後續各篇是這張分層圖的放大鏡:IP/子網路深入網路層、區網與設備深入鏈路層、NAT 橫跨網路與傳輸層、DNS 屬應用層——遇到問題先定位「這是哪一層」。

07

面試與常見誤區速查

高頻問答、易混清單、一句話收尾。

高頻問答(點擊展開)

Q1 OSI 七層和 TCP/IP 四層,面試該講哪個?▸

先點出「OSI 是教學參照模型、TCP/IP 是真實跑的模型」,再用四層回答問題即可。能補一句「OSI 的會談/表現/應用在實務上多併入應用層看」會加分。重點是展現你懂每層職責與封裝,而不是背出七個名詞。

Q2 Segment、Packet、Frame 有什麼差別?▸

它們是同一份資料在不同層的稱呼:傳輸層加了 TCP header 叫 Segment(UDP 則叫 Datagram);再被網路層加 IP header 叫 Packet;再被鏈路層加 frame header/FCS 叫 Frame。名字變了,代表你正在講不同層。

Q3 路由器和交換器差在哪?▸

層次不同:交換器工作在鏈路層(L2),看 MAC 在同一區網內轉發;路由器工作在網路層(L3),看 IP 在不同網路之間路由、且會把封包重新封裝成新 frame 再送出。一句話:交換器管「同網段內」,路由器管「跨網段」。

Q4 封裝(encapsulation)等於加密嗎?▸

不等於。封裝只是逐層貼 header 把資料包起來,內容仍是明文,抓包就看得到。加密是應用層 TLS(HTTPS)做的事。兩者常一起出現,但概念完全獨立。

Q5 為什麼需要傳輸層?IP 不是已經能送到主機了嗎?▸

IP 只能送到「哪一台主機」,但一台主機上跑著幾十個程式。傳輸層用 port 解決「送到哪個程式」的多工問題,並且(TCP 的話)額外提供可靠、有序、重傳、流量控制——這些 IP 都不管。定址粒度與可靠性,是傳輸層存在的兩個理由。

易混與陷阱清單

坑把「哪台主機(IP)」和「哪個程式(port)」混為一談——它們分屬網路層與傳輸層,NAT 就靠這組合玩花樣。
坑以為 encapsulation = encryption。封裝不加密,明文照樣抓得到。
坑把 Segment/Packet/Frame 當成三種不同東西——其實是同一份資料在不同層的名字。
坑以為路由器會讀你的 HTTP/TCP——它只拆到 IP 層,看目的 IP 就轉發,上層內容對它是不透明 payload。
坑硬背 OSI 七層卻說不清每層職責——面試要的是職責與封裝,不是名詞接龍。

一句話收尾

分層把大問題拆成數層、每層只做一件事並向上隱藏細節,任一層可獨立替換。
四層應用(HTTP)/傳輸(TCP·UDP,port)/網路(IP,路由)/鏈路(Ethernet,MAC)。
封裝每下一層貼上該層 header 當 payload 包起來,收端反向對稱解封裝;每層只認自己的 header。
旅程交換器拆到 L2、路由器拆到 L3、端點主機才拆到應用層——這就是分層在真實網路的體現。