當兩台電腦交談時,它們需要說同一種語言。這種語言的結構由 **OSI 模型(OSI model)**分層描述。
為什麼要分層#
OSI 模型提供標準,讓路由器、防火牆等硬體能專注於與它們相關的某個溝通面向、忽略其他面向。它把溝通拆成概念性的層次,如此一來路由與防火牆硬體就能專注於在較低層傳遞資料,忽略執行中應用程式所用的較高層資料封裝。
七層#
- 實體層(Physical layer):處理兩點間的實體連線,是最低層,主要負責傳遞原始位元流,並負責啟動、維持、終止這些位元流通訊。
- 資料連結層(Data-link layer):實際在兩點間傳輸資料。相對於實體層只送原始位元,這層提供錯誤更正、流量控制等高階功能。
- 網路層(Network layer):作為中間地帶,主要在較低與較高層之間傳遞資訊,提供定址與路由。
- 傳輸層(Transport layer):提供系統間透明的資料傳輸。藉由提供可靠的資料通訊,讓更高層無須擔心傳輸的可靠性或成本效益。
- 會議層(Session layer):負責建立與維持網路應用程式之間的連線。
- 表現層(Presentation layer):負責以應用程式理解的語法或語言呈現資料,讓加密與資料壓縮等成為可能。
- 應用層(Application layer):關注應用程式本身的需求。
封裝:像洋蔥一層層包起來#
資料透過這些協定層溝通時,會被切成稱為**封包(packet)**的小片段。每個封包都包含這些協定層的實作。
從應用層開始,封包把表現層包在資料外、再包會議層、再包傳輸層……以此類推。這個過程稱為封裝(encapsulation)。每個被包起的層都有標頭(header)與主體(body):標頭含該層所需的協定資訊,主體含該層的資料。一層的主體,包著先前所有已封裝層的完整包裹——像洋蔥的皮,或程式堆疊上的函式脈絡。
以瀏覽 Web 為例:
| OSI 層 | Web 對應 |
|---|---|
| 實體層 | 乙太網路線與網卡,傳輸原始位元 |
| 資料連結層 | 乙太網路,提供 LAN 上乙太埠之間的低階通訊(此時還沒有 IP 位址) |
| 網路層 | IP,負責定址與在位址間搬移資料 |
| 傳輸層 | TCP,提供無縫的雙向 socket 連線 |
| 應用層 | HTTP(超文本傳輸協定) |
路由器只需實作到網路層#
當你瀏覽 Web,封包被封裝到實體層後交給路由器。路由器不關心封包裡實際是什麼,只需實作到網路層的協定:它把封包送上網際網路,抵達對方網路的路由器,後者再以抵達最終目的地所需的低層協定標頭重新封裝。

圖 0x400-1:封包在兩個網路應用之間穿越各 OSI 層,路由器只處理到網路層
這些協定被寫進路由器、防火牆與你的作業系統中。使用網路的程式(瀏覽器、郵件用戶端)需與處理網路通訊的作業系統介接。既然作業系統打理了封裝的細節,寫網路程式就只是使用 OS 網路介面的問題。