IP協議/地址(IPv4&IPv6)概要
IP協議
什么是IP協議
協議的特征
- 無連接:發送數據包前不與目標建立連接
- 最大努力:不保證數據包交付。即,如果出錯,IP無法重新傳輸數據包;如果順序錯亂或丟失,則使用數據或上層服務的應用程序來解決此問題。(IP不可靠性)
- 介質無關性:操作與傳輸數據的介質無關。(無論光纖、銅纜還是無線電)
IP協議類型
- IPv4
- IPv6
IPv4
IPv4數據包結構如上,數據部分是由下層添加的,所以我們在此只詳細介紹IPv4數據包報頭。報頭為目標地址及其以上的部分(也可以視為可選項及其以上)
(圖片來源:IP數據包結構 - 甜膩 - 博客園 (cnblogs.com))
IPv4數據包報頭
- 版本:包含一個4位二進制值
0100
,用於標識這是個IPv4數據包。(0100轉成十進制為4) - 服務類型(ToS):現在叫區分服務或DiffServ(DS)字段。DS字段是一個用於確定每個數據包優先級的8位字段。其中包括DSCP和ECN
-
- 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 790中Assigned 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主機部分
- 全局路由前綴:為提供商分配給客戶或站點的地址的前綴或網絡部分。一般RIR向客戶分配
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地址可使用,但它留作子路由器的任播地址,應僅分配給路由器。