《TCP/IP協(xié)議族(第4版)》讀書(shū)筆記二

網(wǎng)絡(luò)層簡(jiǎn)介

1. 概念

為解決經(jīng)由多條鏈路的交付問(wèn)題,從而設(shè)計(jì)了網(wǎng)絡(luò)層。其主要負(fù)責(zé)主機(jī)到主機(jī)的交付,并且在分組經(jīng)過(guò)路由器時(shí)負(fù)責(zé)為其選擇路由。

實(shí)際中,互聯(lián)網(wǎng)中的設(shè)備間的連線(xiàn)錯(cuò)綜復(fù)雜,如何從A到B會(huì)經(jīng)過(guò)很多鏈路,在這個(gè)模型中路由器擔(dān)當(dāng)交換機(jī)的作用,當(dāng)一個(gè)分組從a端口到達(dá)該路由器后,會(huì)通過(guò)另一個(gè)端口b轉(zhuǎn)發(fā)到另一個(gè)交換機(jī)或終點(diǎn)設(shè)備上。這個(gè)處理過(guò)程稱(chēng)為交換(switching)。

2. 交換

那要如何實(shí)現(xiàn)交換?

方法一,電路交換。即在報(bào)文傳遞前從源點(diǎn)到終點(diǎn)建立一條物理電路,這種技術(shù)在物理層使用,而不在網(wǎng)絡(luò)層使用。

方法二,分組交換(packet switching)。實(shí)際中網(wǎng)絡(luò)層使用的技術(shù),報(bào)文的源點(diǎn)逐個(gè)發(fā)送被分割成一個(gè)個(gè)分組(datagram數(shù)據(jù)報(bào))的報(bào)文,然后終點(diǎn)逐個(gè)接收,全部到齊后,再由終點(diǎn)的網(wǎng)絡(luò)層交給上層。在分組交換網(wǎng)中,選擇路由的方式有兩種:數(shù)據(jù)報(bào)方式和虛電路方式。

3. 分組交換

3.1 無(wú)連接

開(kāi)始時(shí),網(wǎng)絡(luò)層被設(shè)計(jì)為無(wú)連接服務(wù)(connectionless service),同一個(gè)報(bào)文的分組間沒(méi)有關(guān)系,從A到B的路徑可能不同,即路由可能不同,顧到達(dá)B時(shí)順序可能會(huì)變,還可能會(huì)有部分分組丟失。

當(dāng)一個(gè)分組來(lái)到路由器時(shí),路由器會(huì)讀取該分組的目的地址,然后查詢(xún)自己的路由表,找到輸出端口,完成分組交換操作。若該報(bào)文需要被丟棄時(shí),讀取該分組的源地址,同樣根據(jù)路由表,向源地址發(fā)送差錯(cuò)消息。

所以在無(wú)連接分組交換網(wǎng)中,轉(zhuǎn)發(fā)判決的依據(jù)是該分組的目的地址。

3.2 面向連接

而在面向連接的服務(wù)中,同一報(bào)文中的所有分組間是有關(guān)聯(lián)的。在一個(gè)報(bào)文的所有數(shù)據(jù)報(bào)在發(fā)送前,需要建立一條虛連接。此時(shí)分組除要包含源和目的地址外,還需要有一個(gè)流標(biāo)號(hào)(flow label),就是一個(gè)虛電路標(biāo)識(shí)符(virtual circuit identifier),用來(lái)制定這些分組應(yīng)當(dāng)使用的虛路徑。

建立面向連接的服務(wù)的三個(gè)步驟:建鏈、數(shù)據(jù)傳輸、拆鏈。

建鏈階段,源點(diǎn)和終點(diǎn)間需要交換兩個(gè)分組:請(qǐng)求分組和確認(rèn)分組。請(qǐng)求分組從源點(diǎn)到終點(diǎn),攜帶源地址和目的地址。當(dāng)一個(gè)請(qǐng)求分組來(lái)到一個(gè)路由器時(shí),路由器可以填寫(xiě)入端口、入標(biāo)號(hào)和出端口,其中入標(biāo)號(hào)是路由器自主分配的。

最終請(qǐng)求分組來(lái)到終點(diǎn),終點(diǎn)給分配一個(gè)標(biāo)號(hào)后,發(fā)送確認(rèn)分組。當(dāng)確認(rèn)分組來(lái)到一個(gè)路由器后,路由器可以根據(jù)目的地址和源地址確認(rèn)原先已經(jīng)填寫(xiě)部分的一條路由表項(xiàng),并將它補(bǔ)齊出標(biāo)號(hào)。最后一個(gè)路由器將確認(rèn)分組發(fā)給源點(diǎn)并附上入端口,這個(gè)入端口就是一開(kāi)始在建鏈階段生成的。

此時(shí)源點(diǎn)知道了該用哪個(gè)標(biāo)號(hào)發(fā),終點(diǎn)知道了從哪個(gè)標(biāo)號(hào)來(lái)的,中間鏈路中的路由器知道了當(dāng)某一個(gè)標(biāo)號(hào)來(lái)時(shí),該如何進(jìn)行轉(zhuǎn)發(fā)操作。此時(shí)建鏈階段就結(jié)束了。

FullSizeRender 3.jpg
FullSizeRender 4.jpg

數(shù)據(jù)傳輸階段,某一分組來(lái)到一個(gè)路由器后,路由器根據(jù)標(biāo)號(hào)選擇出端口,并將標(biāo)號(hào)由入標(biāo)號(hào)改為出標(biāo)號(hào),再進(jìn)行轉(zhuǎn)發(fā)。

拆鏈階段,由源點(diǎn)向終點(diǎn)發(fā)送拆鏈分組,終點(diǎn)向源點(diǎn)發(fā)送證實(shí)分組,依然是一個(gè)Request后Response的設(shè)計(jì)。

目前來(lái)說(shuō),無(wú)連接服務(wù)依然占主要地位。

4. 網(wǎng)絡(luò)層各部分提供的服務(wù)

在源點(diǎn),網(wǎng)絡(luò)層提供四種服務(wù):分組化處理、查找下一跳的邏輯地址(IP)、查找下一跳的物理地址(MAC)、對(duì)數(shù)據(jù)報(bào)進(jìn)行必要的分片處理。
首先將從上層得到的報(bào)文進(jìn)行分組化處理,即增加報(bào)頭,填入一些數(shù)據(jù),包括源地址,而目的地址由上層給出。
然后根據(jù)生成的數(shù)據(jù)報(bào)中的目的邏輯地址,通過(guò)路由表來(lái)選擇下一跳的邏輯地址,然后使用ARP(地址解析)協(xié)議在表中查找下一跳的邏輯地址和物理地址之間的映射關(guān)系。
最后由于不同的數(shù)據(jù)鏈路層對(duì)于幀的長(zhǎng)度有不同的要求,需要查找MTU(最大傳送單元)表來(lái)確定需要分割數(shù)據(jù)報(bào)。如果有分片操作,則需要將每一個(gè)分片前都增加首部,還需要在首部中填入數(shù)據(jù)以指明該數(shù)據(jù)片在整個(gè)數(shù)據(jù)報(bào)中的位置。

在路由器上,網(wǎng)絡(luò)層提供四種服務(wù):檢查數(shù)據(jù)報(bào)的有效性、查找下一跳的邏輯地址、查找下一跳的物理地址、分片處理。有效性指的是首部有沒(méi)有損壞,是否被交給正確的路由器。由于轉(zhuǎn)發(fā)設(shè)計(jì)兩個(gè)端口,所以?xún)蓚€(gè)端口對(duì)應(yīng)的數(shù)據(jù)鏈路層可能不同,所以需要查詢(xún)MTU表確認(rèn)是否需要分片。

