- Linux C/C++服務(wù)器開發(fā)實(shí)踐
- 朱文偉 李建英
- 748字
- 2023-08-31 19:54:10
1.4.2 ARP協(xié)議
網(wǎng)絡(luò)上的IP數(shù)據(jù)報(bào)到達(dá)最終目的網(wǎng)絡(luò)后,必須通過MAC地址來找到最終目的主機(jī),而數(shù)據(jù)報(bào)中只有IP地址,為此需要把IP地址轉(zhuǎn)為MAC地址,這個工作就由ARP協(xié)議來完成。ARP協(xié)議是網(wǎng)絡(luò)層中的協(xié)議,用于將IP地址解析為MAC地址。通常,ARP協(xié)議只適用于局域網(wǎng)中。ARP協(xié)議的工作過程如下:
(1)本地主機(jī)在局域網(wǎng)中廣播ARP請求,ARP請求數(shù)據(jù)幀中包含目的主機(jī)的IP地址。這一步所表達(dá)的意思就是“如果你是這個IP地址的擁有者,請回答你的硬件地址。”
(2)目的主機(jī)收到這個廣播報(bào)文后,用ARP協(xié)議解析這份報(bào)文,識別出是詢問其硬件地址,于是發(fā)送ARP應(yīng)答報(bào),里面包含IP地址及其對應(yīng)的硬件地址。
(3)本地主機(jī)收到ARP應(yīng)答后,知道了目的地址的硬件地址,之后的數(shù)據(jù)報(bào)就可以傳送了。同時,會把目的主機(jī)的IP地址和MAC地址保存在本機(jī)的ARP表中,以后通信直接查找此表即可。
在Windows操作系統(tǒng)的命令行下可以使用arp –a命令來查詢本機(jī)ARP緩存列表,如圖1-11所示。另外,可以使用arp -d命令清除ARP緩存表。

圖1-11
ARP協(xié)議通過發(fā)送和接收ARP報(bào)文來獲取物理地址,ARP報(bào)文的格式如圖1-12所示。

圖1-12
結(jié)構(gòu)ether_header定義了以太網(wǎng)幀首部;結(jié)構(gòu)arphdr定義了其后的5個字段,其信息用于在任何類型的介質(zhì)上傳送ARP請求和回答;結(jié)構(gòu)ether_arp除了包含結(jié)構(gòu)arphdr外,還包含源主機(jī)和目的主機(jī)的地址。如果這個報(bào)文格式用C語言表述,代碼如下:
//定義常量 #define EPT_IP 0x0800 /* type: IP */ #define EPT_ARP 0x0806 /* type: ARP */ #define EPT_RARP 0x8035 /* type: RARP */ #define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */ #define ARP_REQUEST 0x0001 /* ARP request */ #define ARP_REPLY 0x0002 /* ARP reply */ //定義以太網(wǎng)首部 typedef struct ehhdr { unsigned char eh_dst[6]; /* destination ethernet addrress */ unsigned char eh_src[6]; /* source ethernet addresss */ unsigned short eh_type; /* ethernet pachet type */ }EHHDR, *PEHHDR; //定義以太網(wǎng)arp字段 typedef struct arphdr { //arp首部 unsigned short arp_hrd; /* format of hardware address */ unsigned short arp_pro; /* format of protocol address */ unsigned char arp_hln; /* length of hardware address */ unsigned char arp_pln; /* length of protocol address */ unsigned short arp_op; /* ARP/RARP operation */ unsigned char arp_sha[6]; /* sender hardware address */ unsigned long arp_spa; /* sender protocol address */ unsigned char arp_tha[6]; /* target hardware address */ unsigned long arp_tpa; /* target protocol address */ }ARPHDR, *PARPHDR;
定義整個ARP報(bào)文,總長度42字節(jié),代碼如下:
typedef struct arpPacket { EHHDR ehhdr; ARPHDR arphdr; } ARPPACKET, *PARPPACKET;
- 面向STEM的Scratch創(chuàng)新課程
- Swift 3 New Features
- TypeScript圖形渲染實(shí)戰(zhàn):基于WebGL的3D架構(gòu)與實(shí)現(xiàn)
- The HTML and CSS Workshop
- C語言程序設(shè)計(jì)教程
- Learning Probabilistic Graphical Models in R
- LabVIEW虛擬儀器入門與測控應(yīng)用100例
- Frank Kane's Taming Big Data with Apache Spark and Python
- Instant PHP Web Scraping
- JavaScript應(yīng)用開發(fā)實(shí)踐指南
- Android應(yīng)用開發(fā)深入學(xué)習(xí)實(shí)錄
- Building Serverless Web Applications
- Python網(wǎng)絡(luò)爬蟲實(shí)例教程(視頻講解版)
- Python GUI Programming Cookbook(Second Edition)
- 面向?qū)ο蟪绦蛟O(shè)計(jì)及C++(第3版)