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

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.xdnf.cn/news/16035.html

相关文章:

  • 目标检测系列(六)labelstudio实现自动化标注
  • YOLO-实例分割头
  • 使用vue-pdf-embed发现某些文件不显示内容
  • 能协调控制器的硬件与软件组成及解决方案
  • 16.多生成树MSTP
  • 图论的整合
  • 前端--bom、JQuery
  • 大数据量查询计算引发数据库CPU告警问题复盘
  • WAF 防护与漏洞扫描联动:让安全防御更精准高效
  • python办自动化--读取邮箱中特定的邮件,并下载特定的附件
  • 数据库—修改某字段默认值
  • importlib.import_module() 的用法与实战案例
  • Java值传递和构造函数
  • Java 并发性深度解析
  • C# 基于halcon的视觉工作流-章21-点查找
  • 【前端】ikun-pptx编辑器前瞻问题一: pptx的xml样式, 使用html能100%还原么
  • 【计算机网络 篇】TCP基本认识和TCP三次握手相关问题
  • 基于springboot的医院后台管理系统的设计与实现(源码+论文)
  • 【python数据结构算法篇】python算法
  • Ubuntu 虚拟机配置 与Windows互传文件
  • 零事故网站重构:11步标准化流程与风险管理指南
  • PHICOMM(斐讯)N1盒子 - Armbian25.05(Debian 12)刷入U盘/EMMC
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • Oracle RAC+ADG switchover 切换演练流程
  • 【文献笔记】ARS: Automatic Routing Solver with Large Language Models
  • LabVIEW 2025安装包| 免费免激活版下载| 附图文详细安装教程
  • Tailwind CSS快速上手 Tailwind CSS的安装、配置、使用
  • 使用qt编写上位机程序,出现串口死掉无法接受数据的bug
  • 【windows修复】解决windows10,没有【相机] 功能问题
  • 前端学习 4:一些术语集合