在終點(diǎn),網(wǎng)絡(luò)層提供服務(wù):檢查有效性、拆包、重裝。檢查有效性后要將報(bào)文頭部去掉從而取出有效數(shù)據(jù),當(dāng)所有的數(shù)據(jù)報(bào)文都到齊后,進(jìn)行重裝再交給上層。若重組定時(shí)器超時(shí),則所有數(shù)據(jù)包會(huì)被銷(xiāo)毀,并發(fā)送一個(gè)差錯(cuò)報(bào)文,以提醒源點(diǎn)需要重發(fā)。

5. 不完全的實(shí)現(xiàn)

有些服務(wù)在網(wǎng)絡(luò)層只是部分實(shí)現(xiàn),或者沒(méi)有實(shí)現(xiàn)。有些服務(wù)是由一些輔助協(xié)議來(lái)提供,或者通過(guò)其他之后加入的協(xié)議實(shí)現(xiàn)。

差錯(cuò)控制(error control)包括對(duì)損壞、丟失以及重復(fù)的數(shù)據(jù)報(bào)進(jìn)行檢測(cè)的機(jī)制,以及檢測(cè)后的糾錯(cuò)機(jī)制。網(wǎng)絡(luò)層沒(méi)有提供真正意義上的此機(jī)制。由于網(wǎng)絡(luò)層有分片,如果有差錯(cuò)控制會(huì)比較低效。在網(wǎng)絡(luò)層報(bào)文的報(bào)頭中有校驗(yàn)和字段,不過(guò)只是針對(duì)報(bào)頭設(shè)計(jì)的,由于報(bào)頭在每個(gè)路由器上都會(huì)有數(shù)據(jù)變化,所以校驗(yàn)和也需要重新計(jì)算。輔助協(xié)議是ICMP。

流量控制(flow control)用于調(diào)整源點(diǎn)發(fā)送的數(shù)據(jù)量以免接收方超載。當(dāng)前網(wǎng)絡(luò)層沒(méi)有考慮此功能。

擁塞控制(congestion control)是避免有過(guò)多的數(shù)據(jù)報(bào)出現(xiàn)在因特網(wǎng)中的某一個(gè)區(qū)域內(nèi),此時(shí)某些路由器可能會(huì)丟棄一些數(shù)據(jù)報(bào)。丟失后需要重傳,結(jié)果變成滾雪球,越來(lái)越擁塞,最終系統(tǒng)崩潰。
在無(wú)連接網(wǎng)絡(luò)中,路由器會(huì)選擇那些造成擁塞的方向,在反方向的報(bào)文中設(shè)置一個(gè)bit作為擁塞警告,以通知源點(diǎn)放慢速度。ICMP同樣有擁塞控制的功能,當(dāng)有擁塞發(fā)生時(shí),路由器會(huì)發(fā)一個(gè)特殊的扼流分組(choke packet)給源點(diǎn)。還有一種方法是給分組設(shè)定優(yōu)先級(jí)。
在面向連接網(wǎng)絡(luò)中,擁塞控制較簡(jiǎn)單??梢酝ㄟ^(guò)建立一條額外的虛電路分壓。另一種方法是在建鏈階段提前協(xié)商,有需要建立虛電路的路由器根據(jù)自己現(xiàn)有的通信量和自己能承受的最大通信量比較,從而決定是否可以建立虛電路,以及虛電路的通信量的最大值。

服務(wù)質(zhì)量(quality of service,QoS),主要針對(duì)對(duì)質(zhì)量有高要求的多媒體通信。大多在上層實(shí)現(xiàn)。

路由選擇(routing)。由路由選擇協(xié)議完成,幫助主機(jī)和路由器建立自己的路由表,并維護(hù)和更新這些表??蓜澐譃閮深?lèi):?jiǎn)尾ズ投嗖サ摹?/p>

安全性。為了在無(wú)連接的網(wǎng)絡(luò)層提供安全性,需要用另外一些虛擬層來(lái)把無(wú)連接服務(wù)轉(zhuǎn)變?yōu)槊嫦蜻B接的服務(wù),這個(gè)虛擬層稱(chēng)為IPSec。

IPv4地址

IPv4地址指的是version=4的IP協(xié)議所定義的邏輯地址,共32bit,它唯一地全球地定義了一臺(tái)主機(jī)或路由器與因特網(wǎng)之間的一個(gè)連接。唯一性表現(xiàn)在每個(gè)地址只能定義一個(gè)到因特網(wǎng)的連接,若設(shè)備有兩個(gè)連接,就需要有兩個(gè)地址。全球性表現(xiàn)在任何要連接到互聯(lián)網(wǎng)的主機(jī)都必須采用的地址系統(tǒng)。地址空間為2^32。

1. IP地址的記法

二進(jìn)制記法(基2):10000000 00001011 00000011 00011111,IPv4地址的本來(lái)面目。
十進(jìn)制記法(基256):128.11.3.31,常用方式。
十六進(jìn)制記法(基16):0x800B031F,常用于網(wǎng)絡(luò)編程。

若需要計(jì)算某段的地址數(shù),可按照不同的計(jì)數(shù)法來(lái)進(jìn)行加減。

2. 分類(lèi)編址

2.1 分類(lèi)

IP地址空間分為5類(lèi):ABCDE。
A類(lèi)共2^31個(gè)地址,占50%。
B類(lèi)共2^30個(gè)地址,占25%。
C類(lèi)共2^29個(gè)地址,占12.5%。
D類(lèi)共2^29個(gè)地址,占6.25%。
E類(lèi)共2^29個(gè)地址,占6.25%。
比例就是:8:4:2:1:1。

按照二進(jìn)制記法時(shí),第一位是0表示A類(lèi);否則判斷第二位是否是0,是表示B類(lèi);否則判斷第三位是否是0,是表示C類(lèi);否則判斷第四位是否是0,是表示D類(lèi),否表示E類(lèi)。
按照十進(jìn)制記法時(shí),對(duì)于第一個(gè)字節(jié),A類(lèi)是0127;B是128191;C是192223;D是224239;E是240~255。
當(dāng)然某些特殊地址落入了A和E,是例外情況。
個(gè)人認(rèn)為二進(jìn)制記法更直觀更好記。

FullSizeRender 5.jpg

對(duì)于ABC三類(lèi),IP地址可劃分為網(wǎng)絡(luò)標(biāo)識(shí)(net-id)和主機(jī)標(biāo)識(shí)(host-id)。
A類(lèi):第1個(gè)字節(jié)是網(wǎng)絡(luò)標(biāo)識(shí),后3個(gè)是主機(jī)標(biāo)識(shí)。
B類(lèi):前2個(gè)字節(jié)是網(wǎng)絡(luò)標(biāo)識(shí),后2個(gè)是主機(jī)標(biāo)識(shí)。
C類(lèi):前3個(gè)字節(jié)是網(wǎng)絡(luò)標(biāo)識(shí),后1個(gè)是主機(jī)標(biāo)識(shí)。

FullSizeRender 6.jpg

2.2 地址類(lèi)和地址塊

分類(lèi)編址的一個(gè)問(wèn)題是每類(lèi)地址都被劃分為固定數(shù)目的地址塊,每個(gè)地址塊的大小是固定的,不靈活。

A類(lèi)網(wǎng)絡(luò)標(biāo)識(shí)是第1個(gè)字節(jié),且第一位必為0,所以只有7bit可以定義網(wǎng)絡(luò)標(biāo)識(shí),27=128理想情況可以指派給128個(gè)機(jī)構(gòu)組織使用。每個(gè)地址塊包含224個(gè)地址,也就是可以分成這么多的主機(jī)標(biāo)識(shí)。

同理,B類(lèi)有16-2=14bit表示網(wǎng)絡(luò)標(biāo)識(shí),214=16384。每類(lèi)地址包含216=65536個(gè)主機(jī)標(biāo)識(shí)。

C類(lèi)有24-3=21bit表示網(wǎng)絡(luò)標(biāo)識(shí),每類(lèi)地址塊有2^8=256個(gè)主機(jī)標(biāo)識(shí)。

