1. 程式人生 > 其它 >IP協議/地址(IPv4&IPv6)概要

IP協議/地址(IPv4&IPv6)概要

IP協議/地址(IPv4&IPv6)概要

IP協議

什麼是IP協議

  • IP是Internet Protocol(網際互連協議)的縮寫,是TCP/IP體系中的網路層協議。 [1]

協議的特徵

  • 無連線:傳送資料包前不與目標建立連線
  • 最大努力:不保證資料包交付。即,如果出錯,IP無法重新傳輸資料包;如果順序錯亂或丟失,則使用資料或上層服務的應用程式來解決此問題。(IP不可靠性)
  • 介質無關性:操作與傳輸資料的介質無關。(無論光纖、銅纜還是無線電)

IP協議型別

  • IPv4
  • IPv6

IPv4

IPv4資料包結構如上,資料部分是由下層新增的,所以我們在此只詳細介紹IPv4資料包報頭。報頭為目標地址及其以上的部分(也可以視為可選項及其以上)

(圖片來源:IP資料包結構 - 甜膩 - 部落格園 (cnblogs.com)

IPv4資料包報頭

  • 版本:包含一個4位二進位制值0100,用於標識這是個IPv4資料包。(0100轉成十進位制為4)
  • 服務型別(ToS):現在叫區分服務或DiffServ(DS)欄位。DS欄位是一個用於確定每個資料包優先順序的8位欄位。其中包括DSCPECN
    • DSCP:即區分服務程式碼點,通過編碼值來區分優先順序,為DS欄位的6個最高有效位。
    • ECN:即顯式擁塞通知位,佔DS欄位後兩位。通常情況下,當網路中出現擁塞的時候,TCP/IP會主動丟棄資料包。源端檢測到丟包後,就會減小擁塞視窗,降低傳輸速率。但如果端到端能成功協商ECN的話
      ,支援ECN的路由器就可以發生擁塞時在IP報頭中設定一個標記,發出即將發生擁塞的訊號,而不是直接丟棄資料包。ECN減少了TCP的丟包數量,通過避免重傳,減少了延遲(尤其是抖動),提升了應用的效能。[2]
  • 標誌:佔3位,用於分片重組。其中3位按順序各分為D\DF\MF,但實際上只有後兩位即DF\MF有意義。
    • D
    • DF:用於決定是否分片。0為不分片,1為分片。
    • MF:用於判斷資料分片傳送後,該資料包後面是否還有分片。0為後面沒有分片,1為後面有分片。
  • 段偏移量:佔12位。通過相對於原來包的偏移量重組分片後的IP資料包,以8位元組位偏移單位。[3]
  • 生存時間(TTL):包含用於限制資料包壽命的一個8位
    二進位制值。資料包傳送方設定初始TTL值,資料包每經過一次路由器數值就減少1。如果TTL欄位的值減少為0,則路由器丟棄該資料包,並向源IP地址傳送因特網控制訊息協議(ICMP)超時資訊
  • 協議程式碼:佔8位,欄位用於確定下一級的協議。此欄位表示資料包包含的資料負載型別,使網路層將資料傳輸到相應的上層協議。常用的值包括ICMP(1)、TCP(6)和UDP(17)
  • 頭校驗和:表示IP報頭的校驗和,用於錯誤檢查。該欄位僅用於IP報頭的校驗和,有效載荷不包 括在校驗和計算中。資料報文沿途的每個中間路由器都重新計算和驗證該欄位(因為路由器 轉發資料報文時,TTL值都會變化)。該欄位長度為16位[4]
  • 源地址:即源IPv4地址。包含表示資料包源IPv4地址的32位二進位制值。源IPv4地址始終為單播地址
  • 目的地址:即目的IPv4地址。32位,目的地址可以為單播、組播或廣播地址

注:源地址與目的地址在傳輸中通常不會發生改變。

IPv4侷限性

  • IP地址耗盡
  • Internet路由表膨脹
  • 缺乏端到端的連線

IPv4通訊

  • 單播:從一臺主機向另一臺主機發送資料包的過程。範圍0.0.0.0~223.255.255.255
  • 廣播:從一臺主機向該網路中所有主機發送資料包的過程
  • 組播:從一臺主機向選定的一組主機(可能在不同網路中)傳送資料包的過程。範圍224.0.0.0~239.255.255.255

IPv4無類編址

基礎

在瞭解編址前,你需要先掌握一些基礎知識

  • 二進位制與十進位制之間的轉換
  • 邏輯與運算

這不是本文主要內容,因此不過多介紹。

IPv4地址、子網掩碼與字首

地址和子網掩碼

首先來看子網掩碼,它是個點分4段(每段對應8位二進位制)十進位制的值,用於描述IP地址的網路地址與主機部分

二進位制子網掩碼每一位與二進位制IPv4地址的位相對應,其中子網掩碼為1的位其IP相應位置處為網路位,為0的位則對應主機位

例如下方的子網掩碼與其對應的IPv4地址

我們將其轉化為二進位制的形式

我們對其二進位制進行邏輯與運算得到其網路地址的二進位制形式

由子網掩碼知11000000.10101000.00001111為網路位,而00000000為主機位

轉換成十進位制得其網路地址為

由主機位可知,所以該網路地址下所能容納的IPv4地址數如下

該網路地址能分配給主機的地址數如下

其中減去的兩個地址為網路地址192.168.15.0與廣播地址192.168.15.255

把網路地址最後一位主機位變為1,得到該網路下能分配給主機的最小IP

把最後一位主機位置為0,其他主機位全為1,則得到該網路下能分配給主機的最大IP(若主機位全1則為廣播地址)

字首

字首是表示網路位的一種簡便寫法

上文中的例子可以寫為

其中/24就是字首,表示子網掩碼前24位都為1,故子網掩碼為255.255.255.0

其他

上述例子中網路部分與主機部分都是處於不同段,該方法同樣適用於IP地址某一段既存在網路位又有主機位的情況

例如

其子網掩碼為

按照上述方法可得:

網路地址

網路地址下所能容納的IPv4地址數

該網路地址能分配給主機的地址數

該網路下能分配給主機的最小IP

該網路下能分配給主機的最大IP

注意

我們指出一個裝置的IPv4地址時一定要給出其子網掩碼或字首,否則該地址沒有意義

IPv4傳統有類編址

1981年,使用在RFC 790Assigned Numbers部分定義的有類編址對網際網路IPv4地址進行分配。根據三個類別(A類、B類、C類)之一為客戶分配網路地址。

A類

  • 範圍:0.0.0.0/8~127.0.0.0/8

B類

  • 範圍:128.0.0.0/16~191.255.0.0/16

C類

  • 範圍:192.0.0.0/24~223.255.255.0/24

其他

還有D類與E類地址,由於不太重要,此處僅簡要概括。

  • D類IP地址第一個位元組以“1110”開始 。它並不指向特定的網路,這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次定址一組計算機,它標識共享同一協議的一組計算機。[5]
  • E類IP地址範圍240.0.0.1到255.255.255.254,E類地址保留,僅作為搜尋、Internet的實驗和開發之用。[6]

IPv6

IPv6資料包報頭

IPv6資料包報頭如上(此圖下方加上資料欄位即為IPv6資料包)

  • 版本:該欄位包含一個4位二進位制值0110,標誌這是個IPv6的資料包
  • 流量類別:佔8位,與IPv4報頭TOS欄位類似。
  • 流標籤:佔20位,給屬於特殊流分組加上標籤(特殊流是傳送方要求特殊處理的流),能夠對一條流中某些資料或某些應用資料報給出優先權。所有相同標籤的包受到路由器相同處理。
  • 負載長度:即有效負荷長度。佔16位,二進位制作為一個無符號整數,表示報頭後面的位元組數量。(資料欄位最大為65535位元組)
  • 下一報頭:佔8位,相當於IPv4的協議欄位,表示資料欄位需要交付給哪個協議(如UDP、TCP)。
  • 跳數限制:佔8位,類似於IPv4的TTL欄位,每臺路由器對其減1,減到0則丟棄該包,並向主機轉發ICMPv6超市訊息來表示未到達目的地。
  • 源地址:即源IPv6地址。佔128位,表示傳送主機地址。
  • 目的地址:即目的IPv6地址。佔128位,表示接收主機地址。

IPv6資料包還可能包含擴充套件包頭(EH),為可選項,介於報頭與資料之間,用於分段、安全性、移動支付等。

注:IPv6源地址與目的地址一般也不會改變。

IPv6編址

IPv6表示方法

  • IPv6地址長度為128位,寫作八段十六進位制的字串,示例如下
  • IPv6無子網掩碼,但有字首長度,表示IPv6地址的字首,剩下的對應介面ID部分(類似於IPv4的主機部分)。例如字首位/64(目前一般預設/64),則分段如下:

IPv6簡寫表示

  • 省略前導0
  • 忽略全0段,並用兩個冒號表示

以上文的地址為例,其簡寫如下:

IPv6地址型別

  • 單播:IPv6單播地址用於唯一標識支援IPv6裝置上的介面。
  • 組播:IPv6組播地址將單個IPv6資料包傳送到多個目的地。
  • 任播:IPv6任播地址是可分配到多個裝置的IPv6任播地址。傳送至任播地址的資料包會被路由到最近擁有改地址的裝置。

注:IPv6沒有廣播,因為廣播可被視為組播的一種特殊情況

下面將詳細介紹三種類型

IPv6單播地址

  • IPv6全域性單播地址(GUA):其具有全域性唯一性,可在IPv6因特網上路由。全域性單播地址有三個部分,即全域性路由字首、子網ID、介面ID。
    • 全域性路由字首:為提供商分配給客戶或站點的地址的字首或網路部分。一般RIR向客戶分配/48的全域性路由字首(總共64位,如果全域性字首佔48位的話,那麼子網ID就是16位,用的是/64,他們的總共位數是固定的),如下圖所示。
    • 子網ID:組織使用子網ID確定其站點子網。子網越大可用子網越多(位數越多,組合出來的子網數就越多)。
    • 介面ID:相當於IPv4主機部分

IPv6組播地址

  • IPv6組播地址類似於IPv4組播地址,用於傳送單個數據包到一個或多個目的地(組播組)。
  • IPv6組播地址字首為FF00::/8
  • IPv6組播地址分為兩種型別:分配的組播、請求節點的組播
    • 分配的組播(相當於IPv4廣播):
      • FF02::1全節點組播組:這是一個包含所有支援IPv6裝置的組播組。傳送到該組的資料包由該鏈路或網路上的所有IPv6介面接收和處理。
      • FF02::2全路由組播組:這是一個所有IPv6均會加入的組播組。傳送到該組的資料包由該鏈路或網路上所有IPv6路由器接收和處理。
    • 請求節點的IPv6組播地址:請求節點組播地址類似於全節點組播地址。請求節點組播地址的優勢在於它被對映到特殊乙太網組播地址。這使乙太網網絡卡可以通過檢查MAC地址過濾該幀,而不是將它傳送給IPv6流程來判斷該裝置是否是IPv6資料包既定目標。

IPv6任播地址

  • 任播地址在行動通訊中很有用,接收方只需要是一組介面中的一個即可,這樣可以使移動使用者在地理位置上不會受過多的限制。[7]
  • IPv6任播地址是從單播地址空間中劃分出來的,任播地址與單播地址位於同一個地址範圍內,任播地址與單播地址有相同的格式,當一個單播地址屬於多個介面時,它就是任播地址。僅看地址本身,節點是無法區分單播地址和任播地址的,節點需要使用明確的配置指明該地址是一個任播地址。[7:1]

IPv4與IPv6共存方式

雙棧

  • 雙棧裝置同時執行IPv4和IPv6協議棧。雙堆疊允許IPv4與IPv6在同一網路中共存

隧道

  • 隧道是一種在IPv4網路中傳輸IPv6資料包的方法
  • 基本原理:假定兩個IPv6節點要使用IPv6資料包進行互動,但他們是經由中間IPv4路由器互聯的。我們將兩臺IPv6路由器之間的中間IPv4路由器的集合稱為一個隧道。藉助於該隧道,在隧道傳送端的IPv6節點資料可將整個IPv6資料放到一個IPv4資料報的資料(有效載荷)欄位中[8]

轉換

  • 轉換技術是將一種協議版本的資料包報頭更改為另一種協議版本的資料包報頭,因而解決了IPv4裝置與IPv6裝置之間的互操作問題。[9]NAT64允許IPv6裝置使用與IPv4 NAT類似方法支援IPv4裝置通訊。

IPv4與IPv6區別

  • IPv6不允許中間路由器對其資料包進行分片,該操作僅限於源與目的地。如果路由器收到的IPv6資料報因太大而不能轉發到出鏈路上,則需丟棄該包,並向傳送方返回一個“分組太大”的ICMP差錯報文。[10]
  • 因為運輸層與資料鏈路層進行檢驗操作,故IPv6取消了首部校驗和欄位
  • IPv6選項欄位可能出現在“下一報頭”指出的位置上(注意,選項欄位並不在IPv6報頭中)
  • IPv6基於128位分層編址,而IPv4採用32位,因此IPv6相比IPv4有更大地址空間
  • IPv6報頭相對與IPv4更加簡化,提高了處理效率
  • IPv6地址數更大,消除了NAT需求,避免了需要端到端連線的應用遇到有些有NAT引起的問題。
  • IPv6地址全0和全1的主機地址可以分配給裝置。全1地址是因為IPv6不使用廣播地址。全0地址可使用,但它留作子路由器的任播地址,應僅分配給路由器。

參考


  1. IP(網路之間互連的協議)_百度百科 ↩︎

  2. 顯式擁塞通知-Explicit Congestion Notification(ECN) - 知乎 ↩︎

  3. 關於IPv4首部標識和片偏移的一點理解_六月香樟的部落格-CSDN部落格 ↩︎

  4. ipv4頭校驗和欄位長度為8位 - CSDN ↩︎

  5. D類IP地址_百度百科 ↩︎

  6. E類地址_百度百科 ↩︎

  7. 任播_百度百科 ↩︎ ↩︎

  8. James F. Kurose.& Keith W. Ross. Computer Networking: A Top-Down Approach Seven Edition[M]. Hoboken, New Jersey: Person, 2017: 352 ↩︎

  9. 三分鐘瞭解NAT64基本原理概述,它的侷限性又有哪些? - 知乎 ↩︎

  10. James F. Kurose.& Keith W. Ross. Computer Networking: A Top-Down Approach Seven Edition[M]. Hoboken, New Jersey: Person, 2017: 352 ↩︎