• 大小: 20KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-05
  • 语言: 其他
  • 标签: socket  arp  linux  协议  

资源简介

arp(地址解析协议)实例示范, 含发送和接收,在linux下跑通,带makefile,可用来学习理解arp协议

资源截图

代码片段和文件信息

// arp.cpp : 定义控制台应用程序的入口点。
//

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  /* 需要里面的 glibc 版本号 */
#include 
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include 
#include  /* 链路层(L2)协议 */
#else
#include 
#include 
#include  /* 链路层协议 */
#endif
#include 

/**
以太网的头部结构:
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN];      // destination eth addr
u_int8_t ether_shost[ETH_ALEN];      // source ether addr   
u_int16_t ether_type;                 // packet type ID field
} __attribute__ ((__packed__));
整个以太网的头部包括: 目的地址(6字节),源地址(6字节),类型(2字节),帧内数据(46-1500个字节),CRC校验和(4字节)
#define ETH_ALEN 6 //以太网地址的长度
#define ETH_HALEN 14 //以太网头部的总长度  (6+6+2)
#define ETH_ZLEN 60 //不含CRC校验数据的数据最小长度(46+14)
#define ETH_DATA_LEN 1500  //帧内数据的最大长度
#define ETH_frame_LEN 1514//不含CRC最大以太网长度(1500+14)
ARP头部信息:
struct arphdr{
__be16 ar_hrd;//硬件类型 1-硬件接口为以太网接口
__be16 ar_pro;//协议类型-0x0800高层协议为IP协议 
unsigned char ar_hln;//硬件地址长度-6字节 MAC
unsigned char ar_pln;//协议地址长度-4字节为IP
__be16 ar_op;//ARP操作码-1 ARP请求

}
ARP协议数据结构:
struct ether_arp{
struct arphdr ea_hdr; //ARPfixed-size header(ARP固定大小的报头)
u_char arp_sha[ETHER_ADDR_LEN]; //sender hardware address(发送端硬件地址)
u_char arp_spa[4]; //sender protocol address(发送端协议地址)
u_char arp_tha[ETHER_ADDR_LEN]; // target hardware address(接收端硬件地址)
u_char arp_tpa[4]; //target protocol address(接收端协议地址)
};
#define arp_hrd ea_hdr.ar_hrd
#define arp_pro ea_hdr.ar_pro
#define arp_hln ea_hdr.ar_hln
#define arp_pln ea_hdr.ar_pln
#define arp_op ea_hdr.ar_op

sockaddr_ll为设备无关的物理层地址结构,描述发送端的地址结构

struct sockaddr_ll
{
unsigned short sll_family;  总填 AF_PACKET 
unsigned short sll_protocol; 网络序列的物理层协议号 0x806为ARP协议
int sll_ifindex;  接口编号  eth0对应的编号 
unsigned short sll_hatype; 头部类型 ARPHRD_ETHER为以太网
unsigned char sll_pkttype; 包类型 PACKET_HOST
unsigned char sll_halen;  地址长度  MAC地址长度6字节
unsigned char sll_addr[8];物理地址 MAC地址只用了前面的6字节
};

FF:FF:FF:FF:FF:FF
SOCK_RAW原始套接字的分析:
(1)socket(AF_INETSOCK_RAWIPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP);//发送或接收ip数据包得到原始的IP包
(2)socket(PF_PACKETSOCK_RAWhtons(ETH_P_IP|ETH_P_ARP|ETH_P_RAP|ETH_P_ALL));//发送或接收以太网数据帧
(1)使用第一种套接字类型,能得到发往本机的原始的IP数据包,但不能得到发往非本机的IP数据包,被过滤了,也不能得到从本机发出去的数据包。这类协议可自己组织TCP,ICMP,UDP数据包。
(2)第二种套接字能收到发往本地的MAC帧,也能收到从本机发出去的数据帧(第3个参数为ETH_P_ALL)能接收到非发往本地的MAC数据帧(网卡需要设置为promisc混杂模式)
协议类型:
ETH_P_IP 0X800 只接收发往本机的mac的ip类型的数据帧
ETH_P_ARP 0X806 只接收发往本机的arp类型的数据帧
ETH_P_RARP 0x8035 只接受发往本机的rarp类型的数据帧
ETH_P_ALL 0X3    接收发往本机的MAC所有类型iparprarp数据帧,接收从本机发出去的数据帧,混杂模式打开的情况下,会接收到非发往本地的MAC数据帧
此时设备无关的物理地址使用struct sockaddr_ll
从而得到MAC帧
**/

//发送ARP数据,ARP协议结构+以太网头部
int main(int argc char*argv[]

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1159  2015-01-15 22:27  ReadMe.txt
     目录           0  2017-02-16 15:39  arp-recv\
     文件        2275  2015-01-18 11:17  arp-recv\arp_recv.cpp
     文件         906  2015-01-18 11:28  arp-recv\Makefile
     目录           0  2017-02-16 15:39  arp-send\
     文件        3069  2015-01-20 21:11  arp-send\arp_send.cpp
     文件         906  2015-01-15 23:44  arp-send\Makefile
     文件       15092  2015-01-15 23:18  arp
     文件        8309  2015-01-15 23:18  arp.cpp
     文件         871  2015-01-15 22:27  arp.sln
     文件        4111  2015-01-20 23:58  arp.vcproj
     文件       11071  2015-01-16 00:11  arp_send

评论

共有 条评论