圖解 IP 基礎知識!


我把自己以往的文章匯總成為了 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 數據報,比如一些低時延、高吞吐量和可靠性的數據報。服務類型如下表所示
  • 擁塞通告(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 鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM