互連網協議入門(一) 本文來自“阮一峰的部落格”,歡迎點擊閱讀原文
我們每天使用互連網,你是否想過,它是如何?的。
全世界幾十億台電腦,串連在一起,兩兩通訊。上海的某一塊網卡送出訊號,洛杉磯的另一塊網卡居然就收到了,兩者實際上根本不知道對方的物理位置,你不覺得這是很神奇的事情嗎。
互連網的核心是一系列協議,總稱為"互連網協議"(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地址是綁定在網卡上的,網路地址則是管理員分配的,它們只是隨機組合在一起。