一篇文章带你详解 TCP/IP 协议(下)
前面的第一二三章已在上篇講解,還沒看過的可以先看看:一篇文章帶你詳解 TCP/IP 協(xié)議(上)
本文繼續(xù)講解第四章。
四、網(wǎng)絡(luò)層中的 IP 協(xié)議
- IP(IPv4、IPv6)相當(dāng)于 OSI 參考模型中的第3層——網(wǎng)絡(luò)層。網(wǎng)絡(luò)層的主要作用是“實(shí)現(xiàn)終端節(jié)點(diǎn)之間的通信”。這種終端節(jié)點(diǎn)之間的通信也叫“點(diǎn)對點(diǎn)通信”。
- 網(wǎng)絡(luò)的下一層——數(shù)據(jù)鏈路層的主要作用是在互連同一種數(shù)據(jù)鏈路的節(jié)點(diǎn)之間進(jìn)行包傳遞。而一旦跨越多種數(shù)據(jù)鏈路,就需要借助網(wǎng)絡(luò)層。網(wǎng)絡(luò)層可以跨越不同的數(shù)據(jù)鏈路,即使是在不同的數(shù)據(jù)鏈路上也能實(shí)現(xiàn)兩端節(jié)點(diǎn)之間的數(shù)據(jù)包傳輸。
- IP 大致分為三大作用模塊,它們是 IP 尋址、路由(最終節(jié)點(diǎn)為止的轉(zhuǎn)發(fā))以及 IP 分包與組包。
1. IP 地址
1.1 IP 地址概述
- 在計(jì)算機(jī)通信中,為了識別通信對端,必須要有一個(gè)類似于地址的識別碼進(jìn)行標(biāo)識。在數(shù)據(jù)鏈路中的 MAC 地址正是用來標(biāo)識同一個(gè)鏈路中不同計(jì)算機(jī)的一種識別碼。
- 作為網(wǎng)絡(luò)層的 IP ,也有這種地址信息,一般叫做 IP 地址。IP 地址用于在“連接到網(wǎng)絡(luò)中的所有主機(jī)中識別出進(jìn)行通信的目標(biāo)地址”。因此,在 TCP/IP 通信中所有主機(jī)或路由器必須設(shè)定自己的 IP 地址。
- 不論一臺主機(jī)與哪種數(shù)據(jù)鏈路連接,其 IP 地址的形式都保持不變。
- IP 地址(IPv4 地址)由32位正整數(shù)來表示。IP 地址在計(jì)算機(jī)內(nèi)部以二進(jìn)制方式被處理。然而,由于我們并不習(xí)慣于采用二進(jìn)制方式,我們將32位的 IP 地址以每8位為一組,分成4組,每組以 “.” 隔開,再將每組數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)。如下:
| 10101100 | 00010100 | 00000001 | 00000001 | (2進(jìn)制) |
| 10101100. | 00010100. | 00000001. | 00000001 | (2進(jìn)制) |
| 172. | 20. | 1. | 1 | (10進(jìn)制) |
1.2 IP 地址由網(wǎng)絡(luò)和主機(jī)兩部分標(biāo)識組成
- 如下圖,網(wǎng)絡(luò)標(biāo)識在數(shù)據(jù)鏈路的每個(gè)段配置不同的值。網(wǎng)絡(luò)標(biāo)識必須保證相互連接的每個(gè)段的地址不相重復(fù)。而相同段內(nèi)相連的主機(jī)必須有相同的網(wǎng)絡(luò)地址。IP 地址的“主機(jī)標(biāo)識”則不允許在同一個(gè)網(wǎng)段內(nèi)重復(fù)出現(xiàn)。由此,可以通過設(shè)置網(wǎng)絡(luò)地址和主機(jī)地址,在相互連接的整個(gè)網(wǎng)絡(luò)中保證每臺主機(jī)的 IP 地址都不會(huì)相互重疊。即 IP 地址具有了唯一性。
?
- 如下圖,IP 包被轉(zhuǎn)發(fā)到途中某個(gè)路由器時(shí),正是利用目標(biāo) IP 地址的網(wǎng)絡(luò)標(biāo)識進(jìn)行路由。因?yàn)榧词共豢粗鳈C(jī)標(biāo)識,只要一見到網(wǎng)絡(luò)標(biāo)識就能判斷出是否為該網(wǎng)段內(nèi)的主機(jī)。
?
1.3 IP 地址的分類
- IP 地址分為四個(gè)級別,分別為A類、B類、C類、D類。它根據(jù) IP 地址中從第 1 位到第 4 位的比特列對其網(wǎng)絡(luò)標(biāo)識和主機(jī)標(biāo)識進(jìn)行區(qū)分。
- A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網(wǎng)絡(luò)標(biāo)識。用十進(jìn)制表示的話,0.0.0.0~127.0.0.0 是 A 類的網(wǎng)絡(luò)地址。A 類地址的后 24 位相當(dāng)于主機(jī)標(biāo)識。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為16,777,214個(gè)。
- B 類 IP 地址是前兩位 “10” 的地址。從第 1 位到第 16 位是它的網(wǎng)絡(luò)標(biāo)識。用十進(jìn)制表示的話,128.0.0.0~191.255.0.0 是 B 類的網(wǎng)絡(luò)地址。B 類地址的后 16 位相當(dāng)于主機(jī)標(biāo)識。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為65,534個(gè)。
- C 類 IP 地址是前三位為 “110” 的地址。從第 1 位到第 24 位是它的網(wǎng)絡(luò)標(biāo)識。用十進(jìn)制表示的話,192.0.0.0~223.255.255.0 是 C 類的網(wǎng)絡(luò)地址。C 類地址的后 8 位相當(dāng)于主機(jī)標(biāo)識。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為254個(gè)。
- D 類 IP 地址是前四位為 “1110” 的地址。從第 1 位到第 32 位是它的網(wǎng)絡(luò)標(biāo)識。用十進(jìn)制表示的話,224.0.0.0~239.255.255.255 是 D 類的網(wǎng)絡(luò)地址。D 類地址沒有主機(jī)標(biāo)識,常用于多播。
- 在分配 IP 地址時(shí)關(guān)于主機(jī)標(biāo)識有一點(diǎn)需要注意。即要用比特位表示主機(jī)地址時(shí),不可以全部為 0 或全部為 1。因?yàn)槿繛?0 只有在表示對應(yīng)的網(wǎng)絡(luò)地址或 IP 地址不可以獲知的情況下才使用。而全部為 1 的主機(jī)通常作為廣播地址。因此,在分配過程中,應(yīng)該去掉這兩種情況。這也是為什么 C 類地址每個(gè)網(wǎng)段最多只能有 254( 28 - 2 = 254)個(gè)主機(jī)地址的原因。
1.4 廣播地址
- 廣播地址用于在同一個(gè)鏈路中相互連接的主機(jī)之間發(fā)送數(shù)據(jù)包。將 IP 地址中的主機(jī)地址部分全部設(shè)置為 1,就成了廣播地址。
- 廣播分為本地廣播和直接廣播兩種。在本網(wǎng)絡(luò)內(nèi)的廣播叫做本地廣播;在不同網(wǎng)絡(luò)之間的廣播叫做直接廣播。
1.5 IP 多播
- 多播用于將包發(fā)送給特定組內(nèi)的所有主機(jī)。由于其直接使用 IP 地址,因此也不存在可靠傳輸。
-
相比于廣播,多播既可以穿透路由器,又可以實(shí)現(xiàn)只給那些必要的組發(fā)送數(shù)據(jù)包。請看下圖:
? IP 多播?
- 多播使用 D 類地址。因此,如果從首位開始到第 4 位是 “1110”,就可以認(rèn)為是多播地址。而剩下的 28 位可以成為多播的組編號。
- 此外, 對于多播,所有的主機(jī)(路由器以外的主機(jī)和終端主機(jī))必須屬于 224.0.0.1 的組,所有的路由器必須屬于 224.0.0.2 的組。
1.6 子網(wǎng)掩碼
- 現(xiàn)在一個(gè) IP 地址的網(wǎng)絡(luò)標(biāo)識和主機(jī)標(biāo)識已不再受限于該地址的類別,而是由一個(gè)叫做“子網(wǎng)掩碼”的識別碼通過子網(wǎng)網(wǎng)絡(luò)地址細(xì)分出比 A 類、B 類、C 類更小粒度的網(wǎng)絡(luò)。這種方式實(shí)際上就是將原來 A 類、B 類、C 類等分類中的主機(jī)地址部分用作子網(wǎng)地址,可以將原網(wǎng)絡(luò)分為多個(gè)物理網(wǎng)絡(luò)的一種機(jī)制。
- 子網(wǎng)掩碼用二進(jìn)制方式表示的話,也是一個(gè) 32 位的數(shù)字。它對應(yīng) IP 地址網(wǎng)絡(luò)標(biāo)識部分的位全部為 “1”,對應(yīng) IP 地址主機(jī)標(biāo)識的部分則全部為 “0”。由此,一個(gè) IP 地址可以不再受限于自己的類別,而是可以用這樣的子網(wǎng)掩碼自由地定位自己的網(wǎng)絡(luò)標(biāo)識長度。當(dāng)然,子網(wǎng)掩碼必須是 IP 地址的首位開始連續(xù)的 “1”。
- 對于子網(wǎng)掩碼,目前有兩種表示方式。第一種是,將 IP 地址與子網(wǎng)掩碼的地址分別用兩行來表示。以 172.20.100.52 的前 26 位是網(wǎng)絡(luò)地址的情況為例,如下:
| 子網(wǎng)掩碼 | 255. | 255. | 255. | 192 |
| ? | ? | ? | ? | ? |
| 網(wǎng)絡(luò)地址 | 172. | 20. | 100. | 0 |
| 子網(wǎng)掩碼 | 255. | 255. | 255. | 192 |
| ? | ? | ? | ? | ? |
| 廣播地址 | 172. | 20. | 100. | 63 |
| 子網(wǎng)掩碼 | 255. | 255. | 255. | 192 |
- 第二種表示方式是,在每個(gè) IP 地址后面追加網(wǎng)絡(luò)地址的位數(shù)用 “/ ” 隔開,如下:
| 網(wǎng)絡(luò)地址 | 172. | 20. | 100. | 0 | / 26 |
| 廣播地址 | 172. | 20. | 100. | 63 | / 26 |
- 另外,在第二種方式下記述網(wǎng)絡(luò)地址時(shí)可以省略后面的 “0” 。例如:172.20.0.0/26 跟 172.20/26 其實(shí)是一個(gè)意思。
?
2. 路由
- 發(fā)送數(shù)據(jù)包時(shí)所使用的地址是網(wǎng)絡(luò)層的地址,即 IP 地址。然而僅僅有 IP 地址還不足以實(shí)現(xiàn)將數(shù)據(jù)包發(fā)送到對端目標(biāo)地址,在數(shù)據(jù)發(fā)送過程中還需要類似于“指明路由器或主機(jī)”的信息,以便真正發(fā)往目標(biāo)地址。保存這種信息的就是路由控制表。
- 該路由控制表的形成方式有兩種:一種是管理員手動(dòng)設(shè)置,另一種是路由器與其他路由器相互交換信息時(shí)自動(dòng)刷新。前者也叫做靜態(tài)路由控制,而后者叫做動(dòng)態(tài)路由控制。
- IP 協(xié)議始終認(rèn)為路由表是正確的。然后,IP 本身并沒有定義制作路由控制表的協(xié)議。即 IP 沒有制作路由控制表的機(jī)制。該表示由一個(gè)叫做“路由協(xié)議”的協(xié)議制作而成。
2.1 IP 地址與路由控制
- IP 地址的網(wǎng)絡(luò)地址部分用于進(jìn)行路由控制。
- 路由控制表中記錄著網(wǎng)絡(luò)地址與下一步應(yīng)該發(fā)送至路由器的地址。
- 在發(fā)送 IP 包時(shí),首先要確定 IP 包首部中的目標(biāo)地址,再從路由控制表中找到與該地址具有相同網(wǎng)絡(luò)地址的記錄,根據(jù)該記錄將 IP 包轉(zhuǎn)發(fā)給相應(yīng)的下一個(gè)路由器。如果路由控制表中存在多條相同網(wǎng)絡(luò)地址的記錄,就選擇一個(gè)最為吻合的網(wǎng)絡(luò)地址。
?
3. IP 分包與組包
- 每種數(shù)據(jù)鏈路的最大傳輸單元(MTU)都不盡相同,因?yàn)槊總€(gè)不同類型的數(shù)據(jù)鏈路的使用目的不同。使用目的不同,可承載的 MTU 也就不同。
- 任何一臺主機(jī)都有必要對 IP 分片進(jìn)行相應(yīng)的處理。分片往往在網(wǎng)絡(luò)上遇到比較大的報(bào)文無法一下子發(fā)送出去時(shí)才會(huì)進(jìn)行處理。
- 經(jīng)過分片之后的 IP 數(shù)據(jù)報(bào)在被重組的時(shí)候,只能由目標(biāo)主機(jī)進(jìn)行。路由器雖然做分片但不會(huì)進(jìn)行重組。
3.1 路徑 MTU 發(fā)現(xiàn)
- 分片機(jī)制也有它的不足。如路由器的處理負(fù)荷加重之類。因此,只要允許,是不希望由路由器進(jìn)行 IP 數(shù)據(jù)包的分片處理的。
- 為了應(yīng)對分片機(jī)制的不足,“路徑 MTU 發(fā)現(xiàn)” 技術(shù)應(yīng)運(yùn)而生。路徑 MTU 指的是,從發(fā)送端主機(jī)到接收端主機(jī)之間不需要分片是最大 MTU 的大小。即路徑中存在的所有數(shù)據(jù)鏈路中最小的 MTU 。
- 進(jìn)行路徑 MTU 發(fā)現(xiàn),就可以避免在中途的路由器上進(jìn)行分片處理,也可以在 TCP 中發(fā)送更大的包。
?
4. IPv6
- IPv6(IP version 6)是為了根本解決 IPv4 地址耗盡的問題而被標(biāo)準(zhǔn)化的網(wǎng)際協(xié)議。IPv4 的地址長度為 4 個(gè) 8 位字節(jié),即 32 比特。而 IPv6 的地址長度則是原來的 4 倍,即 128 比特,一般寫成 8 個(gè) 16 位字節(jié)。
4.1 IPv6 的特點(diǎn)
- IP 得知的擴(kuò)大與路由控制表的聚合。
- 性能提升。包首部長度采用固定的值(40字節(jié)),不再采用首部檢驗(yàn)碼。簡化首部結(jié)構(gòu),減輕路由器負(fù)擔(dān)。路由器不再做分片處理。
- 支持即插即用功能。即使沒有DHCP服務(wù)器也可以實(shí)現(xiàn)自動(dòng)分配 IP 地址。
- 采用認(rèn)證與加密功能。應(yīng)對偽造 IP 地址的網(wǎng)絡(luò)安全功能以及防止線路竊聽的功能。
- 多播、Mobile IP 成為擴(kuò)展功能。
4.2 IPv6 中 IP 地址的標(biāo)記方法
- 一般人們將 128 比特 IP 地址以每 16 比特為一組,每組用冒號(“:”)隔開進(jìn)行標(biāo)記。
- 而且如果出現(xiàn)連續(xù)的 0 時(shí)還可以將這些 0 省略,并用兩個(gè)冒號(“::”)隔開。但是,一個(gè) IP 地址中只允許出現(xiàn)一次兩個(gè)連續(xù)的冒號。
4.3 IPv6 地址的結(jié)構(gòu)
- IPv6 類似 IPv4,也是通過 IP 地址的前幾位標(biāo)識 IP 地址的種類。
- 在互聯(lián)網(wǎng)通信中,使用一種全局的單播地址。它是互聯(lián)網(wǎng)中唯一的一個(gè)地址,不需要正式分配 IP 地址。
| 環(huán)回地址 | 0000 ... 0001(128比特) | ::1 / 128 |
| 唯一本地地址 | 1111 110 | FC00:/ 7 |
| 鏈路本地單播地址 | 1111 1110 10 | FE80::/ 10 |
| 多播地址 | 1111 1111 | FF00::/ 8 |
| 全局單播地址 | (其他) | ? |
4.4 全局單播地址
- 全局單播地址是指世界上唯一的一個(gè)地址。它是互聯(lián)網(wǎng)通信以及各個(gè)域內(nèi)部通信中最為常用的一個(gè) IPv6 地址。
- 格式如下圖所示,現(xiàn)在 IPv6 的網(wǎng)絡(luò)中所使用的格式為,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特為網(wǎng)絡(luò)標(biāo)識,后 64 比特為主機(jī)標(biāo)識。
?
4.5 鏈路本地單播地址
- 鏈路本地單播地址是指在同一個(gè)數(shù)據(jù)鏈路內(nèi)唯一的地址。它用于不經(jīng)過路由器,在同一個(gè)鏈路中的通信。通常接口 ID 保存 64 比特版的 MAC 地址。
?
4.6 唯一本地地址
- 唯一本地地址是不進(jìn)行互聯(lián)網(wǎng)通信時(shí)所用的地址。
- 唯一本地地址雖然不會(huì)與互聯(lián)網(wǎng)連接,但是也會(huì)盡可能地隨機(jī)生成一個(gè)唯一的全局 ID。
- L 通常被置為 1
- 全局 ID 的值隨機(jī)決定
- 子網(wǎng) ID 是指該域子網(wǎng)地址
- 接口 ID 即為接口的 ID
?
4.7 IPv6 分段處理
- IPv6 的分片處理只在作為起點(diǎn)的發(fā)送端主機(jī)上進(jìn)行,路由器不參與分片。
- IPv6 中最小 MTU 為 1280 字節(jié),因此,在嵌入式系統(tǒng)中對于那些有一定系統(tǒng)資源限制的設(shè)備來說,不需要進(jìn)行“路徑 MTU 發(fā)現(xiàn)”,而是在發(fā)送 IP 包時(shí)直接以 1280 字節(jié)為單位分片送出。
4.8 IP 首部(暫略)
?
5. IP 協(xié)議相關(guān)技術(shù)
- IP 旨在讓最終目標(biāo)主機(jī)收到數(shù)據(jù)包,但是在這一過程中僅僅有 IP 是無法實(shí)現(xiàn)通信的。必須還有能夠解析主機(jī)名稱和 MAC 地址的功能,以及數(shù)據(jù)包在發(fā)送過程中異常情況處理的功能。
5.1 DNS
- 我們平常在訪問某個(gè)網(wǎng)站時(shí)不適用 IP 地址,而是用一串由羅馬字和點(diǎn)號組成的字符串。而一般用戶在使用 TCP/IP 進(jìn)行通信時(shí)也不使用 IP 地址。能夠這樣做是因?yàn)橛辛?DNS (Domain Name System)功能的支持。DNS 可以將那串字符串自動(dòng)轉(zhuǎn)換為具體的 IP 地址。
- 這種 DNS 不僅適用于 IPv4,還適用于 IPv6。
5.2 ARP
- 只要確定了 IP 地址,就可以向這個(gè)目標(biāo)地址發(fā)送 IP 數(shù)據(jù)報(bào)。然而,在底層數(shù)據(jù)鏈路層,進(jìn)行實(shí)際通信時(shí)卻有必要了解每個(gè) IP 地址所對應(yīng)的 MAC 地址。
- ARP 是一種解決地址問題的協(xié)議。以目標(biāo) IP 地址為線索,用來定位下一個(gè)應(yīng)該接收數(shù)據(jù)分包的網(wǎng)絡(luò)設(shè)備對應(yīng)的 MAC 地址。不過 ARP 只適用于 IPv4,不能用于 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 發(fā)送鄰居探索消息。
- RARP 是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協(xié)議。
5.3 ICMP
- ICMP 的主要功能包括,確認(rèn) IP 包是否成功送達(dá)目標(biāo)地址,通知在發(fā)送過程當(dāng)中 IP 包被廢棄的具體原因,改善網(wǎng)絡(luò)設(shè)置等。
- IPv4 中 ICMP 僅作為一個(gè)輔助作用支持 IPv4。也就是說,在 IPv4 時(shí)期,即使沒有 ICMP,仍然可以實(shí)現(xiàn) IP 通信。然而,在 IPv6 中,ICMP 的作用被擴(kuò)大,如果沒有 ICMPv6,IPv6 就無法進(jìn)行正常通信。
5.4 DHCP
- 如果逐一為每一臺主機(jī)設(shè)置 IP 地址會(huì)是非常繁瑣的事情。特別是在移動(dòng)使用筆記本電腦、只能終端以及平板電腦等設(shè)備時(shí),每移動(dòng)到一個(gè)新的地方,都要重新設(shè)置 IP 地址。
- 于是,為了實(shí)現(xiàn)自動(dòng)設(shè)置 IP 地址、統(tǒng)一管理 IP 地址分配,就產(chǎn)生了 DHCP(Dynamic Host Configuration Protocol)協(xié)議。有了 DHCP,計(jì)算機(jī)只要連接到網(wǎng)絡(luò),就可以進(jìn)行 TCP/IP 通信。也就是說,DHCP 讓即插即用變得可能。
- DHCP 不僅在 IPv4 中,在 IPv6 中也可以使用。
5.5 NAT
- NAT(Network Address Translator)是用于在本地網(wǎng)絡(luò)中使用私有地址,在連接互聯(lián)網(wǎng)時(shí)轉(zhuǎn)而使用全局 IP 地址的技術(shù)。
- 除轉(zhuǎn)換 IP 地址外,還出現(xiàn)了可以轉(zhuǎn)換 TCP、UDP 端口號的 NAPT(Network Address Ports Translator)技術(shù),由此可以實(shí)現(xiàn)用一個(gè)全局 IP 地址與多個(gè)主機(jī)的通信。
- NAT(NAPT)實(shí)際上是為正在面臨地址枯竭的 IPv4 而開發(fā)的技術(shù)。不過,在 IPv6 中為了提高網(wǎng)絡(luò)安全也在使用 NAT,在 IPv4 和 IPv6 之間的相互通信當(dāng)中常常使用 NAT-PT。
5.6 IP 隧道
夾著 IPv4 網(wǎng)絡(luò)的兩個(gè) IPv6 網(wǎng)絡(luò)?
- 如上圖的網(wǎng)絡(luò)環(huán)境中,網(wǎng)絡(luò) A 與網(wǎng)絡(luò) B 之間無法直接進(jìn)行通信,為了讓它們之間正常通信,這時(shí)必須得采用 IP 隧道的功能。
- IP 隧道可以將那些從網(wǎng)絡(luò) A 發(fā)過來的 IPv6 的包統(tǒng)合為一個(gè)數(shù)據(jù),再為之追加一個(gè) IPv4 的首部以后轉(zhuǎn)發(fā)給網(wǎng)絡(luò) C。
- 一般情況下,緊接著 IP 首部的是 TCP 或 UDP 的首部。然而,現(xiàn)在的應(yīng)用當(dāng)中“ IP 首部的后面還是 IP 首部”或者“ IP 首部的后面是 IPv6 的首部”等情況與日俱增。這種在網(wǎng)絡(luò)層的首部后面追加網(wǎng)絡(luò)層首部的通信方法就叫做“ IP 隧道”。
?
后續(xù)
系列文章
一篇文章帶你詳解 HTTP 協(xié)議(上)
一篇文章帶你詳解 HTTP 協(xié)議之報(bào)文首部及字段詳解(中)
一篇文章帶你詳解 HTTP 協(xié)議(下)
一篇文章帶你詳解 TCP/IP 協(xié)議(上)
?
學(xué)習(xí)資料
- 《TCP/IP 詳解》
- 《圖解 TCP/IP》
作者:滌生_Woo
鏈接:https://www.jianshu.com/p/9f3e879a4c9c
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的一篇文章带你详解 TCP/IP 协议(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章带你详解 TCP/IP 协议(上
- 下一篇: 【网络协议】专题总结以及网络协议高频面试