internet 協議入門

Damonare發表於2016-11-05

前言

勞於讀書,逸於作文。

原文地址:internet協議入門

博主部落格地址:Damonare的個人部落格

博主之前寫過一篇部落格:網路協議分析,在這篇部落格裡通過抓包,具體的分析了不同網路協議的傳送的資料和傳送的方式。而此篇部落格則用來作為一個大綱式的內容,按照層級劃分,逐步介紹各層級的協議以及他們所起的作用。若有錯誤之處,歡迎批評指正。

正文

1.概述

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

1.1 模型劃分

首先我們需要明白的事網際網路的實現是分層級的,那麼這個層級的劃分根據不同的模型又有一些不同。其中又有兩個模型的劃分是我們最常見到的,一個是OSI七層劃分,另一個是TCP/IP五層劃分。他們分別把網際網路分成了七層和五層。

OSI和TCP/IP模型是很基礎但又非常重要的網路基礎知識

OSI七層模型

OSI的層 功能 TCP/IP協議族
應用層 檔案傳輸,電子郵件,檔案服務,虛擬終端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示層 資料格式化,程式碼轉換,資料加密 沒有協議
會話層 解除或建立與別的接點的聯絡 沒有協議
傳輸層 提供端對端的介面 TCP,UDP
網路層 為資料包選擇路由 IP,ICMP,RIP,OSPF,BGP,IGMP
資料鏈路層 傳輸有地址的幀以及錯誤檢測功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理層 以二進位制資料形式在物理媒體上傳輸資料 ISO2110,IEEE802,IEEE802.2

1.2 層與協議

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

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

這個協議就是我們所說的網際網路協議(internet protocol),每一層都有若干個協議,他們共同構成了我們所要講的網際網路協議。

由以上表格我們可以看出,在OSI七層協議模型裡會話層和表示層是沒有協議的,這裡我們取的是TCP/IP模型,分成五層也比較容易解釋。

那麼這五層又都是什麼呢?從上到下分別是:

層級 網路裝置
應用層  也就是使用者使用的應用了。
傳輸層 四層交換機、也有工作在四層的路由器
網路層 路由器、三層交換機
資料鏈路層 網橋(現已很少使用)、乙太網交換機(二層交換機)、網路卡(其實網路卡是一半工作在物理層、一半工作在資料鏈路層)
物理層 網路卡,光纖,CAT-5線,中繼器、集線器、還有我們通常說的雙絞線也工作在物理層

如上表格所示,最底下的一層叫做物理層(Physical Layer),最上面的一層叫做應用層(Application Layer),中間的三層(自下而上)分別是資料鏈路層(Data Link Layer)、網路層(Network Layer)和傳輸層(Transport Layer)。越下面的層,越靠近硬體;越上面的層,越靠近使用者。下面來介紹每一層的功能,著重介紹每一層的主要協議

2. 物理層

物理層規定:為傳輸資料所需要的物理鏈路建立、維持、拆除,而提供具有機械的,電子的,功能的和規範的特性 ——物理層(維基百科)

上面維基百科對於物理層的解釋說白了就是要把電腦連在一塊,方法呢,可以用光纜、電纜、雙絞線、無線電波等方式。

internet 協議入門
物理層連線

物理層就是把電腦連線起來的物理手段。它主要規定了網路的一些電氣特性,作用是負責傳送0和1的電訊號。

3. 資料鏈路層

在兩個網路實體之間提供資料鏈路連線的建立、維持和釋放管理。構成資料鏈路資料單元(frame:資料幀或幀),並對幀定界、同步、收發順序的控制。 ——資料鏈路層(維基百科)

3.1 定義

上面說的網路實體也就是我們日常用到的手機電腦等聯網裝置了,我們剛剛瞭解到不同網路實體之間通過一些物理手段(光纜,雙絞線,無線電波等)連線在了一起,來進行傳輸0和1電訊號。單純的傳輸0和1沒有任何意義,肯定是要規定電訊號的解讀方式,多少個電訊號是一組?每一組代表的意義又是什麼?

這就是資料鏈路層的功能,規定這些電訊號的分組方式。

3.2 乙太網協議

