圖解 IP 基礎知識!

程式設計師cxuan發表於2020-12-22

我把自己以往的文章彙總成為了 Github ,歡迎各位大佬 star
https://github.com/crisxuan/bestJavaer

IP 協議

路由器對分組進行轉發後,就會把資料包傳到網路上,資料包最終是要傳遞到客戶端或者伺服器上的,那麼資料包怎麼知道要發往哪裡呢?起到關鍵作用的就是 IP 協議。

IP 主要分為三個部分,分別是 IP 定址、路由和分包組包。下面我們主要圍繞這三點進行闡述。

IP 地址

既然一個資料包要在網路上傳輸,那麼肯定需要知道這個資料包到底發往哪裡,也就是說需要一個目標地址資訊,IP 地址就是連線網路中的所有主機進行通訊的目標地址,因此,在網路上的每個主機都需要有自己的 IP 地址。

在 IP 資料包傳送的鏈路中,有可能鏈路非常長,比如說由中國發往美國的一個資料包,由於網路抖動等一些意外因素可能會導致資料包丟失,這時我們在這條鏈路中會放入一些 中轉站,一方面能夠確保資料包是否丟失,另一方面能夠控制資料包的轉發,這個中轉站就是我們前面聊過的路由器,這個轉發過程就是 路由控制

路由控制(Routing) 是指將分組資料傳送到最終目標地址的功能,即時網路複雜多變,也能夠通過路由控制到達目標地址。因此,一個資料包能否到達目標主機,關鍵就在於路由器的控制。

這裡有一個名詞,就是 ,因為在一條鏈路中可能會佈滿很多路由器,路由器和路由器之間的資料包傳送就是跳,比如你和隔壁老王通訊,中間就可能會經過路由器 A-> 路由器 B -> 路由器 C 。

那麼一跳的範圍有多大呢?

一跳是指從源 MAC 地址到目標 MAC 地址之間傳輸幀的區間,這裡引出一個新的名詞,MAC 地址是啥?

MAC 地址指的就是計算機的實體地址(Physical Address),它是用來確認網路裝置位置的地址。在 OSI 網路模型中,網路層負責 IP 地址的定位,而資料鏈路層負責 MAC 地址的定位。MAC 地址用於在網路中唯一標示一個網路卡,一臺裝置若有一或多個網路卡,則每個網路卡都需要並會有一個唯一的 MAC 地址,也就是說 MAC 地址和網路卡是緊密聯絡在一起的。

路由器的每一跳都需要詢問當前中轉的路由器,下一跳應該跳到哪裡,從而跳轉到目標地址。而不是資料包剛開始傳送後,網路中所有的通路都會顯示出來,這種多次跳轉也叫做多跳路由

IP 地址定義

現如今有兩個版本的 IP 地址,IPv4 和 IPv6,我們首先探討一下現如今還在廣泛使用的 IPv4 地址,後面再考慮 IPv6 。

IPv4 由 32 位正整數來表示,在計算機內部會轉化為二進位制來處理,但是二進位制不符合人類閱讀的習慣,所以我們根據易讀性的原則把 32 位的 IP 地址以 8 位為一組,分成四組,每組之間以 . 進行分割,再將每組轉換為十進位制數。如下圖所示

那麼上面這個 32 位的 IP 地址就會被轉換為十進位制的 156.197.1.1。

除此之外,從圖中我們還可以得到如下資訊

每個這樣 8 位位一組的數字,自然是非負數,其取值範圍是 [0,255]。

IP 地址的總個數有 2^32 次冪個,這個數值算下來是 4294967296 ,大概能允許 43 億臺裝置連線到網路。實際上真的如此嗎?

實際上 IP 不會以主機的個數來配置的,而是根據裝置上的 網路卡(NIC) 進行配置,每一塊網路卡都會設定一個或者多個 IP 地址,而且通常一臺路由器會有至少兩塊網路卡,所以可以設定兩個以上的 IP 地址,所以主機的數量遠遠達不到 43 億。

IP 地址構造和分類

