51單片機(jī)ARP協(xié)議實(shí)現(xiàn)原理
ARP是Address Resolution Protocol的縮寫。中文譯做“地址解析協(xié)議”,本質(zhì)是完成網(wǎng)絡(luò)地址到物理地址的映射。從概念上講就是找到一個(gè)映射方法f,使得“物理地址 = f(網(wǎng)絡(luò)地址)”。物理地址有兩種基本類型:以太網(wǎng)類型和proNET令牌環(huán)網(wǎng)類型,網(wǎng)絡(luò)地址特指IP地址,對(duì)映射方法的要求就是高效。具體到以太網(wǎng),它使用的是動(dòng)態(tài)綁定轉(zhuǎn)換的方法。為什么不直接使用同一種地址,而要這么麻煩呢?因?yàn)門CP/IP網(wǎng)絡(luò)就是為將不同種類計(jì)算機(jī)互聯(lián)而發(fā)明的,它的體系結(jié)構(gòu)是分層的,層和層之間相互獨(dú)立,改變物理層的實(shí)現(xiàn)不會(huì)影響到網(wǎng)絡(luò)層。
32位IP地址到以太網(wǎng)48位物理地址的映射,采用動(dòng)態(tài)綁定轉(zhuǎn)換的方法會(huì)遇到許多細(xì)節(jié)問題,例如:減少廣播,ARP包丟失,物理地址變更(更換網(wǎng)卡)、移動(dòng)(移動(dòng)設(shè)備到另一子網(wǎng))、消失(關(guān)機(jī))等。一般是設(shè)置ARP高速緩存,通過學(xué)習(xí)、老化、更新、溢出算法處理ARP映射表來解決這些問題。其中,學(xué)習(xí)指ARP收到任何指向本節(jié)點(diǎn)IP地址的ARP/IP包,從中提取出地址對(duì),而ARP緩存中無對(duì)應(yīng)項(xiàng)時(shí),由ARP接收部分添加;老化指為每項(xiàng)設(shè)置壽命域,以便代謝掉陳舊的地址映射項(xiàng);更新指ARP提取到新的地址對(duì)時(shí),用其更新緩存里已有的對(duì)應(yīng)項(xiàng);溢出算法指當(dāng)緩存滿時(shí),采取何種方法替換舊有的地址對(duì)兒。
我找到了幾個(gè)TCP/IP源代碼,對(duì)比他們的實(shí)現(xiàn),深感差別巨大,靈活多變。有的代碼未實(shí)現(xiàn)ARP緩存,只用幾個(gè)全局變量記錄源目的IP地址和源目的MAC地址,每次通信前直接操作全局變量,這在使用51單片機(jī),進(jìn)行點(diǎn)對(duì)點(diǎn)通信時(shí)不失為一個(gè)有效的方案;而有的代碼龐大復(fù)雜,細(xì)節(jié)處理精益求精。比如實(shí)現(xiàn)了ARP高速緩存、支持多址節(jié)點(diǎn)、支持網(wǎng)管查看/動(dòng)態(tài)改變ARP相關(guān)參數(shù)、重發(fā)處理、支持IPv6等。我的看法是:ARP的本質(zhì)是地址轉(zhuǎn)換,只要抓住這個(gè)靈魂,設(shè)計(jì)的大方向就把握住了。具體實(shí)現(xiàn)過程各具特色,因人而異,沒有統(tǒng)一要求,有些功能可以不實(shí)現(xiàn),有些優(yōu)點(diǎn)不能兼得,而唯一不變的只有思想。
我參考了幾種已有的IP協(xié)議棧并結(jié)合51單片機(jī)的特點(diǎn),實(shí)現(xiàn)了自己的基于uCOS51的TCP/IP協(xié)議棧方案。它只是一種具體的實(shí)現(xiàn)范例,不同的人有不同的設(shè)計(jì)方法。我保證自己的方案可以正常使用并具有較好的完備性。
------------------------------
|狀態(tài)|壽命ttl|IP地址 |MAC地址| 學(xué)習(xí)
------------------------------
| 0 | FF |X:X:X:X| XXXX | --- 老化
------------------------------
| 0 | FF |X:X:X:X| XXXX | 更新
------------------------------
圖1 ARP緩存表 表滿處理
如圖1所示,ARP緩存表由狀態(tài)、壽命、IP地址、MAC地址4個(gè)字段組成。狀態(tài)字段指示地址對(duì)是否有效(0-空閑 1-占用);壽命字段用于老化操作,初始存入最大值,以后由OS時(shí)間函數(shù)調(diào)用,每秒減1,直至為0清除;IP地址和MAC地址字段保存網(wǎng)絡(luò)地址和物理地址的映射。此處,沒有設(shè)計(jì)發(fā)送數(shù)據(jù)鏈表首指針和重發(fā)記數(shù)字段,我把重發(fā)操作交給上層軟件統(tǒng)一處理,這是本程序的特色。圍繞ARP緩存表,完成了4種操作:學(xué)習(xí)、老化、更新、表滿處理,詳見偽代碼清單。使用OS的Shell命令ls可以查看ARP表的內(nèi)容,但不支持修改,這個(gè)功能對(duì)測(cè)試很有用。(顯示內(nèi)容舉例如圖2所示)
%ls
ARP table:
status TTL IP address MAC address
=================================================
01 78 172.18.92.86 0050BABD4C7E
%
圖2 ARP緩存表顯示內(nèi)容舉例
表滿處理
|
v ARP請(qǐng)求
--------- ----------- ---------->
| | 學(xué)習(xí)/更新 | | - - - - -
老化--->| ARP表 |------------| ARP處理 |
| | | | - - - - - >
--------- ----------- ----------
^ ARP應(yīng)答
|學(xué)習(xí)/更新
---------
| |
| IP_in |
| |
---------
圖3 ARP處理過程
0 8 16 24 31
---------------------------------------------------------------------
| 硬件類型 | 協(xié)議類型 |
---------------------------------------------------------------------
|硬件地址長(zhǎng)度(HLEN)|協(xié)議長(zhǎng)度(PLEN)| 操作 |
---------------------------------------------------------------------
| 發(fā)送方首部(八位組0-3) |
---------------------------------------------------------------------
| 發(fā)送方首部(八位組4-5) | 發(fā)送方IP地址(八位組0-1) |
---------------------------------------------------------------------
| 發(fā)送方IP地址(八位組2-3) | 目標(biāo)首部(八位組0-1) |
---------------------------------------------------------------------
| 目標(biāo)首部(八位組2-5) |
---------------------------------------------------------------------
| 目標(biāo)IP地址(八位組0-3) |
---------------------------------------------------------------------
圖4 ARP包結(jié)構(gòu)
如圖3,整個(gè)ARP處理過程,我主要用5個(gè)函數(shù)實(shí)現(xiàn)。ARP初始化(ARP_init)、ARP請(qǐng)求(ARP_request)、ARP應(yīng)答(ARP_answer)、ARP回應(yīng)處理(ARP_process)、IP包接收預(yù)處理(IP_in)。在實(shí)現(xiàn)網(wǎng)卡驅(qū)動(dòng)程序后,所有ARP處理操作就是填寫ARP包(ARP包結(jié)構(gòu)見圖4),詳見偽代碼清單。
ARP_init完成ARP表初始化,概括說就是ARP表state字段清0。
ARP_request完成ARP請(qǐng)求操作。ARP協(xié)議要求程序根據(jù)子網(wǎng)掩碼判斷IP地址是否屬于同一子網(wǎng),如果在同一子網(wǎng)內(nèi),ARP請(qǐng)求目的MAC地址,否則請(qǐng)求默認(rèn)網(wǎng)關(guān)MAC地址。
ARP_answer比較簡(jiǎn)單,只要交換ARP請(qǐng)求包地址內(nèi)容,填寫自己的MAC地址和很少的改動(dòng)后發(fā)送即可。
ARP_process完成ARP回應(yīng)回來的信息處理。主要進(jìn)行ARP表的學(xué)習(xí)和更新。
IP_in完成IP包接收預(yù)處理,用于提取地址映射信息,以便主動(dòng)學(xué)習(xí)和及時(shí)更新。我的程序不會(huì)主動(dòng)學(xué)習(xí)不是發(fā)給自己IP地址的MAC地址信息,因?yàn)锳RP表在51中的容量有限,只有頻繁用到的地址對(duì)才應(yīng)該存放在里面,否則一旦出現(xiàn)“顛簸”,ARP表就失效了。
有的ARP實(shí)現(xiàn)方案采用數(shù)據(jù)驅(qū)動(dòng)方式,參數(shù)可配置,使用統(tǒng)一的程序,通過加載不同的配置數(shù)據(jù),執(zhí)行不同的操作。這樣做使程序版本統(tǒng)一,不同的應(yīng)用只要加載不同的配置數(shù)據(jù)即可,不用更換程序,有利于后期維護(hù)。但是考慮到51資源緊張和安全性,我的方案只能顯示ARP表不允許修改其內(nèi)容,用戶可發(fā)揮想象力在此處增加新功能。另外,ARP程序應(yīng)該記住上一次發(fā)過的請(qǐng)求,以避免重發(fā),但同樣考慮到資源緊張,也免了。其實(shí)無所謂,重發(fā)就重發(fā)了。表滿處理采用有損性能的加速算法,快速有效。另外,本程序不能直接用于嵌入式網(wǎng)關(guān)產(chǎn)品。
uCOS51操作系統(tǒng)本身提供了良好的內(nèi)存管理功能,我利用它設(shè)置了大中小三種緩沖區(qū)存放不同類型的數(shù)據(jù)包。內(nèi)存使用前申請(qǐng),使用后釋放,有效利用了資源。
系統(tǒng)特點(diǎn)是:1.搶占式優(yōu)先級(jí);2.消息驅(qū)動(dòng);3.串行服務(wù)器模式。
系統(tǒng)優(yōu)點(diǎn)是:1.等待時(shí)不耗費(fèi)CPU資源;2.有超時(shí)保護(hù),不會(huì)死鎖;3.思路清晰易懂。
系統(tǒng)基于中斷驅(qū)動(dòng),使用Int0做網(wǎng)卡中斷輸入口。ISR寄存器只用到4位:OVW 收溢出錯(cuò)/TXE 發(fā)被中斷錯(cuò)/PTX 發(fā)送成功/PRX 接收成功。TCP/IP協(xié)議棧做成任務(wù),脫離內(nèi)核。整體框架如圖5、6、7所示。主程序框架見偽代碼清單(RxSem和TxSem初始化為0)
評(píng)論