ARP协议是什么鬼?这一篇源码分析!

Posted FPGA之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARP协议是什么鬼?这一篇源码分析!相关的知识,希望对你有一定的参考价值。

ARP协议是什么鬼?这一篇源码分析!
差一点

我们就擦肩而过了

有趣

有用

有态度


ARP协议是什么鬼?这一篇源码分析!知识回顾

在前面的文章中,我们已经介绍了以太网卡的封装接口,其中主要是以下几个接口:

  • netdev_init():初始化网卡的ip地址、mac地址和mtu的值
  • netdev_receive():发送以太网帧数据
  • netdev_transmit():发送以太网帧数据

这几个接口是我们封装ARP数据接口的基础,最好还是先搞明白原理。

ARP协议的由来

在上面,我们介绍netdev_receive()函数的时候,已经发现了以太网帧类型主要分两大类型,一种是IP数据帧,另一种是ARP数据帧。也就是说ARP数据帧与IP数据帧同属于网络层的数据帧。如下图:

ARP协议是什么鬼?这一篇源码分析!

IP数据帧我们知道,是用来传输用户数据的。哪ARP数据帧有什么用呢?

ARP报文组织结构

ARP数据帧位于以太网数据帧的上一层,我们先来了解一下它的报文结构,如下图:

ARP协议是什么鬼?这一篇源码分析!

我们来详解学习一下,里面每个字段所代表的具体含义;

  • 硬件协议:发送方想要知道的硬件接口类型,对于以太网接口来说,该值为1

  • OP:表示ARP数据包的具体类型,1为ARP请求,2为ARP应答

剩余四个字段的具体含义非常简单易懂,就不罗列出来讲解了。

了解ARP报文组织结构之后,下一步,自然就是用c语言结构体来构造这个ARP报文组织,level-ip的ARP报文组织结构体保存在includeethernet.h文件中,如下图:

ARP协议是什么鬼?这一篇源码分析!

这两个结构体的成员变量,与我们刚才介绍的ARP报文的每个字段是一一对应的,这里不再重复解析。

ARP请求发送接口

如下图:

ARP协议是什么鬼?这一篇源码分析!
  • 第8行,动态申请一个sk_buff来继续发送数据的存储。

  • 第12行,选择使用哪个网卡来继续数据帧的发送

  • 第13行,在sk_buff中,向前移动arp_ipv4结构体大小的位置,把得到的指针赋值给payload指针

  • 第18行,在sk_buff中,向前移动arp_hdr结构体大小的位置,把得到的指针赋值给arp指针

  • 第19~29行,初始化ARP报文的硬件协议、协议类型、报文类型等等,htons()函数为进行数据的大小端切换。到这里ARP报文就初始化好了

  • 第31行,调用netdev_transmit()函数,进一步构建以太网数据帧发送

ARP数据读取接口

ARP数据接收接口为arp_rcv()函数。该函数在以太网数据帧读取接口netdev_receive()函数中调用。我们来了解一下这个函数,如下图:

ARP协议是什么鬼?这一篇源码分析!
ARP协议是什么鬼?这一篇源码分析!
  • 第8行,从读取到的数据中获取arp数据帧

  • 第10~12行,获取arp数据帧中的硬件类型、协议类型、报文类型

  • 第30行,继续arp缓存表数据的更新

  • 第32行,判断该arp数据帧,是不是发送给本机的

  • 第42行,判断ARP数据帧的报文类型

  • 第43、44行,如果报文类型为ARP请求帧,那么调用arp_reply()函数进行ARP应答帧的发送

ARP应答帧发送接口

在上面我们介绍ARP数据读取接口时,当我们如果接收到了ARP请求帧,那么我们要调用arp_reply()函数进行ARP应答帧的发送,我们来学习一下这个函数。

如下图:

ARP协议是什么鬼?这一篇源码分析!
  • 第6行,获取arp报文的数据

  • 第8行,使用skb_reserve()函数来调整sk_buff中数据指针的位置,表示以太网首部和ARP报文的数据都还没有填充

  • 第9行,使用skb_push()函数,参数为ARP_HDR_LEN + ARP_DATA_LEN,表示填充了ARP报文

  • 第11~28行,将该ARP请求数据包的源主机信息和目的主机信息交换位置,并把操作字段op置为2

  • 第30行,选择发送网卡

  • 第32行,调用netdev_transmit()函数,进一步构建以太网数据帧发送

总结

通过我们这边文章,我们已经明白了ARP协议的报文结构、ARP数据包的发送、ARP数据包的接收处理等等。知道了ARP协议在TCP协议栈中的重要地位。不过文中对ARP缓存表没有做深入介绍,这是因为该知识点比较基础,主要是对链表的插入、删除等操作。

ARP协议是什么鬼?这一篇源码分析!

END

加油!

ARP协议是什么鬼?这一篇源码分析! 交易担保 FPGA芯城 XILINX ALTERA 自营电商平台


ARP协议是什么鬼?这一篇源码分析!


ARP协议是什么鬼?这一篇源码分析!

全国第一大FPGA微信技术群

欢迎大家加入全国FPGA微信技术群,这个群体拥有数万工程师、一群热爱技术的工程师,这里的FPGA工程师相互帮助,相互分享,技术氛围浓厚!赶紧叫上小伙伴一起加入吧!


ARP协议是什么鬼?这一篇源码分析!

用手指按住就可以加入FPGA全国技术群哦





FPGA之家元器件芯城


优势元器件服务,有需求请扫码联系群主:金娟 邮箱:293580331@qq.com 欢迎推荐给采购


ACTEL、AD部分优势订货(经营全系列):


ARP协议是什么鬼?这一篇源码分析!

XILINX、ALTERA优势现货或订货(经营全系列):


(以上器件为部分型号,更多型号请咨询群主金娟)


服务理念:FPGA之家元器件自营芯城,旨在方便工程师快速方便购买器件服务,经过数年竭诚服务,我们的客服遍布国内大型上市公司、军工科研单位、中小企业、最大的优势是强调服务至上的理念、并且做到快速交货、价格优惠!


直营品牌:Xilinx ALTERA ADI TI NXP ST E2V、镁光 等百余元器件品牌,尤其擅长欧美对华禁运器件,欢迎工程师朋友把我们推荐给采购或者亲自咨询我们!我们将一如既往提供业内最佳服务!






FPGA技术群官方鸣谢品牌:Xilinx、 intel(Altera)、microsemi(,Actel)、LattIC e,Vantis,Quicklogic,Lucent等


以上是关于ARP协议是什么鬼?这一篇源码分析!的主要内容,如果未能解决你的问题,请参考以下文章

linux网络协议栈源码分析 - 链路层ARP地址解析协议

Volley源码看这一篇就够了

Volley源码看这一篇就够了

RxJava的map操作符源码分析

从NEO源码分析看DBFT共识协议

Matrix源码分析之第一篇