IP 地址由 網路標識主機標識 兩部分組成,網路標識代表著網路地址,主機標識代表著主機地址。網路標識在資料鏈路的每個段配置不同的值。網路標識必須保證相互連線的每個段的地址都不重複。而相同段內相連的主機必須有相同的網路地址。IP 地址的 主機標識 則不允許在同一網段內重複出現。

舉個例子來說:比如說我在石家莊(好像不用比如昂),我所在的小區的某一棟樓就相當於是網路標識,某一棟樓的第幾戶就相當於是我的主機標識,當然如果你有整棟樓的話,那就當我沒說。你可以通過xx省xx市xx區xx路xx小區xx棟來定位我的網路標識,這一棟的第幾戶就相當於是我的網路標識。

IP 地址分為四類,分別是 A類、B類、C類、D類、E類,它會根據 IP 地址中的第 1 位到第 4 位的位元對網路標識和主機標識進行分類。

  • A 類:(1.0.0.0 - 126.0.0.0)(預設子網掩碼:255.0.0.0 或 0xFF000000)第一個位元組為網路號,後三個位元組為主機號。該類 IP 地址的最前面為 0 ,所以地址的網路號取值於 1~126 之間。一般用於大型網路。

  • B 類:(128.0.0.0 - 191.255.0.0)(預設子網掩碼:255.255.0.0 或 0xFFFF0000)前兩個位元組為網路號,後兩個位元組為主機號。該類 IP 地址的最前面為 10 ,所以地址的網路號取值於 128~191 之間。一般用於中等規模網路。

  • C 類:(192.0.0.0 - 223.255.255.0)(子網掩碼:255.255.255.0 或 0xFFFFFF00)前三個位元組為網路號,最後一個位元組為主機號。該類 IP 地址的最前面為 110 ,所以地址的網路號取值於 192~223 之間。一般用於小型網路。

  • D 類:是多播地址。該類 IP 地址的最前面為 1110 ,所以地址的網路號取值於 224~239 之間。一般用於多路廣播使用者。

  • E 類:是保留地址。該類 IP 地址的最前面為 1111 ,所以地址的網路號取值於 240~255 之間。

為了方便理解,我畫了一張 IP 地址分類圖,如下所示

根據不同的 IP 範圍,有下面不同的地總空間分類

子網掩碼

子網掩碼(subnet mask) 又叫做網路掩碼,它是一種用來指明一個 IP 地址的哪些位標識的是主機所在的網路。子網掩碼是一個 32位 地址,用於遮蔽 IP 地址的一部分以區別網路標識和主機標識。

一個 IP 地址只要確定了其分類,也就確定了它的網路標識和主機標識,由此,各個分類所表示的網路標識範圍如下

1 表示 IP 網路地址的位元範圍,0 表示 IP 主機地址的範圍。將他們用十進位制表示,那麼這三類的表示如下

保留地址

在IPv4 的幾類地址中,有幾個保留的地址空間不能在網際網路上使用。這些地址用於特殊目的,不能在區域網外部路由。

IP 協議版本

目前,全球 Internet 中共存有兩個IP版本:IP 版本 4(IPv4)IP 版本6(IPv6)。 IP 地址由二進位制值組成,可驅動 Internet 上所有資料的路由。 IPv4 地址的長度為 32 位,而 IPv6 地址的長度為 128 位。

Internet IP 資源由 Internet 分配號碼機構(IANA)分配給區域 Internet 登錄檔(RIR),例如 APNIC,該機構負責根 DNS ,IP 定址和其他 Internet 協議資源。

下面我們就一起認識一下 IP 協議中非常重要的兩個版本 IPv4 和 IPv6。

IPv4

IPv4 的全稱是 Internet Protocol version 4,是 Internet 協議的第四版。IPv4 是一種無連線的協議,這個協議會盡最大努力交付資料包,也就是說它不能保證任何資料包能到達目的地,也不能保證所有的資料包都會按照正確的順序到達目標主機,這些都是由上層比如傳輸控制協議控制的。也就是說,單從 IP 看來,這是一個不可靠的協議。

前面我們講過網路層分組被稱為 資料包,所以我們接下來的敘述也會圍繞著資料包展開。

IPv4 的資料包格式如下

