前言
網(wǎng)絡(luò)設(shè)備有數(shù)據(jù)要發(fā)送給另一臺網(wǎng)絡(luò)設(shè)備時(shí),必須要知道對方的網(wǎng)絡(luò)層地址(即IP地址)拜秧。IP地址由網(wǎng)絡(luò)層來提供差凹,但是僅有IP地址是不夠的尸疆,IP數(shù)據(jù)報(bào)文必須封裝成幀才能通過數(shù)據(jù)鏈路進(jìn)行發(fā)送。數(shù)據(jù)幀必須要包含目的MAC地址硼被,因此發(fā)送端還必須獲取到目的MAC地址示损。通過目的IP地址二獲取的MAC地址的過程是由ARP(Address Resolution Protocol)協(xié)議來實(shí)現(xiàn)的。
數(shù)據(jù)鏈路層在進(jìn)行數(shù)據(jù)封裝的時(shí)候嚷硫,需要目的MAC地址检访。
一臺網(wǎng)絡(luò)設(shè)備要發(fā)送數(shù)據(jù)給另外一臺網(wǎng)絡(luò)設(shè)時(shí)始鱼,必須要知道對方的IP地址。但是脆贵,僅有IP地址是不夠的医清,因?yàn)镮P數(shù)據(jù)報(bào)文必須封裝成幀才能通過數(shù)據(jù)鏈路層進(jìn)行發(fā)送,而數(shù)據(jù)幀必須要包含目的MAC地址卖氨,因此發(fā)送端還必須獲取到目的MAC地址会烙。每一個(gè)網(wǎng)絡(luò)設(shè)備在數(shù)據(jù)封裝前都需要獲取下一跳的MAC地址。IP地址由網(wǎng)絡(luò)層來提供筒捺,MAC地址通過ARP協(xié)議來獲取柏腻。ARP協(xié)議是TCP/IP協(xié)議簇中的重要組成部分,ARP能夠通過目的IP地址發(fā)現(xiàn)目標(biāo)設(shè)備的MAC地址系吭,從而實(shí)現(xiàn)數(shù)據(jù)鏈路層的可達(dá)性五嫂。
ARP數(shù)據(jù)包格式:
關(guān)于ARP協(xié)議屬于2層還是3層的討論:
https://networkengineering.stackexchange.com/questions/5064/on-which-layer-of-the-osi-model-does-the-arp-protocol-belong
這里有句話很好:OSI只是一個(gè)模型,沒有任何一個(gè)協(xié)議是完全屬于哪一層的肯尺。
我們看幀結(jié)構(gòu)贫导,ARP數(shù)據(jù)直接包含在Ethernet_II中,我個(gè)人認(rèn)為它可以歸納于二層蟆盹。
網(wǎng)絡(luò)設(shè)備通過ARP報(bào)文來發(fā)現(xiàn)目的MAC地址孩灯。ARP報(bào)文中包含以下字段:
1)Hardware Type:硬件地址類型,一般為以太網(wǎng)逾滥;
2)Protocol Type:表示三層協(xié)議地址類型峰档,一般為IP;
3)Hardware Length和Protocol Length為MAC地址和IP地址的長度寨昙,單位是字節(jié)讥巡; (這個(gè)理論上可以不要,因?yàn)榍懊嬉呀?jīng)確定了硬件類型和協(xié)議類型)
4)Operation Code指定了ARP報(bào)文的類型舔哪,包括ARP request和ARP reply欢顷;
5)Source Hardware Address 指的是發(fā)送ARP報(bào)文的設(shè)備MAC地址;
6)Source Protocol Address指的是發(fā)送ARP報(bào)文的設(shè)備IP地址捉蚤;
7)Destination Hardware Address指的是接收者M(jìn)AC地址抬驴,在ARP request報(bào)文中,該字段值為0缆巧;
8)Destination Protocol Address指的是接受者的IP地址布持。
ARP工作過程
通過ARP協(xié)議,網(wǎng)絡(luò)設(shè)備可以建立目標(biāo)IP地址和MAC地址之間的映射陕悬。網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)層獲取到目的IP地址之后题暖,還要判斷目的MAC地址是否已知。
ARP緩存
aircrafts-MacBook-Pro:~ ldl$ arp -a
? (10.10.10.1) at bc:67:1c:40:3:f6 on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (224.0.0.252) at 1:0:5e:0:0:fc on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
網(wǎng)絡(luò)設(shè)備一般都有一個(gè)ARP緩存(ARP Cache),ARP緩存用來存放IP地址和MAC地址的關(guān)聯(lián)信息胧卤。在發(fā)送數(shù)據(jù)前唯绍,設(shè)備會先查找ARP緩存表。如果緩存表中存在對方設(shè)備的MAC地址枝誊,則直接采用該MAC地址來封裝幀推捐,然后將幀發(fā)送出去。如果緩存表中不存在相應(yīng)的信息侧啼,則通過發(fā)送ARP request報(bào)文來獲得它牛柒。學(xué)習(xí)到的IP地址和MAC地址的映射關(guān)系會被放入ARP緩存表中存放一段時(shí)間。在有效期內(nèi)痊乾,設(shè)備可以直接從這個(gè)表中查找目的MAC地址來進(jìn)行數(shù)據(jù)封裝皮壁,而無需進(jìn)行ARP查詢。過了這段有效期哪审,ARP表現(xiàn)會被自動刪除蛾魄。
如果目標(biāo)設(shè)備位于其他網(wǎng)絡(luò)則源設(shè)備會在ARP緩存表中查找網(wǎng)關(guān)的MAC地址,然后將數(shù)據(jù)發(fā)送給網(wǎng)關(guān)湿滓,網(wǎng)關(guān)再把數(shù)據(jù)轉(zhuǎn)發(fā)給目的設(shè)備滴须。
ARP 請求
在本例中,主機(jī)A的ARP緩存表中不存在主機(jī)C的MAC地址叽奥,所以主機(jī)A會發(fā)送ARP Request來獲取目的MAC扔水。ARP request報(bào)文封裝在以太幀中。幀頭中的源MAC地址為發(fā)送端主機(jī)A的MAC地址朝氓。此時(shí)魔市,由于主機(jī)A不知道主機(jī)C的MAC地址,所以目的MAC地址為廣播地址FF-FF-FF-FF-FF-FF
赵哲。ARP request 報(bào)文中包含源IP地址待德,目的IP地址,源MAC地址枫夺,目的MAC地址将宪,其中目的MAC地址的值為0。ARP request報(bào)文會在整個(gè)網(wǎng)絡(luò)上傳播橡庞,該網(wǎng)絡(luò)中所有主機(jī)包括網(wǎng)關(guān)都會接受到此ARP request 報(bào)文较坛。網(wǎng)關(guān)會阻止該報(bào)文發(fā)送到其他網(wǎng)絡(luò)上。
FF-FF-FF-FF-FF-FF:MAC廣播地址毙死,不是燒錄在MAC設(shè)備中燎潮,而是一個(gè)約定好的地址,在發(fā)送的時(shí)候扼倘,目的地址寫它,就是MAC廣播消息。
ARP響應(yīng)
所有主機(jī)接收到該ARP request報(bào)文后再菊,會檢查它的目的協(xié)議地址(一般是00-00-00-00-00-00-00
與所有的匹配)字段與自身的IP地址是否匹配爪喘。如果不匹配,則該主機(jī)將不會響應(yīng)該ARP request報(bào)文纠拔。如果匹配秉剑,則該主機(jī)會將ARP報(bào)文中的源MAC地址和源IP地址信息記錄到自己的ARP緩存表中,然后通過ARP Reply報(bào)文進(jìn)行響應(yīng)稠诲。
主機(jī)C會向主機(jī)A回應(yīng)ARP Reply報(bào)文侦鹏。ARP Reply
報(bào)文中的源協(xié)議地址是主機(jī)C自己的IP地址,目標(biāo)協(xié)議地址是主機(jī)A的IP地址臀叙,同事Operation Code被設(shè)置為reply略水。ARP Reply報(bào)文通過單播傳送。
ARP緩存
主機(jī)A收到ARP Reply以后劝萤,會檢查ARP報(bào)文中目的MAC地址是否與自己的MAC匹配渊涝。如果匹配,ARP報(bào)文中的源MAC地址和源IP地址會被記錄到主機(jī)A的ARP緩存表中床嫌。ARP表項(xiàng)的老化超時(shí)時(shí)間缺省為1200秒(20min)跨释。
ARP代理
位于不同網(wǎng)絡(luò)的網(wǎng)絡(luò)設(shè)備在不配置網(wǎng)關(guān)的情況下,能夠通過ARP代理實(shí)現(xiàn)相互通信厌处。
在上述例子的組網(wǎng)中鳖谈,主機(jī)A需要與主機(jī)B通信時(shí),目的IP地址與本機(jī)的IP地址位于不同網(wǎng)絡(luò)阔涉,但是由于主機(jī)A未配置網(wǎng)關(guān)蚯姆,所以它會將以廣播形式發(fā)送ARP request報(bào)文,請求主機(jī)B的MAC地址洒敏。但是龄恋,廣播報(bào)文無法被路由器轉(zhuǎn)發(fā),所以主機(jī)B無法收到主機(jī)A的ARP請求報(bào)文凶伙,當(dāng)然也就無法應(yīng)答郭毕。
在路由器上啟用代理ARP功能,就可以解決這個(gè)問題函荣。啟用代理ARP后显押,路由器收到這樣的請求,會查找路由表傻挂,如果存在主機(jī)B的路由表項(xiàng)乘碑,路由器將會使用自己的G0/0/0接口的MAC地址來回應(yīng)該ARP request。主機(jī)A收到ARP reply后金拒,將以路由器的G0/0/0接口MAC地址作為目的MAC地址進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)兽肤。
免費(fèi)ARP
免費(fèi)ARP可以用來探測IP地址是否沖突套腹。
主機(jī)被分配了IP地址或者IP地址發(fā)生變化后,必須立刻檢測其所分配的IP地址在網(wǎng)絡(luò)上是否是唯一的资铡,以避免地址沖突电禀。主機(jī)通過發(fā)送ARP request報(bào)文來進(jìn)行地址沖突檢測。
主機(jī)A將ARP request
廣播報(bào)文中的目的IP地址字段設(shè)置為自己的IP地址笤休,該網(wǎng)絡(luò)中所有主機(jī)包括網(wǎng)關(guān)都會接收到此報(bào)文尖飞。當(dāng)目的IP地址已經(jīng)被某一個(gè)主機(jī)或網(wǎng)關(guān)使用時(shí),該主機(jī)或網(wǎng)關(guān)就會回應(yīng)ARP reply
報(bào)文店雅。通過這種方式政基,主機(jī)A就能探測到IP地址沖突了。
總結(jié):
1.網(wǎng)絡(luò)設(shè)備在什么情況下回發(fā)送ARP request?
源設(shè)備在發(fā)送數(shù)據(jù)給目的設(shè)備前闹啦,會首先查看自身的ARP緩存沮明,查找ARP緩存是否在目的設(shè)備的IP地址和MAC地址的映射。如果存在則直接使用亥揖,如果不存在則會發(fā)送ARP request珊擂。
2.網(wǎng)絡(luò)設(shè)備什么時(shí)候會產(chǎn)生免費(fèi)ARP?
當(dāng)網(wǎng)絡(luò)上的一個(gè)設(shè)備被分配了IP地址或者IP地址發(fā)生變化后费变,可以通過免費(fèi)ARP來檢查IP地址是否沖突摧扇。