admin管理员组

文章数量:1636956

在写路由器时,涉及到对ARP数据包的传输和接收!本来我是打算将广播,传输,接收一块儿写完之后再来说这块儿的,但是下午突然就没心思了,明天开始要休息五天,所以决定先把目前写了的部分讲述一下吧!

我们先来看看ARP数据包的结构:

一个ARP数据包为42个字节,前14个字节为以太网首部,后28个字节为ARP请求/应答部分。

在看代码之前,我们首先得弄懂,ARP数据包的传输原理。假设A想B发送一个数据包,A并不知道B在哪里,那么A首先会发一个广播的ARP请求,这个网段上的所有计算机(电脑)都会接收到来自A的ARP请求,由于每台计算机(电脑)都有自己唯一的MAC和IP,那么它会分析目的IP是不是自己的IP,如果不是,网卡会自动丢弃数据包。如果B接收到了,经过分析,目的IP是自己的,于是更新自己的ARP高速缓存,记录下A的IP和MAC。然后B就 会回应A一个ARP应答,就是把A的源IP,源MAC变成现在目的IP,和目的MAC,再带上自己的源IP,源MAC,发送给A。当A机接收到ARP应答后,更新自己的ARP高速缓存,即把arp应答中的B机的源IP,源MAC的映射关系记录在高速缓存中。那么现在A机中有B的MAC和IP,B机中也有A的MAC和IP。arp请求和应答过程就结束了。

先来看看写的两个函数接口吧,详解请看注释:

第一个是ARP数据包的传输:

 1 void sendArp(int sockfd,char *ip)
 2 {
 3     int socketfd = sockfd;
 4     unsigned char sendmsg[46] = 
 5     {
 6         /*前14位是以太网手部,后28位是ARP请求/应答
 7           MAC地址是是由48位组成的地址,为方便起见,通常用12位16进制表示,
 8           前6位16进制数字由IEEE负责统一分发,后6位16进制数字由各厂商自己负责管理。*/
 9         0xff, 0xff, 0xff, 0xff, 0xff, 0xff,     //IEEE制定
10         0x00, 0x0c, 0x29, 0x42, 0xae, 0x53,     //这是我的MAC地址
11         0x08, 0x06,                             //这是ARP的协议号,IEEE制定
12 
13         0x00, 0x01,                             //硬件类型0x0001表示以太网
14         0x08, 0x00,                             //协议类型0x0800表示IP协议
15         0x06, 0x04,                             //

本文标签: 路由器数据包自己动手ARP