IPv4 資料包中的關鍵字及其解釋

  • 版本欄位(Version)佔用 4 bit,通訊雙方使用的版本必須一致,對於 IPv4 版本來說,欄位值是 4。
  • 首部長度(Internet Header Length) 佔用 4 bit,首部長度說明首部有多少 32 位(4 位元組)。由於 IPv4 首部可能包含不確定的選項,因此這個欄位被用來確定資料的偏移量。大多數 IP 不包含這個選項,所以一般首部長度設定為 5, 資料包為 20 位元組 。
  • 服務型別(Differential Services Codepoint,DSCP) 佔用 6 bit,以便使用不同的 IP 資料包,比如一些低時延、高吞吐量和可靠性的資料包。服務型別如下表所示
圖解 IP 基礎知識!
  • 擁塞通告(Explicit Congestion Notification,ECN) 佔用 2 bit,它允許在不丟棄報文的同時通知對方網路擁塞的發生。ECN 是一種可選的功能,僅當兩端都支援並希望使用,且底層網路支援時才被使用。 最開始 DSCP 和 ECN 統稱為 TOS,也就是區分服務,但是後來被細化為了 DSCP 和 ECN。

  • 資料包長度(Total Length) 佔用 16 bit,這 16 位是包括在資料在內的總長度,理論上資料包的總長度為 2 的 16 次冪 - 1,最大長度是 65535 位元組,但是實際上資料包很少有超過 1500 位元組的。IP 規定所有主機都必須支援最小 576 位元組的報文,但大多數現代主機支援更大的報文。當下層的資料鏈路協議的最大傳輸單元(MTU)欄位的值小於 IP 報文長度時,報文就必須被分片。

  • 識別符號(Identification) 佔用 16 bit,這個欄位用來標識所有的分片,因為分片不一定會按序到達,所以到達目標主機的所有分片會進行重組,每產生一個資料包,計數器加1,並賦值給此欄位。

  • 標誌(Flags) 佔用 3 bit,標誌用於控制和識別分片,這 3 位分別是

    • 0 位:保留,必須為0;
    • 1 位:禁止分片(Don’t Fragment,DF),當 DF = 0 時才允許分片;
    • 2 位:更多分片(More Fragment,MF),MF = 1 代表後面還有分片,MF = 0 代表已經是最後一個分片。

    如果 DF 標誌被設定為 1 ,但是路由要求必須進行分片,那麼這條資料包回丟棄

  • 分片偏移(Fragment Offset) 佔用 13 位,它指明瞭每個分片相對於原始報文開頭的偏移量,以 8 位元組作單位。

  • 存活時間(Time To Live,TTL) 佔用 8 位,存活時間避免報文在網際網路中迷失,比如陷入路由環路。存活時間以秒為單位,但小於一秒的時間均向上取整到一秒。在現實中,這實際上成了一個跳數計數器:報文經過的每個路由器都將此欄位減 1,當此欄位等於 0 時,報文不再向下一跳傳送並被丟棄,這個欄位最大值是 255。

  • 協議(Protocol) 佔用 8 位,這個欄位定義了報文資料區使用的協議。協議內容可以在 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml 官網上獲取。

  • 首部校驗和(Header Checksum) 佔用 16 位,首部校驗和會對欄位進行糾錯檢查,在每一跳中,路由器都要重新計算出的首部檢驗和並與此欄位進行比對,如果不一致,此報文將會被丟棄。

  • 源地址(Source address) 佔用 32 位,它是 IPv4 地址的構成條件,源地址指的是資料包的傳送方

  • 目的地址(Destination address)佔用 32 位,它是 IPv4 地址的構成條件,目標地址指的是資料包的接收方

  • 選項(Options) 是附加欄位,選項欄位佔用 1 - 40 個位元組不等,一般會跟在目的地址之後。如果首部長度 > 5,就應該考慮選項欄位。

  • 資料 不是首部的一部分,因此並不被包含在首部檢驗和中。

在 IP 傳送的過程中,每個資料包的大小是不同的,每個鏈路層協議能承載的網路層分組也不一樣,有的協議能夠承載大資料包,有的卻只能承載很小的資料包,不同的鏈路層能夠承載的資料包大小如下。

