互聯網協議入門

作者:阮一峯

來源:阮一峯的網絡日誌

我們每天使用互聯網,你是否想過,它是如何實現的?

全世界幾十億臺電腦,連接在一起,兩兩通信。上海的某一塊網卡送出信號,洛杉磯的另一塊網卡居然就收到了,兩者實際上根本不知道對方的物理位置,你不覺得這是很神奇的事情嗎?

互聯網的核心是一系列協議,總稱爲 "互聯網協議"(Internet Protocol Suite)。它們對電腦如何連接和組網,做出了詳盡的規定。理解了這些協議,就理解了互聯網的原理。

下面就是我的學習筆記。因爲這些協議實在太複雜、太龐大,我想整理一個簡潔的框架,幫助自己從總體上把握它們。爲了保證簡單易懂,我做了大量的簡化,有些地方並不全面和精確,但是應該能夠說清楚互聯網的原理。

一、概述

1.1 五層模型

互聯網的實現,分成好幾層。每一層都有自己的功能,就像建築物一樣,每一層都靠下一層支持。

用戶接觸到的,只是最上面的一層,根本沒有感覺到下面的層。要理解互聯網,必須從最下層開始,自下而上理解每一層的功能。

如何分層有不同的模型,有的模型分七層,有的分四層。我覺得,把互聯網分成五層,比較容易解釋。

如上圖所示,最底下的一層叫做 "實體層"(Physical Layer),最上面的一層叫做 "應用層"(Application Layer),中間的三層(自下而上)分別是 "鏈接層"(Link Layer)、"網絡層"(Network Layer)和 "傳輸層"(Transport Layer)。越下面的層,越靠近硬件;越上面的層,越靠近用戶。

它們叫什麼名字,其實並不重要。只需要知道,互聯網分成若干層就可以了。

1.2 層與協議

每一層都是爲了完成一種功能。爲了實現這些功能,就需要大家都遵守共同的規則。

大家都遵守的規則,就叫做 "協議"(protocol)。

互聯網的每一層,都定義了很多協議。這些協議的總稱,就叫做 "互聯網協議"(Internet Protocol Suite)。它們是互聯網的核心,下面介紹每一層的功能,主要就是介紹每一層的主要協議。

二、實體層

我們從最底下的一層開始。

電腦要組網,第一件事要幹什麼?當然是先把電腦連起來,可以用光纜、電纜、雙絞線、無線電波等方式。

這就叫做 "實體層",它就是把電腦連接起來的物理手段。它主要規定了網絡的一些電氣特性,作用是負責傳送 0 和 1 的電信號。

三、鏈接層

3.1 定義

單純的 0 和 1 沒有任何意義,必須規定解讀方式:多少個電信號算一組?每個信號位有何意義?

這就是 "鏈接層" 的功能,它在 "實體層" 的上方,確定了 0 和 1 的分組方式。

3.2 以太網協議

早期的時候,每家公司都有自己的電信號分組方式。逐漸地,一種叫做 "以太網"(Ethernet)的協議,佔據了主導地位。

以太網規定,一組電信號構成一個數據包,叫做 "幀"(Frame)。每一幀分成兩個部分:標頭(Head)和數據(Data)。

"標頭" 包含數據包的一些說明項,比如發送者、接受者、數據類型等等;"數據" 則是數據包的具體內容。

"標頭" 的長度,固定爲 18 字節。"數據" 的長度,最短爲 46 字節,最長爲 1500 字節。因此,整個 "幀" 最短爲 64 字節,最長爲 1518 字節。如果數據很長,就必須分割成多個幀進行發送。

3.3 MAC 地址

上面提到,以太網數據包的 "標頭",包含了發送者和接受者的信息。那麼,發送者和接受者是如何標識呢?

以太網規定,連入網絡的所有設備,都必須具有 "網卡" 接口。數據包必須是從一塊網卡,傳送到另一塊網卡。網卡的地址,就是數據包的發送地址和接收地址,這叫做 MAC 地址。

每塊網卡出廠的時候,都有一個全世界獨一無二的 MAC 地址,長度是 48 個二進制位,通常用 12 個十六進制數表示。

前 6 個十六進制數是廠商編號,後 6 個是該廠商的網卡流水號。有了 MAC 地址,就可以定位網卡和數據包的路徑了。

3.4 廣播

定義地址只是第一步,後面還有更多的步驟。

首先,一塊網卡怎麼會知道另一塊網卡的 MAC 地址?

回答是有一種 ARP 協議,可以解決這個問題。這個留到後面介紹,這裏只需要知道,以太網數據包必須知道接收方的 MAC 地址,然後才能發送。

其次,就算有了 MAC 地址,系統怎樣才能把數據包準確送到接收方?

回答是以太網採用了一種很 "原始" 的方式,它不是把數據包準確送到接收方,而是向本網絡內所有計算機發送,讓每臺計算機自己判斷,是否爲接收方。

上圖中,1 號計算機向 2 號計算機發送一個數據包,同一個子網絡的 3 號、4 號、5 號計算機都會收到這個包。它們讀取這個包的 "標頭",找到接收方的 MAC 地址,然後與自身的 MAC 地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種發送方式就叫做 "廣播"(broadcasting)。

有了數據包的定義、網卡的 MAC 地址、廣播的發送方式,"鏈接層" 就可以在多臺計算機之間傳送數據了。

四、網絡層

4.1 網絡層的由來

以太網協議,依靠 MAC 地址發送數據。理論上,單單依靠 MAC 地址,上海的網卡就可以找到洛杉磯的網卡了,技術上是可以實現的。

但是,這樣做有一個重大的缺點。以太網採用廣播方式發送數據包,所有成員人手一 "包",不僅效率低,而且侷限在發送者所在的子網絡。也就是說,如果兩臺計算機不在同一個子網絡,廣播是傳不過去的。這種設計是合理的,否則互聯網上每一臺計算機都會收到所有包,那會引起災難。

互聯網是無數子網絡共同組成的一個巨型網絡,很像想象上海和洛杉磯的電腦會在同一個子網絡,這幾乎是不可能的。

因此,必須找到一種方法,能夠區分哪些 MAC 地址屬於同一個子網絡,哪些不是。如果是同一個子網絡,就採用廣播方式發送,否則就採用 "路由" 方式發送。("路由" 的意思,就是指如何向不同的子網絡分發數據包,這是一個很大的主題,本文不涉及。)遺憾的是,MAC 地址本身無法做到這一點。它只與廠商有關,與所處網絡無關。

這就導致了 "網絡層" 的誕生。它的作用是引進一套新的地址,使得我們能夠區分不同的計算機是否屬於同一個子網絡。這套地址就叫做 "網絡地址",簡稱 "網址"。

於是,"網絡層" 出現以後,每臺計算機有了兩種地址,一種是 MAC 地址,另一種是網絡地址。兩種地址之間沒有任何聯繫,MAC 地址是綁定在網卡上的,網絡地址則是管理員分配的,它們只是隨機組合在一起。

網絡地址幫助我們確定計算機所在的子網絡,MAC 地址則將數據包送到該子網絡中的目標網卡。因此,從邏輯上可以推斷,必定是先處理網絡地址,然後再處理 MAC 地址。

4.2 IP 協議

規定網絡地址的協議,叫做 IP 協議。它所定義的地址,就被稱爲 IP 地址。

目前,廣泛採用的是 IP 協議第四版,簡稱 IPv4。這個版本規定,網絡地址由 32 個二進制位組成。

習慣上,我們用分成四段的十進制數表示 IP 地址,從 0.0.0.0 一直到 255.255.255.255。

互聯網上的每一臺計算機,都會分配到一個 IP 地址。這個地址分成兩個部分,前一部分代表網絡,後一部分代表主機。比如,IP 地址 172.16.254.1,這是一個 32 位的地址,假定它的網絡部分是前 24 位(172.16.254),那麼主機部分就是後 8 位(最後的那個 1)。處於同一個子網絡的電腦,它們 IP 地址的網絡部分必定是相同的,也就是說 172.16.254.2 應該與 172.16.254.1 處在同一個子網絡。

