官术网_书友最值得收藏!

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;
主站蜘蛛池模板: 德惠市| 托克逊县| 永安市| 内黄县| 碌曲县| 新干县| 六盘水市| 双城市| 上饶县| 田林县| 合山市| 墨竹工卡县| 富阳市| 错那县| 沿河| 古田县| 阜康市| 西藏| 普安县| 兴义市| 伊通| 洛浦县| 临西县| 黔东| 留坝县| 广元市| 岳阳县| 得荣县| 东源县| 宁国市| 抚顺县| 定州市| 镇江市| 平罗县| 金寨县| 长岛县| 社会| 建始县| 广宗县| 临澧县| 阆中市|