IPv4 分片

一個鏈路層幀能承載的最大資料量叫做最大傳輸單元(Maximum Transmission Unit, MTU),每個 IP 資料包封裝在鏈路層幀中從一臺路由器傳到下一臺路由器。因為每個鏈路層所支援的最大 MTU 不一樣,當資料包的大小超過 MTU 後,會在鏈路層進行分片,每個資料包會在鏈路層單獨封裝,每個較小的片都被稱為 片(fragement)

每個片在到達目的地後會進行重組,準確的來說是在運輸層之前會進行重組,TCP 和 UDP 都會希望傳送完整的、未分片的報文,出於效能的原因,分片重組不會在路由器中進行,而是會在目標主機中進行重組。

當目標主機收到從傳送端傳送過來的資料包後,它需要確定這些資料包中的分片是否是由源資料包分片傳遞過來的,如果是的話,還需要確定何時收到了分片中的最後一片,並且這些片會如何拼接一起成為資料包。

針對這些潛在的問題,IPv4 設計者將 標識、標誌和片偏移放在 IP 資料包首部中。當生成一個資料包時,傳送主機會為該資料包設定源和目的地址的同時貼上標識號。傳送主機通常將它傳送的每個資料包的標識 + 1。當某路由器需要對一個資料包分片時,形成的每個資料包具有初始資料包的源地址、目標地址和標識號。當目的地從同一傳送主機收到一系列資料包時,它能夠檢查資料包的標識號以確定哪些資料是由源資料包傳送過來的。由於 IP 是一種不可靠的服務,分片可能會在網路中丟失,鑑於這種情況,通常會把分片的最後一個位元設定為 0 ,其他分片設定為 1,同時使用偏移欄位指定分片應該在資料包的哪個位置。

IPv4 定址

IPv4 支援三種不同型別的定址模式,分別是

  • 單播定址模式:在這種模式下,資料只傳送到一個目的地的主機。

  • 廣播定址模式:在此模式下,資料包將被定址到網段中的所有主機。這裡客戶端傳送一個資料包,由所有伺服器接收:

  • 組播定址模式:此模式是前兩種模式的混合,即傳送的資料包既不指向單個主機也不指定段上的所有主機

IPv6

隨著斷系統接入的越來越多,IPv4 已經無法滿足分配了,所以,IPv6 應運而生,IPv6 就是為了解決 IPv4 的地址耗盡問題而被標準化的網際協議。IPv4 的地址長度為 4 個 8 位元組,即 32 位元, 而 IPv6 的地址長度是原來的四倍,也就是 128 位元,一般寫成 8 個 16 位位元組。

從 IPv4 切換到 IPv6 及其耗時,需要將網路中所有的主機和路由器的 IP 地址進行設定,在網際網路不斷普及的今天,替換所有的 IP 是一個工作量及其龐大的任務。我們後面會說。

我們先來看一下 IPv6 的地址是怎樣的

  • 版本與 IPv4 一樣,版本號由 4 bit 構成,IPv6 版本號的值為 6。
  • 流量型別(Traffic Class) 佔用 8 bit,它就相當於 IPv4 中的服務型別(Type Of Service)。
  • 流標籤(Flow Label) 佔用 20 bit,這 20 位元用於標識一條資料包的流,能夠對一條流中的某些資料包給出優先權,或者它能夠用來對來自某些應用的資料包給出更高的優先權,只有流標籤、源地址和目標地址一致時,才會被認為是一個流。
  • 有效載荷長度(Payload Length) 佔用 16 bit,這 16 位元值作為一個無符號整數,它給出了在 IPv6 資料包中跟在鼎昌 40 位元組資料包首部後面的位元組數量。
  • 下一個首部(Next Header) 佔用 8 bit,它用於標識資料包中的內容需要交付給哪個協議,是 TCP 協議還是 UDP 協議。
  • 跳限制(Hop Limit) 佔用 8 bit,這個欄位與 IPv4 的 TTL 意思相同。資料每經過一次路由就會減 1,減到 0 則會丟棄資料。
  • 源地址(Source Address) 佔用 128 bit (8 個 16 位 ),表示傳送端的 IP 地址。
  • 目標地址(Destination Address) 佔用 128 bit (8 個 16 位 ),表示接收端 IP 地址。