剛剛開始的時候,每一家公司都有自己的一套對於電訊號的解讀方式,後來隨著時間的推移,一種叫做乙太網(Ethernet)的協議,佔據了主導地位。

乙太網規定,一組電訊號構成一個資料包,叫做"幀"(Frame)。每一幀分成兩個部分:標頭(Head)和資料(Data)。

internet 協議入門
乙太網資料包

標頭包含資料包的一些說明項,比如傳送者、接受者、資料型別等等;資料則是資料包的具體內容。

標頭的長度,固定為18位元組。資料的長度,最短為46位元組,最長為1500位元組。因此,整個最短為64位元組,最長為1518位元組。如果資料很長,就必須分割成多個進行傳送。

3.3 MAC地址

我想在日常上網過程中,最為熟悉的就是用一根網線連線埠和電腦了吧,網線連線電腦實際上是連線的這個玩意兒:

internet 協議入門
網路卡

上面就是我們所說的網路卡了,它在物理層和資料鏈路層兩個層級工作,正所謂能力越大責任越大,網路卡的重要性自然不言而喻了。前面說,乙太網規定每一個資料包都有一個標頭(Head)來說明傳送者,接受者資訊,資料型別等資訊。而網路卡就是乙太網規定的來標明傳送者和接受者資訊的工具。

網路卡的地址,就是資料包的傳送地址和接收地址,這叫做MAC地址。

這個Mac地址自然就是傳送者,接受者資訊的了,通過這個每臺電腦獨一無二的地址計算機就能通過一些方式找到另一臺電腦了。每塊網路卡出廠的時候,都有一個全世界獨一無二的MAC地址,長度是48個二進位制位,通常用12個十六進位制數表示。有了MAC地址,就可以定位網路卡和資料包的路徑了。

3.4 廣播

我們現在有了網路卡,也知道每一塊網路卡都有一個世界上獨一無二的Mac地址,那傳送者應該怎麼去找接受者這臺裝置呢,換句話說傳送者怎麼才能知道接受者的Mac地址呢?這就需要另一個協議了叫做ARP協議,這個協議留在後面介紹。這裡我們只需要知道,傳送者必須要知道接受者的Mac地址才能準確的傳送資料。

乙太網採用了一種廣撒網的方式,傳送者傳送的資料包會傳送給本網路內所有的計算機,然後由接收到資料包的計算機來判斷自己是不是接收方。

internet 協議入門
廣播

圖片來自維基百科廣播),如圖所示,紅色主機是傳送方,綠色某一臺是接收方,資料包會傳送給同一個子網路的所有綠色主機,然後由綠色主機根據資料包的標頭來判斷自己是不是接收方。如果是,就接受這個包,不是則丟棄。這種傳送資料的方式就是廣播

綜上,有了對於資料包的定義,網路卡的Mac地址,廣播的傳送方式,資料鏈路層基本就算完整了,然後不同計算機之間就可以傳送資料了。

4.網路層

網路層使兩終端系統能夠互連且決定最佳路徑,並具有一定的擁塞控制和流量控制的能力。 ——網路層(維基百科)

4.1 網路層的產生

走到這裡我們實現的只是在一個子網路裡傳送資料。但我們知道,網際網路實際上是由大大小小的子網路組成的:

internet 協議入門
網際網路

大到一個ISP(因特網服務提供商,國內較大的比如移動電信等),小到一個公司的區域網,正事這些大大小小的子網路組成了龐大的網際網路體系。但實際上,廣播的方式只能在子網路內進行,不同子網路之間廣播方式是行不通的。

因此我們需要一種方法能夠判斷兩臺主機是否在同一個子網路之內,如果在同一個子網路就以廣播的方式傳輸資料,如果不在同一個子網路就以路由的方式傳輸(路由是個比較大的概念,本文不涉及),關於路由協議的瞭解戳這裡,MAC地址做不到這一點,它只和廠商有關,和計算機所處的網路並沒有關係。

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

