🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了手写TCP/IP的第4节3——ARP输入处理。先检查包的格式,不管接收的是请求包还是响应包,都保存其中的源MAC、MAC地址更新ARP表项,以方便后续的通信🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
🔥 手写底层系列
🔥 手写TCP/IP系列
【OSI与课程讲解】
🌈章节引出:
前一篇章:
🌈章节速览:
1.课程大纲:
1.1以太网包结构
现在我们开始根据上层协议来接受处理包了,如果是ARP怎么办呢?接下来我们就来处理:
1.2接收及后续流程:
2.具体抓包
3.代码实现
3.1以太网向上层协议发包
/**
* 以太网数据帧输入输出
* @param packet 待处理的包
*/
static void ethernet_in (xnet_packet_t * packet) {
// 至少要比头部数据大
if (packet->size <= sizeof(xether_hdr_t)) {
return;
}
// 往上分解到各个协议处理
xether_hdr_t* hdr = (xether_hdr_t*)packet->data;
switch (swap_order16(hdr->protocol)) {
case XNET_PROTOCOL_ARP:
remove_header(packet, sizeof(xether_hdr_t));
xarp_in(packet);
break;
case XNET_PROTOCOL_IP: {
// 以下代码是从IP包头中提取IP地址,以及从以太网包头中提取mac地址
// 然后用其更新ARP表
xip_hdr_t *iphdr = (xip_hdr_t *) (packet->data + sizeof(xether_hdr_t));
update_arp_entry(iphdr->src_ip, hdr->src);
remove_header(packet, sizeof(xether_hdr_t));
xip_in(packet);
break;
}
}
}
3.2ARP输入处理
先检查包的格式,不管接收的是请求包还是响应包,都保存其中的源MAC、MAC地址更新ARP表项,以方便后续的通信
/**
* ARP输入处理
* @param packet 输入的ARP包
*/
void xarp_in(xnet_packet_t * packet) {
if (packet->size >= sizeof(xarp_packet_t)) {
xarp_packet_t * arp_packet = (xarp_packet_t *) packet->data;
uint16_t opcode = swap_order16(arp_packet->opcode);
// 包的合法性检查
if ((swap_order16(arp_packet->hw_type) != XARP_HW_ETHER) ||
(arp_packet->hw_len != XNET_MAC_ADDR_SIZE) ||
(swap_order16(arp_packet->pro_type) != XNET_PROTOCOL_IP) ||
(arp_packet->pro_len != XNET_IPV4_ADDR_SIZE)
|| ((opcode != XARP_REQUEST) && (opcode != XARP_REPLY))) {
return;
}
// 只处理发给自己的请求或响应包
if (!xipaddr_is_equal_buf(&netif_ipaddr, arp_packet->target_ip)) {
return;
}
// 根据操作码进行不同的处理
switch (swap_order16(arp_packet->opcode)) {
case XARP_REQUEST: // 请求,回送响应
// 在对方机器Ping 自己,然后看wireshark,能看到ARP请求和响应
// 接下来,很可能对方要与自己通信,所以更新一下自己的ARP表
xarp_make_response(arp_packet);
update_arp_entry(arp_packet->sender_ip, arp_packet->sender_mac);
break;
case XARP_REPLY: // 响应,更新自己的表
update_arp_entry(arp_packet->sender_ip, arp_packet->sender_mac);
break;
}
}
}
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈JAVA面试八股文系列专栏 关注走一波💕💕
🌈🌈JAVA基础试题集精讲 关注走一波💕💕
🌈🌈代码随想录精讲200题 关注走一波💕💕
总栏
🌈🌈JAVA基础要夯牢 关注走一波💕💕
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!