可以看到,相較於 IPv4 ,IPv6 取消了下面幾個欄位

  • 識別符號、標誌和位元偏移:IPv6 不允許在中間路由器上進行分片和重新組裝。這種操作只能在端系統上進行,IPv6 將這個功能放在端系統中,加快了網路中的轉發速度。
  • 首部校驗和:因為在運輸層和資料鏈路執行了報文段完整性校驗工作,IP 設計者大概覺得在網路層中有首部校驗和比較多餘,所以去掉了。IP 更多專注的是快速處理分組資料
  • 選項欄位:選項欄位不再是標準 IP 首部的一部分了,但是它並沒有消失,而是可能出現在 IPv6 的擴充套件首部,也就是下一個首部中。

IPv6 擴充套件首部

IPv6 首部長度固定,無法將選項欄位加入其中,取而代之的是 IPv6 使用了擴充套件首部

擴充套件首部通常介於 IPv6 首部與 TCP/UDP 首部之間,在 IPv4 中可選長度固定位 40 位元組,在 IPv6 中沒有這樣的限制。IPv6 的擴充套件首部可以是任意長度。擴充套件首部中還可以包含擴充套件首部協議和下一個擴充套件欄位。

IPv6 首部中沒有標識和標誌欄位,對 IP 進行分片時,需要使用到擴充套件首部

具體的擴充套件首部表如下所示

下面我們來看一下 IPv6 都有哪些特點

IPv6 特點

IPv6 的特點在 IPv4 中得以實現,但是即便實現了 IPv4 的作業系統,也未必實現了 IPv4 的所有功能。而 IPv6 卻將這些功能大眾化了,也就表明這些功能在 IPv6 已經進行了實現,這些功能主要有

  • 地址空間變得更大:這是 IPv6 最主要的一個特點,即支援更大的地址空間。

  • 精簡報文結構: IPv6 要比 IPv4 精簡很多,IPv4 的報文長度不固定,而且有一個不斷變化的選項欄位;IPv6 報文段固定,並且將選項欄位,分片的欄位移到了 IPv6 擴充套件頭中,這就極大的精簡了 IPv6 的報文結構。

  • 實現了自動配置:IPv6 支援其主機裝置的狀態和無狀態自動配置模式。這樣,沒有 DHCP 伺服器不會停止跨段通訊。

  • 層次化的網路結構: IPv6 不再像 IPv4 一樣按照 A、B、C等分類來劃分地址,而是通過 IANA -> RIR -> ISP 這樣的順序來分配的。IANA 是國際網際網路號碼分配機構,RIR 是區域互連網註冊管理機構,ISP 是一些運營商(例如電信、移動、聯通)。

  • IPSec:IPv6 的擴充套件報頭中有一個認證報頭、封裝安全淨載報頭,這兩個報頭是 IPsec 定義的。通過這兩個報頭網路層自己就可以實現端到端的安全,而無需像 IPv4 協議一樣需要其他協議的幫助。

  • 支援任播:IPv6 引入了一種新的定址方式,稱為任播定址。

IPv6 地址

我們知道,IPv6 地址長度為 128 位,他所能表示的範圍是 2 ^ 128 次冪,這個數字非常龐大,幾乎涵蓋了你能想到的所有主機和路由器,那麼 IPv6 該如何表示呢?

一般我們將 128 位元的 IP 地址以每 16 位元為一組,並用 : 號進行分隔,如果出現連續的 0 時還可以將 0 省略,並用 :: 兩個冒號隔開,記住,一個 IP 地址只允許出現一次兩個連續的冒號。

下面是一些 IPv6 地址的示例

  • 二進位制數表示

  • 用十六進位制數表示

  • 出現兩個冒號的情況

如上圖所示,A120 和 4CD 中間的 0 被 :: 所取代了。

另外,我自己肝了六本 PDF,微信搜尋「程式設計師cxuan」關注公眾號後,在後臺回覆 cxuan ,領取全部 PDF,這些 PDF 如下

六本 PDF 連結

相關文章