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

ETH和TCP/IP报文协议与网络编程

网络|协议|报文


完整的网络数据报文

一个完整的网络数据包,从以太网帧头开始,包含了所有协议层的数据:

+------------------+------------------+------------------+------------------+
| 以太网帧头       | IP 头            | TCP 头           | TCP 数据         |
| (14/18字节)      | (20-60字节)      | (20-60字节)      | (变长)           |
+------------------+------------------+------------------+------------------+

1. 以太网帧(Ethernet Frame)

标准以太网帧结构(14字节)

 0               6               12              14
+---------------+---------------+---------------+
| 目标MAC地址    | 源MAC地址      | 类型/长度      |
| (6 bytes)     | (6 bytes)     | (2 bytes)     |
+---------------+---------------+---------------+
  • 字节 0-5:目标 MAC 地址
  • 字节 6-11:源 MAC 地址
  • 字节 12-13​:帧类型(EtherType) ← 这就是我们要解析的

为什么用 (packet[12] << 8) + packet[13] ​提取帧类型

因为帧类型字段占用 2 字节,且是大端序(Big-Endian)

packet[12]  = 高字节 (例如 0x08)
packet[13]  = 低字节 (例如 0x00)组合成 16 位整数:
packet_type = (0x08 << 8) + 0x00 = 0x0800

常见的帧类型 EtherType 值

EtherType 含义
0x0800 IPv4
0x0806 ARP
0x86DD IPv6
0x8100 VLAN 标签(802.1Q)

VLAN 帧(18字节)

如果 packet_type == 0x8100​,说明这是一个 ​VLAN 标签帧

 0               6               12      14      16              18
+---------------+---------------+-------+-------+---------------+
| 目标MAC        | 源MAC          | 0x8100| VLAN  | 实际EtherType |
| (6 bytes)     | (6 bytes)     | (2B)  | (2B)  | (2 bytes)     |
+---------------+---------------+-------+-------+---------------+
  • 字节 12-13​:0x8100(VLAN 标记)
  • 字节 14-15:VLAN 标签(优先级 + VLAN ID)
  • 字节 16-17真正的 EtherType(如 0x0800 表示 IPv4)

2. IP 头(IPv4 Header)

IPv4 头结构(最小20字节)

0       8     15 16          31 32                             47
+-------+-------+---------------+-------------------------------+
|Ver|IHL| DSCP  | Total Length  |    Identification             |
48    50 51                  63 64   71 72     79 80            95
+-------+-----------------------+-------------------------------+
|Flags  |Fragment Offset        |  TTL  |Protocol| Header Chksum|
96																127
+---------------------------------------------------------------+
|                Source IP Address (4 bytes)                    |
128																159
+-------------------------------+-------------------------------+
|              Destination IP Address (4 bytes)                 |
160																191
+-------------------------------+-------------------------------+
|                Options (if IHL > 5)                           |
+---------------------------------------------------------------+

关键字段解析

字节 0(版本 Ver + 报文头长度 IHL)

buf_post = 14 # IP 包起始地址,如果带 VLAN 标签则为 18
ip_version = pkt->data[buf_pos] & 0xf0;
ip_header_length = (pkt->data[buf_pos] & 0x0f) * 4;
  • 高 4 位​:版本(IPv4 = 4)
  • 低 4 位IHL(Internet Header Length) ,表示 IP 头长度,单位是 4 字节

字节 9(协议 Protocol 类型)

if (pkt->data[buf_pos + 9] != 0x06) {return -1;  // 不是 TCP
}

常见协议号:

协议号 协议
0x01 ICMP
0x06 TCP
0x11 UDP

字节 2-3(总长度)

ip_total_length = (pkt->data[buf_pos + 2] << 8) | pkt->data[buf_pos + 3];

表示整个 IP 数据包的长度(包括 IP 头 + TCP 头 + TCP 数据)。

字节 12-19(源 IP 和目标 IP)

// 源 IP 地址(4字节)
memcpy(&source_ip, &pkt->data[buf_pos + 12], 4);// 目标 IP 地址(4字节)
memcpy(&dst_ip, &pkt->data[buf_pos + 16], 4);

3. TCP 头(TCP Header)

TCP 头结构(最小20字节)

 0               				16              				32
