天天看點

網際網路協定入門(一)

我們每天使用網際網路,你是否想過,它是如何實作的?

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

網際網路的核心是一系列協定,總稱為"網際網路協定"(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 以太網協定

以太網規定,一組電信号構成一個資料包,叫做"幀"(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資料包的"資料"部分。是以,現在的以太網的資料包就變成下面這樣。

網際網路協定入門(一)

繼續閱讀