但是,問題在於單單從 IP 地址,我們無法判斷網絡部分。還是以 172.16.254.1 爲例,它的網絡部分,到底是前 24 位,還是前 16 位,甚至前 28 位,從 IP 地址上是看不出來的。

那麼,怎樣才能從 IP 地址,判斷兩臺計算機是否屬於同一個子網絡呢?這就要用到另一個參數 "子網掩碼"(subnet mask)。

所謂 "子網掩碼",就是表示子網絡特徵的一個參數。它在形式上等同於 IP 地址,也是一個 32 位二進制數字,它的網絡部分全部爲 1,主機部分全部爲 0。比如,IP 地址 172.16.254.1,如果已知網絡部分是前 24 位,主機部分是後 8 位,那麼子網絡掩碼就是 11111111.11111111.11111111.00000000,寫成十進制就是 255.255.255.0。

知道 "子網掩碼",我們就能判斷,任意兩個 IP 地址是否處在同一個子網絡。方法是將兩個 IP 地址與子網掩碼分別進行 AND 運算(兩個數位都爲 1,運算結果爲 1,否則爲 0),然後比較結果是否相同,如果是的話,就表明它們在同一個子網絡中,否則就不是。

比如,已知 IP 地址 172.16.254.1 和 172.16.254.233 的子網掩碼都是 255.255.255.0,請問它們是否在同一個子網絡?兩者與子網掩碼分別進行 AND 運算,結果都是 172.16.254.0,因此它們在同一個子網絡。

總結一下,IP 協議的作用主要有兩個,一個是爲每一臺計算機分配 IP 地址,另一個是確定哪些地址在同一個子網絡。

4.3 IP 數據包

根據 IP 協議發送的數據,就叫做 IP 數據包。不難想象,其中必定包括 IP 地址信息。

但是前面說過,以太網數據包只包含 MAC 地址,並沒有 IP 地址的欄位。那麼是否需要修改數據定義,再添加一個欄位呢?

回答是不需要,我們可以把 IP 數據包直接放進以太網數據包的 "數據" 部分,因此完全不用修改以太網的規格。這就是互聯網分層結構的好處:上層的變動完全不涉及下層的結構。

具體來說,IP 數據包也分爲 "標頭" 和 "數據" 兩個部分。

"標頭" 部分主要包括版本、長度、IP 地址等信息,"數據" 部分則是 IP 數據包的具體內容。它放進以太網數據包後,以太網數據包就變成了下面這樣。

IP 數據包的 "標頭" 部分的長度爲 20 到 60 字節,整個數據包的總長度最大爲 65,535 字節。因此,理論上,一個 IP 數據包的 "數據" 部分,最長爲 65,515 字節。前面說過,以太網數據包的 "數據" 部分,最長只有 1500 字節。因此,如果 IP 數據包超過了 1500 字節,它就需要分割成幾個以太網數據包,分開發送了。

4.4 ARP 協議

關於 "網絡層",還有最後一點需要說明。

因爲 IP 數據包是放在以太網數據包裏發送的,所以我們必須同時知道兩個地址,一個是對方的 MAC 地址,另一個是對方的 IP 地址。通常情況下,對方的 IP 地址是已知的(後文會解釋),但是我們不知道它的 MAC 地址。

所以,我們需要一種機制,能夠從 IP 地址得到 MAC 地址。

這裏又可以分成兩種情況。第一種情況,如果兩臺主機不在同一個子網絡,那麼事實上沒有辦法得到對方的 MAC 地址,只能把數據包傳送到兩個子網絡連接處的 "網關"(gateway),讓網關去處理。

第二種情況,如果兩臺主機在同一個子網絡,那麼我們可以用 ARP 協議,得到對方的 MAC 地址。ARP 協議也是發出一個數據包(包含在以太網數據包中),其中包含它所要查詢主機的 IP 地址,在對方的 MAC 地址這一欄,填的是 FF:FF:FF:FF:FF:FF,表示這是一個 "廣播" 地址。它所在子網絡的每一臺主機,都會收到這個數據包,從中取出 IP 地址,與自身的 IP 地址進行比較。如果兩者相同,都做出回覆,向對方報告自己的 MAC 地址,否則就丟棄這個包。

