一篇文章帶你熟悉 TCP/IP 協議-(三)
四、網路層中的 IP 協議
- IP(IPv4、IPv6)相當於 OSI 參考模型中的第3層——網路層。網路層的主要作用是“實現終端節點之間的通訊”。這種終端節點之間的通訊也叫“點對點通訊”。
- 網路的下一層——資料鏈路層的主要作用是在互連同一種資料鏈路的節點之間進行包傳遞。而一旦跨越多種資料鏈路,就需要藉助網路層。網路層可以跨越不同的資料鏈路,即使是在不同的資料鏈路上也能實現兩端節點之間的資料包傳輸。
- IP 大致分為三大作用模組,它們是 IP 定址、路由(最終節點為止的轉發)以及 IP 分包與組包。
1. IP 地址
1.1 IP 地址概述
- 在計算機通訊中,為了識別通訊對端,必須要有一個類似於地址的識別碼進行標識。在資料鏈路中的 MAC 地址正是用來標識同一個鏈路中不同計算機的一種識別碼。
- 作為網路層的 IP ,也有這種地址資訊,一般叫做 IP 地址。IP 地址用於在“連線到網路中的所有主機中識別出進行通訊的目標地址”。因此,在 TCP/IP 通訊中所有主機或路由器必須設定自己的 IP 地址。
- 不論一臺主機與哪種資料鏈路連線,其 IP 地址的形式都保持不變。
- IP 地址(IPv4 地址)由32位正整數來表示。IP 地址在計算機內部以二進位制方式被處理。然而,由於我們並不習慣於採用二進位制方式,我們將32位的 IP 地址以每8位為一組,分成4組,每組以 “.” 隔開,再將每組數轉換成十進位制數。如下:
1.2 IP 地址由網路和主機兩部分標識組成
- 如下圖,網路標識在資料鏈路的每個段配置不同的值。網路標識必須保證相互連線的每個段的地址不相重複。而相同段內相連的主機必須有相同的網路地址。IP 地址的“主機標識”則不允許在同一個網段內重複出現。由此,可以通過設定網路地址和主機地址,在相互連線的整個網路中保證每臺主機的 IP 地址都不會相互重疊。即 IP 地址具有了唯一性。
- 如下圖,IP 包被轉發到途中某個路由器時,正是利用目標 IP 地址的網路標識進行路由。因為即使不看主機標識,只要一見到網路標識就能判斷出是否為該網段內的主機。
1.3 IP 地址的分類
- IP 地址分為四個級別,分別為A類、B類、C類、D類。它根據 IP 地址中從第 1 位到第 4 位的位元列對其網路標識和主機標識進行區分。
A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網路標識。用十進位制表示的話,0.0.0.0~127.0.0.0 是 A 類的網路地址。A 類地址的後 24 位相當於主機標識。因此,一個網段內可容納的主機地址上限為16,777,214個。
- B 類 IP 地址是前兩位 “10” 的地址。從第 1 位到第 16 位是它的網路標識。用十進位制表示的話,128.0.0.0~191.255.0.0 是 B 類的網路地址。B 類地址的後 16 位相當於主機標識。因此,一個網段內可容納的主機地址上限為65,534個。
- C 類 IP 地址是前三位為 “110” 的地址。從第 1 位到第 24 位是它的網路標識。用十進位制表示的話,192.0.0.0~223.255.255.0 是 C 類的網路地址。C 類地址的後 8 位相當於主機標識。因此,一個網段內可容納的主機地址上限為254個。
- D 類 IP 地址是前四位為 “1110” 的地址。從第 1 位到第 32 位是它的網路標識。用十進位制表示的話,224.0.0.0~239.255.255.255 是 D 類的網路地址。D 類地址沒有主機標識,常用於多播。
- 在分配 IP 地址時關於主機標識有一點需要注意。即要用位元位表示主機地址時,不可以全部為 0 或全部為 1。因為全部為 0 只有在表示對應的網路地址或 IP 地址不可以獲知的情況下才使用。而全部為 1 的主機通常作為廣播地址。因此,在分配過程中,應該去掉這兩種情況。這也是為什麼 C 類地址每個網段最多隻能有 254( 28 - 2 = 254)個主機地址的原因。
1.4 廣播地址
- 廣播地址用於在同一個鏈路中相互連線的主機之間傳送資料包。將 IP 地址中的主機地址部分全部設定為 1,就成了廣播地址。
- 廣播分為本地廣播和直接廣播兩種。在本網路內的廣播叫做本地廣播;在不同網路之間的廣播叫做直接廣播。
1.5 IP 多播
- 多播用於將包傳送給特定組內的所有主機。由於其直接使用 IP 地址,因此也不存在可靠傳輸。
- 相比於廣播,多播既可以穿透路由器,又可以實現只給那些必要的組傳送資料包。請看下圖:
- 多播使用 D 類地址。因此,如果從首位開始到第 4 位是 “1110”,就可以認為是多播地址。而剩下的 28 位可以成為多播的組編號。
此外, 對於多播,所有的主機(路由器以外的主機和終端主機)必須屬於 224.0.0.1 的組,所有的路由器必須屬於 224.0.0.2 的組。
1.6 子網掩碼
- 現在一個 IP 地址的網路標識和主機標識已不再受限於該地址的類別,而是由一個叫做“子網掩碼”的識別碼通過子網網路地址細分出比 A 類、B 類、C 類更小粒度的網路。這種方式實際上就是將原來 A 類、B 類、C 類等分類中的主機地址部分用作子網地址,可以將原網路分為多個物理網路的一種機制。
- 子網掩碼用二進位制方式表示的話,也是一個 32 位的數字。它對應 IP 地址網路標識部分的位全部為 “1”,對應 IP 地址主機標識的部分則全部為 “0”。由此,一個 IP 地址可以不再受限於自己的類別,而是可以用這樣的子網掩碼自由地定位自己的網路標識長度。當然,子網掩碼必須是 IP 地址的首位開始連續的 “1”。
- 對於子網掩碼,目前有兩種表示方式。第一種是,將 IP 地址與子網掩碼的地址分別用兩行來表示。以 172.20.100.52 的前 26 位是網路地址的情況為例,如下:
- 第二種表示方式是,在每個 IP 地址後面追加網路地址的位數用 “/ ” 隔開,如下:
另外,在第二種方式下記述網路地址時可以省略後面的 “0” 。例如:172.20.0.0/26 跟 172.20/26 其實是一個意思。
2. 路由
- 傳送資料包時所使用的地址是網路層的地址,即 IP 地址。然而僅僅有 IP 地址還不足以實現將資料包傳送到對端目標地址,在資料傳送過程中還需要類似於“指明路由器或主機”的資訊,以便真正發往目標地址。儲存這種資訊的就是路由控制表。
- 該路由控制表的形成方式有兩種:一種是管理員手動設定,另一種是路由器與其他路由器相互交換資訊時自動重新整理。前者也叫做靜態路由控制,而後者叫做動態路由控制。
- IP 協議始終認為路由表是正確的。然後,IP 本身並沒有定義製作路由控制表的協議。即 IP 沒有製作路由控制表的機制。該表示由一個叫做“路由協議”的協議製作而成。
2.1 IP 地址與路由控制
- IP 地址的網路地址部分用於進行路由控制。
- 路由控制表中記錄著網路地址與下一步應該傳送至路由器的地址。
- 在傳送 IP 包時,首先要確定 IP 包首部中的目標地址,再從路由控制表中找到與該地址具有相同網路地址的記錄,根據該記錄將 IP 包轉發給相應的下一個路由器。如果路由控制表中存在多條相同網路地址的記錄,就選擇一個最為吻合的網路地址。
3. IP 分包與組包
- 每種資料鏈路的最大傳輸單元(MTU)都不盡相同,因為每個不同型別的資料鏈路的使用目的不同。使用目的不同,可承載的 MTU 也就不同。
- 任何一臺主機都有必要對 IP 分片進行相應的處理。分片往往在網路上遇到比較大的報文無法一下子傳送出去時才會進行處理。
- 經過分片之後的 IP 資料報在被重組的時候,只能由目標主機進行。路由器雖然做分片但不會進行重組。
3.1 路徑 MTU 發現
- 分片機制也有它的不足。如路由器的處理負荷加重之類。因此,只要允許,是不希望由路由器進行 IP 資料包的分片處理的。
- 為了應對分片機制的不足,“路徑 MTU 發現” 技術應運而生。路徑 MTU 指的是,從傳送端主機到接收端主機之間不需要分片是最大 MTU 的大小。即路徑中存在的所有資料鏈路中最小的 MTU 。
- 進行路徑 MTU 發現,就可以避免在中途的路由器上進行分片處理,也可以在 TCP 中傳送更大的包。
4. IPv6
- IPv6(IP version 6)是為了根本解決 IPv4 地址耗盡的問題而被標準化的網際協議。IPv4 的地址長度為 4 個 8 位位元組,即 32 位元。而 IPv6 的地址長度則是原來的 4 倍,即 128 位元,一般寫成 8 個 16 位位元組。
4.1 IPv6 的特點
- IP 得知的擴大與路由控制表的聚合。
- 效能提升。包首部長度採用固定的值(40位元組),不再採用首部檢驗碼。簡化首部結構,減輕路由器負擔。路由器不再做分片處理。
- 支援即插即用功能。即使沒有DHCP伺服器也可以實現自動分配 IP 地址。
- 採用認證與加密功能。應對偽造 IP 地址的網路安全功能以及防止線路竊聽的功能。
- 多播、Mobile IP 成為擴充套件功能。
4.2 IPv6 中 IP 地址的標記方法
- 一般人們將 128 位元 IP 地址以每 16 位元為一組,每組用冒號(“:”)隔開進行標記。
- 而且如果出現連續的 0 時還可以將這些 0 省略,並用兩個冒號(“::”)隔開。但是,一個 IP 地址中只允許出現一次兩個連續的冒號。
4.3 IPv6 地址的結構
- IPv6 類似 IPv4,也是通過 IP 地址的前幾位標識 IP 地址的種類。
- 在網際網路通訊中,使用一種全域性的單播地址。它是網際網路中唯一的一個地址,不需要正式分配 IP 地址。
4.4 全域性單播地址
- 全域性單播地址是指世界上唯一的一個地址。它是網際網路通訊以及各個域內部通訊中最為常用的一個 IPv6 地址。
- 格式如下圖所示,現在 IPv6 的網路中所使用的格式為,n = 48,m = 16 以及 128 - n - m = 64。即前 64 位元為網路標識,後 64 位元為主機標識。
4.5 鏈路本地單播地址
- 鏈路本地單播地址是指在同一個資料鏈路內唯一的地址。它用於不經過路由器,在同一個鏈路中的通訊。通常介面 ID 儲存 64 位元版的 MAC 地址。
4.6 唯一本地地址
- 唯一本地地址是不進行網際網路通訊時所用的地址。
- 唯一本地地址雖然不會與網際網路連線,但是也會盡可能地隨機生成一個唯一的全域性 ID。
- L 通常被置為 1
- 全域性 ID 的值隨機決定
- 子網 ID 是指該域子網地址
- 介面 ID 即為介面的 ID
4.7 IPv6 分段處理
- IPv6 的分片處理只在作為起點的傳送端主機上進行,路由器不參與分片。
- IPv6 中最小 MTU 為 1280 位元組,因此,在嵌入式系統中對於那些有一定系統資源限制的裝置來說,不需要進行“路徑 MTU 發現”,而是在傳送 IP 包時直接以 1280 位元組為單位分片送出。
4.8 IP 首部(暫略)
5. IP 協議相關技術
- IP 旨在讓最終目標主機收到資料包,但是在這一過程中僅僅有 IP 是無法實現通訊的。必須還有能夠解析主機名稱和 MAC 地址的功能,以及資料包在傳送過程中異常情況處理的功能。
5.1 DNS
- 我們平常在訪問某個網站時不適用 IP 地址,而是用一串由羅馬字和點號組成的字串。而一般使用者在使用 TCP/IP 進行通訊時也不使用 IP 地址。能夠這樣做是因為有了 DNS (Domain Name System)功能的支援。DNS 可以將那串字串自動轉換為具體的 IP 地址。
- 這種 DNS 不僅適用於 IPv4,還適用於 IPv6。
5.2 ARP
- 只要確定了 IP 地址,就可以向這個目標地址傳送 IP 資料報。然而,在底層資料鏈路層,進行實際通訊時卻有必要了解每個 IP 地址所對應的 MAC 地址。
- ARP 是一種解決地址問題的協議。以目標 IP 地址為線索,用來定位下一個應該接收資料分包的網路裝置對應的 MAC 地址。不過 ARP 只適用於 IPv4,不能用於 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 傳送鄰居探索訊息。
- RARP 是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協議。
5.3 ICMP
- ICMP 的主要功能包括,確認 IP 包是否成功送達目標地址,通知在傳送過程當中 IP 包被廢棄的具體原因,改善網路設定等。
- IPv4 中 ICMP 僅作為一個輔助作用支援 IPv4。也就是說,在 IPv4 時期,即使沒有 ICMP,仍然可以實現 IP 通訊。然而,在 IPv6 中,ICMP 的作用被擴大,如果沒有 ICMPv6,IPv6 就無法進行正常通訊。
5.4 DHCP
- 如果逐一為每一臺主機設定 IP 地址會是非常繁瑣的事情。特別是在移動使用膝上型電腦、只能終端以及平板電腦等裝置時,每移動到一個新的地方,都要重新設定 IP 地址。
- 於是,為了實現自動設定 IP 地址、統一管理 IP 地址分配,就產生了 DHCP(Dynamic Host Configuration Protocol)協議。有了 DHCP,計算機只要連線到網路,就可以進行 TCP/IP 通訊。也就是說,DHCP 讓即插即用變得可能。
- DHCP 不僅在 IPv4 中,在 IPv6 中也可以使用。
5.5 NAT
- NAT(Network Address Translator)是用於在本地網路中使用私有地址,在連線網際網路時轉而使用全域性 IP 地址的技術。
- 除轉換 IP 地址外,還出現了可以轉換 TCP、UDP 埠號的 NAPT(Network Address Ports Translator)技術,由此可以實現用一個全域性 IP 地址與多個主機的通訊。
- NAT(NAPT)實際上是為正在面臨地址枯竭的 IPv4 而開發的技術。不過,在 IPv6 中為了提高網路安全也在使用 NAT,在 IPv4 和 IPv6 之間的相互通訊當中常常使用 NAT-PT。
5.6 IP 隧道
- 如上圖的網路環境中,網路 A 與網路 B 之間無法直接進行通訊,為了讓它們之間正常通訊,這時必須得采用 IP 隧道的功能。
- IP 隧道可以將那些從網路 A 發過來的 IPv6 的包統合為一個數據,再為之追加一個 IPv4 的首部以後轉發給網路 C。
- 一般情況下,緊接著 IP 首部的是 TCP 或 UDP 的首部。然而,現在的應用當中“ IP 首部的後面還是 IP 首部”或者“ IP 首部的後面是 IPv6