下·一篇文章帶你熟悉 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組,每組以 “.” 隔開,再將每組數轉換成十進制數。如下:

28 28 28 28 10101100 00010100 00000001 00000001 (2進制) 10101100. 00010100. 00000001. 00000001 (2進制) 172. 20. 1. 1 (10進制) 1.2 IP 地址由網絡和主機兩部分標識組成

如下圖,網絡標識在數據鏈路的每個段配置不同的值。網絡標識必須保證相互連接的每個段的地址不相重複。而相同段內相連的主機必須有相同的網絡地址。IP 地址的“主機標識”則不允許在同一個網段內重複出現。由此,可以通過設置網絡地址和主機地址,在相互連接的整個網絡中保證每臺主機的 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 地址,因此也不存在可靠傳輸。相比於廣播,多播既可以穿透路由器,又可以實現只給那些必要的組發送數據包。請看下圖:


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 地址 172. 20. 100. 52 子網掩碼 255. 255. 255. 192 網絡地址 172. 20. 100. 0 子網掩碼 255. 255. 255. 192 廣播地址 172. 20. 100. 63 子網掩碼 255. 255. 255. 192 第二種表示方式是,在每個 IP 地址後面追加網絡地址的位數用 “/ ” 隔開,如下: IP 地址 172. 20. 100. 52 / 26 網絡地址 172. 20. 100. 0 / 26 廣播地址 172. 20. 100. 63 / 26 另外,在第二種方式下記述網絡地址時可以省略後面的 “0” 。例如:172.20.0.0/26 跟 172.20/26 其實是一個意思。

2. 路由

發送數據包時所使用的地址是網絡層的地址,即 IP 地址。然而僅僅有 IP 地址還不足以實現將數據包發送到對端目標地址,在數據發送過程中還需要類似於“指明路由器或主機”的信息,以便真正發往目標地址。保存這種信息的就是路由控制表。該路由控制表的形成方式有兩種:一種是管理員手動設置,另一種是路由器與其他路由器相互交換信息時自動刷新。前者也叫做靜態路由控制,而後者叫做動態路由控制。IP 協議始終認為路由表是正確的。然後,IP 本身並沒有定義製作路由控制表的協議。即 IP 沒有製作路由控制表的機制。該表示由一個叫做“路由協議”的協議製作而成。

2.1 IP 地址與路由控制

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 地址。

未定義 0000 ... 0000(128比特) ::/ 128 環回地址 0000 ... 0001(128比特) ::1 / 128 唯一本地地址 1111 110 FC00:/ 7 鏈路本地單播地址 1111 1110 10 FE80::/ 10 多播地址 1111 1111 FF00::/ 8 全局單播地址 (其他) 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 隧道

夾著 IPv4 網絡的兩個 IPv6 網絡

如上圖的網絡環境中,網絡 A 與網絡 B 之間無法直接進行通信,為了讓它們之間正常通信,這時必須得采用 IP 隧道的功能。IP 隧道可以將那些從網絡 A 發過來的 IPv6 的包統合為一個數據,再為之追加一個 IPv4 的首部以後轉發給網絡 C。一般情況下,緊接著 IP 首部的是 TCP 或 UDP 的首部。然而,現在的應用當中“ IP 首部的後面還是 IP 首部”或者“ IP 首部的後面是 IPv6 的首部”等情況與日俱增。這種在網絡層的首部後面追加網絡層首部的通信方法就叫做“ IP 隧道”。

鏈接:https://www.jianshu.com/p/9f3e879a4c9c

來源:簡書