簡單認識網絡協議

簡單認識網絡協議

通過淺談互聯網協議,我們已經瞭解了TCP/IP的參考模型,對網絡的分層管理有了有一個概念。我們知道計算機之間的通信,靠的就是這些互聯網協議(IPS,Internet Protocol Suite)來保障的。下面我們將通過最底層數據鏈路層到最頂層應用層,來簡單的瞭解一下計算機通信的背後到底是怎麼樣子。

0x01 數據鏈路層

​ 我們的電腦如果想要上網,首先要幹嘛?想必大家會吧。我們要麼連接WiFi,要麼插根網線。之後我們就可以在廣闊的物聯網上衝浪,瀏覽瀏覽新聞,刷刷B站…(打住,迴歸正題。)網線,WiFi,無非就是我們把電腦連接起來的方式。利用這些電氣屬性,我們可以發送和接受0,1信號。這樣計算機之間就建立了聯繫。

​ 能發送0/1信號,計算機就可以進行交流了,最初的時候,各家都有各個的語言,但計算機又不像我們人類一樣能學會多種語言。它有點笨,不能同時掌握多種方式的0/1信號的解讀方式。

但慢慢地,一種叫做"以太網"(Ethernet)的協議出現了,並佔據了主導地位。

以太網協議

​ 以太網規定了一種電信號的分組方式,一組電信號構成一個數據包,稱做以太網幀 ( Frame )

../_images/97c13f044de260baf0ed8051091dd251.png

​ 以太網幀,分爲 頭部 ( Header )、 數據 ( Data )以及 校驗和 ( Checksum )總共 3 大部分。

頭部包含數據包的一些說明項,比如發送者、接受者、數據類型等等,頭部固定爲18個字節頭部依次是一個 6 字節長的 目的地址 ,用於標記數據由哪臺機器接收; 一個 6 字節長的 源地址 ,用於標記數據由哪臺機器發送; 一個 2 字節長的 類型 ,用於標記數據包該如何處理, 最後**4**字節表示承載的是一個 IP 包。

數據 可以是任何需要發送的信息,長度可變, 461500 個字節。 數據還有另一個稱謂, 叫做負荷 ( Payload )。

網卡

​ 每臺計算機進行網線通訊,都要藉助一個硬件設備,網卡,簡稱NICNICNetwork Interface Controller 的縮寫。網卡則負責將比特流轉換成電信號發送出去和將檢測到的電信號轉換成比特流並接收。

​ 發送數據時,內核協議棧負責封裝以太網幀( 目的地址 、源地址 、類型和數據並計算校驗和),並調用網卡驅動發送; 接收數據時,負責驗證目的地址、校驗和並取出數據部分,交由上層協議棧處理。

MAC地址


​ 以太網數據包的頭部包含了發送者和接受者的信息。那麼如何標識發送者和接受者呢?這時就要用到MAC地址了。每塊網卡出廠時,預先分配了一個全球唯一的 MAC地址 ,並燒進硬件。有些設備也支持更改MAC地址。以太網規定,連入網絡的所有設備,都必須具有"網卡"接口。數據包必須是從一塊網卡,傳送到另一塊網卡。而網卡的地址,就是數據包的發送地址和接收地址,就是MAC地址。所以說有了MAC地址,就可以定位網卡和數據包的路徑了。

MAC 地址 6 個字節可以劃分成兩半部分:

  • 3 字節長的 廠商代碼 ( OUI ),由國際組織分配給不同的網絡設備商;
  • 3 字節長的 序列號 ( SN ),由廠商分配給其生產的網絡設備,也就是流水號;

​ MAC地址採用冒分十進制來表示,比如00:1A:3F:F1:4C:C6。冒分十六進制總共需要 17 個字節。 如果算上結尾處的 \0 ,則是18個,相當於擴大了三倍。

數據廣播


​計算機採用廣播的方式發送數據包,它不是把數據包準確送到接收方,而是向本網絡內所有計算機發送,讓每臺計算機自己判斷,是否爲接收方。如上圖中,1號計算機2號計算機發送一個數據包,同一個子網絡的3號、4號、5號計算機都會收到這個數據包。然後它們讀取這個包的"頭部",找到接收方的MAC地址,然後與自身的MAC地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種發送方式就叫做**“廣播”(broadcasting)**.

0x02 網絡互連層

數據鏈路層侷限性

​ 理論上,通過以太網協議,靠MAC地址可以完成任意一臺計算機的通訊,但是世界範圍上的計算機規模巨大。若以太網採用廣播方式發送數據包,互聯網上每一臺計算機都會收到所有包,那會引起災難。引發廣播風暴。而且保證所有計算機在同一子網,也是一大難題。

​ 所以必須找到一種方法,能夠區分哪些MAC地址屬於同一個子網絡,哪些不是。如果是同一個子網絡,就採用廣播方式發送,否則就採用路由方式發送。

​ 爲了解決數據鏈路層的侷限性,引入了新的一層,以及新的地址。也就是網絡互聯層 ,新的地址就是 網絡層地址 。 在網絡層轉發數據的中間節點,稱爲 、網絡層路由 。 網絡層主要職責在於:實現全球尋址以及數據路由 。

​ 每臺參與網絡通訊的計算機分配一個唯一的地址,即網絡層地址 。網絡層地址按網絡拓撲分配,保證組織內部的地址是連續的。

​ 於是網絡層出現以後,每臺計算機有了兩種地址,一種是MAC地址,另一種是網絡地址。兩種地址之間沒有任何聯繫,MAC地址是綁定在網卡上的,網絡地址則是管理員分配的,它們只是隨機組合在一起。網絡地址幫助我們確定計算機所在的子網絡,MAC地址則將數據包送到該子網絡中的目標網卡。

