IP 將 TCP 傳過來的 TCP 首部和 TCP 數(shù)據(jù)合起來當(dāng)做自己的數(shù)據(jù),并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,參考路由控制表決定接受此 IP 包的路由或主機(jī)。
④ 網(wǎng)絡(luò)接口(以太網(wǎng)驅(qū)動(dòng))的處理
從 IP 傳過來的 IP 包對(duì)于以太網(wǎng)來說就是數(shù)據(jù)。給這些數(shù)據(jù)附加上以太網(wǎng)首部并進(jìn)行發(fā)送處理,生成的以太網(wǎng)數(shù)據(jù)包將通過物理層傳輸給接收端。
⑤ 網(wǎng)絡(luò)接口(以太網(wǎng)驅(qū)動(dòng))的處理
主機(jī)收到以太網(wǎng)包后,首先從以太網(wǎng)包首部找到 MAC 地址判斷是否為發(fā)送給自己的包,若不是則丟棄數(shù)據(jù)。
如果是發(fā)送給自己的包,則從以太網(wǎng)包首部中的類型確定數(shù)據(jù)類型,再傳給相應(yīng)的模塊,如 IP、ARP 等。這里的例子則是 IP 。
⑥ IP 模塊的處理
IP 模塊接收到 數(shù)據(jù)后也做類似的處理。從包首部中判斷此 IP 地址是否與自己的 IP 地址匹配,如果匹配則根據(jù)首部的協(xié)議類型將數(shù)據(jù)發(fā)送給對(duì)應(yīng)的模塊,如 TCP、UDP。這里的例子則是 TCP。 另外嗎,對(duì)于有路由器的情況,接收端地址往往不是自己的地址,此時(shí),需要借助路由控制表,在調(diào)查應(yīng)該送往的主機(jī)或路由器之后再進(jìn)行轉(zhuǎn)發(fā)數(shù)據(jù)。
數(shù)據(jù)鏈路和 IP 中的地址,分別指的是 MAC 地址和 IP 地址。前者用來識(shí)別同一鏈路中不同的計(jì)算機(jī),后者用來識(shí)別 TCP/IP 網(wǎng)絡(luò)中互連的主機(jī)和路由器。在傳輸層也有這種類似于地址的概念,那就是端口號(hào)。端口號(hào)用來識(shí)別同一臺(tái)計(jì)算機(jī)中進(jìn)行通信的不同應(yīng)用程序。因此,它也被稱為程序地址。
① 確認(rèn)應(yīng)答未能返回的情況。在這種情況下,數(shù)據(jù)已經(jīng)到達(dá)對(duì)端,是不需要再進(jìn)行重發(fā)的,如下圖:
部分確認(rèn)應(yīng)答丟失
② 某個(gè)報(bào)文段丟失的情況。接收主機(jī)如果收到一個(gè)自己應(yīng)該接收的序列號(hào)以外的數(shù)據(jù)時(shí),會(huì)針對(duì)當(dāng)前為止收到數(shù)據(jù)返回確認(rèn)應(yīng)答。如下圖所示,當(dāng)某一報(bào)文段丟失后,發(fā)送端會(huì)一直收到序號(hào)為1001的確認(rèn)應(yīng)答,因此,在窗口比較大,又出現(xiàn)報(bào)文段丟失的情況下,同一個(gè)序列號(hào)的確認(rèn)應(yīng)答將會(huì)被重復(fù)不斷地返回。而發(fā)送端主機(jī)如果連續(xù)3次收到同一個(gè)確認(rèn)應(yīng)答,就會(huì)將其對(duì)應(yīng)的數(shù)據(jù)進(jìn)行重發(fā)。這種機(jī)制比之前提到的超時(shí)管理更加高效,因此也被稱為高速重發(fā)控制。
高速重發(fā)控制
四、網(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)對(duì)點(diǎn)通信”。
IP 大致分為三大作用模塊,它們是 IP 尋址、路由(最終節(jié)點(diǎn)為止的轉(zhuǎn)發(fā))以及 IP 分包與組包。
1. IP 地址
1.1 IP 地址概述
在計(jì)算機(jī)通信中,為了識(shí)別通信對(duì)端,必須要有一個(gè)類似于地址的識(shí)別碼進(jìn)行標(biāo)識(shí)。在數(shù)據(jù)鏈路中的 MAC 地址正是用來標(biāo)識(shí)同一個(gè)鏈路中不同計(jì)算機(jī)的一種識(shí)別碼。
作為網(wǎng)絡(luò)層的 IP ,也有這種地址信息,一般叫做 IP 地址。IP 地址用于在“連接到網(wǎng)絡(luò)中的所有主機(jī)中識(shí)別出進(jìn)行通信的目標(biāo)地址”。因此,在 TCP/IP 通信中所有主機(jī)或路由器必須設(shè)定自己的 IP 地址。
不論一臺(tái)主機(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ù)。如下:
1.2 IP 地址由網(wǎng)絡(luò)和主機(jī)兩部分標(biāo)識(shí)組成
如下圖,網(wǎng)絡(luò)標(biāo)識(shí)在數(shù)據(jù)鏈路的每個(gè)段配置不同的值。網(wǎng)絡(luò)標(biāo)識(shí)必須保證相互連接的每個(gè)段的地址不相重復(fù)。而相同段內(nèi)相連的主機(jī)必須有相同的網(wǎng)絡(luò)地址。IP 地址的“主機(jī)標(biāo)識(shí)”則不允許在同一個(gè)網(wǎng)段內(nèi)重復(fù)出現(xiàn)。由此,可以通過設(shè)置網(wǎng)絡(luò)地址和主機(jī)地址,在相互連接的整個(gè)網(wǎng)絡(luò)中保證每臺(tái)主機(jī)的 IP 地址都不會(huì)相互重疊。即 IP 地址具有了唯一性。
IP地址的主機(jī)標(biāo)識(shí)
如下圖,IP 包被轉(zhuǎn)發(fā)到途中某個(gè)路由器時(shí),正是利用目標(biāo) IP 地址的網(wǎng)絡(luò)標(biāo)識(shí)進(jìn)行路由。因?yàn)榧词共豢粗鳈C(jī)標(biāo)識(shí),只要一見到網(wǎng)絡(luò)標(biāo)識(shí)就能判斷出是否為該網(wǎng)段內(nèi)的主機(jī)。
IP地址的網(wǎng)絡(luò)標(biāo)識(shí)
1.3 IP 地址的分類
* IP 地址分為四個(gè)級(jí)別,分別為A類、B類、C類、D類。它根據(jù) IP 地址中從第 1 位到第 4 位的比特列對(duì)其網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)進(jìn)行區(qū)分。
A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網(wǎng)絡(luò)標(biāo)識(shí)。用十進(jìn)制表示的話,0.0.0.0~127.0.0.0 是 A 類的網(wǎng)絡(luò)地址。A 類地址的后 24 位相當(dāng)于主機(jī)標(biāo)識(shí)。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為16,777,214個(gè)。
B 類 IP 地址是前兩位 “10” 的地址。從第 1 位到第 16 位是它的網(wǎng)絡(luò)標(biāo)識(shí)。用十進(jìn)制表示的話,128.0.0.0~191.255.0.0 是 B 類的網(wǎng)絡(luò)地址。B 類地址的后 16 位相當(dāng)于主機(jī)標(biāo)識(shí)。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為65,534個(gè)。
C 類 IP 地址是前三位為 “110” 的地址。從第 1 位到第 24 位是它的網(wǎng)絡(luò)標(biāo)識(shí)。用十進(jìn)制表示的話,192.0.0.0~223.255.255.0 是 C 類的網(wǎng)絡(luò)地址。C 類地址的后 8 位相當(dāng)于主機(jī)標(biāo)識(shí)。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為254個(gè)。
D 類 IP 地址是前四位為 “1110” 的地址。從第 1 位到第 32 位是它的網(wǎng)絡(luò)標(biāo)識(shí)。用十進(jìn)制表示的話,224.0.0.0~239.255.255.255 是 D 類的網(wǎng)絡(luò)地址。D 類地址沒有主機(jī)標(biāo)識(shí),常用于多播。
在分配 IP 地址時(shí)關(guān)于主機(jī)標(biāo)識(shí)有一點(diǎn)需要注意。即要用比特位表示主機(jī)地址時(shí),不可以全部為 0 或全部為 1。因?yàn)槿繛?0 只有在表示對(duì)應(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,就成了廣播地址。
現(xiàn)在一個(gè) IP 地址的網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)已不再受限于該地址的類別,而是由一個(gè)叫做“子網(wǎng)掩碼”的識(shí)別碼通過子網(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ù)字。它對(duì)應(yīng) IP 地址網(wǎng)絡(luò)標(biāo)識(shí)部分的位全部為 “1”,對(duì)應(yīng) IP 地址主機(jī)標(biāo)識(shí)的部分則全部為 “0”。由此,一個(gè) IP 地址可以不再受限于自己的類別,而是可以用這樣的子網(wǎng)掩碼自由地定位自己的網(wǎng)絡(luò)標(biāo)識(shí)長(zhǎng)度。當(dāng)然,子網(wǎng)掩碼必須是 IP 地址的首位開始連續(xù)的 “1”。
對(duì)于子網(wǎng)掩碼,目前有兩種表示方式。第一種是,將 IP 地址與子網(wǎng)掩碼的地址分別用兩行來表示。以 172.20.100.52 的前 26 位是網(wǎng)絡(luò)地址的情況為例,如下:
第二種表示方式是,在每個(gè) IP 地址后面追加網(wǎng)絡(luò)地址的位數(shù)用 “/ ” 隔開,如下:
2. 路由
發(fā)送數(shù)據(jù)包時(shí)所使用的地址是網(wǎng)絡(luò)層的地址,即 IP 地址。然而僅僅有 IP 地址還不足以實(shí)現(xiàn)將數(shù)據(jù)包發(fā)送到對(duì)端目標(biāo)地址,在數(shù)據(jù)發(fā)送過程中還需要類似于“指明路由器或主機(jī)”的信息,以便真正發(fā)往目標(biāo)地址。保存這種信息的就是路由控制表。
在發(fā)送 IP 包時(shí),首先要確定 IP 包首部中的目標(biāo)地址,再?gòu)穆酚煽刂票碇姓业脚c該地址具有相同網(wǎng)絡(luò)地址的記錄,根據(jù)該記錄將 IP 包轉(zhuǎn)發(fā)給相應(yīng)的下一個(gè)路由器。如果路由控制表中存在多條相同網(wǎng)絡(luò)地址的記錄,就選擇一個(gè)最為吻合的網(wǎng)絡(luò)地址。
image
IP 分包與組包
每種數(shù)據(jù)鏈路的最大傳輸單元(MTU)都不盡相同,因?yàn)槊總€(gè)不同類型的數(shù)據(jù)鏈路的使用目的不同。使用目的不同,可承載的 MTU 也就不同。
任何一臺(tái)主機(jī)都有必要對(duì) 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)對(duì)分片機(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ā)送更大的包。
IPv6 中最小 MTU 為 1280 字節(jié),因此,在嵌入式系統(tǒng)中對(duì)于那些有一定系統(tǒng)資源限制的設(shè)備來說,不需要進(jìn)行“路徑 MTU 發(fā)現(xiàn)”,而是在發(fā)* 送 IP 包時(shí)直接以 1280 字節(jié)為單位分片送出。
4.8 IP 首部(暫略)
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)號(hào)組成的字符串。而一般用戶在使用 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 地址所對(duì)應(yīng)的 MAC 地址。
ARP 是一種解決地址問題的協(xié)議。以目標(biāo) IP 地址為線索,用來定位下一個(gè)應(yīng)該接收數(shù)據(jù)分包的網(wǎng)絡(luò)設(shè)備對(duì)應(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è)置等。
如上圖的網(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 隧道”。