分析TCP/IP協(xié)議棧代碼之ARP(STM32平臺(tái))
1. ARP的簡(jiǎn)介
Address Resolution Protocol-地址解析協(xié)議
ARP為IP地址到對(duì)應(yīng)的硬件地址之間提供動(dòng)態(tài)映射。從邏輯Internet地址到對(duì)應(yīng)的物理硬件地址需要進(jìn)行翻譯。這就是ARP的功能。ARP的功能是在32 bit的IP地址和采用不同網(wǎng)絡(luò)技術(shù)的硬件地址之間提供動(dòng)態(tài)映射。
2. ARP的應(yīng)答流程
任何時(shí)候我們敲入下面這個(gè)形式的命令:
[html]view plaincopy
%ftpbsdi//示例而已
都會(huì)進(jìn)行以下這些步驟。這些步驟的序號(hào)如圖 4 - 2所示。
1) 應(yīng)用程序FTP客戶端調(diào)用函數(shù)gethostbyname(3)把主機(jī)名(bsdi)轉(zhuǎn)換成32 bit的IP地址。這個(gè)函數(shù)在DNS(域名系統(tǒng))中稱作解析器,我們將在第1 4章對(duì)它進(jìn)行介紹。這個(gè)轉(zhuǎn)換過程或者使用DNS,或者在較小網(wǎng)絡(luò)中使用一個(gè)靜態(tài)的主機(jī)文件(/etc/hosts) 。
2) FTP客戶端請(qǐng)求TCP用得到的IP地址建立連接。
3) TCP發(fā)送一個(gè)連接請(qǐng)求分段到遠(yuǎn)端的主機(jī),即用上述 IP地址發(fā)送一份IP數(shù)據(jù)報(bào)(在第1 8章我們將討論完成這個(gè)過程的細(xì)節(jié)) 。
4) 如果目的主機(jī)在本地網(wǎng)絡(luò)上(如以太網(wǎng)、令牌環(huán)網(wǎng)或點(diǎn)對(duì)點(diǎn)鏈接的另一端) ,那么IP數(shù)據(jù)報(bào)可以直接送到目的主機(jī)上。如果目的主機(jī)在一個(gè)遠(yuǎn)程網(wǎng)絡(luò)上,那么就通過 IP選路函數(shù)來確定位于本地網(wǎng)絡(luò)上的下一站路由器地址,并讓它轉(zhuǎn)發(fā) IP數(shù)據(jù)報(bào)。在這兩種情況下,IP數(shù)據(jù)報(bào)都是被送到位于本地網(wǎng)絡(luò)上的一臺(tái)主機(jī)或路由器。
5) 假定是一個(gè)以太網(wǎng),那么發(fā)送端主機(jī)必須把 32 bit的IP地址變換成48 bit的以太網(wǎng)地址。從邏輯Internet地址到對(duì)應(yīng)的物理硬件地址需要進(jìn)行翻譯。這就是 ARP的功能。ARP本來是用于廣播網(wǎng)絡(luò)的,有許多主機(jī)或路由器連在同一個(gè)網(wǎng)絡(luò)上。
6) ARP發(fā)送一份稱作ARP請(qǐng)求的以太網(wǎng)數(shù)據(jù)幀給以太網(wǎng)上的每個(gè)主機(jī)。這個(gè)過程稱作廣播,如圖 4 - 2中的虛線所示。 ARP請(qǐng)求數(shù)據(jù)幀中包含目的主機(jī)的IP地址(主機(jī)名為bsdi) ,其意思是“如果你是這個(gè)IP地址的擁有者,請(qǐng)回答你的硬件地址。 ”
7) 目的主機(jī)的ARP層收到這份廣播報(bào)文后,識(shí)別出這是發(fā)送端在尋問它的 IP地址,于是發(fā)送一個(gè)ARP應(yīng)答。這個(gè)ARP應(yīng)答包含IP地址及對(duì)應(yīng)的硬件地址。
8) 收到ARP應(yīng)答后,使ARP進(jìn)行請(qǐng)求—應(yīng)答交換的IP數(shù)據(jù)報(bào)現(xiàn)在就可以傳送了。
9) 發(fā)送IP數(shù)據(jù)報(bào)到目的主機(jī)。
3. ARP的分組格式
?以太網(wǎng)報(bào)頭中的前兩個(gè)字段是以太網(wǎng)的源地址和目的地址。目的地址為全 1的特殊地址是廣播地址。電纜上的所有以太網(wǎng)接口都要接收廣播的數(shù)據(jù)幀。
?兩個(gè)字節(jié)長(zhǎng)的以太網(wǎng)幀類型表示后面數(shù)據(jù)的類型。對(duì)于 A R P請(qǐng)求或應(yīng)答來說,該字段的值為0 x 0 8 0 6。
?硬件類型字段表示硬件地址的類型。它的值為 1即表示以太網(wǎng)地址。
?協(xié)議類型字段表示要映射的協(xié)議地址類型。它的值為 0 x 0 8 0 0即表示I P地址。它的值與包含I P數(shù)據(jù)報(bào)的以太網(wǎng)數(shù)據(jù)幀中的類型字段的值相同,這是有意設(shè)計(jì)的(參見圖 2 - 1) -忘了截過來了。
?接下來的兩個(gè)1字節(jié)的字段,硬件地址長(zhǎng)度和協(xié)議地址長(zhǎng)度分別指出硬件地址和協(xié)議地址的長(zhǎng)度,以字節(jié)為單位。對(duì)于以太網(wǎng)上I P地址的ARP請(qǐng)求或應(yīng)答來說,它們的值分別為6和4。
?操作字段(op)指出四種操作類型,它們是 ARP請(qǐng)求(值為1) 、ARP應(yīng)答(值為2) 、RARP請(qǐng)求(值為3)和R ARP應(yīng)答(值為4) (我們?cè)诘?章討論RARP) 。這個(gè)字段必需的,因?yàn)锳RP請(qǐng)求和ARP應(yīng)答的幀類型字段值是相同的。
?接下來的四個(gè)字段是發(fā)送端的硬件地址(在本例中是以太網(wǎng)地址) 、發(fā)送端的協(xié)議地址(IP地址) 、目的端的硬件地址和目的端的協(xié)議地址。注意,這里有一些重復(fù)信息:在以太網(wǎng)的數(shù)據(jù)幀報(bào)頭中和ARP請(qǐng)求數(shù)據(jù)幀中都有發(fā)送端的硬件地址。
對(duì)于一個(gè)ARP請(qǐng)求來說,除目的端硬件地址外的所有其他的字段都有填充值。當(dāng)系統(tǒng)收到一份目的端為本機(jī)的 ARP請(qǐng)求報(bào)文后,它就把硬件地址填進(jìn)去,然后用兩個(gè)目的端地址分別替換兩個(gè)發(fā)送端地址,并把操作字段置為 2,最后把它發(fā)送回去。
--------------------------------以上內(nèi)容整理于《TCP/IP協(xié)議詳解:卷1》----------------------------
理是那個(gè)那個(gè)理,但是過于抽象了,不過是基礎(chǔ),看完上面再看實(shí)現(xiàn),那感覺很爽的~~~
------------------------------------------以下內(nèi)容產(chǎn)生于代碼及分析--------------------------------------
4. ARP的宏定義實(shí)現(xiàn)
以太網(wǎng)協(xié)議而非802.3協(xié)議,看ETH命名的頭名字就曉得了,地址位置可以結(jié)合兩個(gè)header算算就出來了
5. ARP的實(shí)現(xiàn)函數(shù)
以太網(wǎng)的header在ARP的header之前,很簡(jiǎn)單的,介紹先。
配置以太網(wǎng)的頭,為14字節(jié):6字節(jié)目的mac地址+6字節(jié)源mac地址+2字節(jié)協(xié)議類型,如圖4-3
展開就是這樣的,看看宏定義是否與此一一對(duì)應(yīng)呢。
在判斷為arp請(qǐng)求之后,填充以太網(wǎng)的頭之后響應(yīng)arp請(qǐng)求
當(dāng)然,響應(yīng)ARP請(qǐng)求的前提是你得確定有人向你發(fā)出ARP請(qǐng)求(下面那個(gè)函數(shù)就是了),并且這個(gè)人是誰,你是要知道的(通過發(fā)送者的IP和MAC地址),這個(gè)很容易,本協(xié)議是將地址放在幾個(gè)全局變量里面的,大家就都知道了,雖然全局變量用起來很爽,但是對(duì)模塊化以及后期維護(hù)帶來的不便也是很大的。
檢查是否為合法的eth,并且只接受發(fā)給本機(jī)的arp數(shù)據(jù),此函數(shù)在上面那個(gè)函數(shù)之前被調(diào)用,再下面的代碼就是演示的例程