IP協議

IP(Internet Protocol , 互聯網協議)主要用於互聯網通信。IP協議用於將多個包交換網絡連接起來,他在原地址和目的地址之間傳輸數據包,還提供對數據大小的重新組裝功能,以適應不同網絡的要求。

IP協議的作用主要有兩個:

  • 一個是爲每一臺計算機分配IP地址
  • 另一個是確定哪些地址在同一個子網絡。

IP 地址

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

一個IP地址由兩部分組成:

  1. 網絡號:識別該地址所屬的網絡,它由Internet權力機構分配。
  2. 主機號:指明網絡內的主機,它由各個網絡的管理員統一分配。

編址方案:

  1. IPv4編址方案

    • 由4個字節(十進制表示)組成的二進制值進行識別,中間用圓點分開,這種方法叫做點分十進制表示法。
  2. IPv6編址方案

    • 每個IP地址有16個字節(128位二進制數),其完整格式用8段16進製表示,各段之間用冒號分隔。

習慣上,我們用分成四段的十進制數表示IPV4地址,從0.0.0.0一直到255.255.255.255。

子網掩碼

子網掩碼用於屏蔽IP地址的一部分以區別網絡標識和主機標識。子網掩碼把所有的網絡位(二進制)用1來標識,主機位用0來標識

  • 例如:如果將子網掩碼設置爲255.255.255.0,則對於IP地址192.168.1.X,其網絡標示部分爲192.168.1;主機標示爲:X

可以利用子網掩碼判斷兩臺計算機是否在同一子網內.

  • 將其IP地址和子網掩碼做按位與運算,如果得到結果相同即在同一個子網內。

IP數據包

​ 網絡層的數據包結構,包含 地址數據 以及 類型 等信息。 網絡層包 承載在 數據鏈路層包 之上,換句話講,數據鏈路層包 數據負載 就是一個 網絡層包

  • 版本 ( Version ),用於標識 協議版本 ,在協議發展迭代的同時保持高度可兼容性。
  • 首部長度 ( Internet Header Length 或 IHL ),由於 IP 頭部長度一定爲 4 的整數倍, 這個字段以 4 字節爲單位。典型的 IP 報文首部爲 2L0 字節, IHL=5
  • 總長度 ( Total Length ),即 IP 報文總長度,字段長度爲 16 位,因此 IP 報文最大長度爲 216=65535216=65535 。
  • 源地址 ( Source Address ),據此接收方可以獲悉發送源。
  • 目的地址 ( Destination Address ),中間節點據此轉發報文。
  • 可選選項 ( Options ),通過 首部長度 可以判斷報文是否帶可選選項。

IP數據包的頭部部分的長度爲20到60字節,整個數據包的總長度最大爲65535字節。因此,理論上,一個IP數據包的"數據"部分,最長爲65,515字節。前面說過,以太網數據包的"數據"部分,最長只有1500字節。因此,如果IP數據包超過了1500字節,就需要分割成幾個以太網數據包,分開發送。

ARP協議

​ 如果兩臺主機在同一臺子網中,可以用ARP協議,得到對方的MAC地址。ARP協議主要是發出一個數據包(包含在以太網數據包中),其中填寫所要查詢主機的IP地址,在對方的MAC地址這一欄,填寫FF:FF:FF:FF:FF:FF,表示這是一個廣播地址。它所在子網絡的每一臺主機,都會收到這個數據包,從中取出IP地址,與自身的IP地址進行比較。如果兩者相同,都做出回覆,向對方報告自己的MAC地址,否則就丟棄這個包。

​ 總之,有了ARP協議之後,我們就可以得到同一個子網絡內的主機MAC地址,可以把數據包發送到任意一臺主機之上了。

0x03 傳輸層

端口

  • 物理上的端口。如ADSL Modem、集線器的接口。
  • 邏輯意義上的端口,即進程標識
    • 端口號的範圍從0到65535
    • 1000以內的端口號大多被標準協議所佔用,所以應用程序中可以自由使用的端口號一般都使用大於1000的值。如寶塔面板的8888端口。

"傳輸層"的功能,就是建立"端口到端口"的通信。相比之下,"網絡層"的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現程序之間的交流。

​ 有句話這樣說IP地址決定主機,而端口決定進程。Unix系統把主機+端口,叫做**“套接字”(socket)**。有了它,就可以進行網絡應用程序開發了。

UDP協議

在數據包中加入端口信息,這就需要新的協議。所以就有了UDP協議。

UDP數據包,也是由**“頭部"和"數據”**兩部分組成。

"頭部"部分主要定義了發出端口和接收端口,**“數據”**部分就是具體的內容。然後,把整個UDP數據包放入IP數據包的"數據"部分。

​ UDP數據包**“頭部”**一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。

TCP協議

​ UDP協議雖然比較簡單,但是數據容易丟失。爲了提高網絡可靠性,TCP協議就誕生了。

​ TCP數據包和UDP數據包一樣,都是內嵌在IP數據包的"數據"部分。TCP數據包沒有長度限制,理論上可以無限長,但是爲了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。

0x04 應用層

​ 應用程序收到"傳輸層"的數據,接下來就要進行解讀。**“應用層"的作用,就是規定應用程序的數據格式。**以便方便解讀。如TCP協議可以爲各種各樣的程序傳遞數據,比如Email、WWW、FTP等等。那麼,必須有不同協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了"應用層”。

下圖則表示了數據包的添加過程,

img

0x05 參考資料

[1] 《HTTP權威指南 (圖靈程序設計叢書)》.[美]David Gourley Brian Totty Marjorie Sayer Sailu Reddy Aushu Aggarwal

[2] 互聯網協議入門(一)

[3] 網絡傳輸協議

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章