AB被浪費(fèi),C不夠用。

D類(lèi)只有一個(gè)地址塊,用來(lái)進(jìn)行多播。用以定義一組主機(jī),若某個(gè)組被指派了一個(gè)D類(lèi)地址,則該組的每一個(gè)主機(jī)都會(huì)在正常地址(單播地址)的基礎(chǔ)上增加一個(gè)多播地址。

E類(lèi)只有一個(gè)地址塊,是保留地址。

2.3 兩級(jí)編址

如前所述,分類(lèi)編址中指派給一個(gè)組織的是一個(gè)地址段,有ABC類(lèi)三種。對(duì)于同一個(gè)網(wǎng)絡(luò)內(nèi)的所有主機(jī)而言,都應(yīng)該是屬于同一個(gè)地址段的,它們之間用主機(jī)標(biāo)識(shí)表明身份。若網(wǎng)絡(luò)地址為n位,則主機(jī)地址為32-n位,n的值根據(jù)所屬ABC類(lèi)來(lái)取值8,16,24。這就是兩級(jí)編址,電話(huà)號(hào)碼分區(qū)號(hào)+本地號(hào)也是同樣道理。

一個(gè)地址塊有三要素:地址數(shù)、首地址和末地址。首先需要判斷是屬于哪一類(lèi),從而得知n和32-n,也就可以算出地址數(shù)=2^(32-n)。首地址就是后面32-n位全為0,末地址就是全為1。
首地址被稱(chēng)為網(wǎng)絡(luò)地址,不會(huì)指派給任何主機(jī),而是用來(lái)代表這個(gè)網(wǎng)絡(luò)。比如200.11.8.45這個(gè)地址是C類(lèi),則n=24,所以它的網(wǎng)絡(luò)地址是200.11.8.0/24,斜杠后面是n值。

2.4 一個(gè)應(yīng)用

由于網(wǎng)絡(luò)地址是一個(gè)網(wǎng)絡(luò)地址塊的標(biāo)識(shí),所以它可以被用來(lái)為分組選擇路由。當(dāng)某個(gè)分組來(lái)到路由器后,路由器根據(jù)目的地址計(jì)算得到目的地址的網(wǎng)絡(luò)地址,然后查找路由表,找到對(duì)應(yīng)該網(wǎng)絡(luò)地址的端口,然后將該分組進(jìn)行轉(zhuǎn)發(fā)。
常用的算法是使用網(wǎng)絡(luò)掩碼(network mask)。這是一個(gè)32bit的數(shù),前n位是1,后32-n是0。ABC各對(duì)應(yīng)一個(gè)掩碼。路由器根據(jù)目的地址的類(lèi)別來(lái)選擇一個(gè)掩碼與目的地址進(jìn)行按位與運(yùn)算,從而得到網(wǎng)絡(luò)地址。

2.5 三級(jí)編址:子網(wǎng)劃分

對(duì)于AB兩類(lèi),地址塊太大,所以擁有這兩類(lèi)的組織可以將地址塊劃分成多個(gè)較小的子地址塊,并與其他組織進(jìn)行共享。這種思想稱(chēng)為子網(wǎng)劃分,每個(gè)被劃分的子網(wǎng)都有對(duì)應(yīng)的子網(wǎng)地址。這樣地址就分成了網(wǎng)絡(luò)地址、子網(wǎng)地址、主機(jī)地址三級(jí),類(lèi)似的電話(huà)號(hào)碼可分為國(guó)家碼、地區(qū)碼、用戶(hù)碼。

FullSizeRender 8.jpg

之前提到的網(wǎng)絡(luò)掩碼是針對(duì)網(wǎng)絡(luò)地址的,當(dāng)有子網(wǎng)劃分時(shí),對(duì)于子網(wǎng)也需要有一個(gè)網(wǎng)絡(luò)掩碼。子網(wǎng)由子網(wǎng)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)兩部分組成,子網(wǎng)標(biāo)識(shí)增加了網(wǎng)絡(luò)標(biāo)識(shí)的長(zhǎng)度,也同時(shí)減少了主機(jī)標(biāo)識(shí)的長(zhǎng)度。當(dāng)一個(gè)網(wǎng)絡(luò)劃分成s個(gè)子網(wǎng)且每個(gè)子網(wǎng)的主機(jī)數(shù)相同時(shí),每個(gè)子網(wǎng)標(biāo)識(shí)計(jì)算公式如下,s必須是2的乘方。log2s計(jì)算的是上圖“變化”的bit位數(shù)。

FullSizeRender 7.jpg

路由器此時(shí)會(huì)根據(jù)子網(wǎng)標(biāo)識(shí)來(lái)選擇對(duì)應(yīng)的端口,從而到達(dá)子網(wǎng)。同樣是使用掩碼進(jìn)行與運(yùn)算。

2.6 超網(wǎng)

然而對(duì)于C網(wǎng)來(lái)說(shuō),問(wèn)題是地址塊內(nèi)的地址數(shù)太少,需要將多個(gè)C類(lèi)地址塊合并成一個(gè)大的地址段。

所以超網(wǎng)掩碼和子網(wǎng)掩碼正好相反,若要將c個(gè)地址塊合并,則需要n-log2c來(lái)得到超網(wǎng)掩碼。

但這樣的話(huà)會(huì)帶來(lái)兩個(gè)新問(wèn)題:由于c必須是2的乘方,超網(wǎng)構(gòu)造時(shí)會(huì)有冗余。同時(shí)對(duì)于路由選擇來(lái)說(shuō)變得復(fù)雜了。

3. 無(wú)分類(lèi)編址

子網(wǎng)和超網(wǎng)的構(gòu)造并沒(méi)有從實(shí)際上解決地址耗盡的問(wèn)題,利用效率也不高,還使得地址分配和路由選擇變得更加困難。最終的解決辦法是使用更大容量的地址空間,即新的版本IPv6。臨時(shí)的解決方案是改變地址的分配方法,稱(chēng)為無(wú)分類(lèi)編址,也就是說(shuō)類(lèi)別取消了。地址塊變成了可變長(zhǎng)度的。

3.1 兩級(jí)編址

與分類(lèi)編址中的思想相同,地址被分為網(wǎng)絡(luò)地址和主機(jī)地址,也稱(chēng)前綴和后綴。前綴的長(zhǎng)度n取決于地址塊的大小,取值范圍是0~32。n稱(chēng)為前綴長(zhǎng)度,32-n稱(chēng)為后綴長(zhǎng)度。

在分類(lèi)編址中,若給定一個(gè)地址,可得知它屬于哪類(lèi)從而得知它的網(wǎng)絡(luò)地址。但是在無(wú)分類(lèi)編址中,僅憑一個(gè)地址是無(wú)法確定前綴的,需要增加一個(gè)前綴長(zhǎng)度n,放在地址后面,用斜線(xiàn)隔開(kāi)它們,稱(chēng)為斜線(xiàn)記法,正式名稱(chēng)是無(wú)分類(lèi)域間路由選擇(classless interdomain routing)或CIDR記法。由此也可以得到對(duì)應(yīng)的掩碼是多少。

某個(gè)地址塊內(nèi)的地址數(shù)同樣是2^(32-n)。而首地址則是這個(gè)地址塊內(nèi)的任意地址與掩碼的按位與的結(jié)果。

舉例110.23.120.14/20,求這個(gè)地址塊的三要素:首地址、末地址、地址數(shù)。地址數(shù)=2^(32-20)=4096。因?yàn)?0>16&&20<24,所以前兩個(gè)字節(jié)保持不變,第四個(gè)字節(jié)歸0,主要是求第三個(gè)字節(jié)。120的2進(jìn)制表示是0111 1000,前綴長(zhǎng)度是20,所以在第三個(gè)字節(jié)中,只有前四個(gè)bit是屬于前綴的,后面的都要?dú)w0,所以就可以得知首地址是110.23.112.0/20,而末地址就是后面全置1,是110.23.127.255。

