地址解析協(xié)議ARP
物理這一級(jí),主機(jī)和路由器是用物理地址來區(qū)別的。物理地址是一個(gè)本地地址,管轄范圍是本地網(wǎng)絡(luò),所以在本地范圍內(nèi)必須唯一。稱為物理地址是因?yàn)橥ǔ#ú⒎强偸牵┰谟布蠈?shí)現(xiàn)。一個(gè)具體實(shí)例是以太網(wǎng)協(xié)議中48位的MAC地址,被寫入安裝在主機(jī)或路由器中的網(wǎng)絡(luò)接口卡(NIC)中。
一個(gè)分組交付到主機(jī)或路由器需要兩級(jí)地址:邏輯地址和物理地址。需要將兩者相互映射,方法是靜態(tài)映射或動(dòng)態(tài)映射。
靜態(tài)映射就是創(chuàng)建一張表將邏輯地址和物理地址都記錄,并存儲(chǔ)在網(wǎng)絡(luò)中的每一臺(tái)機(jī)器中。局限顯而易見。
動(dòng)態(tài)映射是每次只要機(jī)器知道另一臺(tái)機(jī)器的邏輯地址,就可以按照協(xié)議找出與之對(duì)應(yīng)的物理地址。地址解析協(xié)議ARP是將邏輯地址映射為物理地址。逆地址解析協(xié)議RARP是將物理地址映射為邏輯地址,目前已被另一個(gè)協(xié)議取代。
1. ARP原理
當(dāng)主機(jī)或路由器需要找出另外一個(gè)主機(jī)或路由器的物理地址時(shí),就可以發(fā)送一個(gè)ARP查詢分組,分組中包括了發(fā)送方的物理地址和IP地址以及接收方的IP地址。因?yàn)榘l(fā)送方不知道接收方的物理地址,所以需要在網(wǎng)絡(luò)上廣播該分組。
網(wǎng)絡(luò)上的每一個(gè)機(jī)器都會(huì)接收并處理該分組,但只有與接收方IP地址相匹配的機(jī)器才會(huì)返回一個(gè)ARP響應(yīng)分組,分組中包含有接收方的IP地址和物理地址,這個(gè)分組因?yàn)橹懒藢?duì)方的物理地址,所以只需要單播即可。
總體需要7個(gè)步驟:
1.發(fā)送方知道目標(biāo)的IP地址。
2.IP請(qǐng)求ARP創(chuàng)建一個(gè)ARP請(qǐng)求報(bào)文,填入發(fā)送方的物理地址、IP地址和目標(biāo)IP地址,而目標(biāo)物理地址字段全填0(各字段詳情見下)。
3.遞交給數(shù)據(jù)鏈路層,封裝成幀后,以發(fā)送方的物理地址作為源地址,以物理廣播地址作為目的地址。
4.每個(gè)主機(jī)或路由器均會(huì)接收并處理(因?yàn)槭菑V播地址),除了目標(biāo)機(jī)器外,其余均會(huì)將這個(gè)分組丟棄。
5.目標(biāo)機(jī)器用ARP回答報(bào)文進(jìn)行回答,報(bào)文中包含它的物理地址,使用單播方式。
6.發(fā)送方接收到這個(gè)應(yīng)答。
7.攜帶有給目標(biāo)機(jī)器數(shù)據(jù)的IP數(shù)據(jù)報(bào)現(xiàn)在可以封裝成幀,并用單播方式發(fā)送到終點(diǎn)。
2. 分組格式
硬件類型:16bit,定義運(yùn)行ARP的物理網(wǎng)絡(luò)類型。如以太網(wǎng)是1,ARP可用在任何物理網(wǎng)絡(luò)上。
協(xié)議類型:16bit,定義使用的協(xié)議。如IPv4是0x0800,ARP可用于任何高層協(xié)議。
硬件長度:8bit,定義物理地址的長度,以byte為單位。如以太網(wǎng)是48bit=6byte。
協(xié)議長度:8bit,定義邏輯地址的長度,以byte為單位。如IPv4是4.
操作:16bit,定義分組類型。ARP請(qǐng)求是1,ARP回復(fù)是2.
發(fā)送方硬件地址:可變長度字段,定義發(fā)送方的物理地址。如以太網(wǎng)是6byte。
發(fā)送方協(xié)議地址:可變長度字段,定義發(fā)送方的邏輯地址。對(duì)于IPv4是4byte。
目標(biāo)硬件地址:可變長度字段,定義接收方的物理地址。如以太網(wǎng)是6byte。對(duì)于ARP請(qǐng)求報(bào)文,此字段為全0,因?yàn)榘l(fā)送時(shí)并不知道接收方的物理地址。
目標(biāo)協(xié)議地址:可變長度字段,定義接收方的邏輯地址。對(duì)于IPv4是4byte。
ARP分組直接封裝在物理鏈路幀中,幀中的類型字段會(huì)指出此幀攜帶的數(shù)據(jù)是ARP分組。
3. 代理ARP
代理ARP(proxy ARP)技術(shù),可用于產(chǎn)生一種子網(wǎng)劃分的效果。代理ARP是代表了一組主機(jī)的ARP。當(dāng)運(yùn)行代理ARP的路由器收到一個(gè)ARP請(qǐng)求后,希望找出這些主機(jī)中的某一臺(tái)主機(jī)的物理地址時(shí),此路由器就會(huì)返回它自己的物理地址的ARP回答分組。當(dāng)這個(gè)路由器收到真正的數(shù)據(jù)IP分組后,會(huì)把這些分組發(fā)送給響應(yīng)的主機(jī)或路由器。
4. ARP軟件構(gòu)成
高速緩存表:當(dāng)主機(jī)或路由器接收到一個(gè)IP數(shù)據(jù)報(bào),會(huì)把相應(yīng)的物理地址存儲(chǔ)在高速緩存表中。這樣同樣目的地的數(shù)據(jù)報(bào)可以重復(fù)利用一個(gè)物理地址,提高效率,但是由于空間有限,并不會(huì)無限制時(shí)間存儲(chǔ)。
每個(gè)表項(xiàng)包含以下字段:
1.狀態(tài),顯示表項(xiàng)的狀態(tài),F(xiàn)REE/PENDING/RESOLVED。分別代表生存時(shí)間到期,可分配給新表項(xiàng);表項(xiàng)的ARP請(qǐng)求已發(fā)出但未收到回復(fù);表項(xiàng)映射已建立,此表項(xiàng)信息可以被使用。
2.硬件類型:
3.協(xié)議類型:
4.硬件長度:
5.協(xié)議長度:以上三項(xiàng)與ARP分組中對(duì)應(yīng)字段相同。
6.接口號(hào):指代路由器(或連接多個(gè)網(wǎng)絡(luò)的主機(jī))的不同連接所對(duì)應(yīng)的接口號(hào)。
7.隊(duì)列號(hào):ARP使用帶編號(hào)的隊(duì)列將等待地址解析的分組進(jìn)行排隊(duì),發(fā)往同一個(gè)終點(diǎn)的分組通常放在同一個(gè)隊(duì)列中。
8.嘗試:已發(fā)送多少次ARP請(qǐng)求。
9.超時(shí):剩余的生存時(shí)間,單位為秒。
10.硬件地址:對(duì)端物理地址,接收到ARP回復(fù)報(bào)文時(shí)才填入數(shù)據(jù),否則為空。
11.協(xié)議地址:對(duì)端IP地址。
隊(duì)列:ARP使用帶編號(hào)的隊(duì)列將等待地址解析的分組進(jìn)行排隊(duì),發(fā)往同一個(gè)終點(diǎn)的分組通常放在同一個(gè)隊(duì)列中。輸出模塊把未解析的分組發(fā)送到相應(yīng)的隊(duì)列。輸入模塊從隊(duì)列中取出分組,并連同解析出的物理地址發(fā)送給數(shù)據(jù)鏈路層傳輸。
輸出模塊:等待來自IP的分組。接收到后,檢查高速緩存表,查找是否有表項(xiàng)對(duì)應(yīng)該分組的目的IP地址。
若找到了,并且狀態(tài)是RESOLVED,則將分組連同目的硬件地址一起傳遞給數(shù)據(jù)鏈路層。
若找到了,并且狀態(tài)是PENDING,則將分組相應(yīng)的隊(duì)列中等待。
若找不到,輸出模塊新建一個(gè)隊(duì)列,將分組放入隊(duì)列中。并為這個(gè)終點(diǎn)在高速緩存表中創(chuàng)建一個(gè)表項(xiàng),把“嘗試”字段置為1,并發(fā)送ARP廣播請(qǐng)求分組。
輸入模塊:等待ARP分組(請(qǐng)求或回答)到達(dá)。接收到后,檢查高速緩存表,查找是否有表項(xiàng)對(duì)應(yīng)該分組的目的IP地址。
若找到了,并且狀態(tài)是PENDING,則模塊對(duì)該表項(xiàng)進(jìn)行更新,即把物理地址寫入,并把狀態(tài)更改為RESOLVED。還要設(shè)置超時(shí)時(shí)間值。然后將對(duì)應(yīng)的隊(duì)列中的分組逐個(gè)取出,連同物理地址發(fā)送給數(shù)據(jù)鏈路層傳輸。
若找到了,并且狀態(tài)是RESOLVED,還是要更新該表項(xiàng),這是因?yàn)槟康牡赜布刂房赡芤迅淖儯瑫r(shí)時(shí)間值也要重置。
若找不到,則創(chuàng)建一個(gè)新表項(xiàng)。協(xié)議要求任何收到的信息都要添加到表中以供以后使用,此時(shí)狀態(tài)為RESOLVED。超時(shí)時(shí)間值也要設(shè)置。
最后,還要查看下到達(dá)的ARP分組是不是請(qǐng)求分組,若需要回復(fù),則創(chuàng)建一個(gè)ARP回答分組并發(fā)送給對(duì)方。具體是更改請(qǐng)求分組中的“操作字段”從請(qǐng)求變?yōu)榛卮穑⑻钊肽繕?biāo)硬件地址。
高速緩存控制模塊:負(fù)責(zé)維護(hù)高速緩存表。周期性地逐項(xiàng)檢查高速緩存表。
若為FREE則跳過。
若為PENDING,則將嘗試字段+1,再檢查嘗試字段,若超過最大嘗試次數(shù),則改狀態(tài)為FREE,并銷毀相應(yīng)隊(duì)列,還要向最初數(shù)據(jù)源發(fā)送一個(gè)ICMP報(bào)文,若小于,則發(fā)送一個(gè)ARP請(qǐng)求分組。
若為RESOLVED,則把超時(shí)字段減去自上次檢查以來經(jīng)過的時(shí)間,若此時(shí)數(shù)值小于等于0,則狀態(tài)變?yōu)镕REE,并銷毀相應(yīng)隊(duì)列。
網(wǎng)際控制報(bào)文協(xié)議ICMP
網(wǎng)際控制報(bào)文協(xié)議ICMPv4為了補(bǔ)償IP協(xié)議缺少差錯(cuò)控制和缺少輔助機(jī)制這兩個(gè)缺點(diǎn)而設(shè)計(jì)。
常見差錯(cuò)報(bào)告場景:路由器找不到可到達(dá)最后終點(diǎn)的路由器,或生存時(shí)間字段值為0必須丟棄數(shù)據(jù)報(bào),最終目的主機(jī)在時(shí)間內(nèi)未收到一個(gè)數(shù)據(jù)報(bào)的所有分組必須全部丟棄時(shí)。
常見輔助場景:主機(jī)需要判斷某個(gè)路由器或者對(duì)方主機(jī)是否活躍,網(wǎng)絡(luò)管理員需要來自其他主機(jī)或路由器的信息。
ICMP屬于網(wǎng)絡(luò)層,但是它的報(bào)文是要首先封裝成IP數(shù)據(jù)報(bào),再傳遞給下一層。IPv4報(bào)頭中的協(xié)議字段值為1時(shí),表示攜帶的是數(shù)據(jù)是ICMP報(bào)文。
1. 報(bào)文
ICMP報(bào)文可分為兩類:差錯(cuò)報(bào)告報(bào)文,報(bào)告了路由器或主機(jī)在處理IP數(shù)據(jù)報(bào)時(shí)可能遇到的問題;查詢報(bào)文,成雙成對(duì)出現(xiàn),幫助主機(jī)或網(wǎng)絡(luò)管理員從某個(gè)路由器或?qū)Ψ街鳈C(jī)那里獲取特定的信息。
報(bào)文由一個(gè)8byte首部和可變長的數(shù)據(jù)部分組成。類型字段8bit,是ICMP的類型,定義了報(bào)文類型。代碼字段8bit,指明發(fā)送原因。校驗(yàn)和,16bit,和IP的校驗(yàn)和一樣,使用反碼。首部的其余部分,32bit,對(duì)于每種類型的報(bào)文都是特有的。
在差錯(cuò)報(bào)文中,數(shù)據(jù)部分?jǐn)y帶的是用于找出引起差錯(cuò)的原始分組的信息。在查詢報(bào)文中,數(shù)據(jù)部分?jǐn)y帶的是基于查詢類型的額外信息。
1.1 差錯(cuò)報(bào)告報(bào)文
ICMP并不能糾錯(cuò),只是簡單地報(bào)告差錯(cuò)。差錯(cuò)報(bào)文總是發(fā)送給最初的數(shù)據(jù)源,因?yàn)樵跀?shù)據(jù)報(bào)中關(guān)于路由唯一可用的信息就是源IP地址和目的IP地址。IMCP利用了源IP地址把差錯(cuò)報(bào)文發(fā)送給數(shù)據(jù)報(bào)的源點(diǎn)。
分為5類:終點(diǎn)不可達(dá)、源點(diǎn)抑制、超時(shí)、參數(shù)問題、改變路由。
特殊注意點(diǎn):攜帶ICMP差錯(cuò)報(bào)文的數(shù)據(jù)報(bào),不再產(chǎn)生ICMP差錯(cuò)報(bào)文。對(duì)于分片的數(shù)據(jù)報(bào),若不是第一個(gè)分片,不產(chǎn)生ICMP差錯(cuò)報(bào)文。具有多播地址的數(shù)據(jù)報(bào),不產(chǎn)生。具有特殊地址(如127.0.0.0或0.0.0.0)的數(shù)據(jù)報(bào),不產(chǎn)生。
差錯(cuò)報(bào)文的數(shù)據(jù)部分包括原始數(shù)據(jù)報(bào)的IP首部,加上該數(shù)據(jù)報(bào)的前8byte。前者是為了向接受差錯(cuò)報(bào)文的原始源點(diǎn)給出關(guān)于數(shù)據(jù)報(bào)本身的信息。后者是因?yàn)?byte提供了關(guān)于端口號(hào)(UDP和TCP)的信息,為了讓源點(diǎn)通知這些協(xié)議就需要這些信息。
所以ICMP的差錯(cuò)報(bào)文是ICMP首部+原IP首部+源IP數(shù)據(jù)頭8byte。當(dāng)ICMP要發(fā)送時(shí),還要在前面加一個(gè)新IP首部。
終點(diǎn)不可達(dá):當(dāng)路由器無法為一個(gè)數(shù)據(jù)報(bào)找到路由,或者主機(jī)無法交付一個(gè)數(shù)據(jù)報(bào),此數(shù)據(jù)報(bào)被丟棄,需要向源主機(jī)返回一個(gè)重點(diǎn)不可達(dá)報(bào)文。
首部的類型字段為3,代碼字段指明了丟棄的原因。首部的其余部分未使用,為全0。
為0:網(wǎng)絡(luò)不可達(dá),知道目的網(wǎng)絡(luò)的存在卻無法到達(dá),可能是硬件故障。
為1:主機(jī)不可達(dá),知道目的主機(jī)的存在卻無法到達(dá),也可能是硬件故障。
為2:協(xié)議不可達(dá),目的主機(jī)收到IP報(bào)文后,發(fā)現(xiàn)其中攜帶的高層協(xié)議并未運(yùn)行。
為3:端口不可達(dá),數(shù)據(jù)報(bào)要交付的目標(biāo)應(yīng)用程序(進(jìn)程)未運(yùn)行。
為4:需要分片,但DF(不分片)已設(shè)置。
為5:源路由不能完成,即源路由選項(xiàng)中定義的一個(gè)或多個(gè)路由器無法通過。
為6:目的網(wǎng)絡(luò)未知,路由器根本沒有關(guān)于這個(gè)網(wǎng)絡(luò)的信息。
為7:目的主機(jī)未知,路由器根本不知道目的地主機(jī)的存在。
為8:源主機(jī)被隔離了。
為9:從管理上禁止與目的網(wǎng)絡(luò)通信。
為10:從管理上禁止與目的主機(jī)通信。
為11:對(duì)指明的服務(wù)類型,網(wǎng)絡(luò)不可達(dá)。
為12:對(duì)指明的服務(wù)類型,主機(jī)不可達(dá)。
為13:主機(jī)不可達(dá),因?yàn)楣芾韱T已經(jīng)在這個(gè)主機(jī)上放置了過濾器。
為14:主機(jī)不可達(dá),因?yàn)橹鳈C(jī)違反了優(yōu)先級(jí)策略,這種報(bào)文由路由器發(fā)出,指出所要求的優(yōu)先級(jí)在該目的主機(jī)是不允許的。
為15:主機(jī)不可達(dá),因?yàn)樗膬?yōu)先級(jí)被截止,當(dāng)網(wǎng)絡(luò)操作員為網(wǎng)絡(luò)的操作設(shè)定了最小的優(yōu)先級(jí)限制,但發(fā)送的數(shù)據(jù)報(bào)的優(yōu)先級(jí)小于此限制。
以上2或3的報(bào)文只能由目的主機(jī)產(chǎn)生,其余幾個(gè)報(bào)文只能由路由器產(chǎn)生。
當(dāng)然,以上并沒有包括所有終點(diǎn)不可達(dá)的情況。
源點(diǎn)抑制:由于IP無連接,產(chǎn)生數(shù)據(jù)報(bào)的源點(diǎn),和轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)的路由器以及目的點(diǎn)間沒有任何通信聯(lián)系,故缺乏流量控制和擁塞控制。
當(dāng)路由器或主機(jī)因擁塞而丟棄數(shù)據(jù)報(bào)時(shí),它就向該數(shù)據(jù)包的發(fā)送方發(fā)送一個(gè)源點(diǎn)抑制報(bào)文。有兩個(gè)作用:通知源點(diǎn),數(shù)據(jù)報(bào)已被丟棄;警告源點(diǎn),路徑中的某處出現(xiàn)擁塞,源點(diǎn)必須放慢發(fā)送過程。
首部的類型字段為4,代碼字段為全0,首部其余部分也為全0。
幾點(diǎn)補(bǔ)充:
遭受擁塞的路由器必須為每一個(gè)丟棄的報(bào)文都發(fā)送一個(gè)源點(diǎn)抑制報(bào)文。
沒有機(jī)制告訴源點(diǎn)擁塞已緩解,源點(diǎn)只能不停降低發(fā)送速率知道不再收到源點(diǎn)抑制報(bào)文。
在一對(duì)一的通信中,源點(diǎn)抑制報(bào)文很有用。而在多對(duì)一的通信中,路由器或目的主機(jī)不知道哪一個(gè)源點(diǎn)應(yīng)該為擁塞負(fù)責(zé),可能丟棄了來自低速率的源點(diǎn)的數(shù)據(jù)報(bào),而沒有丟棄來自高速率源點(diǎn)的數(shù)據(jù)報(bào),此時(shí)源點(diǎn)抑制報(bào)文就不一定有用了。
超時(shí):數(shù)據(jù)報(bào)中的超時(shí)字段為0時(shí),需要丟棄,此時(shí)路由器要向源點(diǎn)發(fā)送一個(gè)超時(shí)報(bào)文。
當(dāng)一個(gè)報(bào)文的所有分片未能在規(guī)定時(shí)間內(nèi)全部到達(dá)目標(biāo)主機(jī)時(shí),也要產(chǎn)生超時(shí)報(bào)文。當(dāng)?shù)谝粋€(gè)分片到達(dá)時(shí),目標(biāo)主機(jī)就開始計(jì)時(shí)。
首部的類型字段為11,代碼字段為0或1(分別指代以上兩種情況),首部的其余部分為全0。
參數(shù)問題:數(shù)據(jù)報(bào)的首部中出現(xiàn)二義性,或發(fā)現(xiàn)某字段缺少值,就回丟棄數(shù)據(jù)報(bào),并返回一個(gè)參數(shù)問題報(bào)文。
首部的類型字段為2,代碼字段為0或1:0代表首部的某個(gè)字段中有差錯(cuò)或二義性,指針字段(在首部的其余部分中)要指向有問題的字段,1代表缺少的選項(xiàng)部分,此時(shí)不適用指針。首部的其余部分若未被使用,則全為0。
改變路由:在網(wǎng)絡(luò)中,路由器的路由表通常是動(dòng)態(tài)變化的,而主機(jī)的路由表通常使用靜態(tài)路由選擇。因此主機(jī)有可能會(huì)把另一個(gè)網(wǎng)絡(luò)的數(shù)據(jù)報(bào)發(fā)送給一個(gè)錯(cuò)誤的路由器(沒有與時(shí)俱進(jìn))。此時(shí),收到這個(gè)數(shù)據(jù)報(bào)的路由器會(huì)將數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)給正確的路由器,但是為了更新主機(jī)中的路由表,路由器還要向主機(jī)發(fā)送一個(gè)改變路由報(bào)文。
主機(jī)在剛開始工作時(shí)只有一張很小的路由表,這個(gè)路由表逐漸增大和更新。完成這項(xiàng)任務(wù)的工具之一就是改變路由報(bào)文。
首部的類型字段為5,代碼為0~3,首部的其余部分是合適的路由器的IP地址。
需要注意的是,此種情況下路由器不會(huì)丟棄報(bào)文。
代碼字段縮小了改變路由的范圍:
為0,對(duì)特定網(wǎng)絡(luò)路由的改變。
為1,對(duì)特定主機(jī)路由的改變。
為2,基于制定服務(wù)類型的對(duì)特定網(wǎng)絡(luò)路由的改變。
為3,基于制定服務(wù)類型的對(duì)特定主機(jī)路由的改變。
1.2 查詢報(bào)文
查詢報(bào)文是成雙成對(duì)的,起初設(shè)計(jì)了5對(duì),但其中3對(duì)已過時(shí)。還在使用的是回答請(qǐng)求與回答,時(shí)間戳請(qǐng)求與回答。使用此類ICMP報(bào)文時(shí),先由一個(gè)節(jié)點(diǎn)先發(fā)送一個(gè)報(bào)文,再由目的節(jié)點(diǎn)以指明的格式進(jìn)行回答。
回送請(qǐng)求與回答:回送請(qǐng)求與回送回答報(bào)文是為了診斷而設(shè)計(jì)的。組合起來可確定雙方是否可以通信。此外還證明了中間的路由器也能夠接收、處理和轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)。
通常會(huì)調(diào)用分組因特網(wǎng)搜尋器(ping)命令來檢查另一個(gè)主機(jī)是否可達(dá)。它會(huì)提供一串信息以供統(tǒng)計(jì)使用。
首部的類型字段為8或0,8是回送請(qǐng)求,0是回送回答。代碼字段是0。首部的其余部分分為兩部分,16bit的標(biāo)識(shí)符,通常與發(fā)起請(qǐng)求的進(jìn)程的ID是一致的,16bit的序號(hào),通常是一個(gè)序列號(hào)。
在報(bào)文的數(shù)據(jù)部分,回送回答報(bào)文中必須copy回送請(qǐng)求中的數(shù)據(jù)部分,要一模一樣。
時(shí)間戳請(qǐng)求和回答:來確定IP數(shù)據(jù)報(bào)在這兩個(gè)機(jī)器之間來回所需的往返時(shí)間。也可用來同步時(shí)間。
首部的類型字段為13或14,13是時(shí)間戳請(qǐng)求,14是時(shí)間按此回答。代碼字段是0。首部的其余部分和回送請(qǐng)求與回答一致。
數(shù)據(jù)部分是3個(gè)時(shí)間戳,每個(gè)32bit,分別是原始時(shí)間戳,接收時(shí)間戳,發(fā)送時(shí)間戳,都要保存一個(gè)數(shù),代表以通用時(shí)間(以前稱為格林威治時(shí)間)的午夜起測(cè)量出的時(shí)間,單位是毫秒。
源點(diǎn)生成時(shí)間戳請(qǐng)求報(bào)文,并把它的發(fā)送時(shí)間填入原始時(shí)間戳,其他字段置0。
終點(diǎn)生成時(shí)間戳回答報(bào)文,原始時(shí)間戳copy即可,接收時(shí)間戳填入接收時(shí)間,發(fā)送時(shí)將發(fā)送時(shí)間戳填入。
源點(diǎn)接收到時(shí)間戳回答報(bào)文后,進(jìn)行計(jì)算:
發(fā)送時(shí)間 = 接收時(shí)間戳 - 原始時(shí)間戳
接收時(shí)間 = 分組返回的時(shí)間 - 發(fā)送時(shí)間戳
往返時(shí)間 = 發(fā)送時(shí)間 + 接收時(shí)間
當(dāng)雙方時(shí)間同步時(shí),計(jì)算結(jié)果才是精確的。但是未同步時(shí),由于每一個(gè)時(shí)鐘在往返時(shí)間的計(jì)算中出現(xiàn)了2次,差別抵消,也還是準(zhǔn)確的。
若給出實(shí)際的單項(xiàng)時(shí)間,則可進(jìn)行雙方間的時(shí)間同步:
時(shí)間差 = 接收時(shí)間戳 - (原始時(shí)間戳 + 單向經(jīng)歷時(shí)間)
將往返時(shí)間除2可得到準(zhǔn)確的單向經(jīng)歷時(shí)間。
過時(shí)的報(bào)文:信息請(qǐng)求和回答報(bào)文,它們的任務(wù)移交給地址解析協(xié)議ARP。地址掩碼請(qǐng)求和回答,移交給動(dòng)態(tài)主機(jī)配置協(xié)議DHCP。路由器詢問和通告報(bào)文,移交給動(dòng)態(tài)主機(jī)配置協(xié)議DHCP。
2. 排錯(cuò)工具
ping,查出某個(gè)主機(jī)是否已加電并能夠響應(yīng)。見我之前的筆記:[記錄]Ping命令粗略。
traceroute跟蹤一個(gè)分組從源點(diǎn)到終點(diǎn)的路徑。這個(gè)應(yīng)用級(jí)的程序使用UDP服務(wù),巧妙地使用了兩個(gè)ICMP報(bào)文——超時(shí)報(bào)文和終點(diǎn)不可達(dá)報(bào)文來找出一個(gè)分組的路由。主要使用ICMP報(bào)文和IP分組中的TTL(生存時(shí)間)字段。
舉例,主機(jī)A到主機(jī)B間需要依次通過路由器R1和R2。
首先,主機(jī)A要找到路由器R1的地址和分組在它們之間的往返時(shí)間,這個(gè)過程會(huì)重復(fù)3次,以得到一個(gè)較為準(zhǔn)確的往返時(shí)間平均值。a). 主機(jī)A的traceroute使用UDP向終點(diǎn)B發(fā)送一個(gè)分組,被封裝成IP分組,且TTL值為1,并記下發(fā)送時(shí)間。b). 路由器R1收到該分組,TTL減一變?yōu)?,R1丟棄該分組并向主機(jī)A發(fā)送ICMP超時(shí)報(bào)文。c). 主機(jī)A收到ICMP報(bào)文,利用IP的源地址找出R1地址,并記下分組的到達(dá)時(shí)間。與a)中的時(shí)間差即為往返時(shí)間。
然后,主機(jī)A重復(fù)以上步驟來找出R2的地址,此次TTL為2,因此R1會(huì)轉(zhuǎn)發(fā)分組,而R2會(huì)丟棄并發(fā)送ICMP超時(shí)報(bào)文。
最后,分組的TTL設(shè)為3,但主機(jī)B接收到該分組后并不會(huì)丟棄該分組,因?yàn)橐呀?jīng)到達(dá)終點(diǎn)B。traceroute使用一種策略,UDP的目的端口被設(shè)置成UDP協(xié)議不支持的一個(gè)端口,這樣當(dāng)主機(jī)B收到該分組后,會(huì)因?yàn)檎也坏娇梢越邮战桓兜某绦蚨鴣G棄該分組,并向主機(jī)A發(fā)送一個(gè)ICMP終點(diǎn)不可達(dá)報(bào)文。因?yàn)槁酚善鞑粫?huì)檢查UDP首部,所以不會(huì)在R1和R2處被檢查出來而丟棄。主機(jī)A收到ICMP報(bào)文后,因?yàn)榻K點(diǎn)已找出,不會(huì)再發(fā)送更多分組。
3. ICMP軟件構(gòu)成
由輸入模塊和輸出模塊組成,前者處理到來的ICMP分組,后者處理對(duì)ICMP服務(wù)的請(qǐng)求。
輸入模塊:當(dāng)一個(gè)來自IP層的ICMP分組要交付給它時(shí),就被激活。若收到的是請(qǐng)求報(bào)文,則輸入模塊產(chǎn)生回答報(bào)文并發(fā)送。若收到的是改變路由報(bào)文,則更新路由表。若收到的是差錯(cuò)報(bào)文,則通知相關(guān)協(xié)議有關(guān)差錯(cuò)的情況。
輸出模塊:根據(jù)高層協(xié)議或IP協(xié)議的要求來創(chuàng)建請(qǐng)求報(bào)文、詢問報(bào)文或差錯(cuò)報(bào)文。若來自IP,則輸出模塊必須檢查是否合理,有四種情況不允許創(chuàng)建ICMP報(bào)文:攜帶ICMP差錯(cuò)報(bào)文的IP分組、被分片的IP分組、多播IP分組、IP地址為0.0.0.0或127.X.Y.Z的IP分組。
移動(dòng)IP
1. 編址
使用IP協(xié)議提供移動(dòng)通信時(shí)必須解決的主要問題是編址。
最初的的IP編址的假設(shè):主機(jī)是固定的,并且連接到某個(gè)特定的網(wǎng)絡(luò)。所以IP地址由兩部分組成:前綴(網(wǎng)絡(luò)地址)+后綴(主機(jī)地址)。暗示因特網(wǎng)上的主機(jī)無法攜帶一個(gè)IP地址從一個(gè)地方到其他地方而保持不變。只有連接到對(duì)應(yīng)的網(wǎng)絡(luò)上,這個(gè)地址才是有效的,如果網(wǎng)絡(luò)改變了,則之前的地址就無效了。
對(duì)于移動(dòng)主機(jī),有幾種解決方案。
改變地址:移動(dòng)到新的網(wǎng)絡(luò)時(shí)改變它的地址,使用DHCP來獲得新地址。缺點(diǎn):配置文件可能改變;移動(dòng)到新網(wǎng)絡(luò)后,主機(jī)需要重啟;DNS表必須更新,以使因特網(wǎng)上的其他主機(jī)都知道變化;移動(dòng)過程中,數(shù)據(jù)傳輸會(huì)中斷,因?yàn)榭蛻舳撕头?wù)器端在傳輸時(shí)IP地址和端口號(hào)需要保持不變。
兩個(gè)地址:原始地址稱為歸屬地址,臨時(shí)地址稱為轉(zhuǎn)交地址。前者使得主機(jī)和它的歸屬網(wǎng)絡(luò)相關(guān)聯(lián),后者與移動(dòng)到的新網(wǎng)絡(luò)相關(guān)聯(lián)。
2. 代理
當(dāng)移動(dòng)主機(jī)接入一個(gè)外地網(wǎng)絡(luò)時(shí),它就會(huì)在代理發(fā)現(xiàn)階段和登記階段收到自己的轉(zhuǎn)交地址。
需要一個(gè)歸屬代理和外地代理。
歸屬代理通常是連接在移動(dòng)主機(jī)的歸屬網(wǎng)絡(luò)上的路由器,當(dāng)遠(yuǎn)程主機(jī)向移動(dòng)主機(jī)發(fā)送數(shù)據(jù)時(shí),歸屬代理就充當(dāng)該移動(dòng)主機(jī)。接收后,再把分組轉(zhuǎn)交給外地代理。
外地代理通常是連接在外地網(wǎng)絡(luò)上的路由器,接收歸屬代理發(fā)送過來的分組,并轉(zhuǎn)交給移動(dòng)主機(jī)。移動(dòng)主機(jī)也可以充當(dāng)外地代理,此時(shí)必須能夠收到自己的轉(zhuǎn)交地址,通常是用DHCP來實(shí)現(xiàn)。
3. 三個(gè)階段
要與遠(yuǎn)程主機(jī)通信,有三個(gè)階段:代理發(fā)現(xiàn)、登記、數(shù)據(jù)傳送。
代理發(fā)現(xiàn):移動(dòng)主機(jī)在離開歸屬網(wǎng)絡(luò)之前發(fā)現(xiàn)歸屬代理,掌握歸屬代理的地址;在移動(dòng)到外地網(wǎng)絡(luò)后發(fā)現(xiàn)外地代理。
當(dāng)一個(gè)路由器充當(dāng)代理的角色,則可使用ICMP的路由器通告分組,在后面附帶代理通告報(bào)文來實(shí)現(xiàn)代理通告。
當(dāng)移動(dòng)主機(jī)移動(dòng)到新網(wǎng)絡(luò)但沒收到代理通告時(shí),可使用ICMP詢問報(bào)文通知代理,讓代理知道它的需求,即為一個(gè)代理詢問。
登記:移動(dòng)主機(jī)向外地代理登記;外地代理以移動(dòng)主機(jī)的身份來向歸屬代理登記;截止期到了后移動(dòng)主機(jī)必須更新登記;移動(dòng)主機(jī)回歸歸屬網(wǎng)絡(luò)后必須取消登記。
登記請(qǐng)求或回答使用UDP,代理使用端口是434。
數(shù)據(jù)傳送:分為四個(gè)步驟。
1.從遠(yuǎn)程主機(jī)到歸屬代理。遠(yuǎn)程主機(jī)發(fā)送分組時(shí)還以為移動(dòng)主機(jī)在歸屬網(wǎng)絡(luò),分組被歸屬代理截獲,使用了代理ARP技術(shù)。
2.從歸屬代理到外地代理。使用隧道技術(shù),將分組發(fā)送給外地代理。歸屬代理將原IP分組封裝在另一個(gè)IP分組中。
3.從外地代理到移動(dòng)主機(jī)。從大IP分組中取出原IP分組,并查詢登記表,找到轉(zhuǎn)交地址,并發(fā)送。
4.從移動(dòng)主機(jī)到遠(yuǎn)程主機(jī)。正常發(fā)送,使用歸屬地址作為源地址。
移動(dòng)主機(jī)對(duì)于因特網(wǎng)的其余部分是不可知的,遠(yuǎn)程主機(jī)發(fā)送時(shí)使用的目的地址,以及收到的分組中的源地址,都是移動(dòng)主機(jī)的歸屬地址,所以不可知。
4. 低效率
很嚴(yán)重的情況成為兩次穿越或2X。中等嚴(yán)重的情況成為三角路由選擇或狗腿路由選擇。
兩次穿越:移動(dòng)主機(jī)與遠(yuǎn)程主機(jī)處于同一網(wǎng)絡(luò)。移動(dòng)主機(jī)到遠(yuǎn)程主機(jī)不存在低效問題,而遠(yuǎn)程主機(jī)到移動(dòng)主機(jī)通信時(shí),卻需要穿越互聯(lián)網(wǎng)兩次,造成低效。
三角路由選擇:低效情況較輕,此種情況下移動(dòng)主機(jī)和遠(yuǎn)程主機(jī)沒有連接在一個(gè)網(wǎng)絡(luò)上。移動(dòng)主機(jī)到遠(yuǎn)程主機(jī)不存在低效問題,而遠(yuǎn)程主機(jī)到移動(dòng)主機(jī)通信時(shí),需要先到歸屬代理,再由外地代理找到移動(dòng)主機(jī),相當(dāng)于三角形的兩邊,而不只是一條邊。
一種解決方案是,當(dāng)歸屬代理收到第一個(gè)來自遠(yuǎn)程主機(jī)的分組時(shí),進(jìn)行轉(zhuǎn)發(fā)的同時(shí),向遠(yuǎn)程主機(jī)發(fā)送一個(gè)更新綁定分組,使之在以后發(fā)送給該移動(dòng)主機(jī)時(shí)選擇這個(gè)轉(zhuǎn)交地址,遠(yuǎn)程主機(jī)會(huì)將此信息存入高速緩存中。引入的問題是,一旦移動(dòng)主機(jī)又移動(dòng),則高速緩存的信息會(huì)過時(shí),這種情況下,歸屬代理需要向遠(yuǎn)程主機(jī)發(fā)送告警分組以通知改變。
參考
《TCP/IP協(xié)議族(第4版)》 (Behrouz A.Forouzan) 第八、九、十章