本章為系列指南的第九章,終結(jié)篇,本章主要來分析一下完整的ARP協(xié)議,并在STM32F4中實(shí)現(xiàn)一個精簡的ARP協(xié)議響應(yīng)流程。
ARP協(xié)議的本質(zhì)是使局域網(wǎng)內(nèi)的其他主機(jī)能夠知道我在哪兒,比如在局域網(wǎng)上有人沖著所有人喊了一句「IP為XXXX的家伙,你在哪兒」,我一聽,XXXX不是我的IP嗎,我得回答他啊,于是我沖著所有人(也可以是單獨(dú)的這個人)喊一句「我在這兒呢,我的MAC是YYYY」,這樣局域網(wǎng)內(nèi)所有用戶,包括交換機(jī)就知道IP為XXXX的家伙MAC地址是YYYY,并且交換機(jī)知道了我連在它的第N個端口上,以后有人要通過交換機(jī)向IP為XXXX的我發(fā)信息,交換機(jī)就把數(shù)據(jù)包發(fā)到N port上去了。沒有上面這套流程,局域網(wǎng)上就沒人知道你是誰,你的IP多少,你的MAC多少,你連在交換機(jī)大佬的第幾個端口上,自然你也收不到任何非廣播包數(shù)據(jù)了。
ARP請求
如果我要向一個之前沒有任何聯(lián)系的主機(jī)主動發(fā)一個數(shù)據(jù)包,一般情況下都會觸發(fā)一個ARP詢問,比如我們上一章《STM32F4+DP83848以太網(wǎng)通信指南第八章:收包流程》中,最后的實(shí)驗(yàn),我打開CMD命令行,輸入了一個指令ping 192.168.1.201,這時候PC的底層設(shè)備(一般是網(wǎng)卡)首先判斷一下自己的緩存中有沒有192.168.1.201這個IP的緩存信息,如果沒有通信記錄或者時間過長失效了,就得在網(wǎng)絡(luò)上廣播一下,找找看當(dāng)前有沒有誰在用192.168.1.201這個IP地址,包內(nèi)容如下:
ff ff ff ff ff ff 00 0e c6 d4 1d d4 08 06 00 01
08 00 06 04 00 01 00 0e c6 d4 1d d4 c0 a8 01 c8
00 00 00 00 00 00 c0 a8 01 C9
WireShark分析以上報文的解析如下圖所示:
ARP響應(yīng)
目標(biāo)主機(jī)的MAC地址為FF FF FF FF FF FF時,交換機(jī)會將此包廣播到所有端口,這時候所有節(jié)點(diǎn)的網(wǎng)卡上都能收到這個廣播包,如果某一節(jié)點(diǎn)的IP地址為192.168.1.201則需要對此包進(jìn)行響應(yīng),判斷依據(jù)為上述包的以下特征:
第一行倒數(shù)第4,第3字節(jié):0806,代表的是ARP協(xié)議
第二行第6字節(jié):01,代表的是ARP請求
第三行最后4字節(jié):c0 a8 01 C9,代表的是192.168.1.1,跟自己寄存器中的值匹配
響應(yīng)數(shù)據(jù)包為以下內(nèi)容:
00 0e c6 d4 1d d4 00 11 0e 0b 03 8a 08 06 00 01
08 00 06 04 00 02 00 11 0e 0b 03 8a c0 a8 01 c9
00 0e c6 d4 1d d4 c0 a8 01 c8 00 00 00 00 00 00
00 00 00 00 00 00 00 00 20 20 20 20
上述中,以下數(shù)據(jù)是動態(tài)變化的:
第一行前6個字節(jié):00 0e c6 d4 1d d4,根據(jù)請求包中的第7-12六個字節(jié)決定,表示目標(biāo)MAC地址
第一行第7-12六個字節(jié):00 11 0e 0b 03 8a,自由設(shè)置的自己的MAC地址
第二行第7-12六個字節(jié):00 11 0e 0b 03 8a,自由設(shè)置的自己的MAC地址
第二行倒數(shù)4個字節(jié):c0 a8 01 c9,自己的IP地址,也就是請求包中所呼喚的IP地址,192.168.1.201
第三行前6個字節(jié):00 0e c6 d4 1d d4,根據(jù)請求包中的第7-12六個字節(jié)決定,表示目標(biāo)MAC地址
第三行第7-10四個字節(jié):c0 a8 01 c8,根據(jù)請求包第二行倒數(shù)四個字節(jié)決定,表示目標(biāo)IP地址
這些信息都可以用WireShark分析出來,WireShark對每一個字節(jié)的含義都有明確的解釋。
編碼實(shí)現(xiàn)
有了特征匹配及填充規(guī)則,配合我們之前的STM32發(fā)包和收包DEMO,我們就可以編程實(shí)現(xiàn)ARP數(shù)據(jù)包的響應(yīng)了。
#define LEN_ARP 42
/* 以下為業(yè)務(wù)邏輯需要用到的全局變量 */
u8 IPAddr[4];
vu8 SystemStatus; /* 系統(tǒng)狀態(tài),bit0:是否需要發(fā)送被動響應(yīng)數(shù)據(jù)包,bit1:是否打開了PNIO開關(guān),bit2:是否需要發(fā)送PNControl request */
vu16 sendLen; /* 發(fā)送包長度 */
u8 sendBuffer[1024]; /* 發(fā)送包BUFFER */
u8 arp_answer[LEN_ARP]={
0,0,0,0,0,0, /* ArpAskerMac */ 0,0,0,0,0,0, /* myMac */ 0x08, 0x06, 0x00, 0x01,
0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 0,0,0,0,0,0, /* myMac */ 0,0,0,0, /* IP address */
0,0,0,0,0,0, /* ArpAskerMac */ 0,0,0,0/* ArpAskerIP */
};
int main() {
SystemStatus = SS_NOTHING;
sendLen = 0;
/* 默認(rèn)調(diào)用SystemInit,系統(tǒng)時鐘168MHz */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //4位搶占,0位響應(yīng)
DelayInit(168); //初始化168MHz
NVIC_SetPriority (SysTick_IRQn, 0); //系統(tǒng)滴答定時器優(yōu)先級最高
DP83848Init(MyMacAddr); //初始化DP83848
while(1) {
if (0x01 == (SystemStatus & 0x01)){
/* 如果需要發(fā)送被動網(wǎng)卡響應(yīng) */
DP83848Send(sendBuffer, sendLen);
sendLen = 0;
SystemStatus = SystemStatus & 0xFE; /* bit0置為0 */
}
}
}
void Pkt_Handle(void) {
FrameTypeDef frame;
__IO ETH_DMADESCTypeDef *DMARxNextDesc;
/* get received frame */
frame = ETH_Get_Received_Frame();
/* Obtain the size of the packet and put it into the "len" variable. */
receiveLen = frame.length;
receiveBuffer = (u8 *)frame.buffer;
if (Match(receiveBuffer, ArpProtocol, 12, 2) && Match(receiveBuffer, IPAddr, 38, 4)){
/* ARP */
//printf("ARP test receivedn");
memcpy(sendBuffer, arp_answer, LEN_ARP);
for (int i = 0; i < 6; i++) {
/* ArpAskerMac */
sendBuffer[i] = receiveBuffer[6 + i];
sendBuffer[32 + i] = receiveBuffer[6 + i];
}
for (int i = 0; i < 4; i++) {
/* ArpAskerIP */
sendBuffer[38 + i] = receiveBuffer[28 + i];
}
sendLen = LEN_ARP;
SystemStatus = (SystemStatus | 0x01); /* 打開網(wǎng)卡被動數(shù)據(jù)發(fā)送開關(guān) */
}
/* Check if frame with multiple DMA buffer segments */
if (DMA_RX_FRAME_infos->Seg_Count > 1) {
DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc;
} else {
DMARxNextDesc = frame.descriptor;
}
/* Set Own bit in Rx descriptors: gives the buffers back to DMA */
for (i = 0; i < DMA_RX_FRAME_infos->Seg_Count; i++) {
DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
}
/* Clear Segment_Count */
DMA_RX_FRAME_infos->Seg_Count = 0;
/* When Rx Buffer unavailable flag is set: clear it and resume reception */
if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET) {
/* Clear RBUS ETHERNET DMA flag */
ETH->DMASR = ETH_DMASR_RBUS;
/* Resume DMA reception */
ETH->DMARPDR = 0;
}
}
編碼的總體思想就是中斷中快進(jìn)快出,用變量來標(biāo)記狀態(tài),主循環(huán)中不斷判斷狀態(tài)并復(fù)位狀態(tài)。
使用這種方式,可以繼續(xù)擴(kuò)展ICMP協(xié)議,實(shí)現(xiàn)PING指令,以及更多按需裁剪的TCP/IP協(xié)議,當(dāng)然擴(kuò)展的協(xié)議越多,這種純粹的if判斷也會越多,以后會細(xì)分各個層,在層次中繼續(xù)if判斷,當(dāng)?shù)搅隧攲討?yīng)用層之后,就只管TCP/UDP協(xié)議了,內(nèi)容一般都是應(yīng)用協(xié)議自己規(guī)劃的比如HTTP,F(xiàn)TP這些協(xié)議,只需要把上層協(xié)議的數(shù)據(jù)結(jié)構(gòu)填充到下層協(xié)議的內(nèi)容區(qū)域就行了。當(dāng)遇到數(shù)據(jù)包比較龐大的時候,還需要分包傳輸,暫時我們沒有用到,LWIP中有相應(yīng)的實(shí)現(xiàn),有需求的話可以去研究。此外,我們實(shí)驗(yàn)中的代碼都是基于數(shù)組進(jìn)行數(shù)據(jù)裝箱拆箱操作的,而網(wǎng)絡(luò)包的協(xié)議是按層次來的,使用數(shù)組不斷的進(jìn)行數(shù)據(jù)的填充是非常消耗性能的,因此在遇到數(shù)據(jù)量比較大,需要實(shí)現(xiàn)的協(xié)議比較多時,仍然建議按照LWIP的思路使用收尾相接的鏈?zhǔn)浇Y(jié)構(gòu)進(jìn)行拆裝箱。
系列總結(jié)
到此我們這個系列就算告一段落了,后面的工業(yè)以太網(wǎng)的協(xié)議的分析和實(shí)現(xiàn)我不方便做公開的教程,也是自己一步一步摸索過來的,目前自己在設(shè)計(jì)PCB板,后期這個工程需要制板貼片并做成最終的工業(yè)產(chǎn)品。
我們來回顧總結(jié)一下這個系列教程,首先我們對STM32F407的時鐘、中斷等相關(guān)知識做了一個梳理,接著我們認(rèn)識了STM32中的MAC,以及跟MAC搭配的PHY,同時還對DMA技術(shù)做了一個粗略的了解。試著初始化相關(guān)的GPIO,使能了MAC,DMA,PHY,這樣一個DP83848Init()函數(shù)就搞定了;再后來我們又完成DP83848Send()函數(shù),能夠發(fā)包了,接著配置了以太網(wǎng)中斷,能夠在Pkt_Handle()函數(shù)中進(jìn)行以太網(wǎng)收包了,以上函數(shù)的編寫,我們都是參考的ethernetif.c文件,它的幾個底層函數(shù)low_level_init、low_level_output、low_level_input給我們提供了重要的線索。最后對TCP/IP協(xié)議棧中的ARP協(xié)議進(jìn)行了分析,并運(yùn)用之前的全部知識,進(jìn)行了ARP響應(yīng)的編碼實(shí)現(xiàn),并對以后其他協(xié)議的擴(kuò)展實(shí)現(xiàn)提出了思路和優(yōu)化建議。
上一篇:STM32開發(fā)筆記56: STM32F407VGT6的解釋
下一篇:STM32開發(fā)筆記54:STM32F4+DP83848以太網(wǎng)通信指南系列(八)
推薦閱讀
史海拾趣
Astro Tool Corp公司深知產(chǎn)品質(zhì)量是企業(yè)生存和發(fā)展的關(guān)鍵。因此,公司始終將質(zhì)量管理放在首位,建立了完善的質(zhì)量管理體系和檢測機(jī)制。通過嚴(yán)格把控原材料采購、生產(chǎn)過程和成品檢測等各個環(huán)節(jié),公司確保了產(chǎn)品的穩(wěn)定性和可靠性。同時,公司還注重品牌建設(shè),通過提升產(chǎn)品附加值和服務(wù)質(zhì)量,不斷增強(qiáng)客戶對公司的信任度和忠誠度。
Circuit Technology Inc(以下簡稱CTI)自創(chuàng)立之初,便致力于電路技術(shù)的研發(fā)與創(chuàng)新。在成立初期,公司憑借其獨(dú)特的電路設(shè)計(jì)技術(shù),成功開發(fā)出一款高效能、低成本的電路板,迅速在行業(yè)內(nèi)嶄露頭角。隨著技術(shù)的不斷完善和市場的逐步認(rèn)可,CTI的產(chǎn)品逐漸占據(jù)了市場份額,公司規(guī)模也逐漸擴(kuò)大。為了進(jìn)一步拓展市場,CTI積極與國內(nèi)外知名企業(yè)合作,共同開發(fā)新產(chǎn)品,不斷提升自身的技術(shù)水平和市場競爭力。
在電子行業(yè)競爭日益激烈的背景下,BB公司深知技術(shù)創(chuàng)新是企業(yè)發(fā)展的核心動力。因此,公司投入大量研發(fā)資金,積極引進(jìn)和培養(yǎng)人才,不斷推動技術(shù)創(chuàng)新。經(jīng)過多年的努力,BB公司在模擬集成電路領(lǐng)域取得了多項(xiàng)重大突破,推出了一系列具有自主知識產(chǎn)權(quán)的創(chuàng)新產(chǎn)品。這些產(chǎn)品不僅提升了BB公司的市場競爭力,也為整個電子行業(yè)的發(fā)展做出了貢獻(xiàn)。
Crouzet公司,這家以生產(chǎn)自控產(chǎn)品為主的跨國公司,于1921年正式成立。創(chuàng)立之初,Crouzet主要專注于自控產(chǎn)品的研發(fā)和生產(chǎn),憑借其卓越的技術(shù)和創(chuàng)新能力,很快在市場中占據(jù)了一席之地。公司逐漸擴(kuò)大生產(chǎn)規(guī)模,提升產(chǎn)品質(zhì)量,贏得了客戶的信賴。
隨著市場競爭的加劇,Crouzet開始注重提供定制化的解決方案,以滿足客戶不斷變化的需求。公司憑借強(qiáng)大的研發(fā)能力和豐富的行業(yè)經(jīng)驗(yàn),能夠根據(jù)客戶的具體需求,提供量身定制的產(chǎn)品和服務(wù)。這種以客戶需求為導(dǎo)向的經(jīng)營理念,使得Crouzet在市場上贏得了更多的客戶和合作伙伴。
自推出第一代產(chǎn)品以來,EnOcean憑借其卓越的性能和獨(dú)特的優(yōu)勢,在歐洲市場上取得了良好的銷售業(yè)績。隨后,隨著公司不斷推出新產(chǎn)品和技術(shù),其產(chǎn)品的應(yīng)用領(lǐng)域也逐漸擴(kuò)大至全球范圍。如今,EnOcean的無線模塊已被全球100多家制造商選中,用于實(shí)現(xiàn)他們的建筑和工業(yè)系統(tǒng)理念。無線組件已經(jīng)在超過20萬棟建筑中使用,為節(jié)能建筑和創(chuàng)新產(chǎn)業(yè)提供了重要支持。
本信息來自合作QQ群:AVR單片機(jī)學(xué)習(xí)與交流群(17727270) 群管理員在壇子里的ID:銅河 要有COM口,有并口。有網(wǎng)口… 查看全部問答∨ |
EP3C120F780是CYCLONE III 中比較大的FPGA,其相關(guān)介紹資料如下圖: 780個管腳,F(xiàn)BGA封裝,工業(yè)溫度(-40 到100度),商業(yè)溫度(0~85度) ES: 工程樣品, LEAD-FREE 表示啥意思? 此外上面也沒有介紹,其等效的邏輯門數(shù)量? 這而也 ...… 查看全部問答∨ |
WINCE USB攝像頭驅(qū)動成功,結(jié)果實(shí)時視頻速度太慢 這是一個大喜又大悲的結(jié)果,前天搞定了6410下USB攝像頭驅(qū)動,可以捕獲320X240 YUV420格式圖像,昨天修改成了實(shí)時視頻流的程序,結(jié)果大失所望,S3C6410的USB HOST是USB1.1協(xié)議的,全速12Mbps,所以我想獲取30FPS的圖像很難呀,實(shí)際測試結(jié)果是160MS一 ...… 查看全部問答∨ |
|
淘寶購物特點(diǎn)是,一次性的,退不了的,所以\"兵者國之大事,不可不察也\" 一句話,挑最近成交多的,而且貨比三家,再有同賣家談好,別發(fā)生不愉快. 我上淘寶買東西主要有以下幾種方式: 一,急 我對急用的東東,不賣不行非買不可的,我貨比三家后,找 ...… 查看全部問答∨ |
據(jù)我的總結(jié)如下: begin-end語句的各句話是順序執(zhí)行的; fork-join語句各句話是并行執(zhí)行的; 阻塞賦值“=”計(jì)算表達(dá)式和賦值一起進(jìn)行; 非阻塞賦值“<=”先計(jì)算表達(dá)式,再在語句塊中統(tǒng)一賦值; 但是,唉,說實(shí)話還是搞得不明不白的??!比如begin- ...… 查看全部問答∨ |
BeagleBone 學(xué)習(xí)筆記03_2012_10_08 開貼說說sqlite移植 1)下載sqlite的源碼,解壓后進(jìn)入文件夾,新建build文件夾 2)可使用../configure -help查看配置的參數(shù)說明項(xiàng) 3)進(jìn)入build文件夾使用命令生成makefile文件:../configure --host=arm-arago-linux-gnueabi --prefix=/hom ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 漏電火災(zāi)報警系統(tǒng)的設(shè)計(jì)與應(yīng)用探討
- 對USB接口進(jìn)行固件設(shè)計(jì)提升視頻傳輸質(zhì)量方案
- 怎樣測試運(yùn)算放大器的輸入失調(diào)電壓?
- TI 電池管理產(chǎn)品可使移動電源開啟高壓智能充電模式
- 手機(jī)芯事:性能與功耗續(xù)航必定矛盾?
- 藍(lán)牙兩大技術(shù)―BR/EDR和Smart的十大重要區(qū)別
- 流量監(jiān)控與WIFI監(jiān)控誰更勝一籌?
- 移動電源當(dāng)中的自動檢測負(fù)載方式講解
- 智能攝像機(jī)或是智能家居破局關(guān)鍵
- 應(yīng)用在物聯(lián)網(wǎng)節(jié)點(diǎn)的SHA和AES解決方案
- 亞馬遜曾考慮開為兒童開發(fā)Alexa的可穿戴設(shè)備Seeker
- 平板電腦和筆記本電腦總收益2021年將增長 17%
- 普渡餐飲智能機(jī)器人“葫蘆”入駐盧家媽媽,助力餐飲業(yè)智慧升級
- 三星電子為大眾汽車供應(yīng)汽車芯片,大力發(fā)展車載芯片業(yè)務(wù)
- 寧德時代西南總部落戶宜賓,打造全球最大動力電池基地
- 聯(lián)發(fā)科3顆7nm芯片正在設(shè)計(jì)中,Helio X 系列下半年重出江湖?
- SEMI:今年半導(dǎo)體續(xù)樂觀,明年產(chǎn)值將挑戰(zhàn)5000億美元
- 臺灣行業(yè)協(xié)會呼吁嚴(yán)審博通收購高通案
- 大陸限排 PCB上游掀漲價潮
- 中芯國際向中芯長電出售上海測試中心業(yè)務(wù),對價2000萬美元