网络安全项目实战(三)--报文检测

6. TCP/IP协议栈及以太网帧

  • 目标
    • 了解TCP/IP协议栈的组织结构
    • 掌握以太网帧的数据格式定义
    • 能应用编码实现以太网帧的解析方法

6.1. TCP/IP 协议栈

TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。如下图所示(该图出自[TCPIP])。

两台计算机通过TCP/IP协议通讯的过程如下所示(该图出自[TCPIP])。 

传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示(该图出自[TCPIP])。 

不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。我们在pcap文件中,所得到的package data数据就是一个以太网帧, 因此对“package data”的解析就是解析一个以太网帧

 

6.2. 以太网(RFC 894)帧格式

以太网的帧格式如下所示(该图出自[TCPIP]):

  • 源地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。
  • 目的地址, 意义同源地址
  • 协议字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码。

    以太网帧中的数据长度规定最小46字节,最大1500字节。

    ARP和RARP数据包的长度不够46字节,要在后面补填充位。

    最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。

    ifconfig命令的输出中也有“MTU:1500”。

    注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。

 

6.3. 以太网栈头部

 // /usr/include/linux/if_ether.h struct ethhdr {unsigned char    h_dest[ETH_ALEN];    /* 目标mac地址    */unsigned char    h_source[ETH_ALEN];    /* 源mac地址    */__be16        h_proto;        /* 以太网类型    */
} __attribute__((packed));

6.4. 以太网帧解析代码

一下为以太网帧的核心解析代码

MAC_FRM_HDR *mac_hdr; //define a Ethernet frame header  IP_HDR *ip_hdr;       //define a IP header  char *tmp1, *tmp2;  int AND_LOGIC = 0xFF;  mac_hdr = buf;  //buf is what we got from the socket program  ip_hdr = buf + sizeof(MAC_FRM_HDR);  //udp_hdr = buf + sizeof(MAC_FRM_HDR) + sizeof(IP_HDR); //if we want to analyses the UDP/TCP  tmp1 = mac_hdr->src_addr;  tmp2 = mac_hdr->dest_addr;  /* print the MAC addresses of source and receiving host */  printf("MAC: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X==>" "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",  tmp1[0]&AND_LOGIC, tmp1[1]&AND_LOGIC, tmp1[2]&AND_LOGIC,tmp1[3]&AND_LOGIC,  tmp1[4]&AND_LOGIC, tmp1[5]&AND_LOGIC,  tmp2[0]&AND_LOGIC, tmp2[1]&AND_LOGIC, tmp2[2]&AND_LOGIC,tmp2[3]&AND_LOGIC,  tmp2[4]&AND_LOGIC, tmp2[5]&AND_LOGIC);  tmp1 = (char*)&ip_hdr->ip_src;  tmp2 = (char*)&ip_hdr->ip_dest;  /* print the IP addresses of source and receiving host */  printf("IP: %d.%d.%d.%d => %d.%d.%d.%d",  tmp1[0]&AND_LOGIC, tmp1[1]&AND_LOGIC, tmp1[2]&AND_LOGIC,tmp1[3]&AND_LOGIC,  tmp2[0]&AND_LOGIC, tmp2[1]&AND_LOGIC, tmp2[2]&AND_LOGIC,tmp2[3]&AND_LOGIC);  /* print the IP protocol which was used by the socket communication */  switch(ip_hdr->ip_protocol) {  case IPPROTO_ICMP: LOGI("ICMP"); break;  case IPPROTO_IGMP: LOGI("IGMP"); break;  case IPPROTO_IPIP: LOGI("IPIP"); break;  case IPPROTO_TCP:  case IPPROTO_UDP:  LOGI("Protocol: %s", ip_hdr->ip_protocol == IPPROTO_TCP ? "TCP" : "UDP");  LOGI("Source port: %u, destination port: %u", udp_hdr->s_port, udp_hdr->d_port);  break;  case IPPROTO_RAW: LOGI("RAW"); break;  default: printf("Unknown, please query in inclued/linux/in.h\n"); break;  }  

7. IP 报文

  • 目标
    • 了解IP报文的组织结构
    • 掌握IP报文的分析方法。

7.1. IP数据报格式

IP数据报的格式如下(这里只讨论IPv4)(该图出自[TCPIP]):

 

  • 版本:IP报文版本号 IPV4:4,IPV6:6

  • 首部长度:IP header 长度,是4字节的整数倍, 没有选项,则一般为5(5x32bit=20B)

  • 8位服务类型:一般没有使用,详细参考RFC
  • 总长度:header+数据 总长度
  • 16位标识:IP 报文的唯一id,分片报文的id 相同,便于进行重组。
  • 3位标志:标明是否分片。是一个3位的控制字段,包含:
    • 保留位:1位
    • 不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段)
    • 更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)
Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment,  1 = Don't Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.0   1   2+---+---+---+|   | D | M || 0 | F | F |+---+---+---+
  • 13位片偏移:参考下图。如果是第一片取值为0,第二片取值175,以此类推。

  • TTL:生存时间,即路由器的跳数,每经过一个路由器,该TTL 减一,因此路由器需要重新计算IP报文的校验和。
  • 8位协议:ICMP:1,TCP:6,UDP:17,其他的自行百度
  • 首部校验和:IP header校验和,接收端收到报文进行计算如果校验和错误,直接丢弃。
  • 源IP地址:无须解释
  • 目的IP地址:无须解释
  • 选项:这个一般也没有使用。详细参考RFC
  • 数据:上层的报文,如TCP 报文、UDP报文等。

