internet 協議入門

JuanWhitcom 8年前發布 | 8K 次閱讀 網關 DHCP 網絡技術

前言

勞于讀書,逸于作文。

在這篇文章里通過抓包,具體的分析了不同網絡協議的傳送的數據和傳送的方式。而此篇文章則用來作為一個大綱式的內容,按照層級劃分,逐步介紹各層級的協議以及他們所起的作用。若有錯誤之處,歡迎批評指正。

正文

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. 物理層

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

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

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

3. 數據鏈路層

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

3.1 定義

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

這就是數據鏈路層的功能,規定這些電信號的分組方式。

3.2 以太網協議

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

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

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

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

3.3 MAC地址

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

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

網卡的地址,就是數據包的發送地址和接收地址,這叫做MAC地址。

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

3.4 廣播

我們現在有了網卡,也知道每一塊網卡都有一個世界上獨一無二的Mac地址,那發送者應該怎么去找接受者這臺設備呢,換句話說發送者怎么才能知道接受者的Mac地址呢?這就需要另一個協議了叫做ARP協議,這個協議留在后面介紹。這里我們只需要知道,發送者必須要知道接受者的Mac地址才能準確的發送數據。

以太網采用了一種廣撒網的方式,發送者發送的數據包會發送給本網絡內所有的計算機,然后由接收到數據包的計算機來判斷自己是不是接收方。

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

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

4.網絡層

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

4.1 網絡層的產生

走到這里我們實現的只是在一個子網絡里傳送數據。但我們知道,互聯網實際上是由大大小小的子網絡組成的:

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

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

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

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

4.2 IP協議

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

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

由于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地址長這樣:

“標頭”部分主要包括版本、長度、IP地址等信息,”數據”部分則是IP數據包的具體內容。

現在把它加到以太網數據包里面:

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數據包同樣是由標頭和數據組成:

標頭 部分主要定義了發出端口和接收端口, 數據 部分定義了具體的內容。然后把它放在IP地址數據包的數據部分,前面我們說過IP數據包是放在以太網數據包的數據里面的,那么現在整個以太網數據包就成了這樣:

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數據包的”數據”部分。因此,現在的以太網的數據包就變成下面這樣:

上面買的坑改填了,我們前面說過,我們對于目標主機的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端口):

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

6.2 網關

網關要區別于路由器(由于歷史的原因,許多有關TCP/IP的文獻曾經把網絡層使用的路由器(英語:Router)稱為網關,在今天很多局域網采用都是路由來接入網絡,因此現在通常指的網關就是路由器的IP),經常在家庭中或者小型企業網絡中使用,用于連接局域網和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上網設置界面:

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

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

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

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

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

  • (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協議有較為詳細的分析,在這里就不多做介紹了。

后記

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

 

 

來自:http://mp.weixin.qq.com/s/UJYysKrg3ZHnUWrHSHp36A

 

 本文由用戶 JuanWhitcom 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!