總之,有了 ARP 協議之後,我們就可以得到同一個子網絡內的主機 MAC 地址,可以把數據包發送到任意一臺主機之上了。

五、傳輸層

5.1 傳輸層的由來

有了 MAC 地址和 IP 地址,我們已經可以在互聯網上任意兩臺主機上建立通信。

接下來的問題是,同一臺主機上有許多程序都需要用到網絡,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎麼知道,它是表示網頁的內容,還是表示在線聊天的內容?

也就是說,我們還需要一個參數,表示這個數據包到底供哪個程序(進程)使用。這個參數就叫做 "端口"(port),它其實是每一個使用網卡的程序的編號。每個數據包都發到主機的特定端口,所以不同的程序就能取到自己所需要的數據。

"端口" 是 0 到 65535 之間的一個整數,正好 16 個二進制位。0 到 1023 的端口被系統佔用,用戶只能選用大於 1023 的端口。不管是瀏覽網頁還是在線聊天,應用程序會隨機選用一個端口,然後與服務器的相應端口聯繫。

**"傳輸層" 的功能,就是建立 "端口到端口" 的通信。相比之下,"網絡層" 的功能是建立 "主機到主機" 的通信。只要確定主機和端口,我們就能實現程序之間的交流。**因此,Unix 系統就把主機 + 端口,叫做 "套接字"(socket)。有了它,就可以進行網絡應用程序開發了。

5.2 UDP 協議

現在,我們必須在數據包中加入端口信息,這就需要新的協議。最簡單的實現叫做 UDP 協議,它的格式幾乎就是在數據前面,加上端口號。

UDP 數據包,也是由 "標頭" 和 "數據" 兩部分組成。

"標頭" 部分主要定義了發出端口和接收端口,"數據" 部分就是具體的內容。然後,把整個 UDP 數據包放入 IP 數據包的 "數據" 部分,而前面說過,IP 數據包又是放在以太網數據包之中的,所以整個以太網數據包現在變成了下面這樣:

UDP 數據包非常簡單,"標頭" 部分一共只有 8 個字節,總長度不超過 65,535 字節,正好放進一個 IP 數據包。

5.3 TCP 協議

UDP 協議的優點是比較簡單,容易實現,但是缺點是可靠性較差,一旦數據包發出,無法知道對方是否收到。

爲了解決這個問題,提高網絡可靠性,TCP 協議就誕生了。這個協議非常複雜,但可以近似認爲,它就是有確認機制的 UDP 協議,每發出一個數據包都要求確認。如果有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。

因此,TCP 協議能夠確保數據不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。

TCP 數據包和 UDP 數據包一樣,都是內嵌在 IP 數據包的 "數據" 部分。TCP 數據包沒有長度限制,理論上可以無限長,但是爲了保證網絡的效率,通常 TCP 數據包的長度不會超過 IP 數據包的長度,以確保單個 TCP 數據包不必再分割。

六、應用層

應用程序收到 "傳輸層" 的數據,接下來就要進行解讀。由於互聯網是開放架構,數據來源五花八門,必須事先規定好格式,否則根本無法解讀。

"應用層" 的作用,就是規定應用程序的數據格式。

舉例來說,TCP 協議可以爲各種各樣的程序傳遞數據,比如 Email、WWW、FTP 等等。那麼,必須有不同協議規定電子郵件、網頁、FTP 數據的格式,這些應用程序協議就構成了 "應用層"。

這是最高的一層,直接面對用戶。它的數據就放在 TCP 數據包的 "數據" 部分。因此,現在的以太網的數據包就變成下面這樣。

至此,整個互聯網的五層結構,自下而上全部講完了。這是從系統的角度,解釋互聯網是如何構成的。

下面,我反過來,從用戶的角度,自上而下看看這個結構是如何發揮作用,完成一次網絡數據交換的。至此,整個互聯網的五層結構,自下而上全部講完了。這是從系統的角度,解釋互聯網是如何構成的。下一篇,我反過來,從用戶的角度,自上而下看看這個結構是如何發揮作用,完成一次網絡數據交換的。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/AmBAAgRXsEV8mzxfJHxzww