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

原始套接字Raw Socket

  • 原始套接字(Raw Socket)允许程序直接访问网络层 / 链路层的数据包,可用于自定义协议、抓包、网络分析等场景,需要 root 权限运行
  • 网络层原始套接字:基于 AF_INET,抓包时内核已处理链路层 /header,直接获取 IP 数据包
  • 链路层原始套接字:基于 PF_PACKET,抓包时获取完整的链路层数据包(包含以太网头),可捕获所有协议类型

与普通套接字的区别

类型普通套接字(TCP/UDP)原始套接字(Raw Socket)
操作层级传输层(TCP/UDP),看不到 IP 头、以太网头网络层(IP)/ 链路层(以太网),可直接操作所有协议头
协议处理内核自动封装 / 解析 IP 头、TCP/UDP 头,只处理数据可跳过内核协议处理,手动封装 / 解析所有协议头,甚至自定义
数据可见性只能看到应用层数据(比如 HTTP 报文)能看到完整数据包(以太网头 + IP 头 + TCP/UDP 头 + 数据)
权限要求普通用户即可使用必须 root / 管理员权限(防止滥用)
  • 绕开内核对协议的默认处理,获得对网络数据包的 “完全控制权”

应用场景

  • 网络抓包与协议分析
  • 自定义网络协议 / 修改协议头
  • 网络诊断与工具开发

网络层原始套接字 VS链路层原始套接字

维度网络层原始套接字链路层原始套接字
套接字创建方式socket(AF_INET, SOCK_RAW, IPPROTO_TCP)socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
捕获数据范围仅 IP 层的 TCP 协议数据包(内核过滤非 TCP 包)链路层所有协议包(IP/ARP/LOOPBACK 等),需手动过滤
数据包起始结构直接指向iphdr(IP 头)先指向ether_header
(以太网头),再偏移到 IP 头
IP 头偏移量无(buf 起始即为 IP 头)buf + 14(以太网头固定 14 字节)
核心过滤逻辑无需过滤链路层,内核已限定 IPPROTO_TCP1. 先过滤以太网类型为ETHERTYPE_IP;2. 再过滤 IP 协议为 IPPROTO_TCP
功能侧重点聚焦 TCP 数据解析(含数据段的字符 / 16 进制打印)先识别链路层协议类型,再解析 TCP 头部基础信息
//网络层原始套接字(仅捕获TCP的IP包)intsockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);//链路层原始套接字(捕获所有链路层包)intsockfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
  • ETH_P_ALL:捕获所有以太网帧;若改为 ETH_P_IP,可仅捕获 IP 协议帧,减少过滤逻辑

数据包解析流程

  • 网络层
buf(IP头) → iphdr → 偏移 iph->ihl*4 字节 → tcphdr → 解析TCP数据
  • 链路层
buf(以太网头) → ether_header(过滤ETHERTYPE_IP)→ buf+14 → iphdr(过滤IPPROTO_TCP) → buf+14+iph->ihl*4 → tcphdr

demo

  • 聚焦分析 TCP 数据内容,基于网络层原始套接字,减少链路层解析成本
#include<stdio.h>#include<sys/socket.h>#include<netinet/ether.h>#include<arpa/inet.h>#include<unistd.h>#include<arpa/inet.h>#include<linux/ip.h>#include<linux/tcp.h>#include<sys/ioctl.h>#defineMTU1500intmain(){/* 定义变量 */intsockfd=-1,len,datalen,i;uint8_tbuf[MTU]={},*data;structiphdr*iph;//IP包头structtcphdr*tcph;//TCP包头structwinsizesize;/* 创建一个原始套接字 */if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP))<0){perror("socket");return0;}printf("sockfd = %d\n",sockfd);/* 接收(只接收TCP数据协议)并处理IP数据报 */while(1){/* 接收包含TCP协议的IP数据报 */len=recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);printf("IP数据报长度 = %d\n",len);/* 打印源IP和目的IP */iph=(structiphdr*)buf;printf("源IP:%s",inet_ntoa(*(structin_addr*)&iph->saddr));printf("目的IP%s\n",inet_ntoa(*(structin_addr*)&iph->daddr));/* 打印TCP包头的源端口号和目的端口号 */tcph=(structtcphdr*)(buf+iph->ihl*4);printf("%hu--->",ntohs(tcph->source));printf("%hu\n",ntohs(tcph->dest));/* 打印TCP数据段的长度 */printf("TCP首部长度:%d\n",tcph->doff*4);if(iph->ihl*4+tcph->doff*4<len){data=buf+iph->ihl*4+tcph->doff*4;datalen=len-iph->ihl*4-tcph->doff*4;ioctl(STDIN_FILENO,TIOCGWINSZ,&size);//terminal 结构体for(i=0;i<size.ws_col;i++)//显示一行 =putchar('=');putchar('\n');printf("TCP数据字符:\n");for(i=0;i<size.ws_col;i++)putchar('=');putchar('\n');for(i=0;i<datalen-1;i++){printf("%c",data[i]);}for(i=0;i<size.ws_col;i++)putchar('=');putchar('\n');printf("TCP数据16进制:\n");for(i=0;i<size.ws_col;i++)putchar('=');putchar('\n');for(i=0;i<datalen-1;i++){printf("%x ",data[i]);}putchar('\n');for(i=0;i<size.ws_col;i++)putchar('=');putchar('\n');}}//关闭套接字close(sockfd);return0;}
  • 合链路层全协议分析,可扩展支持 ARP、ICMP 等协议解析,灵活性更高
