# Computer Networking — 1.5 Protocol Layers and Their Service Models
contributed by <[`kaeteyaruyo`](https://github.com/kaeteyaruyo)>
###### tags: `Computer Networking`
到目前為止,我們已經可以看得出來,網際網路是一個極度複雜的系統,由好多個元件組成,例如:大量的應用程式和通訊協定、不同種類的終端系統或封包交換機,以及不同種類的傳輸媒介。網際網路這麼複雜,我們有辦法用一個架構來管理或是描述它嗎?還好,我們的確有!
## 1.5.1 Layered Architecture
在試圖組織我們的網際網路架構之前,我們一樣先用人類世界來類比吧。其實在我們的日常生活中時常會遇到複雜的系統,就拿搭飛機這件事來舉例好了,你會如何描述這個包含了票務人員、行李檢查員、登機口服務員、飛行員、飛機、航空交通管制員,還有橫跨全世界的飛行航線系統的複雜系統?其中一個方法,是透過你搭飛機時會進行的一系列動作來描述。首先你會買飛機票、再來掛行李、再來出境,然後登機。飛機起飛之後沿著航線飛到目的地。接著你下飛機、入境、領行李,如果你覺得這趟航程爛透了,你可能還會去跟票務人員抱怨(但你不會因此得到任何好處的)。這個情境就如下圖所示:
![](https://i.imgur.com/cCix3qk.png)
我們已經可以看到這個類比和電腦網路的相似之處:你搭飛機從你的出發地前往目的地,而封包則是透過網際網路從出發地前往目的地。但這不是我們想要的類比。我們想要的是從上圖中找出一個*結構*。在上圖中我們可以看到,在箭頭的兩端都有票務的功能、行李的功能(劃票完成才能用)、出入境的功能(劃票、掛行李都完成才能用),以及起飛/降落的功能(劃票、掛行李、出境都完成才能用)。而在飛行途中,則有飛行航線規劃的功能。由此可知,我們可以從*水平方向*來看上面這張圖,看起來會一層一層的,像下圖這樣:
![](https://i.imgur.com/rrteo2W.png)
上圖將一個飛航系統依據其功能分成數層,提供了我們探討一個飛行航程的框架。圖中的每一層,結合他底下所有的層,可以提供一個功能,或者說,一個*服務*。例如:
* 票務層結合他底下所有的層,可以提供**票務櫃台到票務櫃台**的**人員轉發**服務
* 行李層結合他底下所有的層,可以提供**掛行李櫃台到領行李櫃台**的**人員與行李轉發**服務
* 這個服務只有已經處理完票務的人才可以用
* 出入境層結合他底下所有的層,可以提供**出境口到入境口**的**人員與行李轉發**服務
* 起飛/降落層結合他底下所有的層,提供了**起飛跑道到降落跑道**的**人員與行李轉發**服務
每一層的服務都是透過**在自己這一層執行某些動作**(例如:在出入境那一層有讓乘客登機/下飛機的動作)以及**使用他正下方那一層的某些功能**(例如:出入境層會使用起飛/降落層的「起飛跑道到降落跑道人員轉發服務」)來完成的。
這種一層一層的架構讓我們在討論時可以專注在一個複雜又龐大的系統的一小部份。這個簡化方式的好處在於,他將系統給**模組化**,讓我們要變更特定一層服務的實作方式時更容易了。只要變更前後,該層都提供一樣的服務給他的上層,也使用他下層一樣的服務,那整個系統的行為就都不會改變(注意:變更實作方式和變更服務本身是兩回事)。例如:就算出入境層的功能被變更了(像是要求旅客依照身高登機或下飛機),整個飛航系統的行為依然沒有改變,因為出入境層提供的服務是一樣的(讓人員上下飛機),他只是改變了自身功能的實作方式而已。對於一個龐大又複雜、經常需要進行更新的系統來說,有辦法讓任意一個元件變更時不會影響到其他的元件,也是分層的另一個重大好處。
### Protocol Layering
搭飛機的例子看夠了,現在我們回來討論網路通訊協定。為了結構化網路通訊協定的設計,設計網路架構的人各式各樣的通訊協定(以及實作這些通訊協定的軟硬體)給**分層**。每個通訊協定都屬於網路的某一層,就像飛航系統中的不同功能也必定屬於上述結構的某一層一樣。同樣的,我們感興趣的是每一層到底提供了什麼樣的**服務**給他上面那層,我們把這叫做該層的**服務模型 (service model)**。跟我們飛航系統的例子一樣,每一層的服務都是透過「在自己這一層執行某些動作」以及「使用他正下方那一層的某些功能」來完成的。例如:第 n 層可能有提供「邊緣網路之間可靠的訊息傳輸」這樣的服務,而這可能是透過利用第 n - 1 層提供的「邊緣網路之間不可靠的訊息傳輸」的服務,再加上在自己這層實作的「丟包偵測和重傳訊息」功能達成的。
一個通訊協定層可以是用軟體、硬體,或是同時使用兩者實作出來的。
* 應用層 (application layer,像是 HTTP 和 SMTP 之類的) 和傳輸層 (transport layer) 的通訊協,幾乎都是在終端系統中用軟體實作出來的
* 物理層 (physical layer) 和資料連結層 (data link layer) 負責處理特定種類的線路之間的通訊,所以他們通常是被實作在對應該線路的網路介面卡裡面的(像是乙太網或是 Wi-Fi 的介面卡)
* 網路層 (network layer) 通常是結合軟硬體一起實作出來的
此外,就像在飛航系統的分層架構中,每一層的功能都被分散地實作在世界各地的機場和飛航控制中心一樣,在網路的分層架構中,第 n 層的通訊協定也是被*分散地*實作在世界各地的終端系統、交換機,以及其他構成網路的元件上的。也就是說,這些構成網路的元件通常都會是第 n 層通訊協定的一小部分。
給通訊協定分層,在概念上與結構上都提供了許多好處 [RFC 3439]。就像我們剛才看到的,分層讓我們可以用一個更結構化的方式討論這些系統元件,而模組化也讓我們更容易升級系統。但是還是有一些研究者和網路工程師非常討厭分層的作法[Wakeman 1992]。分層帶來的其中一個壞處是,有些功能可能會在不同層被重複實作。例如:許多協定堆疊都會同時提供線路上的 (per-link basis) 與端到端的 (end-to-end basis) 錯誤處理及復原功能。另一個壞處是,有些層的功能可能會需要只存在於其他層的資料(例如:時間戳),而這違反了分層的目標。
![](https://i.imgur.com/e4Igk9J.png)
我們把不同層的通訊協定疊在一起組成的這個東西叫做**協定堆疊 (protocol stack)**。網際網路的協定堆疊總共有五層,如上圖所示(補圖),分別是:
* 應用層 (Application layer)
* 傳輸層 (Transport layer)
* 網路層 (Network layer)
* 資料連結層 (Data link layer)
* 物理層 (Physical layer)
你或許會注意到,本書的目錄就是按照這個結構來編排的,我們是**由上到下 (Top-Down Approach)** 的在介紹網際網路的協定推疊,從應用層開始,再一路往下看。
#### Application Layer
應用層是由**網路應用服務**和**應用層通訊協定**組成的。應用層包含了非常多的協定,像是
* HTTP (HyperText Transfer Protocol), 負責做網頁傳輸
* SMTP (Simple Mail Transfer Protocol), 負責做 email 傳輸
* FTP (File Transfer Protocol), 負責做檔案傳輸
除此之外,也有一些網路的功能,像是把方便人類讀的網址轉換成給機器看的 32 位元 IP 位址的 DNS (Domain Name System) 服務,也是以應用層的協定實作的。在第二章將會提到,自己實作並佈署一個新的應用層協定是非常容易的。
應用層協定是被分散地實作在眾多終端系統中的,他們通常會搭配一個應用程式,讓終端系統可以透過應用程式互相交換封包。我們把這種從應用層發出的封包叫作**訊息(message)**。
#### Transport Layer
傳輸層負責**在應用程式終端 (application endpoint) 之間傳輸應用層的訊息**。目前在網際網路上最主要的兩種傳輸層協定,分別是 TCP 和 UDP,他們都可以轉發應用層丟下來的訊息。
* TCP (Transmission Control Protocol) 提供的是連結導向式 (connection-oriented) 的服務。他有以下特色:
* 提供可靠傳輸 (reliable delivery),保證應用層訊息絕對可以送到該去的地方
* 提供流量控制 (flow control), 也就是會控制收發兩端的傳輸速度,讓他們差不多快
* 把過長的訊息切成小塊,以提供壅塞控制機制 (congestion-control)。在網路壅塞的時候,送訊息的人將會自動降低傳輸速率
* UDP (User Datagram Protocol) 提供的則是非連結導向的傳輸服務。除了傳輸訊息必要的功能以外,他不會做其他多餘的動作:不提供可靠傳輸、不做流量控制,也沒有壅塞控制
在本書中,我們把傳輸層發出的封包叫做**區段 (segment)**。
#### Network Layer
網路層負責在不同主機之間傳輸封包,我們把這一層的封包叫做**資料塊 (datagram)**。要送資料的主機,會把訊息片段和目標主機的地址丟給網路層(就像你要寄信的時候會把信和收件人地址丟給郵局一樣),網路層接著就把訊息片段給送到目標主機的傳輸層。
在網路層當中,有非常著名的 IP (Internet Protocol) 協定,定義了資料塊裏面有哪些欄位,以及終端系統和路由器要怎麼解讀這些欄位並做出對應動作。 IP 協定就只有一種而已,所以網路上的所有元件,只要有網路層,就必須要可以運行 IP 協定。
除此之外,網路層也包含了數種路由協定 (routing protocols) ,用來決定資料塊要走起點跟終點之間的哪一條路。路由協定的種類就很多了,我們在 1.3 的時候有提到,網際網路就是網路的網路,在每一個網路之內,該網路的網路管理者都可以自行決定他們要用哪一種路由協定。
雖然網路層同時包含 IP 協定和為數眾多的路由協定,但大家還是常常會把這一層叫作 「IP 層」,這顯現出 IP 協定是把整個網際網路給串連起來的關鍵元件。
#### Link Layer
網路層運送資料塊的途中,會經過起點、一系列的路由器,才到達終點。為了將封包從一個節點(主機或路由器)移動到另一個節點,網路層必須依賴於資料連結層的服務。更明確的說,在每個節點,網路層都會把資料塊往下丟到連結層,連結層再負責把資料塊送到指定路徑上的下一個節點,等到抵達了下一個節點,該節點的連結層再把資料塊往上送到網路層。
不同的連結層協定會提供不一樣的服務內容,而這些協定則是由該段路徑的線路種類決定的。例如:有些連結層的協定會提供可靠傳輸,他保證相鄰的兩個收發節點和他們中間的那一條線路上的傳輸行為一定會成功。要注意的是,這一層提供的可靠傳輸服務和 TCP 提供的是不一樣的,因為 TCP 提供的是兩個服務終端之間的可靠傳輸,而不是兩個節點而已。
一些連結層協定的例子包含:乙太網路、 Wi-Fi,以及有線電視接取網路的 DOCSIS 協定。由於一個資料塊往往需要經過好多條線路才會抵達終點,因此他在這一路上可能會經過數種不同的協定。例如:一個資料塊可能在某條線路上是經由乙太網路協定處理的,但是到下一個線路時又變成了由 PPP 處理,而在不同的協定中,他們可能會收到不同的服務。
我們把資料連結層的封包稱作**訊框 (frame)**。
#### Physical Layer
如果說資料連結層的工作是要在兩個相鄰的網路節點之間移動一整個訊框,那麼物理層的工作就是要在兩個相鄰的節點之間移動訊框內的一個一個位元了。物理層的協定也是根據線路的不同來決定的。更精確的說,是由該傳輸媒介的物理組成來決定的(像是雙絞銅線、單模光纖...等)。例如,乙太網路這個技術本身就有實作數種不同的物理層協定:雙絞線一種、同軸電纜一種、光纖一種,...等等的。在每一種不同的協定中,位元都是透過不同的方式在線路上傳輸的。
|編號|名字|功能|跑在哪裡|協定|封包的稱呼|
|-|-|-|-|-|-|
|5|應用層|提供各式各樣的應用服務|終端設備上|HTTP, SMTP, TPC 等|訊息 (message)|
|4|傳輸層|把應用層丟下來的訊息<br>傳到另一個應用程式手上|終端設備上?|TCP, UDP 等|區段 (segment)|
|3|網路層|把傳輸層丟下來的區段<br>傳到另一個傳輸層手上|任何網路節點|IP, 數種路由協定|資料塊 (datagram)|
|2|連結層|把網路層丟下來的資料塊<br>傳到相鄰節點的網路層手上|路由器上|Ethernet, Wi-Fi, DOCSIS, PPP|訊框 (frame)|
|1|物理層|把連結層丟下來的訊框<br>拆成位元送給下一個節點|線路上|連結層的協定各自有<br>適用不同物理媒介的版本|位元?|
### The OSI Model
我們上面討論了很多網路協定堆疊的細節,但我們也要告訴各位,協定堆疊不是只有這一種而已。在 1970 年代後期,國際標準化組織 (International Organization for Standardization, ISO) 將電腦網路組織成一個七層的架構,被稱為**開放式系統互聯模型 (Open Systems Interconnection, OSI)** [ISO 2016]。 OSI 模型被提出的時候, IP 協定才剛被發明出來,還只是眾多開發中的協定套組的其中一個而已。當時發明 OSI 模型的人,或許對網際網路這個東西一點概念都沒有(就還沒有這個東西)。儘管如此,從 1970 年代後期開始,有許多網路相關的訓練課程和大學課程還是收到了 ISO 的委任,開始在教材內編排跟這個七層的模型有關的內容。就是因為他在早期的網路教育裏面有其影響力,因此七層的 OSI 模型才會持續出現在眾多網路相關的課本裏面。
![](https://i.imgur.com/jKbP54r.png)
OSI 七層模型長相如上圖所示,包含
* 應用層 (Application layer)
* **表現層 (Presentation layer)**
* **會議層 (Session layer)**
* 傳輸層 (Transport layer)
* 網路層 (Network layer)
* 資料連結層 (Data link layer)
* 物理層 (Physical layer)
你會發現這當中有五層跟我們先前提到的那個協定堆疊是一樣的,因此我們在這邊只額外說明多出來的那兩層就好。
#### Presentation Layer
表現層的工作是提供兩個正在溝通的應用程式解讀收到的資料的服務。這些服務包含:
* 資料壓縮
* 資料加密 ==(which are self-explanatory)==(看不懂)
* 資料解讀 (應用程式因此可以不必在意資料是怎麼被表達/被儲存的,因為不同電腦可能會有不同的表達方式,例如[編碼](https://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81)、[大小端序](https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F)等)
#### Session Layer
會議層提供界定 (==delimiting==) 與同步資交換行為的功能,其手段包含了建立檢查點還有會議復原機制。
網際網路的協定堆疊少了這兩層,讓一些人提出了幾個有趣的問題:這兩層提供的服務不重要嗎?如果有些應用程式真的需要這些服務怎麼辦?網際網路的設計師們已經回答了這兩個問題,而且答案是一樣的:這些通通交給應用程式的開發者去決定。應用程式的開發者們有權決定這些服務是不是很重要,如果是的話,那他們可以自己在應用層內實做出這些功能。
## 1.5.2 Encapsulation
![](https://i.imgur.com/fy38SZD.png)
上圖展示了資料流在物理層面上經過了哪些層才跑到終點的。資料會先從起點電腦的應用層一路往下,經過連結層交換機和路由器的時候會往上跑再跑下來,最後跑到終點電腦之後一路往上回到應用層。在本書的後面我們會提到,路由器和連接層交換機都屬於封包交換機。和終端系統一樣,路由器和連接層交換機的軟硬體也是按照網際網路的協定堆疊分層組織的。但是路由器和連接層交換機並不會實作所有的層,他們通常只有實作底下的幾層而已。就像上圖所示,連結層交換機只有實作了 1, 2 層,而路由器只有實作 1 - 3 層而已。這表示路由器是有辦法實作 IP 協定(屬於第 3 層)的,但是連結層交換機不行。我們等等就會提到,連結層交換機看不懂 IP 位址,但他可以看得懂其它第 2 層的位址,像是乙太網位址。而終端設備則是五層全都實作了,這也確實符合了「網際網路的架構是在邊緣網路的部份最複雜」這件事實。
上圖同時還展示了一個很重要的概念,那就是**封裝 (encapsulation)**。
* 在送信主機,應用層的**訊息**(上圖中的 $M$) 會被往下傳到傳輸層。在最簡單的情況下(訊息很短,不用拆解之類的),傳輸層會在這個訊息上加上一段額外的資訊,叫作**傳輸層標頭**(上圖中的 $H_t$), 這會被收信主機的傳輸層拿去看。應用層的訊息加上**傳輸層的標頭**一起組成了傳輸層的區段,因此我們說**傳輸層的區段封裝了應用層的訊息**
* 這段額外加上去的資訊,或許包含了讓收信主機的傳輸層可以判斷要把訊息送給哪一個應用程式的資訊,或是一些錯誤偵測的位元,讓收信端可以確認訊息中的位元是不是有在傳輸過程中被更改
* 傳輸層的區段再被往下傳到網路層,被加上**網路層標頭**(上圖中的 $H_n$), 組成**網路層的資料塊**
* 網路層標頭可能會包含像是送信/收信主機的位址這類的資料
* 網路層的資料塊再被往下傳到連結層,被加上**連結層標頭**(上圖中的 $H_l$), 組成**連結層的訊框**
我們可以看到,每一層的封包都可以分成兩個部份:**標頭 (header)** 和**負載 (payload)**。而負載的部份一般來說都是他上面那一層的一整個封包。
我們可以把這個過程類比成一個企業的分公司之間透過郵政系統寄送備忘錄的情境。設想以下情況:某甲是 A 分公司的一個員工,他要寄一件備忘錄給 B 分公司的某乙。
* 備忘錄可以想成應用層的訊息。某甲把這張備忘錄放進公司內部用的信封裡面,在上頭寫上某乙的名字和部門。這個公司內部用的信封就可以想成傳輸層的區段,封面上寫的送信資訊就是傳輸層標頭,整個信封封裝了應用層的訊息(備忘錄)
* 這封信被送到 A 分公司的收發室,收發室的人會再把它放進另一個給一般郵政系統看的信封裡面,然後在上頭寫上 B 分公司的地址作為收信人, A 分公司的地址作為寄信人。這個一般郵政系統看的信封可以想成網路層的資料塊,他封裝了傳輸層的區塊(公司內部用的信封)
* 郵政系統收到這個給郵政系統看的信封之後,就會把它送到 B 分公司的收發室。收發室把這封信給拆開 (deencapsulate),然後按著裡面信封上寫的資訊,將裡面那個信封丟給某乙。最後,某乙收到信封之後取出裡面的備忘錄。
實際上,封裝的程序會比上面描述的還要再複雜一點。例如:有些過大的訊息會在傳輸層被拆解成好幾個區段,而這些區段在網路層可能又會被拆成好多個資料塊。因此在收信端,這些被拆開的區段必須要想辦法從組成他們的資料塊之中被復原回來。
----
[<< 1.4 Delay, Loss, and Throughput in Packet-Switched Networks](https://hackmd.io/@kaeteyaruyo/computer-networking-1-4) | [目錄](https://hackmd.io/@kaeteyaruyo/computer-networking-index) | [1.6 Networks Under Attack >>](https://hackmd.io/@kaeteyaruyo/computer-networking-1-6)