網址的出現,使得每臺計算機都有了兩個地址,一個是出生就帶著不會改變的Mac地址,一個是後期網路管理員分配的可變的網路地址。網址判斷兩臺計算機是否在同一個子網路,Mac地址則是將資料準確的傳遞到目標計算機中。因此邏輯上可以判斷必定是先處理網路地址,再處理Mac地址。

4.2 IP協議

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

現在廣泛採用的是IP協議第四版,簡稱IPv4。這個版本規定,網路地址由32個二進位制位組成,IPV6則是64個二進位制組成。

internet 協議入門
IP地址

由於IPV6還沒有廣泛應用,這裡還是用IPV4講解。一般我們用分成四段(IPV6分成八段)的十進位制數表示IP地址,從0.0.0.0一直到255.255.255.255。這個地址分成兩部分,前一部分是網路部分,後一部分代表主機。But!!!網路部分具體是前16位還是前24位,我們沒法從IP地址進行判斷,這是我們就需要另一引數叫做子網掩碼

所謂"子網掩碼",就是表示子網路特徵的一個引數。它在形式上等同於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地址放在哪裡儲存呢?是的,我們可以直接儲存在前面提到的乙太網資料包的Data部分。

IP地址長這樣:

internet 協議入門
IP資料包

"標頭"部分主要包括版本、長度、IP地址等資訊,"資料"部分則是IP資料包的具體內容。
現在把它加到乙太網資料包裡面:

internet 協議入門
乙太網資料包

IP資料包的"標頭"部分的長度為20到60位元組,整個資料包的總長度最大為65,535位元組。因此,理論上,一個IP資料包的"資料"部分,最長為65,515位元組。前面說過,乙太網資料包的"資料"部分,最長只有1500位元組。因此,如果IP資料包超過了1500位元組,它就需要分割成幾個乙太網資料包,分開傳送了。

4.3 ARP協議

現在為止我們必須知道兩個地址,一個是IP地址,一個是Mac地址才能把資料傳送到目標主機,那麼IP地址是已知的(後文解釋),MAC地址怎麼獲取呢?

我們需要一種能通過IP地址得知MAC地址的機制,這個極致就是ARP協議。

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

另一種情況是兩臺計算機不在同一個子網路,
那麼事實上沒有辦法得到對方的MAC地址,只能把資料包傳送到兩個子網路連線處的"閘道器"(gateway),讓閘道器(後文解釋)去處理。

4.4總結

這一層為止,如果目標主機和本機在同一個子網路,我們通過IP地址,子網掩碼比較得出在同一個子網路的結果,在通過ARP協議得到目標主機的Mac地址,傳送!Success!

如果目標主機和本機不在同一個子網路,我們通過IP地址,子網掩碼比較得出在同一個子網路的結果,然後交給本網路的閘道器A處理,閘道器A根據路由協議得到目標主機所在子網路的閘道器B,閘道器B再通過IP地址判斷得出和目標主機在同一個子網路,然後再通過ARP協議獲取Mac地址,傳送!Success!

5. 傳輸層

該層的協議為應用程式提供端到端的通訊服務。它提供面向連線的資料流支援、可靠性、流量控制、多路複用等服務。——傳輸層(維基百科)

5.1 傳輸層的產生

我們現在成功的實現了主機和主機之間的通訊,那麼問題又來了,主機之間不同的程式該怎麼區分這個資料是不是傳送給自己的呢。要知道,當你正在QQ聊天的時候,微信傳送過來的訊息內容呈現在了QQ介面,這會讓計算機懵逼的!太混亂了!

這個時候我們就需要一個新的引數了!這個引數就是

可連線兩個或兩個以上不同之電路裝置使之能夠傳遞電子或任何形式訊號之裝置.——埠(維基百科)

它其實是每一個使用網路卡的程式的編號。每個資料包都發到主機的特定埠,所以不同的程式就能取到自己所需要的資料。

不同的程式在計算機中所佔用的埠是不同的,確切的說是不能相同的,否則就混亂了。比如,HTTP所佔用的埠一般是80,HTTPS所佔用的埠一般是443。

是0到65535之間的一個整數,正好16個二進位制位。0到1023的被系統佔用,使用者只能選用大於1023的。不管是瀏覽網頁還是線上聊天,應用程式會隨機選用一個,然後與伺服器的相應聯絡。