+-------------------------------+-------------------------------+
|         Source Port           |       Destination Port        |
+-------------------------------+-------------------------------+
|                    valueSequence Number                            |
+-------------------------------+-------------------------------+
|                 Acknowledgment Number                         |
96
+-------+-------+---------------+-------------------------------+
|Offset |Reserv |    Flags      |         Window Size           |
+-------+-------+---------------+-------------------------------+
|         Checksum              |       Urgent Pointer          |
+-------------------------------+-------------------------------+
|                    Options (if Offset > 5)                    |
160																xx
+-------------------------------+-------------------------------+
|						data 									|

关键字段解析

字节 0-3(源端口和目标端口)

// buf_pos 现在指向 TCP 头的起始位置
src_port = (pkt->data[buf_pos] << 8) | pkt->data[buf_pos + 1];
dst_port = (pkt->data[buf_pos + 2] << 8) | pkt->data[buf_pos + 3];// 检查是否是 8000 端口
if (dst_port != 8000 && src_port != 8000) {return -1;
}

字节 12(数据偏移 Data Offset)

tcp_header_length = ((pkt->data[buf_pos + 12] >> 4) & 0x0f) * 4;
  • 高 4 位​:​Data Offset​,表示 TCP 头长度,单位是 4 字节
  • 低 4 位:保留位

示例:

pkt->data[buf_pos + 12] = 0x50右移 4 位: 0x05TCP头长度 = 5 × 4 = 20 字节(标准长度)

如果值为 0x60​,则 TCP 头长度 = 24 字节(包含选项)。

4. TCP 数据(HTTP 报文)

// TCP 数据的长度
tcp_data_length = ip_total_length - ip_header_length - tcp_header_length;// TCP 数据的起始位置
tcp_data = &pkt->data[buf_pos];// 搜索 "XJWECOME"
for (i = 0; i <= tcp_data_length - WEBHMI_TRIGGER_LEN; i++) {if (memcmp(&tcp_data[i], "XJWECOME", 8) == 0) {// 找到触发字符串!return 0;}
}


http://www.zskr.cn/news/27961.html

相关文章:

  • 2025年10月黄黑皮美白产品榜:持证淡斑五强深度评测
  • 股票操作统计分析报告 - 2025年10月23日
  • 2025年10月黄褐斑改善产品推荐榜:权威排行与效果对比
  • windows11关闭自动更新,通用解决方法
  • 2025年10月海南监理公司评测榜:五家实力排名全览
  • 深入解析:Unity避坑——继承了MonoBehaviour的对象不能通过new来创建
  • 使用vscode进行linux 服务器远程管理
  • 2025年上海装修公司联系电话推荐:精选五强口碑榜。
  • 2025年10月GEO优化推荐:高性价比解决方案市场报告
  • 2025年诺士诚公司:权威解析全过程咨询竞争力与风险
  • 2025年10月祛斑产品推荐榜:仙瑟传明酸领衔全维度对比
  • 2025年仙瑟传明酸精华液权威盘点:敏感肌多通路美白的临床级证据链
  • 2025年10月无功补偿装置厂家推荐榜:权威对比与选购指南
  • 2025年10月geo优化供应商推荐:全维度对比与可验证选择指南
  • 2025.10.23博客
  • AI代码辅助工具标准使用场景
  • 实用指南:Coze源码分析-资源库-删除数据库-后端源码-流程/核心技术/总结
  • 2025年10月北京GEO优化公司推荐:主流公司列表评测指南
  • 【GitHub每日速递 251023】46.1k star, 1.2B参数逆袭!MinerU2.5成最牛文档解析多模态大模型
  • 微软七月补丁日修复130个漏洞,重点关注RRAS与Office安全更新
  • 图像分割- sam2 版本 - MKT
  • tryhackme-网络安全基础-AD基础- Active Directory 基础知识-20
  • tryhackme-预安全-windows基础-windows 基础知识3-18
  • 从生产到出库:医疗器械行业SAP B1MES质量追溯闭环方案
  • CF1248A Integer Points
  • 搜索百科(5):Easysearch — 自主可控的国产分布式搜索引擎
  • 2025 CRP129 HD Elite 24V Truck Scanner – Heavy Duty OBD2 Diagnostics for Commercial Vehicles
  • 日志|力扣|98.验证二叉搜索树|前序遍历|中序遍历|后序遍历|
  • PowerShell---的办公小技能
  • 编译folly