7.2. IP报文头部

IP头部,总长度20字节

// /usr/include/linux/ip.h
struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD)__u8    ihl:4,     //首部长度version:4;    //版本 #elif defined (__BIG_ENDIAN_BITFIELD)__u8    version:4,    //版本ihl:4;          //首部长度#else#error    "Please fix <asm/byteorder.h>"#endif__u8    tos;      //服务类型__be16    tot_len;    //总长度__be16    id;         //标志__be16    frag_off;   //分片偏移__u8    ttl;         //生存时间__u8    protocol;     //协议__sum16    check;         //检验和__be32    saddr;      //源IP地址__be32    daddr;      //目的IP地址/*The options start here. */
};

关于协议类型定义

 // /usr/include/linux/netinet/in.h/* Standard well-defined IP protocols.  */
enum{IPPROTO_IP = 0,       /* Dummy protocol for TCP.  */
#define IPPROTO_IP        IPPROTO_IPIPPROTO_ICMP = 1,       /* Internet Control Message Protocol.  */
#define IPPROTO_ICMP        IPPROTO_ICMPIPPROTO_IGMP = 2,       /* Internet Group Management Protocol. */
#define IPPROTO_IGMP        IPPROTO_IGMPIPPROTO_IPIP = 4,       /* IPIP tunnels (older KA9Q tunnels use 94).  */
#define IPPROTO_IPIP        IPPROTO_IPIPIPPROTO_TCP = 6,       /* Transmission Control Protocol.  */
#define IPPROTO_TCP        IPPROTO_TCPIPPROTO_EGP = 8,       /* Exterior Gateway Protocol.  */
#define IPPROTO_EGP        IPPROTO_EGPIPPROTO_PUP = 12,       /* PUP protocol.  */
#define IPPROTO_PUP        IPPROTO_PUPIPPROTO_UDP = 17,       /* User Datagram Protocol.  */
.....

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码 —— 饮食均衡,合理膳食

目录 一、低代码的概念 二、低代码的优缺点 &#xff08;一&#xff09;优点 &#xff08;二&#xff09;缺点 三、低代码的能力 1、场景构建能力 2、数据编排能力 3、连接生态能力 4、业务中台能力 四、你认为低代码会替代传统编程吗&#xff1f; 1、从技术特征来看…

【改进YOLOv8】矿物尺寸图像分析系统:融合位置感知循环卷积(ParC)改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着科技的不断发展&#xff0c;计算机视觉技术在各个领域中得到了广泛的应用。其中&#xff0c;物体检测是计算机视觉领域中的一个重要研究方向。物体检测的目标…

Spring Boot 整合过滤器拦截器

Spring Boot 整合过滤器 1. 简介 在Spring Boot应用中&#xff0c;我们可以使用Servlet API中的Filter来实现一些全局的功能&#xff0c;比如日志记录、跨域处理、权限验证等。 2. 创建自定义过滤器 创建一个类&#xff0c;实现javax.servlet.Filter接口&#xff0c;并重写…

力扣5、 最长回文子串

转到力扣 考察知识&#xff1a;字符串、动态规划 这个题目力扣给的难度是中等&#xff0c;感觉是中等难度题目中比较难的一个了&#xff0c;写代码之前理清楚思路再去写&#xff0c; 方法一、动态规划 时间复杂度&#xff1a;O(n2) 空间复杂度&#xff1a;O(n2) public cla…

SpringBoot对PDF进行模板内容填充、电子签名合并

1. 依赖引入–这里只包含额外引入的包 原有项目包不含括在内 <!-- pdf编辑相关--> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version> </dependency><de…

C# 提取PDF中指定文本、图片的坐标

获取PDF文件中文字或图片的坐标可以实现精确定位&#xff0c;这对于快速提取指定区域的元素&#xff0c;以及在PDF中添加注释、标记或自动盖章等操作非常有用。本文将详解如何使用国产PDF库通过C# 提取PDF中指定文本或图片的坐标位置&#xff08;X, Y轴&#xff09;。 ✍ 用于…

Python机器学习19——常用六种机器学习的异常值监测方法(孤立森林,数据支持描述,自编码器,高斯混合,DBSCAN,LOF)

案例背景 异常值监测是机器学习的一个重要领域&#xff0c;博主以前做预测多&#xff0c;异常值监测涉及得少&#xff0c;但之后的工作可能需要做异常值方面的工作&#xff0c;所以大致总结了一下常用的机器学习来做异常值监测的方法以及代码。 标题的这些机器学习方法基本都…

WPF-一个简单登录界面

一个简单登录界面 文章目录 一个简单登录界面一、效果展示二、准备代码 一、效果展示 二、准备代码 创建一个WPF工程&#xff0c;创建名为 Login5 的WPF项目。 添加Nuget包 MaterialDesignThemes 界面的整体布局和样式代码 <Window x:Class"Login5.MainWindow&quo…

Java - 异常(三)- 声明异常(throws)和手动抛出异常throw

目录 6.3 方式2&#xff1a;声明异常&#xff08;throws&#xff09; 6.4 手动抛出异常throw 6.4.1 概述 6.4.2 使用格式&#xff1a; 6.4.3 实例代码 6.4.4 为什么要手动抛出异常对象&#xff1f; 6.4.5 如何理解“自动”和“手动” 抛出异常对象 6.4.6 注意点 ❓面试…

数字化赋能实体经济,凌雄科技发挥DaaS模式提质增效价值

11月中旬&#xff0c;市场监管总局发布了2023年前三季度经营主体数据。其中&#xff0c;前三季度全国新设民营企业总计706.5万户&#xff0c;截至9月底&#xff0c;全国登记在册的民营企业数量超过5200万户&#xff0c;在企业总量中占比高达92.3%。如何帮助民营企业实现高质量发…

【数学建模美赛M奖速成系列】报名流程与论文的基本格式

数学建模美赛M奖速成系列 写在前面报名方式1.官网直接报名2.赛氪软件辅助报名 论文的基本格式摘要模型建立模型求解结果分析与检验模型评价 竞赛的基本注意事项1. 选题后查找资料2. 写作能力和编程能力 历年优秀论文标题与摘要简明扼要善用图表 最后 写在前面 最近&#xff0c…

通过Jenkins将应用发布到K8s1.24.3

一、准备基础环境 cat >> /etc/hosts <<EOF 192.168.180.210 k8s-master 192.168.180.200 k8s-node1 192.168.180.190 k8s-node2 192.168.180.180 gitlab 192.168.180.170 jenkins 192.168.180.160 harbor EOF 配置主机名 hostnamectl set-hostname k8s-master &am…

Vue 3 开发中遇到的问题及解决方案(fix bug)

开发环境&#xff1a;mac系统&#xff0c;node版本&#xff1a; 16.15.0 版本兼容问题 vite v3.2.4 building for development... hasInjectionContext is not exported by node_modules/pinia/node_modules/vue-demi/lib/index.mjs, imported by node_modules/pinia/dist/pini…

深圳移动与大富科技助力深圳人工智能教育高质量发展

12月12日&#xff0c;中国移动通信集团广东有限公司深圳分公司(以下简称“深圳移动”) 与大富科技&#xff08;安徽&#xff09;股份有限公司&#xff08;以下简称“大富科技”&#xff09;在中国移动深圳信息大厦签署“战略合作框架协议”&#xff0c;共同推进人工智能教育、I…

常见的工作流编排引擎

常见工作流框架&#xff1a;微服务编排引擎 工作流框架还是比较多的&#xff0c;按照语言分类的话&#xff0c;有 Java: jBPM、Activiti、SWF PHP: Tpflow、PHPworkflow Go: Cadence&#xff08;Cadence由Uber开发并开源&#xff0c;Maxim Fateev是Cadence的主架构师&#…

解决文件默认打开程序选择被联想管家劫持

问题描述 当选择文件右键->“打开方式”->“选择其他应用”时&#xff0c;弹出了联想电脑管家的软件安装推荐。一不小心就会下载了它推荐的软件。特恶心。 问题原因 这个推荐软件的程序&#xff0c;是联想开发的一个叫“LeASOpen”的垃圾软件。联想把系统右键菜单“选…

Java面试题1-10

1、一个".java"源文件中是否可以包括多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制&#xff1f; 可以有多个类&#xff0c;但只能有一个public的类&#xff0c;并且public的类名必须与文件名相一致。 2、Java有没有goto? java中的保留字&am…

K8S(七)—污点、容忍

目录 污点、容忍污点&#xff08;Taints&#xff09;&#xff1a;容忍&#xff08;Tolerations&#xff09;&#xff1a;如何一起使用污点和容忍&#xff1a;操作符&#xff08;Equal、Exists&#xff09;例子基于污点的驱逐基于节点状态添加污点 污点、容忍 官网地址&#xf…

【大数据】详解 AVRO 格式

详解 AVRO 格式 1.Avro 介绍2.schema2.1 原始类型2.2 复杂类型2.2.1 Records2.2.2 Enums2.2.3 Arrays2.2.4 Maps2.2.5 Unions2.2.6 Fixed 3.Avro 的文件存储格式3.1 数据编码3.1.1 原始类型3.1.2 复杂类型 3.2 存储格式3.3 存储格式 4.小结 1.Avro 介绍 Apache Avro 是 Hadoop…

three.js(一)

文章目录 three.js环境搭建正文补充 示例效果知识点补充1:一个标准的html知识点补充2:原生的前端框架和Vue框架的区别原生的前端框架Vue框架声明式编程和响应式编程 three.js环境搭建 正文 搭建 Three.js 的环境通常包括以下几个步骤&#xff1a; 1.创建项目目录&#xff1a…