確切的說,傳輸層實現的是端對端的服務,網路層實現的僅僅是主機到主機之間的服務。只要確定主機和埠,我們就能實現程式之間的交流。因此,Unix系統就把主機+埠,叫做"套接字"(socket)。

5.2 UDP協議

現在又出了一個新的資料,就是埠資訊。現在乙太網資料包裡已經包括髮送者,接受者資訊,資料型別,IP地址資料包,UDp資料包。

UDP資料包同樣是由標頭和資料組成:

internet 協議入門
UDP資料包

標頭部分主要定義了發出埠和接收埠,
資料部分定義了具體的內容。然後把它放在IP地址資料包的資料部分,前面我們說過IP資料包是放在乙太網資料包的資料裡面的,那麼現在整個乙太網資料包就成了這樣:

internet 協議入門
乙太網資料包

UDP資料包非常簡單,"標頭"部分一共只有8個位元組,總長度不超過65,535位元組,一個IP資料包正好可以容納。

5.3 TCP協議

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

因此,TCP協議能夠確保資料不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。
TCP資料包和UDP資料包一樣,都是內嵌在IP資料包的"資料"部分。TCP資料包沒有長度限制,理論上可以無限長,但是為了保證網路的效率,通常TCP資料包的長度不會超過IP資料包的長度,以確保單個TCP資料包不必再分割。

關於TCP協議的三次握手和四次揮手過程博主在網路協議分析這篇部落格裡有較為詳細的說明。

6. 應用層

應用層直接和應用程式介面並提供常見的網路應用服務。 ——應用層(維基百科)

6.1 應用層介紹

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

"應用層"的作用,就是規定應用程式的資料格式。

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

這是最高的一層,直接面對使用者。它的資料就放在TCP資料包的"資料"部分。因此,現在的乙太網的資料包就變成下面這樣:

internet 協議入門
乙太網資料包

上面買的坑改填了,我們前面說過,我們對於目標主機的IP地址肯定知道的,為什麼呢?還有就是當兩臺計算機不在同一個子網路的時候,我們需要通過本機所在子網路的閘道器A,再通過路由協議得到目標主機子網路的閘道器B,由閘道器B將我們要傳送給目標主機的資料包傳送給目標主機。那麼,閘道器又是什麼呢?

6.2 DNS協議

我們都知道由於IP地址不方便記憶,我們創造了域名這個概念。

DNS(網域名稱系統,Domain Name System,有時也簡稱為域名)是因特網的一項核心服務,它作為可以將域名和IP地址相互對映的一個分散式資料庫,能夠使人更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP地址數串。

例如,damonare.cn是一個域名,和IP地址119.29.180.47相對應。DNS就像是一個自動的電話號碼簿,我們可以直接撥打damonare的名字來代替電話號碼(IP地址)。我們直接呼叫網站的名字以後,DNS就會將便於人類使用的名字(如 damonare.cn)轉化成便於機器識別的IP地址(如119.29.180.47)。

已知DNS伺服器為8.8.8.8(這個和IP地址一樣管理員告知或是通過自行設定的),於是我們向這個地址傳送一個DNS資料包(53埠):

internet 協議入門
乙太網資料包

DNS伺服器做出響應,告訴我們Google的IP地址是172.194.72.105。於是,我們知道了對方的IP地址。

6.2 閘道器

閘道器要區別於路由器(由於歷史的原因,許多有關TCP/IP的文獻曾經把網路層使用的路由器(英語:Router)稱為閘道器,在今天很多區域網採用都是路由來接入網路,因此現在通常指的閘道器就是路由器的IP),經常在家庭中或者小型企業網路中使用,用於連線區域網和Internet。

internet 協議入門
閘道器作用

前面我們已經說過傳送乙太網資料包,需要知道兩個地址:

  • 對方的MAC地址
  • 對方的IP地址

有了這兩個地址,資料包才能準確送到接收者手中。但是,前面說過,MAC地址有侷限性,如果兩臺電腦不在同一個子網路,就無法知道對方的MAC地址,必須通過閘道器(gateway)轉發。