3.2 地址塊的分配

分配地址塊三原則:
1.申請(qǐng)的地址數(shù)N必須是2的乘方。主要是為了使前綴長(zhǎng)度n是一個(gè)整數(shù)。
2.對(duì)于一個(gè)地址塊來(lái)說(shuō),根據(jù)地址數(shù)就可以求出前綴長(zhǎng)度的值。其中1和2是互相牽制的。
3.必須是地址空間中連續(xù)的未分配地址才能被分配給申請(qǐng)的地址塊。同時(shí)選擇的起始地址必須能夠被地址塊的地址數(shù)整除。如果不能整除,根據(jù)1和2的約束,可以推測(cè)出若使用該起始地址,地址塊內(nèi)的地址數(shù)一定小于申請(qǐng)的地址數(shù)。

分類(lèi)編址是無(wú)分類(lèi)編址的一個(gè)特例,如ABC類(lèi)的前綴長(zhǎng)度分別是8,16,24,可以直接轉(zhuǎn)換成無(wú)分類(lèi)編址。

3.3 子網(wǎng)劃分

與分類(lèi)編址中的子網(wǎng)劃分類(lèi)似。
子網(wǎng)設(shè)計(jì)的三原則:
1.每個(gè)子網(wǎng)絡(luò)的地址數(shù)應(yīng)當(dāng)是2的乘方。
2.每個(gè)子網(wǎng)絡(luò)的前綴長(zhǎng)度應(yīng)當(dāng)是如下所示,其中N是總地址數(shù),Nsub是每個(gè)子網(wǎng)的地址數(shù),n是原先的前綴長(zhǎng)度:

FullSizeRender 9.jpg

3.每個(gè)子網(wǎng)絡(luò)的起始地址應(yīng)當(dāng)能夠被它的地址數(shù)整除。遵循這一原則,需要首先為大的子網(wǎng)絡(luò)指派地址。

舉例起始地址是14.24.74.0/24的地址塊,需要分配三個(gè)地址塊,地址數(shù)分別是120,60,10。
首先該地址塊共有2^(32-24)=256個(gè)地址,首地址是14.24.74.0/24,末地址是14.24.74.255。
然后按照各子網(wǎng)的地址數(shù)從大到小分配。第一個(gè)子網(wǎng)需要120個(gè)地址,不是2的乘方,增加到128,是2的7次方,可知該子網(wǎng)的前綴長(zhǎng)度是24+1=25,其實(shí)也可以用32-7=25算出。首地址是14.24.74.0/25,末地址是14.24.74.127/25。
然后是第二個(gè)子網(wǎng)需要60個(gè),補(bǔ)齊到64,是2的6次方,前綴是32-6=26。首地址是14.24.74.128/26,末地址是14.24.74.191/26。
最后是第三個(gè)子網(wǎng)需要10個(gè),補(bǔ)齊到16,是2的4次方,前綴是32-4=28。首地址是14.24.74.192/28,末地址是14.24.74.207/28。

4. 特殊地址

分類(lèi)編址中某些地址被用作特殊用途,無(wú)分類(lèi)編址繼承了部分策略。

全0地址,0.0.0.0/32。被保留用于某主機(jī)不知道自己的IPv4地址,但需要發(fā)送一個(gè)IPv4分組時(shí)。通常是用在主機(jī)正在啟動(dòng)的時(shí)候。此時(shí)主機(jī)為了得到IPv4地址,向DHCP服務(wù)器發(fā)送一個(gè)IPv4分組,并用全0地址作為源地址,二用受限廣播地址作為目的地址。

全1地址:受限廣播地址,255.255.255.255/32。被保留用作當(dāng)前網(wǎng)絡(luò)的受限廣播地址。一個(gè)主機(jī)想要將報(bào)文發(fā)送給網(wǎng)絡(luò)中的所有主機(jī),可使用此地址作為IPv4分組中的目的地址,但是路由器會(huì)將此類(lèi)地址的分組忽略,這樣廣播只局限在本地網(wǎng)絡(luò)中。

環(huán)回地址,127.0.0.0/8,用作測(cè)試機(jī)器的軟件。使用時(shí),分組不會(huì)離開(kāi)機(jī)器,只是簡(jiǎn)單地由協(xié)議軟件返回。此地址只能用作目的地址。如ping程序可以使用此地址測(cè)試IPv4軟件是否接受和處理分組??蛻?hù)進(jìn)程可以用此進(jìn)程給本機(jī)上的服務(wù)進(jìn)程發(fā)送一個(gè)報(bào)文。

專(zhuān)用地址,這些地址不會(huì)在全球被識(shí)別。要么用于隔絕其他網(wǎng)絡(luò)的情況下,要么就用于具有網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)的連接(NAT)。包括10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16。

多播地址,224.0.0.0/4。

此外每個(gè)地址塊中有些地址有著特殊用途的,但是此機(jī)制只是推薦不作強(qiáng)制使用。如地址塊的首地址定義為網(wǎng)絡(luò)地址。如地址塊的末地址可用作直接廣播地址,路由器會(huì)用這個(gè)地址發(fā)送給某個(gè)特定網(wǎng)絡(luò)上的所有主機(jī),此地址只能作目的地址。

5. NAT

又有新問(wèn)題:分配的地址段定死了,若某用戶(hù)需要增加地址,則之前分配給他的地址段的前后均已使用,無(wú)法擴(kuò)容。但是在一個(gè)小型網(wǎng)絡(luò)中,絕大多數(shù)時(shí)間只有一部分計(jì)算機(jī)需要同時(shí)接入因特網(wǎng),也就是說(shuō),分配的地址數(shù)可以小于網(wǎng)絡(luò)中的計(jì)算機(jī)數(shù)。
在網(wǎng)絡(luò)內(nèi)部,可以使用專(zhuān)用地址來(lái)進(jìn)行內(nèi)部通信,然后全球通信使用分配的地址。

網(wǎng)絡(luò)地址轉(zhuǎn)換(network address translation,NAT)可用于提供在專(zhuān)用地址和全球地址間的轉(zhuǎn)換,同時(shí)也支持虛擬專(zhuān)用網(wǎng)絡(luò)。一般網(wǎng)絡(luò)通過(guò)一個(gè)具有NAT軟件的路由器與全球網(wǎng)絡(luò)連接。當(dāng)外出的分組通過(guò)此路由器時(shí),源地址被換成全球NAT地址,當(dāng)進(jìn)入的分組通過(guò)此路由器時(shí),目的地址被換成相應(yīng)的內(nèi)部專(zhuān)用地址。

NAT路由器使用轉(zhuǎn)換表來(lái)解決地址轉(zhuǎn)換對(duì)應(yīng)問(wèn)題。
簡(jiǎn)單的方法,一個(gè)專(zhuān)用地址映射一個(gè)全球地址,當(dāng)發(fā)送時(shí)將專(zhuān)用地址替換成全球地址,并記錄在表中;當(dāng)接受時(shí)根據(jù)表內(nèi)記錄,將全球地址替換成專(zhuān)用地址。但是有問(wèn)題:通信必須總是由專(zhuān)用網(wǎng)絡(luò)發(fā)起,不能運(yùn)行服務(wù)器程序來(lái)為網(wǎng)絡(luò)之外的客戶(hù)端提供服務(wù);一臺(tái)主機(jī)不能同時(shí)訪問(wèn)兩個(gè)外部服務(wù)器程序;兩臺(tái)主機(jī)也不能同時(shí)訪問(wèn)一個(gè)相同的外部服務(wù)器程序。

