1. 程式人生 > 實用技巧 >3.OSI開放式系統互聯通訊參考模型

3.OSI開放式系統互聯通訊參考模型

網際網路分層模型

網際網路的邏輯實現被分為好幾層。每一層都有自己的功能,就像建築物一樣,每一層都靠下一層支援。使用者接觸到的只是最上面的那一層,根本不會感覺到下面的幾層。要理解網際網路就需要自下而上理解每一層的實現的功能。osi七層模型如上圖所示,網際網路按照不同的模型劃分會有不用的分層,但是不論按照什麼模型去劃分,越往上的層越靠近使用者,越往下的層越靠近硬體。在軟體開發中使用最多的是將網際網路劃分為五個分層的模型。

接下來我們一層一層的自底向上介紹一下每一層。

物理層

我們的電腦要與外界網際網路通訊,需要先把電腦連線網路,我們可以用雙絞線、光纖、無線電波等方式。這就叫做”實物理層”,它就是把電腦連線起來的物理手段。它主要規定了網路的一些電氣特性,作用是負責傳送0和1的電訊號。

資料鏈路層

單純的0和1沒有任何意義,所以我們使用者會為其賦予一些特定的含義,規定解讀電訊號的方式:例如:多少個電訊號算一組?每個訊號位有何意義?這就是”資料鏈接層”的功能,它在”物理層”的上方,確定了物理層傳輸的0和1的分組方式及代表的意義。早期的時候,每家公司都有自己的電訊號分組方式。逐漸地,一種叫做"乙太網"(Ethernet)的協議,佔據了主導地位。

乙太網規定,一組電訊號構成一個數據包,叫做"幀"(Frame)。每一幀分成三個部分:幀頭、資料、幀尾。
幀頭包含有源MAC地址和目標MAC地址各佔6個位元組,以及型別欄位佔4個位元組,裡面包含的資訊用來標誌上一層使用的是什麼協議,以便接收端把收到的MAC幀的資料部分上交給上一層的這個協議。

資料部分只有一個欄位,其長度在46到1500位元組之間,包含的資訊是網路層傳下來的資料。
幀尾也只有一個欄位,長度為4個位元組,包含有幀校驗序列(讓接收幀的網絡卡或介面判斷是否發生了錯誤)。
因此,整個"幀"最短為64位元組,最長為1518位元組。如果資料很長,就必須分割成多個幀進行傳送。

通過以上可以發現,傳送者和接受者是MAC地址去標識的。我們一般通過ARP協議來獲取接受方的MAC地址,有了MAC地址之後,如何把資料準確的傳送給接收方呢?其實這裡乙太網採用了一種很”原始”的方式,它不是把資料包準確送到接收方,而是向本網路內所有計算機都發送,讓每臺計算機讀取這個包的幀頭,找到接收方的MAC地址,然後與自身的MAC地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種傳送方式叫”廣播”(broadcasting)。

網路層

按照乙太網協議的規則我們可以依靠MAC地址來向外傳送資料。理論上依靠MAC地址,你電腦的網絡卡就可以找到身在世界另一個角落的某臺電腦的網絡卡了,但是這種做法有一個重大缺陷就是乙太網採用廣播方式傳送資料包,所有成員人手一”包”,不僅效率低,而且傳送的資料只能侷限在傳送者所在的子網路。也就是說如果兩臺計算機不在同一個子網路,廣播是傳不過去的。這種設計是合理且必要的,因為如果網際網路上每一臺計算機都會收到網際網路上收發的所有資料包,那是不現實的。

因此,必須找到一種方法區分哪些MAC地址屬於同一個子網路,哪些不是。如果是同一個子網路,就採用廣播方式傳送,否則就採用”路由”方式傳送。這就導致了”網路層”的誕生。它的作用是引進一套新的地址,使得我們能夠區分不同的計算機是否屬於同一個子網路。這套地址叫”網路地址”,簡稱”網址”。

“網路層”出現以後,每臺計算機有了兩種地址,一種是MAC地址,另一種是網路地址。兩種地址之間沒有任何聯絡,MAC地址是繫結在網絡卡上的,網路地址則是網路管理員分配的。網路地址幫助我們確定計算機所在的子網路,MAC地址則將資料包送到該子網路中的目標網絡卡。因此,從邏輯上可以推斷,必定是先處理網路地址,然後再處理MAC地址。

規定網路地址的協議,叫IP協議。它所定義的地址,被稱為IP地址。目前,廣泛採用的是IP協議第四版,簡稱IPv4。IPv4這個版本規定,網路地址由32個二進位制位組成,我們通常習慣用分成四段的十進位制數表示IP地址,從0.0.0.0一直到255.255.255.255。

根據IP協議傳送的資料,叫IP資料包。IP資料包也分為"包頭"和"資料"兩個部分:"包頭"部分主要包括版本、長度、IP地址等資訊,"資料"部分則是IP資料包的具體內容。IP資料包的"包頭"部分的長度為20到60位元組,整個資料包的總長度最大為65535位元組。

傳輸層

有了MAC地址和IP地址,我們已經可以在網際網路上任意兩臺主機上建立通訊。但問題是同一臺主機上會有許多程式都需要用網路收發資料,比如QQ和瀏覽器這兩個程式都需要連線網際網路並收發資料,我們如何區分某個資料包到底是歸哪個程式的呢?也就是說,我們還需要一個引數,表示這個資料包到底供哪個程式(程序)使用。這個引數就叫做”埠”(port),它其實是每一個使用網絡卡的程式的編號。每個資料包都發到主機的特定埠,所以不同的程式就能取到自己所需要的資料。

“埠”是0到65535之間的一個整數,正好16個二進位制位。0到1023的埠被系統佔用,使用者一般選用大於1023的埠。有了IP和埠我們就能實現唯一確定網際網路上一個程式,進而實現網路間的程式通訊。

我們必須在資料包中加入埠資訊,這就需要新的協議。最簡單的實現叫做UDP協議,它的格式幾乎就是在資料前面,加上埠號。UDP資料包,也是由"包頭"和"資料"兩部分組成:"包頭"部分主要定義了發出埠和接收埠,"資料"部分就是具體的內容。UDP資料包非常簡單,"包頭"部分一共只有8個位元組,總長度不超過65,535位元組,正好放進一個IP資料包。

UDP協議的優點是比較簡單,容易實現,但是缺點是可靠性較差,一旦資料包發出,無法知道對方是否收到。為了解決這個問題,提高網路可靠性,TCP協議就誕生了。TCP協議能夠確保資料不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。TCP資料包沒有長度限制,理論上可以無限長,但是為了保證網路的效率,通常TCP資料包的長度不會超過IP資料包的長度,以確保單個TCP資料包不必再分割。

應用層

應用程式收到”傳輸層”的資料,接下來就要對資料進行解包。由於網際網路是開放架構,資料來源五花八門,必須事先規定好通訊的資料格式,否則接收方根本無法獲得真正傳送的資料內容。”應用層”的作用就是規定應用程式使用的資料格式,例如我們TCP協議之上常見的Email、HTTP、FTP等協議,由這些協議組成網際網路協議的應用層。

如下圖所示,傳送方的HTTP資料經過網際網路的傳輸過程中會依次新增各層協議的標頭資訊,接收方收到資料包之後再依次根據協議解包得到資料。