#include<stdio.h>#include<sys/socket.h>#include<netinet/ether.h>#include<arpa/inet.h>#include<unistd.h>#include<arpa/inet.h>#include<linux/ip.h>#include<linux/tcp.h>#include<net/ethernet.h>#defineMTU1500intmain(){/* 定义变量 */intsockfd,len;uint8_tbuf[MTU]={};uint16_tether_type;structiphdr*iph;//IP包头structtcphdr*tcph;//TCP包头structether_header*eth;/* 创建一个链路层原始套接字 */if((sockfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)))<0){perror("socket");return0;}printf("sockfd = %d\n",sockfd);/* 接收(只接收TCP数据协议)并处理IP数据报 */while(1){/* 接收包含TCP协议的IP数据报 */len=recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);eth=(structether_header*)buf;ether_type=htons(eth->ether_type);switch(ether_type){caseETHERTYPE_IP:printf("IP协议\n");break;caseETHERTYPE_ARP:printf("ARP协议\n");break;caseETHERTYPE_LOOPBACK:printf("loop back\n");break;default:printf("其他协议 %x\n",eth->ether_type);}if(ether_type!=ETHERTYPE_IP)continue;/* 打印源IP和目的IP */iph=(structiphdr*)(buf+14);if(iph->protocol!=IPPROTO_TCP)continue;printf("源IP:%s\n",inet_ntoa(*(structin_addr*)&iph->saddr));printf("目的IP%s\n",inet_ntoa(*(structin_addr*)&iph->daddr));/* 打印TCP包头的源端口号和目的端口号 */tcph=(structtcphdr*)(buf+14+iph->ihl*4);printf("%hu--->",ntohs(tcph->source));printf("%hu\n",ntohs(tcph->dest));/* 打印TCP数据段的长度 */printf("TCP首部长度:%d\n",tcph->doff*4);}//关闭套接字close(sockfd);return0;}
http://www.jsqmd.com/news/401601/

相关文章:

  • GLM-4-9B-Chat-1M开源大模型指南:vLLM与HuggingFace TGI部署差异对比
  • Java智能客服系统实现指南:从架构设计到核心算法解析
  • CosyVoice 3.0 本地化部署效率优化实战:从容器编排到 GPU 资源调度
  • 套接字属性的获取与设置
  • 导师推荐!风靡全网的AI论文平台 —— 千笔·专业论文写作工具
  • AI写教材技巧大揭秘,低查重方法让教材生成不再困难!
  • 广播与组播
  • 基于Agent实现智能客服:从架构设计到生产环境避坑指南
  • Agent实习模拟面试之vLLM:大模型推理加速的核心引擎与工程实践
  • 学长亲荐!一键生成论文工具,千笔AI VS 灵感ai
  • ChatTTS 对接实战:从零构建高可靠语音合成服务
  • 定稿前必看!千笔,抢手爆款的AI论文工具
  • ChatTTS案例实战:如何通过语音合成技术提升客服系统效率
  • Agent实习模拟面试之NL2SQL:从零构建自然语言到SQL的智能桥梁
  • Agent实习模拟面试之Benchmark:如何科学评估智能体的真实能力?
  • 深度测评 10个降AIGC软件:专科生降AI率必备工具全对比
  • 基于神经网络的毕设实战:从模型选型到部署落地的完整路径
  • ChatTTS 生产环境部署实战:从零搭建到高可用架构
  • ChatGPT内容转Word的高效实现:Python自动化方案与避坑指南
  • 【信息科学与工程学】【解决方案体系】 第二十篇 互联网行业收入和支出、利润抽成
  • 2026最新!王者级的降AI率工具 —— 千笔·专业降AI率智能体
  • 260219
  • 智能客服在金融领域的应用:从架构设计到生产环境避坑指南
  • n皇后算法
  • 一行代码实现数组去重与排序
  • AI专著撰写新突破!揭秘高效工具,轻松完成学术专著创作
  • 实测对比后AI论文工具,千笔AI VS speedai,研究生写作神器!
  • ChatTTS v3 技术解析:从语音合成原理到生产环境部署实战
  • ChatTTS Colab 实战:如何高效部署与优化语音合成工作流
  • AMD Windows平台下CosyVoice AI辅助开发实战:从环境配置到性能优化