為了允許多對(duì)多的映射關(guān)系,需要在轉(zhuǎn)換表中增加更多內(nèi)容,此時(shí)表內(nèi)有五部分:專(zhuān)用地址,專(zhuān)用端口,外部地址,外部端口,傳輸層協(xié)議。增加專(zhuān)用端口用以更好的區(qū)分,那么同時(shí)使用的專(zhuān)用端口就不可以相同,必須是唯一的。

IP分組的交付和轉(zhuǎn)發(fā)

交付指的是在網(wǎng)絡(luò)層的控制下,底層各網(wǎng)絡(luò)對(duì)分組的處理方式,包括直接交付和間接交付。轉(zhuǎn)發(fā)指的是把分組交付到下一站的方式,包括基于分組目的地址的轉(zhuǎn)發(fā)和基于附加在分組上的標(biāo)記的轉(zhuǎn)發(fā)。

1. 交付

直接交付:分組的重點(diǎn)是一臺(tái)與交付者連接在同一網(wǎng)絡(luò)上的主機(jī)。通常發(fā)生在源點(diǎn)和終點(diǎn)屬于同一物理網(wǎng)絡(luò),或者最后一個(gè)路由器與目的主機(jī)之間。
發(fā)送通過(guò)提取終點(diǎn)的網(wǎng)絡(luò)地址(用掩碼),然后與自己所連接的網(wǎng)絡(luò)的地址比較,若匹配則是直接交付。此時(shí),發(fā)送方可直接通過(guò)目的IP地址找出對(duì)應(yīng)的MAC地址,然后網(wǎng)絡(luò)層將IP和MAC地址都交給數(shù)據(jù)鏈路層,完成實(shí)際交付。IP和MAC地址間的映射通常由ARP實(shí)現(xiàn)。

間接交付:源點(diǎn)和終點(diǎn)不在同一網(wǎng)絡(luò)上。間接交付原理上是多個(gè)直接交付。發(fā)送方使用目的IP地址和路由表來(lái)查找下一跳路由的IP地址,同樣是使用ARP找到對(duì)應(yīng)的MAC地址,然后進(jìn)行交付。這樣一步一步,到達(dá)終點(diǎn)。

2. 轉(zhuǎn)發(fā)

2.1 基于目的地址的轉(zhuǎn)發(fā)

這是一種傳統(tǒng)方式+當(dāng)前主流,適用于無(wú)連接的協(xié)議,此時(shí)轉(zhuǎn)發(fā)的基礎(chǔ)是IP數(shù)據(jù)報(bào)的目的地址。路由器主要通過(guò)路由表來(lái)判斷如何轉(zhuǎn)發(fā)。路由表有多種構(gòu)造方法。

基于路由的路由表:分組由A到B,需要將經(jīng)過(guò)的所有結(jié)點(diǎn)均寫(xiě)入路由表。

下一跳方法:路由表中只保存下一跳的地址,而不是保留完整路由的信息。

特定網(wǎng)絡(luò)方法:另一種簡(jiǎn)化查找過(guò)程的方法,此時(shí)路由表不是對(duì)連接在同一個(gè)物理網(wǎng)絡(luò)上的每一臺(tái)主機(jī)都設(shè)置一個(gè)表項(xiàng),而是只用一個(gè)表項(xiàng)來(lái)定義目的網(wǎng)絡(luò)本身的地址。

特定主機(jī)方法:正好與特定網(wǎng)絡(luò)方法相反,目的主機(jī)的地址在路由表內(nèi)都要給出。這樣可以給特定的目的主機(jī)指定路由,主要用在像檢查路由或提供安全措施這樣的特殊情況下。

默認(rèn)方法:A連接的網(wǎng)絡(luò)上有兩個(gè)路由器R1和R2,其中經(jīng)過(guò)R1可到到B,經(jīng)過(guò)R2可到達(dá)網(wǎng)絡(luò)其余部分。此時(shí)主機(jī)A的路由表就不需要把整個(gè)網(wǎng)絡(luò)都羅列出來(lái),而是除去到達(dá)B之外,其余路由均用一個(gè)成為默認(rèn)的表項(xiàng)來(lái)表示,通常定義網(wǎng)絡(luò)地址為0.0.0.0。

2.1.1 使用分類(lèi)編址時(shí)的轉(zhuǎn)發(fā)
2.1.1.1 無(wú)子網(wǎng)劃分的轉(zhuǎn)發(fā)

使用分類(lèi)編址時(shí),全球互聯(lián)網(wǎng)中絕大多數(shù)路由器都沒(méi)有涉及子網(wǎng)劃分。子網(wǎng)劃分是在一個(gè)組織內(nèi)部進(jìn)行的。此時(shí)一個(gè)典型的轉(zhuǎn)發(fā)模塊對(duì)于每種單播類(lèi)型(ABC)各對(duì)應(yīng)一張表,若有多播,則需要一張對(duì)應(yīng)處理D類(lèi)的表。

每張路由表的三要素:
1.目的網(wǎng)絡(luò)的網(wǎng)絡(luò)地址,此時(shí)使用的是特定網(wǎng)絡(luò)轉(zhuǎn)發(fā)。
2.下一跳地址,間接交付時(shí)告訴分組應(yīng)當(dāng)交付到的路由器,直接交付時(shí)為空。
3.接口號(hào),定義分組應(yīng)當(dāng)從哪個(gè)輸出卡發(fā)送出去。

所以最簡(jiǎn)單的場(chǎng)景如下。從分組中提取目的IP地址,判斷類(lèi)別(ABC,若DE則走另外流程),從而得到網(wǎng)絡(luò)地址,然后到找到對(duì)應(yīng)類(lèi)別的路由表,找到網(wǎng)絡(luò)地址相對(duì)應(yīng)的下一跳IP地址和接口號(hào),再通過(guò)ARP協(xié)議找到下一跳IP地址映射的MAC地址。如果沒(méi)有找到對(duì)應(yīng)的下一跳IP地址,則使用默認(rèn)的。

2.1.1.2 有子網(wǎng)劃分的轉(zhuǎn)發(fā)

處理子網(wǎng)劃分的路由器不是在該組織站點(diǎn)的邊界上,就是在站點(diǎn)邊界的里面。如果使用了可變長(zhǎng)度的子網(wǎng)劃分,則需要多張路由表,否則只需要一張。

最簡(jiǎn)單的場(chǎng)景如下。從分組中提取目的IP地址,并同子網(wǎng)掩碼(子網(wǎng)劃分是不可變長(zhǎng)度的,所以子網(wǎng)掩碼是固定的)進(jìn)行按位與運(yùn)算,得到子網(wǎng)地址,在路由表中查找,得到下一跳地址和接口號(hào),然后通過(guò)ARP找到下一跳的MAC地址。找不到下一跳地址的則使用默認(rèn)的表項(xiàng)。

2.1.2 使用無(wú)分類(lèi)編址時(shí)的轉(zhuǎn)發(fā)

無(wú)分類(lèi)編址時(shí),地址空間是完整的,沒(méi)有劃分類(lèi)別。所以為了找到目的地址的網(wǎng)絡(luò)地址,需要在路由表中包含掩碼(/n),所以無(wú)分類(lèi)編址的路由表至少有四列。

應(yīng)用時(shí),從上到下依次取每個(gè)表項(xiàng)的掩碼,去和目的地址做按位與運(yùn)算,若和網(wǎng)絡(luò)地址相符合,就可得到下一跳地址和接口。找不到符合的則使用默認(rèn)的表項(xiàng)。

如果路由表的規(guī)模過(guò)大,可能會(huì)造成搜索時(shí)間過(guò)長(zhǎng)。

一種方法是將臨近的幾個(gè)地址塊聚合成一個(gè)大的地址塊,由R1來(lái)區(qū)分具體是哪個(gè)地址塊,而與R1鏈接的R2則只在路由表中記錄到這個(gè)大的地址塊的網(wǎng)絡(luò)地址就可以了。這種方法稱(chēng)為地址聚合。

