当前位置: 首页 > news >正文

PACKET_HOST等宏定义介绍

PACKET_HOST 是 Linux 内核中定义的一个​​常量​​(通常在头文件 <linux/if_packet.h> 中),它表示​​捕获到的网络数据包的目的地是本机​​。

​详细说明:​

  1. ​适用场景​​:

    • 当你使用 ​​AF_PACKET / PF_PACKET 套接字​​(也称为 SOCK_RAW + ETH_P_ALLSOCK_DGRAM)进行​​原始网络链路层数据包捕获​​时,会接触到它。
    • 这种类型的套接字允许你的程序直接接收流经网络接口(网卡)的底层数据包,包括不是发给本机的包(如果你开启了混杂模式)。
  2. ​来源和作用​​:

    • 当你的原始套接字使用 recvfrom(), recvmsg() 等系统调用接收一个数据包时,除了数据内容本身,你还会收到一个地址结构 struct sockaddr_ll
    • 这个 struct sockaddr_ll 结构体有一个非常重要的成员叫做 sll_pkttype
    • sll_pkttype 的值​​就是由 PACKET_HOST, PACKET_BROADCAST, PACKET_MULTICAST, PACKET_OTHERHOST, PACKET_OUTGOING 等常量表示的。
    • sll_pkttype = PACKET_HOST 明确告诉你:这个刚刚捕获到的数据包是发往本机操作系统网络协议栈的!​​ 也就是说,这个包的目标 MAC 地址是本机网卡的 MAC 地址(或者如果接口支持,是配置给该接口的多个 MAC 地址之一)。
  3. ​与其他包类型的区别​​:

    • PACKET_BROADCAST​: 广播包 (目标 MAC 地址为 FF:FF:FF:FF:FF:FF)。
    • PACKET_MULTICAST​: 多播包 (目标 MAC 地址属于多播地址范围)。
    • PACKET_OTHERHOST​: ​​目的地不是本机​​的包。在正常模式下,网卡会过滤掉这类包。​​只有开启了网卡的“混杂模式”(Promiscuous Mode),你的原始套接字才能接收到这种数据包​​。例如,捕获同一局域网中其他主机之间的通信就需要它。
    • PACKET_OUTGOING​: 表示此包​​是由本机发送出去​​的数据包(当套接字设置为捕获所有包 ETH_P_ALL 时可能也会收到本机发出的包)。

​关键总结:​

  • PACKET_HOST​不是配置项,而是捕获包时的一个“标记”或“属性”​​。
  • 它是 struct sockaddr_llsll_pkttype 字段的一个​​可能取值​​。
  • 它的值明确表示:“捕获到的这个数据包​​本来是打算交给本机操作系统协议栈处理的​​”(例如,一个发送给你电脑 IP 地址的 TCP SYN 包,一个 ICMP echo request 包等)。
  • 在编写抓包工具(如 tcpdumpWireshark 的底层)或自定义网络监控/安全程序时,检查 sll_pkttype 的值(特别是与 PACKET_HOST, PACKET_OTHERHOST 的比较)是理解捕获包流的关键。

​通俗比喻:​

想象一个繁忙的邮局分拣中心:

  • PACKET_HOST​: 信件上写着你的名字和地址,是寄给你的。
  • PACKET_BROADCAST: 信件上写着“此片区所有居民收”,是广播通知。
  • PACKET_MULTICAST: 信件上写着“某兴趣小组成员收”,是多播通知。
  • PACKET_OTHERHOST: 信件上写的是别人的名字地址,你本不该看到,但邮局工作人员(在特殊模式下)也让你看了。

​在代码中如何识别:​

#include <sys/socket.h>
#include <linux/if_packet.h>
#include <net/ethernet.h> // 或 netinet/if_ether.h
// ... 其他头文件 ...int sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // 创建原始套接字
// ... 绑定到接口等操作 ...struct sockaddr_ll sll;
socklen_t sll_len = sizeof(sll);
unsigned char buffer[1500]; // 常见 MTU 大小的缓冲区// 接收数据包
ssize_t packet_size = recvfrom(sock, buffer, sizeof(buffer), 0,(struct sockaddr*)&sll, &sll_len);if (packet_size > 0) {// 检查包的“类型属性” sll_pkttypeswitch(sll.sll_pkttype) {case PACKET_HOST:printf("捕获到一个本机接收包!\n");// ... 处理目的地址是本机的包 ...break;case PACKET_BROADCAST:printf("捕获到一个广播包!\n");break;case PACKET_MULTICAST:printf("捕获到一个多播包!\n");break;case PACKET_OTHERHOST:printf("捕获到一个目的地是其他主机的包!\n");// ... 处理目的地址不是本机的包 (混杂模式下捕获) ...break;default:printf("捕获到一个未知类型的包 (%d)\n", sll.sll_pkttype);}
}

希望这个详细的中文解释能帮助你清晰理解 PACKET_HOST 的含义和作用!

http://www.dtcms.com/a/292646.html

相关文章:

  • 草稿!Linux网络系统总结!
  • 碰一碰发视频源码搭建:支持OEM
  • 10.Java中的反射
  • 深度学习-全连接神经网络2
  • 使用EasyExcel导出明细数据
  • gpt面试题
  • 【学习路线】Python全栈开发攻略:从编程入门到AI应用实战
  • 深度学习篇---车道线循迹
  • 快速了解pandas库
  • opencv简介(附电子书资料)
  • VS Code 美化插件
  • Java (Spring AI) 实现MCP server实现数据库的智能问答
  • SpringAOP的实现原理和场景
  • 《汇编语言:基于X86处理器》第9章 字符串和数组(2)
  • 服务器租用:网络钓鱼具体是指什么?
  • Linux 内核与底层开发
  • Linux 下分卷压缩与解压缩全指南:ZIP 与 TAR.GZ 实战
  • Python趣味算法:实现任意进制转换算法原理+源码
  • Spring Boot环境搭建与核心原理深度解析
  • 【Dij】P1807 最长路
  • Linux文件——文件系统Ext2(1)_理解硬件
  • js的基本内容:引用、变量、打印、交互、定时器、demo操作
  • 【LeetCode 热题 100】46. 全排列——回溯
  • Windows 编程辅助技能:转到文档
  • 【方案】网页由微应用拼图,微前端
  • 『 C++ 入门到放弃 』- 红黑树
  • 一文详解Java类中的构造器是什么及主要特性
  • 70.爬楼梯
  • ABP VNext 报表:EPPlus DinkToPdf 多格式导出
  • redis秒杀之lua脚本