计算机网络-GRE(通用路由封装协议)简介
昨天我们学习了VPN的基本概念,虚拟专用网络在当前企业总部与分支间广泛使用。常用的划分方法为基于协议层次有GRE VPN、IPSec VPN、L2TP VPN、PPTP VPN、SSL VPN等。其实我有考虑该怎么讲,因为在IP阶段好像虚拟专用网络讲得不深,在IE的阶段会更加深入,后面想想还是算了,该怎样就怎样吧。
一、GRE通用路由封装协议概述
由于Internet的发展,Internet网有了足够的带宽和覆盖,通过Internet建立分支-总部内网通信的可行性越来越高,GRE(Generic Routing Encapsulation,通用路由封装协议) 就是在这种背景下被提出的。通过GRE隧道,分支和总部之间可以基于Internet建立企业网络。

通用路由封装协议(General Routing Encapsulation,GRE)是一种三层VPN封装技术。GRE可以对某些网络层协议(如IPX、IPv4、IPv6等)的报文进行封装,使封装后的报文能够在另一种网络中(如IPv4)传输,从而解决了跨越异种网络的报文传输问题。

GRE隧道的两端是Tunnel接口,分别对数据报文进行封装及解封装。负责发送封装后的报文的物理接口叫做隧道源接口,对端接收此报文的物理接口叫做隧道目的接口。

GRE技术本质上是一种隧道技术。隧道技术类似于一座桥,可以在底层网络(比如:Internet)之上构建转发通道,用户可以自行构建隧道网络,不需要底层网络的管理者(比如:ISP)介入。隧道技术的方案很多,常见的隧道技术有:MPLS,GRE,L2TP,VXLAN等,隧道基本原理如下:

GRE隧道能够承载IPv4/IPv6的单播、组播、广播报文,GRE报文格式如下:

-
C:校验和验证位。如果该位置1,表示GRE头插入了校验和(Checksum)字段;该位为0表示GRE头不包含校验和字段。 -
K:关键字位。如果该位置1,表示GRE头插入了关键字(Key)字段;该位为0表示GRE头不包含关键字字段。 -
Recursion:用来表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1。如果封装层数大于3,则丢弃该报文。该字段的作用是防止报文被无限次的封装。 -
Flags:预留字段。当前必须设为0。 -
Version:版本字段,必须置为0。Version为1是使用在相关标准的PPTP中。 -
Protocol Type:乘客协议的协议类型。 -
Checksum:对GRE头及其负载的校验和字段。- -
Key:关键字字段,隧道接收端用于对收到的报文进行验证。
因为目前实现的GRE头不包含源路由字段,所以Bit 1、Bit 3和Bit 4都置为0。
简单说GRE就是利用隧道技术在两端建立tunnel接口,通过封装IPV4、IPV6报文使得总部到分支的私有网络报文传输到对端,其中涉及到报文的封装与接封装,隧道模式等。
二、GRE工作原理
2.1 工作原理
GRE构成要素分为3个部分:乘客协议、封装协议和运输协议。
-
乘客协议是指用户在传输数据时所使用的原始网络协议(IPv4、IPX、IPv6等)。 -
封装协议的作用就是用来“包装”乘客协议对应的报文,使原始报文能够在新的网络中传输,如GRE。 -
运输协议是指被封装以后的报文在新网络中传输时所使用的网络协议如:IP协议。

上图中报文的封装过程:
-
RTA连接企业分部的接口收到IP数据报文后,首先交由IP协议处理。 -
IP协议检查报文头中目的地址来确定如何转发此报文。若报文的目的地址要经过GRE隧道才能到达,则IP协议将此报文发给相应的Tunnel接口。 -
Tunnel接口收到此报文后为其封装GRE报文头,然后再交由IP协议处理。 -
IP协议再为GRE报文封装新的IP报文头(源地址为隧道源接口IP,目的地址为隧道目的接口IP),然后根据封装后的IP报文的目的地址及路由表对报文进行转发,从相应的连接Internet的物理接口(隧道源接口)发送出去。
解封装过程与封装过程相反,具体如下:
-
RTB从连接Internet的物理接口收到IP报文后,检查其目的地址。如果目的地址是RTB,且IP报文头中的协议号为47(表示封装的报文为GRE报文),则RTB剥掉此报文的IP报文头,交给GRE协议处理。 -
GRE协议进行校验和关键字识别后,剥掉GRE报文头,再交由IP协议处理。 -
IP协议将此数据报文转发到企业总部。
2.2 GRE Keepalive检测
由于GRE协议并不具备检测链路状态的功能,如果对端接口不可达,隧道并不能及时关闭该Tunnel连接,这样会造成源端会不断的向对端转发数据,而对端却因隧道不通接收不到报文,由此就会形成流量中断。
GRE的Keepalive检测功能可以检测隧道状态,即检测隧道对端是否可达。
Keepalive超时时间=发送周期(默认5 s)*重试次数(默认3次)