另一個(gè)需要注意的原則是最長(zhǎng)掩碼匹配,此原則指出路由表要按照從最長(zhǎng)掩碼到最短掩碼來(lái)排序,如/27,/26,/25。相當(dāng)于是先精確匹配,再模糊匹配。當(dāng)然這樣搜索還是在列表中按序搜索,如果想要減少查找時(shí)間,一種解決辦法是改變查找的數(shù)據(jù)結(jié)構(gòu),不使用列表而是諸如樹(shù)或二叉樹(shù)之類(lèi)。

還有一種方法是多級(jí)路由選擇,在路由表中建立分等級(jí)概念。類(lèi)似于分類(lèi)編址中的有子網(wǎng)劃分的算法,不過(guò)此時(shí)等級(jí)的劃分是無(wú)限制的。

還有就是可以依據(jù)地理上的分布來(lái)進(jìn)行表項(xiàng)的聚合。

2.2 基于標(biāo)記的轉(zhuǎn)發(fā)

比基于目的地址的轉(zhuǎn)發(fā)簡(jiǎn)單,路由表中只需記錄接口和下一個(gè)標(biāo)記。當(dāng)一個(gè)分組到達(dá)一個(gè)路由器時(shí),根據(jù)攜帶的標(biāo)記,在路由表中按此標(biāo)記進(jìn)行索引,直接可得到接口和下一個(gè)標(biāo)記。

IPv4分組格式

IP是一種不可靠的無(wú)連接數(shù)據(jù)報(bào)協(xié)議。如果可靠性很重要,需要結(jié)合可靠的協(xié)議如TCP配合使用。

1. 數(shù)據(jù)報(bào)

網(wǎng)絡(luò)層的分組稱(chēng)為數(shù)據(jù)報(bào)datagram。IPv4數(shù)據(jù)報(bào)格式如圖。首部的長(zhǎng)度是20~60byte,包含有關(guān)路由選擇和交付的信息。習(xí)慣上,在TCP/IP中都是以4byte為一段來(lái)表示首部。

FullSizeRender 10.jpg

版本(VER):共4bit。目前版本是4,將來(lái)可能會(huì)可以使用6。IP軟件根據(jù)這個(gè)字段來(lái)判斷該數(shù)據(jù)報(bào)是否和自己的版本相同。

首部長(zhǎng)度(HLEN):共4bit。單位是4byte,因?yàn)槭撞块L(zhǎng)度是2060byte,所以該字段的取值是512。

服務(wù)類(lèi)型:共8bit。指明了該如何處理數(shù)據(jù)報(bào)。之前定義了數(shù)據(jù)報(bào)的優(yōu)先級(jí)和服務(wù)類(lèi)型。
新的解釋是,定義了一組區(qū)分服務(wù),前6bit是碼點(diǎn)子字段,后2bit保留。
當(dāng)最右邊的3位是0時(shí),最左邊3位定義為優(yōu)先級(jí)(與原來(lái)兼容),此優(yōu)先級(jí)定義了在出現(xiàn)一些問(wèn)題(如擁塞)時(shí)數(shù)據(jù)報(bào)的優(yōu)先級(jí)。
當(dāng)最右邊的3位非全0時(shí),6bit定義了56 (64-8)種服務(wù)。類(lèi)別1,碼點(diǎn)是XXXXX0,是由因特網(wǎng)管理機(jī)構(gòu)(IETF)指派的優(yōu)先級(jí),共24種。類(lèi)別2,碼點(diǎn)是XXXX11,由本地管理機(jī)構(gòu)指派的優(yōu)先級(jí),16種。類(lèi)別3,碼點(diǎn)是XXXX01,臨時(shí)或試驗(yàn)的指派,16種。

總長(zhǎng)度: 共16bit。單位是byte,定義數(shù)據(jù)報(bào)報(bào)頭+數(shù)據(jù)的總長(zhǎng)度??赏茢?,IP數(shù)據(jù)報(bào)的長(zhǎng)度范圍是2^16-1=65535byte,其中還包括20~60byte的首部。如果物理網(wǎng)絡(luò)不能把數(shù)據(jù)報(bào)封裝成幀,則需要分片操作。
某些時(shí)候,封裝在數(shù)據(jù)報(bào)中除了首部、數(shù)據(jù)外,還有一些填充,如以太網(wǎng)協(xié)議對(duì)幀的范圍有46~1500byte的要求,所以用此字段可以識(shí)別出哪些是數(shù)據(jù),哪些是填充。

標(biāo)識(shí):16bit。
標(biāo)志:3bit。
分片偏移:13bit。以上三類(lèi)用于分片,詳見(jiàn)下一節(jié)。

生存時(shí)間:8bit。數(shù)據(jù)報(bào)不可以一直在網(wǎng)絡(luò)中傳輸,否則會(huì)造成浪費(fèi)。之前的設(shè)計(jì)是一個(gè)時(shí)間戳,經(jīng)過(guò)路由器進(jìn)行遞減,然而所有路由器不可能進(jìn)行時(shí)鐘同步,總的耗費(fèi)時(shí)間也不好估計(jì)。
當(dāng)前此字段設(shè)置成數(shù)據(jù)報(bào)所經(jīng)過(guò)的最大跳數(shù)(路由器),數(shù)值大約是任意兩臺(tái)主機(jī)間的最大路由器數(shù)的2倍,沒(méi)經(jīng)過(guò)一個(gè)路由器要減一。當(dāng)為0時(shí),路由器要拋棄該數(shù)據(jù)報(bào)。
另一個(gè)用途是源點(diǎn)限制分組的轉(zhuǎn)發(fā)范圍,如設(shè)置成1則該分組只能在局域網(wǎng)中轉(zhuǎn)發(fā)。到達(dá)第一個(gè)路由器時(shí)就會(huì)變?yōu)?被拋棄。

協(xié)議:8bit。定義了此IP層服務(wù)的高層協(xié)議,指明了此分組必須交付給哪個(gè)最終目的協(xié)議。1代表ICMP,2代表IGMP,6代表TCP,17代表UDP,89代表OSPF。

首部校驗(yàn)和:16bit。

源地址:32bit。此字段始終不變。

目的地址:32bit。此字段始終不變。

選項(xiàng)+填充:0~40byte。首部此時(shí)共有20byte,若某首部的長(zhǎng)度大于20byte,則說(shuō)明后續(xù)有該字段。

2. 分片

路由器會(huì)從收到的幀中拆解出IP報(bào)文,然后再封裝成另一個(gè)幀發(fā)送。接受幀的格式與長(zhǎng)度與經(jīng)過(guò)的物理網(wǎng)絡(luò)使用的協(xié)議有關(guān),發(fā)送幀的格式與長(zhǎng)度與將要經(jīng)過(guò)的物理網(wǎng)絡(luò)使用的協(xié)議有關(guān)。

不管是什么物理網(wǎng)絡(luò),一定會(huì)對(duì)經(jīng)過(guò)幀的最大長(zhǎng)度做出限制,出去幀的首部和尾部,剩下的對(duì)于IP報(bào)文的限制來(lái)說(shuō),稱(chēng)為MTU。如以太網(wǎng)局域網(wǎng)的這個(gè)值是1500byte。

由于IP數(shù)據(jù)報(bào)的最大長(zhǎng)度為65535byte,若物理網(wǎng)絡(luò)的MTU比此值小,則需要對(duì)數(shù)據(jù)報(bào)進(jìn)行分片(fragmentation)。

源點(diǎn)通常不會(huì)分片,因?yàn)樵趥鬏攲右呀?jīng)把數(shù)據(jù)劃分成IP和源點(diǎn)使用的數(shù)據(jù)鏈路層可接納的大小。分片后首部大部分相同,有些字段會(huì)變化。若已分片的數(shù)據(jù)報(bào)遇到更小MTU的網(wǎng)絡(luò),還會(huì)再進(jìn)行分片。

