自己动手写路由器之ARP数据包的传输

本文探讨了在自定义路由器实现中ARP数据包的传输和接收原理。通过 ARP 请求广播,目标设备响应并更新高速缓存的过程,解释了如何在两个设备间建立IP与MAC地址的映射。介绍了相关函数接口,并提到了获取网络接口信息的前一篇博客。目前的路由器代码仍在逐步完善中,未来将公开完整代码。
摘要由CSDN通过智能技术生成

在写路由器时,涉及到对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,                             //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值