前面我们讲过需要创建一个tunnel隧道接口用于GRE,这个接口类似于环回接口lookback接口,没有检测功能,不会主动关闭接口,因此需要一个机制来实现当GRE两端连接失败时断开GRE隧道。
Keepalive检测功能的实现过程如下:
-
当GRE隧道的源端使能Keepalive检测功能后,就创建一个定时器,周期地发送Keepalive探测报文,同时通过计数器进行不可达计数。每发送一个探测报文,不可达计数加1。 -
对端每收到一个探测报文,就给源端发送一个回应报文。 -
如果源端的计数器值未达到预先设置的值就收到回应报文,就表明对端可达。如果源端的计数器值到达预先设置的值——重试次数(Retry Times)时,还没收到回送报文,就认为对端不可达。此时,源端将关闭隧道连接。但是源端口仍会继续发送Keepalive报文,若对端Up,则源端口也会Up,建立隧道链接。
2.3 GRE隧道安全威胁
GRE隧道的主要作用是将数据在分支-总部之间传递,数据并不加密,有被篡改的风险。GRE隧道建立也有一定风险,通过伪造IP地址,可以使得非法设备与合法设备之间建立GRE隧道。

2.3.1 GRE数据校验和验证
校验和验证是指对封装的报文进行端到端校验。
若GRE报文头中的C位标识位置1,则校验和有效。发送方将根据GRE头及Payload信息计算校验和,并将包含校验和的报文发送给对端。接收方对接收到的报文计算校验和,并与报文中的校验和比较,如果一致则对报文进一步处理,否则丢弃。

数据校验是为了确保数据是完整的,没有经过篡改的,需要开启数据校验将C置位1。
2.3.2 GRE识别关键字
为了防止非法路由器连接GRE或者伪造IP进行连接,可以开启密码认证。
识别关键字(Key)验证是指对Tunnel接口进行校验。通过这种弱安全机制,可以防止错误识别、接收其它地方来的报文。若GRE报文头中的K位为1,则在GRE头中插入一个四字节长关键字字段,收发双方将进行识别关键字的验证。

通过密码来验证GRE对端的建立,置位K,然后设置一个Key进行验证。
虽然通过上面的计算可以实现合法建立GRE隧道以及数据的完整性,但是因为GRE本身没有进行加密因此GRE报文能够清晰地查看到报文的信息,存在不安全性。因此一般情况下GRE会结合其它安全机制来搭配使用。