分片可以在源點(diǎn)或途中的路由器中進(jìn)行,但重裝只能在墓地主機(jī)上進(jìn)行。一方面現(xiàn)階段IP是無(wú)連接的,各分組路由不同,中途無(wú)法重裝。另一方面若要做的話(huà)會(huì)降低效率。

分片時(shí),首部的必要部分必須復(fù)制到所有分片,選項(xiàng)字段可以選擇不復(fù)制。標(biāo)志、分片偏移、總長(zhǎng)度需要改變。校驗(yàn)和需要重新計(jì)算。也就是說(shuō),只有數(shù)據(jù)報(bào)中的數(shù)據(jù)是分片的。

三個(gè)分片相關(guān)字段:
標(biāo)識(shí)(identification):16bit。此標(biāo)識(shí)和源IP地址必須唯一確定數(shù)據(jù)報(bào)。IP協(xié)議使用計(jì)數(shù)器來(lái)生成標(biāo)識(shí)。數(shù)據(jù)報(bào)分片時(shí),該字段要復(fù)制到所有分片中。故所有分片均有相同的標(biāo)識(shí),也是原始的數(shù)據(jù)報(bào)的標(biāo)識(shí)號(hào)。在終點(diǎn)時(shí)用于重裝數(shù)據(jù)報(bào)。

標(biāo)識(shí)(flag):3bit。
第1bit保留。
第2bit稱(chēng)為“不分片”位,為1則機(jī)器不可對(duì)該數(shù)據(jù)報(bào)分片。若無(wú)法通過(guò)任何物理網(wǎng)絡(luò)發(fā)送該數(shù)據(jù)報(bào),則需要丟棄,并向源點(diǎn)發(fā)送ICMP差錯(cuò)報(bào)文。為0說(shuō)明可分片。
第3bit是“還有分片”位,為1表示這個(gè)數(shù)據(jù)報(bào)不是最后的分片,為1表示是最后的分片或者是唯一分片,用于重裝時(shí)的判斷。

分片偏移:13bit。表示分片在整個(gè)數(shù)據(jù)報(bào)中的相對(duì)位置,并且是按照原始數(shù)據(jù)的偏移量,單位是8byte。以8byte為單位也迫使數(shù)據(jù)報(bào)沒(méi)進(jìn)行一次分片,第一個(gè)分片的字節(jié)數(shù)量一定能夠被8除盡。
當(dāng)二次分片時(shí),分片偏移也是永遠(yuǎn)相對(duì)于原始數(shù)據(jù)的。

在終點(diǎn)進(jìn)行重裝的算法如下:
0.依據(jù)標(biāo)識(shí)來(lái)講分片歸類(lèi)。
1.依據(jù)第一個(gè)分片的分片偏移字段值為0來(lái)選出第一個(gè)分片。
2.把第一個(gè)分片的數(shù)據(jù)長(zhǎng)度除以8,就是第二個(gè)分片的分片偏移值。
3.把第一個(gè)和第二個(gè)分片的數(shù)據(jù)長(zhǎng)度除以8,就是第三個(gè)分片的分片偏移值。
4.以此類(lèi)推,直到看到一個(gè)分片的“還有分片”位為0,即為最后一個(gè)分片。

3. 選項(xiàng)

IP數(shù)據(jù)報(bào)的首部固定部分是20byte,可變部分是0~40byte。選項(xiàng)部分可用于網(wǎng)絡(luò)的測(cè)試和排錯(cuò)。

如圖所示,選項(xiàng)的格式是:1byte的類(lèi)型字段,1byte的長(zhǎng)度字段,可變長(zhǎng)度的值字段。這三個(gè)字段經(jīng)常被稱(chēng)為T(mén)LV(type-length-value)。

FullSizeRender 3.jpg

類(lèi)型:8bit,包括三個(gè)子字段。
1.復(fù)制:1bit??刂七x項(xiàng)在分片是否出現(xiàn),為0則必須且只須復(fù)制到第一個(gè)分片,為1復(fù)制到所有分片。
2.類(lèi)別:2bit。定義選項(xiàng)的一般用途。00表示用于數(shù)據(jù)報(bào)的控制。10表示用于排錯(cuò)和管理。其余未定義。
3.編號(hào):5bit。定義了選項(xiàng)的類(lèi)型。目前僅使用了6類(lèi)。

長(zhǎng)度:8bit。定義選項(xiàng)的總長(zhǎng)度??梢圆怀霈F(xiàn)。

:包含某些特定選項(xiàng)所需的數(shù)據(jù)??梢圆怀霈F(xiàn)。

6種選項(xiàng)類(lèi)型中,2種是單字節(jié)選項(xiàng),不需要長(zhǎng)度和值字段。其余均需要長(zhǎng)度和值字段,是多字節(jié)選項(xiàng)。
無(wú)操作選項(xiàng):1byte。用作選項(xiàng)間的填充,以便于對(duì)齊。
選項(xiàng)結(jié)束選項(xiàng):1byte。用于選項(xiàng)字段結(jié)束的填充,只能作最后一個(gè)選項(xiàng)且只能用一次。接收器根據(jù)此選項(xiàng)來(lái)開(kāi)始操作凈荷數(shù)據(jù)。也就是說(shuō)如果對(duì)齊選項(xiàng)需要超過(guò)1個(gè)字節(jié),那么必須先填充一些無(wú)操作選項(xiàng),再在最后加一個(gè)選項(xiàng)結(jié)束選項(xiàng)。
記錄路由選項(xiàng):記錄處理數(shù)據(jù)報(bào)的因特網(wǎng)路由器??梢粤谐鲎疃?個(gè)路由器的IP地址,算法是這樣的:數(shù)據(jù)報(bào)選項(xiàng)部分是40byte,刨除類(lèi)型和長(zhǎng)度字段2byte,剩余38byte,而一個(gè)IP地址需要4byte,那么最大可填入9個(gè)IP地址。
此時(shí)在值字段中,需要引入一個(gè)指針字段用于表示第一個(gè)空項(xiàng)的偏移量,即指向第一個(gè)可用的空項(xiàng)。當(dāng)數(shù)據(jù)報(bào)離開(kāi)源點(diǎn)時(shí),這些IP地址字段都是空的,指針字段的值為4,指向第一個(gè)空字段。在經(jīng)過(guò)路由器時(shí),路由器會(huì)比較長(zhǎng)度字段和指針字段,若指針字段大于長(zhǎng)度值,則選項(xiàng)已滿(mǎn),不做改變。否則,路由器要在當(dāng)前空字段中填入自己的出口IP地址,然后再把指針字段+4。
嚴(yán)格路由選項(xiàng):被源點(diǎn)用來(lái)預(yù)先制定數(shù)據(jù)報(bào)在因特網(wǎng)中傳送時(shí)的路由。若指定了該選項(xiàng),則數(shù)據(jù)報(bào)就必須經(jīng)過(guò)在選項(xiàng)中定義的所有路由器。若某路由器IP地址不在表中,則一定不通過(guò)該路由器。若通過(guò)了,則這個(gè)路由器要丟棄該數(shù)據(jù)報(bào)并發(fā)送差錯(cuò)報(bào)文。若數(shù)據(jù)報(bào)到達(dá)終點(diǎn)時(shí)有些IP地址未經(jīng)過(guò),依然丟棄并發(fā)送差錯(cuò)報(bào)文。
此時(shí)在值字段中,依然有一個(gè)指針字段,區(qū)別在于此種情況下所有的IP地址在源點(diǎn)時(shí)就已經(jīng)填好。路由器比較指針值和長(zhǎng)度值時(shí),若指針值大,則數(shù)據(jù)報(bào)已通過(guò)了所有預(yù)設(shè)的路由器,不可再轉(zhuǎn)發(fā),必須丟棄并發(fā)送差錯(cuò)報(bào)文。若指針值小,則路由器比較該幀(數(shù)據(jù)鏈路層)的目的IP地址是否與自己的入口IP地址一致,相等則進(jìn)行操作并用該幀的目的IP地址來(lái)替換指針?biāo)赶虻腎P地址,還要將指針值+4,并且指針指向的IP地址作為下一次轉(zhuǎn)發(fā)的目的IP地址。不相等就丟棄并發(fā)送差錯(cuò)報(bào)文。
不嚴(yán)格路由選項(xiàng):條件放寬為,表中列出的路由器必須經(jīng)過(guò),但數(shù)據(jù)報(bào)還可以訪問(wèn)其他的路由器。
時(shí)間戳選項(xiàng):用來(lái)記錄路由器處理數(shù)據(jù)報(bào)的時(shí)間。時(shí)間是從午夜開(kāi)始以毫秒計(jì)時(shí)的全球通用時(shí)間。有助于用戶(hù)和管理者對(duì)因特網(wǎng)上的各路由器的行為進(jìn)行跟蹤。能夠估計(jì)數(shù)據(jù)報(bào)從一個(gè)路由器到另一個(gè)路由器所需時(shí)間,估計(jì)是因?yàn)闀r(shí)鐘可能不同步。
除了要有指針字段外,還需要4bit溢出字段,4bit標(biāo)志字段。溢出字段用來(lái)記錄因缺少可用字段而無(wú)法增加時(shí)間戳的路由器數(shù)量。標(biāo)志字段為0,則只記錄時(shí)間戳。若為1,則需要增加出口IP地址和時(shí)間戳。若為3,則IP地址是預(yù)先給出的,路由器需要用自己的入口IP地址來(lái)檢查給定的IP地址,匹配的話(huà)要用出口IP地址來(lái)覆蓋該地址。

