TCP/IP協(xié)議簇是目前互聯(lián)網(wǎng)應(yīng)用最廣的協(xié)議棧,談到TCP/IP協(xié)議棧就不能不講一講IP路由的問題梁只,因?yàn)樵谖覀兪褂玫木W(wǎng)絡(luò)通信中幾乎每時(shí)每刻都在發(fā)生著IP路由的事件……。當(dāng)你在網(wǎng)絡(luò)世界中還是一位新手的時(shí)候,你也許認(rèn)為設(shè)備之間實(shí)現(xiàn)IP路由所需的僅僅是一臺(tái)設(shè)備的IP地址而已门坷,如果你真的這樣認(rèn)為那就錯(cuò)了讶坯。每臺(tái)設(shè)備在進(jìn)行IP路由的時(shí)候除了必需的IP地址外還需要很多其他信息來完成數(shù)據(jù)的封裝番电!我將通過以下網(wǎng)絡(luò)場(chǎng)景提供的案例一步一步地來分析設(shè)備在進(jìn)行IP路由時(shí)將會(huì)發(fā)生哪些通信事件。
在這個(gè)場(chǎng)景中有兩個(gè)網(wǎng)絡(luò),這兩個(gè)網(wǎng)絡(luò)通過一臺(tái)具有兩個(gè)以太網(wǎng)接口(F0/0漱办,F(xiàn)0/1)的路由器連接在一起这刷。路由器的這兩個(gè)端口和你自己電腦上的RJ-45型號(hào)的網(wǎng)卡端口是一樣的,都是內(nèi)建在路由器中的∶渚現(xiàn)在我們來看一看當(dāng)位于網(wǎng)絡(luò)A的主機(jī)A想要和位于網(wǎng)絡(luò)B的主機(jī)B進(jìn)行通信時(shí)都發(fā)生了什么暇屋?
主機(jī)A打開命令提示符(具體方法:開始——運(yùn)行——cmd),命令提示符(>)后輸入ping 1.1.1.5 當(dāng)“ping”這個(gè)指令被計(jì)算機(jī)執(zhí)行的時(shí)候洞辣,TCP/IP協(xié)議棧會(huì)調(diào)用該協(xié)議椄琅伲互聯(lián)網(wǎng)層的“ICMP”協(xié)議封裝“ping 1.1.1.5”這個(gè)請(qǐng)求。
ICMP協(xié)議封裝如下:
ICMP報(bào)頭 | (主機(jī)A) Ping 1.1.1.5 |
---|
Host A(主機(jī)A)若要將這個(gè)ICMP協(xié)議封裝的請(qǐng)求發(fā)送給目標(biāo)主機(jī)B(Host B)就必須要使用IP協(xié)議來“運(yùn)輸”該請(qǐng)求扬霜。這樣定鸟,IP協(xié)議這個(gè)時(shí)候就充當(dāng)了一個(gè)郵差的角色,將ICMP這個(gè)數(shù)據(jù)包寫上發(fā)送者(主機(jī)A)的IP地址和接收者(主機(jī)B)的IP地址著瓶,然后就可以根據(jù)這個(gè)目標(biāo)地址(主機(jī)B的地址)來“投遞”這個(gè)數(shù)據(jù)包了联予。
IP協(xié)議封裝如下:
IP報(bào)頭 | ICMP報(bào)頭 | (主機(jī)A) Ping 1.1.1.5 |
---|
經(jīng)過IP協(xié)議封裝的數(shù)據(jù)包只是完成了TCP/IP協(xié)議簇網(wǎng)絡(luò)層上的封裝,接下來要完成的是數(shù)據(jù)鏈路層的封裝材原。在進(jìn)行數(shù)據(jù)鏈路層的信息封裝之前主機(jī)A還需啟動(dòng)IP路由進(jìn)程來判斷目標(biāo)主機(jī)B在本地網(wǎng)絡(luò)還是在遠(yuǎn)程網(wǎng)絡(luò)沸久。若主機(jī)B在本地網(wǎng)絡(luò),說明主機(jī)B和主機(jī)A在同一個(gè)邏輯子網(wǎng)中余蟹,也就是同一個(gè)IP網(wǎng)段內(nèi)卷胯。若主機(jī)B在遠(yuǎn)程網(wǎng)絡(luò)則說明主機(jī)B與主機(jī)A不在同一個(gè)網(wǎng)段內(nèi),比如本例中客叉,主機(jī)A位于網(wǎng)絡(luò)A而主機(jī)B位于網(wǎng)絡(luò)B诵竭。顯而易見,在本例的網(wǎng)絡(luò)場(chǎng)景中主機(jī)A會(huì)判斷出主機(jī)B位于遠(yuǎn)程網(wǎng)絡(luò)兼搏。那么問題是主機(jī)A是如何做出判斷的呢卵慰?
首先主機(jī)A將自己的IP地址和子網(wǎng)掩碼作“與運(yùn)算”。所謂與運(yùn)算就是無論是二進(jìn)制的“0”和“1”相與還是二進(jìn)制的“0”和“0”相與佛呻,得出的結(jié)果都為“0”裳朋,而只有二進(jìn)制“1”和“1”相與得出的結(jié)果為“1”。比如本例中吓著,主機(jī)A的IP地址為192.168.0.5鲤嫡,將這個(gè)IP地址轉(zhuǎn)換為二進(jìn)制就是:11000000 10101000 00000000 00000101
主機(jī)A的子網(wǎng)掩碼為255.255.255.0,將該掩碼轉(zhuǎn)換為二進(jìn)制就是:11111111 11111111 11111111 00000000 將主機(jī)A二進(jìn)制形式的IP地址和子網(wǎng)掩碼作“與運(yùn)算”的結(jié)果是: 11000000 10101000 00000000 00000000
為了方便查看將這個(gè)“與運(yùn)算”的結(jié)果再轉(zhuǎn)換為點(diǎn)分十進(jìn)制的數(shù)就是:192.168.0.0
這樣主機(jī)A就通過“與運(yùn)算”完成了IP路由判斷的第一步绑莺。接下來的第二步是將目標(biāo)主機(jī)(主機(jī)B)的IP地址與發(fā)送方(主機(jī)A)的子網(wǎng)掩碼作“與運(yùn)算”暖眼,比如本例中,主機(jī)B的IP地址為1.1.1.5纺裁,將這個(gè)IP地址轉(zhuǎn)換為二進(jìn)制就是:00000001 00000001 00000001 00000101
主機(jī)A的子網(wǎng)掩碼為255.255.255.0將該掩碼轉(zhuǎn)換為二進(jìn)制就是:11111111 11111111 11111111 00000000 將以上兩組二進(jìn)制的數(shù)進(jìn)行“與運(yùn)算”的結(jié)果是:00000001 00000001 00000001 00000000 將這個(gè)“與運(yùn)算”的結(jié)果轉(zhuǎn)換為點(diǎn)分十進(jìn)制的數(shù)就是:1.1.1.0 這樣我們就得到了兩組“與運(yùn)算”的結(jié)果诫肠,分別是:192.168.0.0和1.1.1.0
對(duì)于主機(jī)A來說司澎,經(jīng)過這樣一番“與運(yùn)算”后,如果兩個(gè)“與運(yùn)算”結(jié)果相同栋豫,則說明目標(biāo)主機(jī)B和自己在同一個(gè)網(wǎng)絡(luò)內(nèi)挤安,即目標(biāo)主機(jī)B在本地網(wǎng)絡(luò)。相反地丧鸯,對(duì)于主機(jī)A來說蛤铜,經(jīng)過這樣一番“與運(yùn)算”后,如果兩個(gè)“與運(yùn)算”結(jié)果不同丛肢,則說明目標(biāo)主機(jī)B和自己不在同一個(gè)網(wǎng)絡(luò)內(nèi)围肥,即目標(biāo)主機(jī)B在遠(yuǎn)程網(wǎng)絡(luò)。在本例中蜂怎,很顯然目標(biāo)主機(jī)B對(duì)于發(fā)送方(主機(jī)A)來說在遠(yuǎn)程網(wǎng)絡(luò)——也就是在網(wǎng)絡(luò)B虐先。
主機(jī)A通過以上與目標(biāo)主機(jī)B略顯復(fù)雜的“與運(yùn)算”后,完成了路由判斷的第一步——判斷出了目標(biāo)主機(jī)B在遠(yuǎn)程網(wǎng)絡(luò)派敷。接下來主機(jī)A需要“思考”的是如何才能夠到達(dá)主機(jī)B所在的網(wǎng)絡(luò)?主機(jī)A首先會(huì)查詢自己的路由表撰洗,看在自己的路由表中能否找到去往目標(biāo)網(wǎng)絡(luò)(網(wǎng)絡(luò)B)的路由條目篮愉。為了方便大家理解,我將主機(jī)A的路由表輸出顯示如下:
Active Routes:
Network Destination | Netmask | Gateway | Interface | Metric |
---|---|---|---|---|
127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | 1 |
192.168.0.0 | 255.255.255.0 | 192.168.0.5 | 192.168.0.5 | 10 |
192.168.0.5 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | 10 |
192.168.0.255 | 255.255.255.255 | 192.168.0.5 | 192.168.0.5 | 10 |
224.0.0.0 | 240.0.0.0 | 192.168.0.5 | 192.168.0.5 | 10 |
255.255.255.255 | 255.255.255.255 | 192.168.0.5 | 192.168.0.5 | 1 |
0.0.0.0 | 0.0.0.0 | 192.168.0.1 | 192.168.0.5 | 10 |
Default Gateway: 192.168.0.1
從主機(jī)A路由表的輸出顯示中我們沒有找到與目標(biāo)主機(jī)B所在的網(wǎng)絡(luò)相匹配的具體路由差导,也就是說主機(jī)A沒有到達(dá)1.1.1.0這個(gè)網(wǎng)絡(luò)的路由试躏。但是我們注意到在該路由表的最后一行輸出的是: Default Gateway(默認(rèn)/缺省網(wǎng)關(guān)): 192.168.0.1 路由表最后一行的輸出說明主機(jī)A在沒有找到能夠到達(dá)目標(biāo)網(wǎng)絡(luò)的具體路由的情況下,會(huì)將發(fā)往目標(biāo)網(wǎng)絡(luò)的數(shù)據(jù)包發(fā)送到默認(rèn)/缺省網(wǎng)關(guān)(192.168.0.1)设褐,由這個(gè)默認(rèn)/缺省網(wǎng)關(guān)再將該數(shù)據(jù)包轉(zhuǎn)發(fā)到目標(biāo)網(wǎng)絡(luò)颠蕴。
好了,現(xiàn)在主機(jī)A知道了默認(rèn)網(wǎng)關(guān)(192.168.0.1)是自己的下一跳地址助析,主機(jī)A開始執(zhí)行封裝犀被。封裝信息如下:
目的MAC | 源MAC: | 源IP | 目的IP | ICMP報(bào)頭 | (主機(jī)A) |
---|---|---|---|---|---|
下一跳設(shè)備的MAC | 主機(jī)A的MAC地址 | 192.168.0.5 | 1.1.1.5 | ICMP報(bào)頭 | Ping 1.1.1.5 |
在以上所封裝的尋址信息當(dāng)中,主機(jī)A唯一不知道的就是“下一跳設(shè)備的MAC地址”外冀,這里的“下一跳設(shè)備MAC地址”是指主機(jī)A的默認(rèn)網(wǎng)關(guān)192.168.0.1的F0/0接口的MAC地址寡键。這里容易讓人產(chǎn)生一個(gè)困惑,主機(jī)A的目的IP地址是主機(jī)B雪隧,那么為什么主機(jī)A封裝的鏈路層的目的MAC地址卻是路由器F0/0的MAC地址呢西轩?原因是當(dāng)初人們?cè)谠O(shè)計(jì)數(shù)據(jù)鏈路層時(shí)主要考慮如何解決一條線路上相鄰兩端設(shè)備之間的通信。
從這個(gè)網(wǎng)絡(luò)場(chǎng)景中我們看到主機(jī)A和主機(jī)B從各自所處的物理位置上看并不屬于相鄰的兩臺(tái)設(shè)備(中間隔著一臺(tái)路由器)脑沿。既然主機(jī)B并不是主機(jī)A直接相鄰的設(shè)備藕畔,那么主機(jī)A在數(shù)據(jù)鏈路層封裝的目的MAC地址當(dāng)然就不可能是主機(jī)B了。主機(jī)A通過IP路由的流程判斷和查詢路由表知道要想到達(dá)主機(jī)B就必須將數(shù)據(jù)包發(fā)給路由器A的F0/0接口(F0/0接口也是主機(jī)A到達(dá)主機(jī)B必經(jīng)的直接相鄰的接口)庄拇,因此F0/0的MAC地址就成為主機(jī)A在數(shù)據(jù)鏈路層封裝的目的MAC地址注服。在本例中假如主機(jī)A要給Server A發(fā)送數(shù)據(jù)而不是給主機(jī)B,那么主機(jī)A在數(shù)據(jù)鏈路層封裝的目的MAC地址就是Server A的MAC地址,因?yàn)镾erver A與主機(jī)A是彼此直接相鄰的設(shè)備祠汇。那么對(duì)于主機(jī)A來說它是否知道路由器F0/0接口的MAC地址呢仍秤?主機(jī)A是不知道的。所以接下來主機(jī)A需要做的是如何才能找到F0/0接口的MAC地址以完成數(shù)據(jù)鏈路層的封裝成幀可很。首先主機(jī)A查看自己的ARP緩存表诗力,每臺(tái)主機(jī)/電腦都有這個(gè)ARP緩存表,該緩存表記錄著與自己發(fā)生過通信的所有的直接相鄰設(shè)備或主機(jī)的硬件地址(MAC地址)我抠,ARP緩存表經(jīng)過一段時(shí)間會(huì)自動(dòng)刪除苇本,比如Windows 的動(dòng)態(tài) ARP 緩存條目不超過 10 分鐘就會(huì)被刪除。如果主機(jī)A與路由器之前曾發(fā)生過通信菜拓,主機(jī)A自然能在ARP緩存表中找到路由器F0/0的硬件MAC地址瓣窄,可是如果這是主機(jī)A與路由器的第一次通信,則主機(jī)A會(huì)向網(wǎng)絡(luò)A上發(fā)送發(fā)送ARP廣播請(qǐng)求數(shù)據(jù)包纳鼎,該ARP請(qǐng)求包包含的關(guān)鍵信息如下:
發(fā)送方IP地址(192.168.0.5) | 發(fā)送方MAC地址(主機(jī)A MAC地址) |
---|---|
目的IP地址(192.168.0.1) | 目的MAC地址(000000000000) |
以上ARP請(qǐng)求包中封裝的三項(xiàng)信息都是已知的俺夕,只有“目的MAC地址”這一信息是未知的(全“0”填充)。當(dāng)該ARP請(qǐng)求包發(fā)送到網(wǎng)絡(luò)A上時(shí)贱鄙,網(wǎng)絡(luò)A上的設(shè)備接收該ARP包并查看該ARP包內(nèi)的具體封裝信息劝贸。因?yàn)樵揂RP包中封裝的目的IP地址是192.168.0.1,所以只有具有192.168.0.1這個(gè)IP的接口或設(shè)備才應(yīng)答該ARP查詢請(qǐng)求逗宁,應(yīng)答者會(huì)將自己的硬件MAC地址封裝到這個(gè)ARP應(yīng)答數(shù)據(jù)包中映九。這個(gè)ARP應(yīng)答數(shù)據(jù)包(本例中由路由器F0/0接口發(fā)出ARP應(yīng)答)封裝的關(guān)鍵信息如下:
發(fā)送方IP地址(192.168.0.1) | 發(fā)送方MAC地址(F0/0接口MAC地址) |
---|---|
目的IP地址(192.168.0.5) | 目的MAC地址(主機(jī)A的MAC地址) |
主機(jī)A通過ARP協(xié)議解析出路由器F0/0接口的MAC地址從而完成了數(shù)據(jù)鏈路層的封裝。通過主機(jī)A這個(gè)解析過程大家可以看到主機(jī)A在第一次與默認(rèn)網(wǎng)關(guān)通信時(shí)的確是費(fèi)了一番周折瞎颗,為了找到默認(rèn)網(wǎng)關(guān)F0/0接口的MAC地址也“耽擱”了一些時(shí)間件甥,這也是為什么我們?cè)诘谝淮蝡ing網(wǎng)絡(luò)上某臺(tái)主機(jī)/設(shè)備的時(shí)候通常會(huì)看到第一個(gè)數(shù)據(jù)包會(huì)出現(xiàn)“request timed out!”(請(qǐng)求超時(shí)!)的情況哼拔。最后主機(jī)A完成MAC地址解析后將該幀發(fā)送到網(wǎng)絡(luò)A上引有,該幀的具體封裝如下:
目的MAC | 源MAC | 源IP | 目的IP | ICMP報(bào)頭 | (主機(jī)A) |
---|---|---|---|---|---|
路由器F0/0接口 | 主機(jī)A的MAC地址 | 192.168.0.5 | 1.1.1.5 | ICMP報(bào)頭 | Ping 1.1.1.5 |
因?yàn)樵搸哪康腗AC地址是F0/0的MAC地址,所以只有路由器的F0/0接口接收并處理該數(shù)據(jù)幀管挟。路由器將該幀解封裝并查看網(wǎng)絡(luò)層的封裝信息轿曙,路由器看到該數(shù)據(jù)包網(wǎng)絡(luò)層封裝的目的地址是1.1.1.5。路由器為了將這個(gè)數(shù)據(jù)包轉(zhuǎn)發(fā)到1.1.1.5僻孝,使用前面提到的“與運(yùn)算”的方法進(jìn)行計(jì)算导帝,依據(jù)計(jì)算結(jié)果判斷目標(biāo)地址1.1.1.5對(duì)于路由器自己來說在本地網(wǎng)絡(luò)還是在遠(yuǎn)程網(wǎng)絡(luò)。路由器所做“與運(yùn)算”過程簡(jiǎn)述如下:
路由器的F0/0接口上的IP地址192.168.0.1與F0/0接口的子網(wǎng)掩碼255.255.255.0作“與運(yùn)算”得到“結(jié)果1”穿铆;目標(biāo)地址1.1.1.5與路由器F0/0接口的子網(wǎng)掩碼255.255.255.0作“與運(yùn)算”得到“結(jié)果2”您单;“結(jié)果1”與“結(jié)果2”并不相同,證明目標(biāo)地址1.1.1.5并不處在路由器的F0/0接口所在的網(wǎng)絡(luò)A荞雏。
路由器的另一個(gè)接口F0/1的IP地址1.1.1.1與F0/1接口的子網(wǎng)掩碼255.255.255.0作“與運(yùn)算”得到“結(jié)果3”虐秦;目標(biāo)地址1.1.1.5與F0/1接口上的子網(wǎng)掩碼255.255.255.0作“與運(yùn)算”得到“結(jié)果4”平酿;“結(jié)果3”與“結(jié)果4”相同,證明目標(biāo)地址1.1.1.5處在路由器的F0/1接口所在的網(wǎng)絡(luò)B悦陋。這也就意味著路由器B只需將發(fā)送給1.1.1.5的數(shù)據(jù)包從F0/1接口發(fā)出去就OK了蜈彼。我們將路由器的這種路由稱為直接路由。
路由器得出上述結(jié)論后立刻執(zhí)行封裝俺驶,封裝的具體信息如下:
目的MAC | 源MAC | 源IP地址 | 目的IP地址 | ICMP報(bào)頭 | (主機(jī)A) |
---|---|---|---|---|---|
主機(jī)B的MAC地址 | 路由器F0/1接口 | 192.168.0.5 | 1.1.1.5 | ICMP報(bào)頭 | Ping 1.1.1.5 |
在以上路由器封裝的具體信息中的目的MAC地址是主機(jī)B的MAC地址幸逆。如果路由器在ARP緩存表中并未查到主機(jī)B的硬件MAC地址,則路由器仍然會(huì)像主機(jī)A查詢路由器F0/0接口硬件MAC地址一樣發(fā)送ARP請(qǐng)求來查詢主機(jī)B的MAC地址暮现。關(guān)于路由器對(duì)主機(jī)B 硬件MAC地址的查詢過程在這里就不再重復(fù)了还绘。
這樣主機(jī)B就收到了該數(shù)據(jù)幀,主機(jī)B對(duì)該幀進(jìn)行解封裝看到了網(wǎng)絡(luò)層封裝的目的IP地址栖袋,知道這個(gè)數(shù)據(jù)包的目的地是自己后拍顷,主機(jī)B繼續(xù)對(duì)其拆封裝并查看ICMP報(bào)頭內(nèi)的信息得出結(jié)論:這是一個(gè)請(qǐng)求自己進(jìn)行反饋的數(shù)據(jù)包,需要自己將這條“數(shù)據(jù)包已到達(dá)主機(jī)B”的信息回饋給主機(jī)A塘幅。因此主機(jī)B為了將回饋信息順利送達(dá)主機(jī)A需要經(jīng)過如封裝:
目的MAC | 源MAC | 源IP | 目的IP | ICMP報(bào)頭 | 對(duì)(主機(jī)A) |
---|---|---|---|---|---|
路由器F0/1接口 | 主機(jī)B的MAC地址 | 1.1.1.5 | 192.168.0.5 | ICMP報(bào)頭 | Ping 1.1.1.5的應(yīng)答 |
主機(jī)B在發(fā)送應(yīng)答數(shù)據(jù)包時(shí)封裝的目的MAC地址是路由器F0/1接口的MAC地址昔案,這也是主機(jī)B通過路由判斷和與運(yùn)算得出的結(jié)論,對(duì)于主機(jī)B來說路由器F0/1接口是它的下一跳电媳。
路由器F0/1接口在收到主機(jī)B發(fā)來的數(shù)據(jù)包后為了將其轉(zhuǎn)發(fā)給主機(jī)A再次進(jìn)行封裝爱沟,具體的封裝信息如下:
目的MAC | 源MAC | 源IP | 目的IP | ICMP報(bào)頭 | 對(duì)(主機(jī)A) |
---|---|---|---|---|---|
主機(jī)A的MAC地址 | 路由器F0/0接口 | 1.1.1.5 | 192.168.0.5 | ICMP報(bào)頭 | Ping 1.1.1.5的應(yīng)答 |
從主機(jī)A到路由器再到主機(jī)B執(zhí)行的封裝過程中我們可以看出網(wǎng)絡(luò)層封裝的信息是始終不變的:源IP是192.168.0.5 目的IP是1.1.1.5。始終變化的是一跳一跳的硬件MAC地址匆背。從主機(jī)B到路由器再到主機(jī)A執(zhí)行的封裝過程中我們同樣可以看出網(wǎng)絡(luò)層封裝的信息也是始終不變的:源IP是1.1.1.5目的IP是192.168.0.5。始終變化的還是一跳一跳的硬件MAC地址身冀。