总结:GRE本质是一种隧道技术,利用隧道在分支和总部间建立隧道接口,结合数据验证和key对数据完整性、合法性进行校验可以建立起一个虚拟的Tunnel通道,GRE可以用于传输单播、组播、广播报文具有其优点,但是也存在一些安全性的缺陷,简单说只要有部署了Internet能够就有可能使用GRE实现分支互联。
本文由 mdnice 多平台发布
相关文章:
计算机网络-GRE(通用路由封装协议)简介
昨天我们学习了VPN的基本概念,虚拟专用网络在当前企业总部与分支间广泛使用。常用的划分方法为基于协议层次有GRE VPN、IPSec VPN、L2TP VPN、PPTP VPN、SSL VPN等。其实我有考虑该怎么讲,因为在IP阶段好像虚拟专用网络讲得不深,在IE的阶段会…...
汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?
在汽车渲染领域,选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5(Unreal Engine 5)作为两大主流3D软件,各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…...
服务器数据恢复—光纤存储FC硬盘数据恢复案例
服务器存储数据恢复环境: 某品牌光纤存储上共有16块FC硬盘。存储上的卷映射到Linux操作系统上。Linux操作系统上运行Oracle数据库。 服务器存储故障&检测: 存储上2块硬盘故障灯亮起,存储映射到linux操作系统上的卷挂载不上,业…...
MySQL系列之远程管理(安全)
导览 前言Q:如何保障远程登录安全一、远程登录的主要方式1. 用户名/口令2. SSH3. SSL/TLS 二、使用TLS协议加密连接1. 服务端2. 客户端 结语精彩回放 前言 在我们的学习或工作过程中,作为开发、测试或运维人员,经常会通过各类客户端软件&…...
硬菜!高精度!BO-Transformer贝叶斯优化编码器多特征分类预测/故障诊断
硬菜!高精度!BO-Transformer贝叶斯优化编码器多特征分类预测/故障诊断 目录 硬菜!高精度!BO-Transformer贝叶斯优化编码器多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-Transform…...
idea_常用设置
相关设置 项目的JDK设置out目录取消自动更新设置主题设置菜单和窗口字体大小滚轮调节字体大小显示行号与方法分隔符代码智能提示忽略大小写自动导包配置设置项目文件编码设置控制台的字符编码修改类头的文档注释信息设置自动编译 项目的JDK设置 File -> Project Structure -…...
C# 中的异步流:高效处理序列数据
C#中的异步流(Async Streams)。异步流是C# 8.0引入的一个新特性,它允许你异步地处理序列数据,非常适合处理大量数据或长时间运行的任务。以下是一篇关于C#中异步流的文章。 引言 在现代应用程序开发中,处理大量数据或…...
Spring WebFlux SSE(服务器发送事件)的正确用法
在SpringBoot2下SSE实现是返回一个SseEmitter,然后通过SseEmitter的send方法来发送事件. 在SpringBoot3的WebFlux 下SSE实现是返回一个Flux<ServerSentEvent<?>>,但是怎么手动向客户端发送SSE事件搜遍全网也没有看到一个讲清楚的.网上的例子一般都是这样的: GetM…...
pyhton+yaml+pytest+allure框架封装-全局变量渲染
我们在日常测试中 会有一个接口中多个值的情况 比如这种 { "name": "thread", "value": "4986-MainThread", "status": "framework", "start": "pytest", …...
Redis五大基本类型——Set集合命令详解(命令用法详解+思维导图详解)
目录 一、Set集合类型介绍 二、常见命令 1、SADD 2、SMEMBERS 3、SISMEMBER 4、SCARD 5、SRANDMEMBER 6、SPOP 7、SMOVE 8、SREM 编辑 9、集合间操作 (1)SINTER (2)SINTERSTORE (3)SUNION…...
网络协议之邮件协议(SMTP、POP3与IMAP)
一、引言 在数字化时代,电子邮件已成为人们日常沟通和信息交流的重要工具。电子邮件系统的稳定运行离不开一系列网络协议的支撑,其中SMTP、POP3和IMAP是最为关键的三个协议。它们分别负责邮件的发送、接收和管理,共同构建了一个高效、稳定的…...
【GAMES101笔记速查——Lecture 20 Color and Perception】
颜色与感知 目录 1 光场(Light Field / Lumigraph) 1.1 全光函数 1.1.1 改进:引入波长 1.1.2 改进:添加时间t 1.1.3 改进:人可以移动,添加空间坐标 1.1.4 改进:不把函数当电影来看。 1.…...
全新配置ubuntu18.04深度学习环境
1、下载显卡驱动 1.1、驱动下载 连接:显卡驱动 手动驱动搜索-》查找-》查看-》下载 下载可使用指令 wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.216.01/NVIDIA-Linux-x86_64-535.216.01.run 2、下载安装cuda12.0 wget https://developer.do…...
C++初阶——类和对象(下)
目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表, 初始化列…...
Android Framework SurfaceFlinger面试题及参考答案
目录 请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是如何与 CPU、GPU 以及显示器协同工作的? 解释一下 Android 系统中的三块 Graphic Buffer 及其用途。 VSYNC 信号在 Android 渲染机制中扮演什么角色? 请描述 SurfaceFlinger 如何分发 VSYNC 信号…...
STM32 外设简介
STM32 外设简介 STM32 是由意法半导体 (STMicroelectronics) 开发的一系列基于 ARM Cortex 内核的微控制器,广泛应用于嵌入式系统中。STM32 系列的一个重要特点是其丰富而强大的外设模块,支持多种接口和功能,能满足工业控制、物联网、消费电…...
java操作doc——java利用Aspose.Words操作Word文档并动态设置单元格合并
在实际工作中,如果业务线是管理类项目或者存在大量报表需要导出的业务时,可以借助第三方插件实现其对应功能。 尤其是需要对word文档的动态操作或者模板数据的定向合并,使用Aspose会相对来说容易一些,而且相关文档比较完整&#…...
人工智能—机器学习-图像处理
1. 人工智能(AI) 定义:人工智能是计算机科学的一个分支,旨在开发能够模拟人类智能的系统,包括学习、推理、问题解决、感知和语言理解等能力。子领域: 机器学习(ML):使计…...
数据结构——树
参考:数据结构(C版)第2版 [王红梅] 文章目录 树和二叉树基本术语二叉树概念二叉树的性质二叉树的存储顺序存储二叉链表 二叉树的遍历广度遍历深度遍历 树和二叉树 基本术语 结点的度、树的度:某结点拥有子树的个数为该结点的度&…...
快速理解微服务中Fegin的概念
一.由来 1.在传统的架构里面,我们是通过使用RestTemplate来访问其他的服务,但是这种方式就存在了一个很大的缺陷,也就是被调用方如果发生了服务的迁移(IP和端口发生了变化),那么调用方也需要同步的在代码里面进行修改,…...
testImplementation和androidTestImplementation区别
testImplementation和androidTestImplementation区别 testImplementation 和 androidTestImplementation 是 Gradle 中用于添加测试依赖的配置,主要区别在于测试的类型和运行的环境: 1. testImplementation 用于:单元测试运行环境…...
Vue前端开发2.3.2-4 绑定指令
本文介绍了Vue中的绑定指令,包括属性绑定指令v-bind、事件绑定指令v-on以及双向数据绑定指令v-model。通过创建单文件组件,演示了如何使用这些指令来控制DOM属性、监听事件和实现表单输入与数据的双向同步。同时,探讨了v-model的修饰符如.num…...
使用ElementUI中的el-table制作可编辑的表格
在前端开发时,可能会需要用到可编辑的表格控件。一些原生的UI框架并不支持Table控件的可编辑功能,所以只能自己实现。 以下用Vue3Element-Plus进行示例开发。 一、实现可编辑的单元格 我想要实现的效果是,鼠标移动到el-table的某行时&…...
pytest 通过实例讲清单元测试、集成测试、测试覆盖率
1. 单元测试 概念 定义: 单元测试是对代码中最小功能单元的测试,通常是函数或类的方法。目标: 验证单个功能是否按照预期工作,而不依赖其他模块或外部资源。特点: 快速、独立,通常是开发者最先编写的测试。 示例:pytest 实现单…...
概率论中交并集的公式
文章目录 对于相容事件且独立事件1. 同时出现的概率,即 P ( A ∩ B ) P(A\cap B) P(A∩B):2. 出现任意一个的概率,即 P ( A ∪ B ) P(A\cup B) P(A∪B): 对于相容事件且依赖事件1. 同时出现的概率,即 P ( A ∩ B ) P(A\cap B) P(A∩B):特殊的,对于独立事件 2. 出现任意一个的概…...
在Ubuntu2004中搭建基于ESP-IDF v5.1的ESP32-S3开发环境
在Ubuntu2004中搭建基于ESP-IDF v5.1的ESP32-S3开发环境 目录 1 基本资料 2 注意事项 2.1 子模块检出失败处理 2.2 选择 Espressif 下载服务器 2.3 自定义工具安装路径 2.4 导出环境变量 2.5 测试基础环境 3 创建自己的工程 3.1 创建基础应用工程 3.2 创建组件(…...
Vue 项目中 Axios 的封装方向探索
什么是 Axios? Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境中发送 HTTP 请求。它的主要作用是帮助前端与后端进行数据交换,通常用于向后端接口发送 GET、POST、PUT、DELETE 等请求并处理返回的响应。 Axios 的特点: 基于 Promise,支持异步编程。…...
LLM应用-prompt提示:RAG query重写、相似query生成 加强检索准确率
参考: https://zhuanlan.zhihu.com/p/719510286 1、query重写 你是一名AI助手,负责在RAG(知识库)系统中通过重构用户查询来提高检索效果。根据原始查询,将其重写得更具体、详细,以便更有可能检索到相关信…...
详解Qt QBuffer
文章目录 **QBuffer 的详解****前言****QBuffer 是什么?****QBuffer 的主要用途****构造函数****主要成员函数详解****1. open()****原型:****作用:****参数:****返回值:****示例代码:** **2. write()****原…...
【编程语言】Kotlin快速入门 - 泛型
Kotlin的泛型与Java十分类似,也是使用这种的语法结构: class Fruit<T> {fun eat(f : T): Unit {println("eat...")}fun <T> buy(p : T): T {return p} }泛型限制 和Java一样,Kotlin也允许泛型是某个类的子类 fun &l…...
Oracle 执行计划查看方法汇总及优劣对比
在 Oracle 数据库中,查看执行计划是优化 SQL 语句性能的重要工具。以下是几种常用的查看执行计划的方法及其优劣比较: 1. 使用 EXPLAIN PLAN FOR 和 DBMS_XPLAN.DISPLAY 方法 执行 EXPLAIN PLAN FOR 语句: EXPLAIN PLAN FOR SELECT * FROM …...
typescript进阶
typescript进阶 #函数重载 #参数类型和反应值不同的函数 #接口继承 #类的修饰符 #存取器 #类实现接口 #抽象类 #泛型类 #函数重载 #参数类型和反应值不同的函数 function hello (name: string) : string function hello (age: number) : string function hello (value: strin…...
【真实场景面试问题-2】
1 介绍一下低功耗设计手段–clock gating 和 clock domain; 芯片的低功耗设计尤其是在关注能耗的场景:移动设备、物联网和嵌入式系统;时钟门控(Clock Gating)和时钟域(Clock Domain)是两种常用…...
CKA认证 | Day4 K8s管理应用生命周期(下)
第四章 K8s管理应用程序生命周期(下) 1、Pod对象 1.1 Pod 的基本概念 Pod 是 Kubernetes 中最基本和最重要的概念之一,是一个逻辑抽象概念,Kubernetes创建和管理的最小单元, 一个Pod由一个容器或多个容器组成。它简…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【六】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人
课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符,使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…...
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在充满活力与激情的校园生活中,校运会不仅是…...
一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式
平台如何检测一路RTSP流是否在线? 在之前的流媒体平台方案中,我们都是通过定时RTSP拉流的方式,走一个完整的RTSP流程:包括OPTIONS、DESCRIBE、SETUP、PLAY、RTP收流,这种方式去取流,然后取到流之后进行流解…...
HTML飞舞的爱心
目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色…...
银行卡 OCR 识别 API 接口的发展前景
随着智能手机的广泛普及以及互联网的迅猛发展,“互联网 ” 时代的移动支付已然开启了智慧生活的崭新蓝图。移动支付要求进行实名认证并绑定银行卡,然而传统的手工输入银行卡号不但速度缓慢、容易出错,还极大地降低了用户体验。银行卡 OCR 识别…...
python tkinter 控件实现鼠标悬停提示,提示文本动态展示
展示效果 全部代码和使用示例 # _*_ coding:utf-8 _*_ import tkinter as tk import pyautoguiscreen_width, screen_height pyautogui.size()class WidgetTip:"""鼠标悬停提示"""def __init__(self, widget, text):self.widget widgetself.…...
【spark-spring boot】学习笔记
目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…...
Delphi ADO组件中的 ADOTable、ADOQurey 无SQL语句实现增、删、改、查
准备: 数据库是Acess数据库 1.放一个 Adoconnection1到 表单上,设置好数据连接字符串 并 设置 connected 属性 为 true 2 设置 adoquery1的connection 属性为 adoconnection1 3 设置 adoquery1的 sql 属性为 select * from 表名 4 设置 adoquery1的 active true …...
力扣整理版九:贪心算法
局部最优 全局最优 局部最优可以推出全局最优 并且想不出反例 ----------------------------- (1) 455 分发饼干 (2) 1005 k次取反后最大化的数组和 (3) 860 柠檬水找零 (4) 376 摆动序列 (5) 738 单调递增的数字 (6) 122 买卖股票的最佳时机2 (7) 135 分发糖果 (8…...
ffmpeg 视频滤镜:高斯模糊-gblur
滤镜描述 gblur 官网地址 > FFmpeg Filters Documentation 这个滤镜会将视频变得模糊。 滤镜使用 参数 gblur AVOptions:sigma <float> ..FV.....T. set sigma (from 0 to 1024) (default 0.5)steps <int> ..FV.....T…...
利用D3.js实现数据可视化的简单示例
目录 一、D3.js选择器 二、数据绑定相关方法 三、DOM操作方法 四、事件监听 五、实现折线图案例 1.首先引入 D3.js 库。 2.然后获取数据(这里定义了销售数据数组作为数据)。 3.接着创建一个 svg 元素作为画布 4.定义 x 轴和 y 轴的比例尺&#…...
Top 10 Tools to Level Up Your Prompt Engineering Skills
此文章文字是转载翻译,图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1,Prompt Engineering 提示工程…...
sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk
目录 1. 脚本代码 2. 执行情况 3. 代码详解 (1)BEGIN 过程 (2)主过程 (3)END 过程 (4)支持函数 4. 附加说明 这是一个基于 UNIX spell 程序的名为 spellcheck 的 awk 脚本&a…...
Android 应用测试的各种环境问题记录(Instrumentation测试)
报错记录 failed to configure packages targetSdkVersion(未解决) failed to configure com.demo.test.SettingsActivityTest.testOnCreate_withNullSavedInstanceState: Package targetSdkVersion34 > maxSdkVersion32 java.lang.IllegalArgumentE…...
python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)
文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…...