二層封裝與路由器轉(zhuǎn)發(fā)數(shù)據(jù)過程(路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的封裝過程)
二層封裝
為什么需要了解二層封裝呢? 因為在一個路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的時候,除了知道目的地怎么去(有路由),還需要二層的正確封裝,否則就算有路由的話,也無法進行通信。
這是卷一提到過的,雖然沒有像協(xié)議卷一說得那么細,但是,它也說明了,必須獲取數(shù)據(jù)鏈路層的信息才能正常進行封裝,而這個二層的信息通常就是目的mac地址,而提供這個IP對應(yīng)MAC的機制,就通過ARP來完成,并且通過緩存保存下來。而網(wǎng)絡(luò)層,則是通過靜態(tài)或者動態(tài)路由協(xié)議獲取相關(guān)的信息,保存在路由表中,也叫路由選擇信息庫 RIB。
這個拓撲主要介紹ARP和代理ARP在以太網(wǎng)類型中起一個什么作用。IP地址信息如圖上所示
證明一
第一個證明,二層如果沒有獲取到封裝的信息,則數(shù)據(jù)包都不會發(fā)送出去。
根據(jù)這個圖就配置了IP地址,右邊路由有一跳缺省路由,這時候隨便測試一個不存在的地址,查看數(shù)據(jù)包發(fā)送的情況。
在R2上telnet 12.1.1.3,一個不存在的地址 。
沒有響應(yīng)是正常的,但是這個沒響應(yīng),到低是因為找不到二層的封裝,還是應(yīng)用層沒有響應(yīng)呢。 三層信息路由是沒有問題的,因為是直連網(wǎng)段,,那么以太網(wǎng)通信,必須知道對方的MAC地址,而默認情況下,是不知道的,那么就需要一個機制來進行查詢,就是ARP了。
發(fā)送了三個ARP查詢,而網(wǎng)絡(luò)中沒有人進行響應(yīng),所以,二層無法得到封裝(沒有獲取12.1.1.3的MAC地址)則通信失敗。
這時候,我們做一個靜態(tài)ARP綁定,然后在進行telnet,MAC地址可以隨意定義。
其中1.1.1就是表示MAC 0001.0001.0001 可以省略寫的。
發(fā)現(xiàn)了什么? 因為MAC地址有了封裝(就是手工綁定的),它直接發(fā)送TCP連接給12.1.1.3了,發(fā)送了4個SYN的包,因為對方?jīng)]有響應(yīng)SYN+ACK,所以這個TCP會話沒有繼續(xù)進行下去。
結(jié)論: 無論在一個相同網(wǎng)段,還是不同網(wǎng)段的情況下,如果二層的介質(zhì)是以太網(wǎng),那么就必須獲取對方的MAC地址信息,相同網(wǎng)段則是目的地址的MAC地址,不同網(wǎng)段則是路由表中的下一跳 ,一種特殊情況下,就是啟用了代理arp的話,那么也是目的地址,但是MAC則是下一跳。 這也是在當(dāng)前IPV4的網(wǎng)絡(luò)中,ARP是一個非常不安全的協(xié)議,因為很容易就實現(xiàn)攻擊了,只要網(wǎng)關(guān)的MAC被攻擊者以錯誤的MAC告訴當(dāng)前網(wǎng)絡(luò)的設(shè)備,那么整個網(wǎng)絡(luò)就通信不正常了。
證明二
第二個證明:路由器在路由模式和主機模式下,數(shù)據(jù)包是怎么通信的。
還是這個拓撲,在右邊路由器上關(guān)閉路由功能,no ip routing,那么能與 1.1.1.1通信么?
答案是:可以的。
通了是通了,那么它是怎么通的呢
在show arp后,發(fā)現(xiàn)除了有12.1.1.1的MAC地址信息(之前ping過了),還有1.1.1.1對應(yīng)的MAC信息,另外一個重要的信息就是12.1.1.1和1.1.1.1的MAC地址信息都是關(guān)于12.1.1.1的,這是為什么? 這就是所謂的代理ARP和主機模式工作的工程。
主機模式工作:
1、無網(wǎng)關(guān)情況下:當(dāng)沒有網(wǎng)關(guān)的情況下,它會對當(dāng)前網(wǎng)絡(luò)進行ARP查詢,詢問訪問的目的地址的MAC地址信息,如果這個時候,網(wǎng)關(guān)知道怎么去這個目的地址,并且開啟了代理ARP的功能,那么就會回應(yīng)這個ARP響應(yīng),那么回應(yīng)的內(nèi)容就是這個目的地址的MAC地址是自己,這對于PC或者主機路由器來說是不知道的,它就認為這個MAC是對應(yīng)目的主機,每次發(fā)送去往這個目的地址的時候,二層就封裝這個目的MAC,然后發(fā)送出去。
2、有網(wǎng)關(guān)的情況下:當(dāng)有網(wǎng)關(guān)的情況下,它只會詢問網(wǎng)關(guān)的MAC是多少,如果網(wǎng)關(guān)響應(yīng)了后,那么PC或主機路由器,就會把這個數(shù)據(jù)包發(fā)送出去,它不管網(wǎng)關(guān)是否知道怎么去往這個目的地址不。
可以進行證明:1、在沒有網(wǎng)關(guān)的情況下,把R1的代理ARP給關(guān)閉了,默認是打開的,并且把ARP 緩存清掉 shutdown接口,clear arp
不通,因為R1的接口已經(jīng)關(guān)閉了代理ARP了,所以不不會去響應(yīng)這個ARP的Request。
2、設(shè)置網(wǎng)關(guān)為R1的接口,并且發(fā)送一個去往2.2.2.2的telnet的會話,看TCP會話是否會發(fā)出去,如果出去了,就證明之前說的是對的,不管網(wǎng)關(guān)是否知道目的地可達,PC或主機路由器都會發(fā)送。
這時候開始telnet 2.2.2.2
telnet2.2.2.2 ,提示目的不可達,或者網(wǎng)關(guān)和主機是downde
首選,路由器發(fā)送ARP的Request選為12.1.1.1(GW)的MAC地址是多少。R1響應(yīng)這個ARP的請求。緊接著一個TCP會話發(fā)送出去,R1直接回復(fù)一個ICMP的差錯報文,主機不可達。
路由模式下的路由器:
路由模式的數(shù)據(jù)包轉(zhuǎn)發(fā),不跟主機模式一樣,主機模式是只要設(shè)置了網(wǎng)關(guān)或者沒設(shè)置都會發(fā)送arp請求,但是,路由模式的話,先查看路由表,如果路由表中沒有該路由,則不做任何動作。
可以看出,因為路由表沒有去往2.2.2.2的路由信息,所以不采取任何動作,連ARP都沒有發(fā)送。
證明三
第三個證明:兩個不同網(wǎng)段的主機,能否進行通信?
在設(shè)置有GW的情況下,肯定是不可能的,但是,在某種情況下,它卻成為可能,那就是兩個主機都不設(shè)置IP,并且有代理ARP功能。
說明:R1和R2都是關(guān)閉了路由功能的路由器,并且接口開啟了代理ARP功能。IP地址與圖
從R1開始ping 2.2.2.2,并且抓取R1的數(shù)據(jù)包進行分析。
沒看錯,R1與R2可以通信了,仔細看抓包的內(nèi)容,首先R1發(fā)送一個arp的查詢,{how has 2.2.2.2? tell 1.1.1.1}一個詢問2.2.2.2的MAC Request包就發(fā)送出去了,因為R2與R1是直連(鏈路),所以,R2收到了這個ARP 的Request,而且R2是開啟了代理ARP功能的,也就是說只要R2知道2.2.2.2怎么去,就會響應(yīng)這個ARP的請求(這里明顯就是自己),所以第二個訴舉報就是arp的reply{2.2.2.2 is at c0:01:05:04:00:00},那么這時候R1就有R2的mac地址映射了,所以就發(fā)送了數(shù)據(jù)包出去,也就是icmp的echo,這時候R2收到,需要回應(yīng)這個數(shù)據(jù)包,但是,它并不知道對方的MAC是什么,緊接著也發(fā)送了一個ARP的請求過去,詢問1.1.1.1的MAC,R1回復(fù)這個ARP請求。后續(xù),通信就正常了。
注意:如果是正常的ARP詢問,那么只要一方放送ARP請求,另外一份響應(yīng)的時候,還會把請求方的ARP的信息緩存起來。并且在主機模式下的路由器是不能關(guān)閉代理ARP的,就算接口下關(guān)閉了,也一樣會響應(yīng)請求。
其實,不只有代理ARP能實現(xiàn)這個需求,比如在PC的情況下,因為PC沒有代理ARP機制,所以,可以直接把1.1.1.1的網(wǎng)關(guān)設(shè)置為2.2.2.2,2.2.2.2的網(wǎng)關(guān)為1.1.1.1,它一樣能通信,因為它會發(fā)送ARP信息來請求網(wǎng)關(guān)。
注意:并不是所有的操作系統(tǒng)都是能執(zhí)行的,有些是禁止的,之所有說明這個案例,主要是說明ARP在MAC和IP對應(yīng)時候的作用,已經(jīng)二層封裝。