上圖中,1號電腦要向4號電腦傳送一個資料包。它先判斷4號電腦是否在同一個子網路,結果發現不是(後文介紹判斷方法),於是就把這個資料包發到閘道器A。閘道器A通過路由協議,發現4號電腦位於子網路B,又把資料包發給閘道器B,閘道器B再轉發到4號電腦。

6.3 DHCP協議

新買的電腦通常你必須做一些設定,才能上網,有時,管理員(或者ISP)會告訴你下面四個引數,你把它們填入作業系統,計算機就能連上網了:

  • 本機的IP地址
  • 子網掩碼
  • 閘道器的IP地址
  • DNS的IP地址

由於它們是給定的,計算機每次開機,都會分到同樣的IP地址,所以這種情況被稱作"靜態IP地址上網"。如下圖Window靜態IP上網設定介面:

internet 協議入門

這樣的設定很專業,但普通使用者望而生畏,而且如果一臺電腦的IP地址保持不變,其他電腦就不能使用這個地址,不夠靈活。出於這兩個原因,大多數使用者使用"動態IP地址上網"。

動態IP地址上網使用的協議就是DHCP協議,這個協議規定,每一個子網路中,有一臺計算機負責管理本網路的所有IP地址,它叫做"DHCP伺服器"。新的計算機加入網路,必須向"DHCP伺服器"傳送一個"DHCP請求"資料包,申請IP地址和相關的網路引數。

前面說過,如果兩臺計算機在同一個子網路,必須知道對方的MAC地址IP地址,才能傳送資料包。但是,新加入的計算機不知道這兩個地址,怎麼傳送資料包呢?

DHCP協議做了一些巧妙的規定。

首先DHCP協議是建立在UDP協議之上,所以整個資料包是這樣的:

internet 協議入門
乙太網資料包

  • (1).最前面的"乙太網標頭",設定發出方(本機)的MAC地址和接收方(DHCP伺服器)的MAC地址。前者就是本機網路卡的MAC地址,後者這時不知道,就填入一個廣播地址:FF-FF-FF-FF-FF-FF。
  • (2).後面的"IP標頭",設定發出方的IP地址和接收方的IP地址。這時,對於這兩者,本機都不知道。於是,發出方的IP地址就設為0.0.0.0,接收方的IP地址設為255.255.255.255。
  • (3).最後的"UDP標頭",設定發出方的埠和接收方的埠。這一部分是DHCP協議規定好的,發出方是68埠,接收方是67埠。

這個資料包構造完成後,就可以發出了。乙太網是廣播傳送,同一個子網路的每臺計算機都收到了這個包。因為接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是發給誰的,所以每臺收到這個包的計算機,還必須分析這個包的IP地址,才能確定是不是發給自己的。當看到發出方IP地址是0.0.0.0,接收方是255.255.255.255,於是DHCP伺服器知道"這個包是發給我的",而其他計算機就可以丟棄這個包。

接下來,DHCP伺服器讀出這個包的資料內容,分配好IP地址,傳送回去一個"DHCP響應"資料包。這個響應包的結構也是類似的,乙太網標頭的MAC地址是雙方的網路卡地址,IP標頭的IP地址是DHCP伺服器的IP地址(發出方)和255.255.255.255(接收方),UDP標頭的埠是67(發出方)和68(接收方),分配給請求端的IP地址和本網路的具體引數則包含在Data部分。

新加入的計算機收到這個響應包,於是就知道了自己的IP地址、子網掩碼、閘道器地址、DNS伺服器等等引數。

6.4 小結

應用層比較重要的協議還有大名鼎鼎的HTTP協議,這個在博主的網路協議分析這篇部落格裡對於TCP/HTTP協議有較為詳細的分析,在這裡就不多做介紹了。

後記

通過整篇部落格分析,我想整個網際網路的層級劃分就很清楚了,也應該明白了資料是如何傳送的,大概的過程就是如此,但網際網路協議浩如煙海究極一生可能也無法真正理解。此篇部落格僅僅作為一個入門,也算是一個大致的思路。關於資料包資料具體的形式,路由,以及其他協議就需要讀者自己去進一步發掘理解了。

參考文章:

相關文章