4. 檢驗(yàn)和

二進(jìn)制反碼加法:用n位來(lái)表示從0~2^n-1之間的無(wú)符號(hào)整數(shù),如果一個(gè)數(shù)多于n位,則多余的最左邊的位被駕到最右邊的位上(繞回)。

在發(fā)送端,把分組劃分為k段,每段的長(zhǎng)度都是n位。用二進(jìn)制反碼加法把這些段相加。把最終結(jié)果去反碼就得出校驗(yàn)和。
在IP分組中,針對(duì)分組首部進(jìn)行計(jì)算,n=16,首先把校驗(yàn)和字段置0,計(jì)算出結(jié)果后再更改。

在接收端,把分組劃分為k段,每段的長(zhǎng)度都是n位。用二進(jìn)制反碼加法把這些段相加,然后再取反碼,若結(jié)果為0,則接受此分組,否則拒絕。

安全性

有三個(gè)安全問(wèn)題是特別應(yīng)用于IP協(xié)議的:
分組竊?。罕粍?dòng)攻擊,入侵者截取并復(fù)制一個(gè)IP分組。難以檢測(cè),但若對(duì)分組進(jìn)行加密則可令攻擊者無(wú)功而返。

分組篡改:攻擊者先截取,再改變其中內(nèi)容,最后發(fā)送給接收方??梢员粩?shù)據(jù)完整性機(jī)制檢測(cè)。

IP偽裝:攻擊者偽裝成另一個(gè)人,創(chuàng)建一個(gè)攜帶另一臺(tái)計(jì)算機(jī)的源地址的IP分組。可通過(guò)起源鑒別來(lái)防范。

使用IPSec協(xié)議來(lái)保護(hù):
定義算法和密鑰。
分組加密:對(duì)應(yīng)分組竊取攻擊。
數(shù)據(jù)完整性:對(duì)應(yīng)分組篡改攻擊。
起源鑒別:對(duì)應(yīng)IP偽裝攻擊。

簡(jiǎn)化IP軟件包

忽略選項(xiàng)的處理,可以簡(jiǎn)單地認(rèn)為IP軟件包包含了八個(gè)組件:首部添加模塊、處理模塊、轉(zhuǎn)發(fā)模塊、分片模塊、重裝模塊、路由表、MTU表、重裝表。還有一些輸入輸出隊(duì)列。

此軟件包接受來(lái)自高層或數(shù)據(jù)鏈路層的分組。若從高層來(lái),則必須將它交付給數(shù)據(jù)鏈路層進(jìn)行傳輸(除非使用還會(huì)地址127.x.y.z)。若來(lái)自數(shù)據(jù)鏈路層,則或者講起交付給數(shù)據(jù)鏈路層進(jìn)行轉(zhuǎn)發(fā)(在路由器中),或者交付給高層協(xié)議(目的地址與本站一致)。

FullSizeRender 4.jpg

首部添加模塊:接受來(lái)自高層的數(shù)據(jù),把數(shù)據(jù)封裝成為IP數(shù)據(jù)報(bào),計(jì)算校驗(yàn)和,插入對(duì)應(yīng)字段,然后發(fā)送到輸入隊(duì)列。

FullSizeRender 6.jpg

處理模塊:核心,接受來(lái)自高層或數(shù)據(jù)鏈路層的數(shù)據(jù)報(bào)。若目的地址與本地地址相匹配,則發(fā)送到重裝模塊,處理完畢;若本機(jī)是路由器,則TTL減一;若TTL小于等于0,則丟棄此分組并發(fā)送ICMP差錯(cuò)報(bào)文,處理完畢;還未完畢的話(huà),將數(shù)據(jù)報(bào)發(fā)送到轉(zhuǎn)發(fā)模塊,處理完畢。

FullSizeRender 5.jpg
FullSizeRender 7.jpg

隊(duì)列:輸入隊(duì)列指的是來(lái)自數(shù)據(jù)鏈路層和高層的數(shù)據(jù)報(bào)。輸出隊(duì)列則存放的是要發(fā)送到數(shù)據(jù)鏈路層和高層的數(shù)據(jù)。處理模塊從輸入隊(duì)列中取出數(shù)據(jù)報(bào),分片和重裝模塊則向輸出隊(duì)列中添加數(shù)據(jù)報(bào)。

路由表:轉(zhuǎn)發(fā)模塊利用路由表來(lái)確定下一跳的地址。

轉(zhuǎn)發(fā)模塊:接受來(lái)自處理模塊的IP分組。找出下一站的IP地址以及發(fā)送該分組時(shí)應(yīng)當(dāng)使用的接口。然后將分組以及這些信息傳遞給分片模塊。

MTU表:分片模塊使用MTU表找出特定接口的MTU值。

分片模塊:分片模塊查詢(xún)MTU表,若數(shù)據(jù)報(bào)長(zhǎng)度大于MTU,則進(jìn)行分片,對(duì)每一個(gè)分片添加首部,并將它們發(fā)送個(gè)ARP軟件包以進(jìn)行地址解析和交付。

FullSizeRender 11.jpg

重裝表:有5個(gè)字段,狀態(tài)、源IP地址、數(shù)據(jù)報(bào)標(biāo)識(shí)符、超時(shí)以及分片。狀態(tài)字段取值為FREE或IN-USE。數(shù)據(jù)報(bào)標(biāo)識(shí)是IP分組中的標(biāo)識(shí)字段,定義了一個(gè)數(shù)據(jù)報(bào)以及屬于該數(shù)據(jù)報(bào)的所有分片。超時(shí)表示所有分片必須在預(yù)定的時(shí)間內(nèi)到達(dá)。分片字段是指向分片鏈表的指針。

FullSizeRender 8.jpg

重裝模塊:找出分片是屬于哪個(gè)數(shù)據(jù)報(bào)的,并將它們進(jìn)行排序,所有分片都到達(dá)時(shí)重新組裝成一個(gè)數(shù)據(jù)報(bào),超時(shí)的話(huà)全部丟棄。

FullSizeRender 9.jpg
FullSizeRender 10.jpg

參考

《TCP/IP協(xié)議族(第4版)》 (Behrouz A.Forouzan) 第四、五、六、七章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容