手写TCP/IP协议——实现ping的响应

理论部分

本课程中ICMP主要负责2项任务:检查连通性,差错报告,交换路由器之间的信息通信码

代码实现部分

在xnet_tinny.h中添加ICMP协议

cpp 复制代码
typedef enum _xnet_protocol_t
{
	XNET_PROTOCOL_ARP = 0x0806,
	XNET_PROTOCOL_IP = 0x0800,
	XNET_PROTOCOL_ICMP = 1,
}xnet_protocol_t;

xnet_tinny.c中IP协议处理中向上层协议交付可添加ICMP协议的处理部分

cpp 复制代码
#define xipaddr_from_buf(dest,buf) ((dest)->addr = *(uint32_t*)(buf))


switch (iphdr->protocol)
	{
	case XNET_PROTOCOL_ICMP:
		remove_header(packet, header_size);
		ximcp_in(&src_ip, packet);
	default:
		break;
	}

接下来实现xicmp_in函数

铺垫工作:

cpp 复制代码
void xicmp_init(void);
void xicmp_in(xipaddr_t* src_ip, xnet_packet_t* packet);
cpp 复制代码
void xnet_init(void)
{
	ethernet_init();
	xarp_init();
	xip_init();
	xicmp_init();
}

ICMP数据包格式

cpp 复制代码
typedef struct _xicmp_hdr_t
{
	uint8_t type;
	uint8_t code;
	uint16_t checksum;
	uint16_t id;
	uint16_t seq;
}xicmp_hdr_t;
cpp 复制代码
#define XICMP_CODE_ECHO_REQUEST  8    //ICMP回显请求
#define XICMP_CODE_ECHO_REPLY    0    //ICMP回显响应

xicmp_in函数实现:

cpp 复制代码
void xicmp_in(xipaddr_t* src_ip, xnet_packet_t* packet)
{
	xicmp_hdr_t* icmphdr = (xicmp_hdr_t*)packet->data;
	
	if ((packet->size >= sizeof(xicmp_hdr_t)) && (icmphdr->type == XICMP_CODE_ECHO_REQUEST))
		reply_icmp_request(icmphdr, src_ip, packet);
}

reply_icmp_request函数实现:

cpp 复制代码
static xnet_err_t reply_icmp_request(xicmp_hdr_t* icmp_hdr, xipaddr_t* src_ip, xnet_packet_t* packet)
{
	xicmp_hdr_t* reply_hdr;
	xnet_packet_t* tx = xnet_alloc_for_send(packet->size);

	reply_hdr = (xicmp_hdr_t*)tx->data;
	reply_hdr->type = XICMP_CODE_ECHO_REPLY;
	reply_hdr->code = 0;
	reply_hdr->id = icmp_hdr->id;
	reply_hdr->seq = icmp_hdr->seq;
	reply_hdr->checksum = 0;
	memcpy(((uint8_t*)reply_hdr) + sizeof(xicmp_hdr_t), ((uint8_t*)icmp_hdr) + sizeof(xicmp_hdr_t),
		packet->size - sizeof(xicmp_hdr_t));
	reply_hdr->checksum = checksum16((uint16_t*)reply_hdr, tx->size, 0, 1);

	return xip_out(XNET_PROTOCOL_ICMP, src_ip, tx);
}

测试部分

相关推荐
2301_780789662 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
2501_915106322 小时前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
情 九2 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
Sakura_j_h_2 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
程序喵大人3 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
星融元asterfusion3 小时前
工业网络升级实战:100G 双轨 Leaf-Spine 架构破解高并发出货网络瓶颈
网络·架构·spine
Da Da 泓3 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
云和数据.ChenGuang4 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
ESDWAN5 小时前
企业网络监控应该监测哪些目标?网关、网络节点还是业务系统?
服务器·网络·php
mennekes5 小时前
临时用电线路标识:插头颜色、钟面标识配套规范
运维·网络·科技·安全·制造