龙空技术网

网络编程-基于arp协议的功能讲解和代码实例

L点W 185

前言:

目前朋友们对“功能点技术代码”可能比较着重,同学们都想要分析一些“功能点技术代码”的相关内容。那么小编也在网上汇集了一些对于“功能点技术代码””的相关知识,希望同学们能喜欢,兄弟们快快来学习一下吧!

arp协议

介绍

arp地址解析协议,它的作用是在ipv4地址和底层网络硬件地址之间的转换,提供从网络层地址到相关硬件地址的动态映射。

格式

arp帧的结构

头14个字节是以太网帧,它的前2个字段DST和SRC分别是目的以太网地址和源以太网地址。如果要发送arp包,则目的以太网地址DST必需设置成ff:ff:ff:ff:ff:ff值。Length or Type字段必需是0x0806。

Arp包的第一个字段硬件类型Hard Type必需是1,硬件大小Hard Size大小为6,协议类型Prot Type是ipv4地址值为0x0800,协议长度Prot Size大小是4。操作Op为1代表arp请求,2代表arp响应,3代表rarp请求,4代表rarp响应。接下来的4个字段分别是:Sender’s Hard Address和以太网的帧的Src值一样代表发送者的以太网地址,Sender’s Protocal Address就是发送者的ipv4地址,Traget Hard Address目标以太网地址,Target Protocal Address目标ipv4地址。因为发送arp就是为了获取目标以太网地址,所以发送arp请求时Traget Hard Address值置为0。为了满足以太网最小帧的长度,在后面增加Pad字段还填充了18个字节。FCS是校验值,可以没有。

代码

完整的arp包定义结构如下,包含有一个以太网帧、一个arp帧,以及18个字节的填充。

arp结构的定义

我们在初始化数据时,定义发送者的ip和以太网地址分别为src_ip和my_mac,目标ip为dst_ip,以太网广播地址为broad_mac,arpp就是要发送的arp包。

arp数据的初始化

因为需要处理链路层的数据收发,所以需要创建一个SOCK_RAW原始套接字。协议族为PF_PACKET,ETH_P_ARP值表示链路层只需要把arp的包传递给我,其它包不需要。

创建原始套接字用于arp

然后,我们就需要bind我们的地址,因为我们只需要接收这个地址的数据。SOCK_RAW原始套接字使用的是标准的物理层地址结构sockaddr_ll。

绑定本地地址

在发送之前,我们必需要先把arp包给组装好,记得在发送之前需要把主机字节序转化成网络字节序。内容就是按照文章开头arp格式据说的值去填写就ok。

组装arp结构

最后,只需要把arp广播包对着broad_etheraddr地址发送出去,等着接收arp响应就好。这里的接收应该创建一个线程来接收,因为你可能在发送之前就收到一个arp包,可能是请求包,也可能是响应包,因为你的链路层一直在接收数据。如果在发送以后收包就可能会丢失一些链路层传递过来的arp包,而且接收也不及时。

arp数据的收发

接收到arp包时,需要判断是不是arp响应包,如果是则输出相应的内容,如果不是则过滤,不处理。

输出mac地址

输出以太网帧信息

输出arp帧信息

总结

arp协议是tcp/ip协议的一个基本协议,目前arp的攻击也很多,其主要方式还是通过arp欺骗,发送假的数据给对方来达到目的。arp还有一些其它功能,例如,寻找自己的ip地址,ip地址冲突检测等等。如果需要了解更多的网络编程知识,请关注我,谢谢。

标签: #功能点技术代码