手写TCP/IP协议栈——无回报ARP包生成

理论部分

如果局域网范围内每一个人都要找张三,就都需要广播一遍,浪费网络性能

不妨设定:主机启用网卡的时候,自动在网络上广播自己的IP地址&&MAC地址,表示我已经上线了,方便网络当中的其他主机能感知到你的存在

网卡上线的广播包设置为无回报的ARP包

这里通过一个比较巧妙的手法

以太网的dst mac填写的是广播包,protocol为ARP,表示交给ARP协议处理

在ARP协议中,发送方和接收方的IP地址都填写的自己的

这样设计可以保证广播范围内的主机都能收到,同时无需做出回应。只需要根据ARP协议要求来提取出来请求主机的 IP <-> ARP 的映射关系,就ok了

对于这种数据包,我们称之为无回报的ARP包

代码实现部分

xnet_tinny.h

arp数据包结构体定义

结合wireshark抓包软件/RFC文档可以看到arp包的具体结构字段,注意这部分内容需要夹在#pragma pack()中间,因为需要解析具体字段

cpp 复制代码
#define XNET_CFG_NETIF_IP			{192, 168, 254, 2}

#define XARP_HW_ETHER 0x1         //以太网
#define XARP_REQUEST  0x1         //ARP请求包
#define XARP_REPLY    0x2         //ARP响应包

typedef struct _xarp_packet_t
{
	uint16_t hw_type, pro_type;
	uint8_t hw_len, pro_len;
	uint16_t opcode;
	uint8_t sender_mac[XNET_MAC_ADDR_SIZE];
	uint8_t sender_ip[XNET_IPV4_ADDR_SIZE];
	uint8_t target_mac[XNET_MAC_ADDR_SIZE];
	uint8_t target_ip[XNET_IPV4_ADDR_SIZE];
}xarp_packet_t;

xnet_tinny.c

cpp 复制代码
static const xipaddr_t netif_ipaddr = XNET_CFG_NETIF_IP;
static const uint8_t ether_broadcast[] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };

int xarp_make_request(const xipaddr_t* ipaddr)
{
	xarp_packet_t* arp_packet;
	xnet_packet_t* packet = xnet_alloc_for_send(sizeof(xarp_packet_t));

	arp_packet = (xarp_packet_t*)packet->data;
	arp_packet->hw_type = swap_order16(XARP_HW_ETHER);
	arp_packet->pro_type = swap_order16(XNET_PROTOCOL_IP);
	arp_packet->hw_len = XNET_MAC_ADDR_SIZE;
	arp_packet->pro_len = XNET_IPV4_ADDR_SIZE;
	memcpy(arp_packet->sender_mac, netif_mac, XNET_MAC_ADDR_SIZE);
	memcpy(arp_packet->sender_ip, netif_ipaddr.array, XNET_IPV4_ADDR_SIZE);
	memset(arp_packet->target_mac, 0, XNET_MAC_ADDR_SIZE);
	memcpy(arp_packet->target_ip, ipaddr->array, XNET_IPV4_ADDR_SIZE);
	return ethernet_out_to(XNET_PROTOCOL_ARP, ether_broadcast, packet);
}

static xnet_err_t ethernet_init(void)
{
	xnet_err_t err = xnet_driver_open(netif_mac);
	if (err < 0)
		return err;

	return xarp_make_request(&netif_ipaddr);
}

测试部分

使用wireshark抓包,全速运行xnet软件,得到无回报ARP包

ok,今天的你就到此为止吧,明天还要接着🐺啊!

相关推荐
闻缺陷则喜何志丹10 分钟前
【动态规划】P10726 [GESP202406 八级] 空间跳跃|普及+
c++·算法·动态规划·洛谷
zyf10441623 分钟前
暑期实践日志 Day48:复盘大纲与知识点对照表,系统汇总整理成果
学习·计算机网络·剪辑·暑期实践·课题任务
Chester_199930 分钟前
CSP202312C.树上搜索
开发语言·数据结构·c++·蓝桥杯·stl
热心网友俣先生2 小时前
2026国赛C题:五年命题规律与预测
java·c语言·前端·数学建模
见叶之秋2 小时前
【C++】String类的使用(含模拟实现)
java·开发语言·c++
wuminyu2 小时前
Linux内核线程调度与虚拟线程调度机制系统级深度剖析
java·linux·c语言·jvm·c++
TechWayfarer2 小时前
做IP归属地查询时总是查不准?IP纯净度检测实战:从“查归属地“到识别“脏IP“的四个维度
服务器·网络·python·tcp/ip·安全·web安全
ocean21033 小时前
2025-2026年计算机网络大厂面试高频问题示例
websocket·计算机网络·秋招·tcp·后端面试·大厂面经·面试真题
xxwxx__4 小时前
深入理解 C++ 继承:从基础语法到底层原理全解析
c++
键盘会跳舞4 小时前
【C++多线程】多线程性能调优:伪共享、缓存行对齐与吞吐优化
c++·多线程·多线程调优