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数据包的传输 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729237091a1192023.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论