计算机网络:应用层 —— 电子邮件
文章目录
- 电子邮件的起源与发展
- 电子邮件的组成
- 电子邮件协议
- 邮件发送和接收过程
- 邮件发送协议
- SMTP协议
- 多用途因特网邮件扩展MIME
- 电子邮件的信息格式
- 邮件读取协议
- 邮局协议POP
- 因特网邮件访问协议IMAP
- 基于万维网的电子邮件
电子邮件(E-mail)是因特网上最早流行的一种应用,并且仍然是当今因特网上最重要、最实用的应用之一。它通过电子方式发送和接收消息,极大地改变了人们的沟通方式。
电子邮件的起源与发展
电子邮件的历史可以追溯到20世纪60年代的阿帕网(ARPANET)。最初,电子邮件仅用于同一台计算机上的用户之间发送消息,后来逐渐发展为跨网络的通信工具。1971年,雷·汤姆林森(Ray Tomlinson)发明了现代电子邮件系统,并引入了@符号用于区分用户和服务器,奠定了电子邮件的基本格式。
随着互联网的普及,电子邮件成为全球范围内最常用的通信方式之一。如今,电子邮件不仅用于个人通信,还广泛应用于商业、教育、政府等多个领域。
传统的电话通信属于实时通信,存在以下两个缺点:
- 电话通信的主叫和被叫双方必须同时在场;
- 一些不是十分紧迫的电话也常常不必要地打断人们的工作或休息。
而电子邮件与邮政系统的寄信相似:
-
发件人将邮件发送到自己使用的邮件服务器
-
发件人的邮件服务器,将收到的邮件按其目的地址转发到收件人邮件服务器中的收件人邮箱
-
收件人在方便的时候访问收件人邮件服务器中自己的邮箱,获取收到的电子邮件。
电子邮件使用方便、传递迅速而且费用低廉。它不仅可以传送文字信息,而且还可附上声音和图像。由于电子邮件的广泛使用,现在许多国家已经正式取消了电报业务。在我国,电信局的电报业务也因电子邮件的普及而濒临消失。
电子邮件的组成
电子邮件系统采用客户/服务器方式。
电子邮件系统的三个主要组成构件:
-
用户代理(Mail User Agent, MUA):用户与电子邮件系统的接口,又称为电子邮件客户端软件。
-
邮件服务器(Mail Server):电子邮件系统的基础设施。因特网上所有的 ISP 都有邮件服务器,其功能是发送和接收邮件,同时还要负责维护用户的邮箱。
-
协议:电子邮件所需的协议,包括邮件发送协议(例如
SMTP
)和邮件读取协议(例如POP3
,IMAP
)
电子邮件协议
邮件发送和接收过程
电子邮件的发送和接收过程涉及多个协议和服务器的协作,以下是其基本工作流程:
-
发送邮件:用户通过邮件客户端撰写邮件并点击“发送”按钮。邮件客户端使用
SMTP
(简单邮件传输协议)将邮件发送到用户的邮件服务器。 -
邮件服务器之间的转发:发送方邮件服务器使用
SMTP
协议将邮件转发到接收方邮件服务器。如果接收方服务器不可用,邮件将被暂时存储在发送方服务器的队列中,等待重试。 -
接收邮件:接收方邮件服务器接收邮件后,将其存储在用户的邮箱中。用户可以通过邮件客户端使用
POP3
(邮局协议)或IMAP
(互联网消息访问协议)协议从服务器下载或访问邮件。 -
邮件存储与管理:邮件存储在服务器的邮箱中,用户可以通过邮件客户端进行管理,如删除、回复、转发等操作。
邮件发送协议
SMTP协议
简单邮件传送协议SMTP(Simple Mail Transfer Protocol)用于发送电子邮件。当使用电子邮件客户端(如Outlook、Gmail等)发送一封电子邮件时,该客户端会使用 SMTP
协议将邮件发送到指定的 SMTP
服务器。然后,SMTP
服务器会负责将邮件路由到目标邮件服务器。
SMTP
客户与服务器之间,通过命令与应答的交互方式,最终实现 SMTP
客户发送邮件给 SMTP
服务器。
-
客户端与服务器建立 TCP 连接。
-
客户端发送
HELO
或EHLO
命令,标识自己的身份。 -
客户端发送
MAIL FROM
命令,指定发件人地址。 -
客户端发送
RCPT TO
命令,指定收件人地址。 -
客户端发送
DATA
命令,开始传输邮件内容。 -
邮件传输完成后,客户端发送
.
表示结束,服务器返回响应。 -
客户端发送
QUIT
命令,向服务器请求断开连接。
多用途因特网邮件扩展MIME
SMTP协议只能传送ASCII码文本数据,不能传送可执行文件或其他的二进制对象。SMTP
不能满足传送多媒体邮件(例如带有图片、音频或视频数据)的需要。并且许多其他非英语国家的文字(例如中文、俄文、甚至带有重音符号的法文或德文)也无法用 SMTP
传送。
为解决 SMTP
传送非 ASCII 码文本的问题,提出了多用途因特网邮件扩展MIME(Multipurpose Internet Mail Extensions)
-
增加了5个新的邮件首部字段,这些字段提共了有关邮件主体的信息。
-
定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。
-
定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。
-
MIME
不仅仅用于SMTP
,也用于后来的同样面向ASCII字符的HTTP
电子邮件的信息格式
电子邮件的信息格式并不是由 SMTP
定义的,而是在 [RFC 822]
中单独定义的。这个 RFC 文档已在 2008 年更新为[RFC 5322]
。一个电子邮件有信封和内容两部分。而内容又由首部和主体两部分构成。
邮件读取协议
常用的邮件读取协议有两个:邮局协议POP3和因特网邮件访问协议IMAP
POP3
和 IMAP4
都采用基于TCP连接的客户/服务器方式。POP3 使用熟知端口 110,IMAP4 使用熟知端口 143。
邮局协议POP
邮局协议 POP(Post Office Protocol),POP3 是其第三个版本,是因特网正式标准。用于从邮件服务器检索电子邮件。当使用电子邮件客户端从邮件服务器下载邮件时,该客户端会使用 POP3
协议。
POP3
协议允许将邮件从服务器下载到本地计算机,并从服务器上删除这些邮件。但用户只能以下载并删除方式或下载并保留方式,从邮件服务器下载邮件到用户方计算机。不允许用户在邮件服务器上管理自己的邮件。(例如创建文件夹,对邮件进行分类管理等)
POP3
基于 TCP 协议,工作在端口110(明文)或端口 995(加密)。其工作过程为:
-
客户端与服务器建立 TCP 连接。
-
客户端发送用户名和密码进行认证。
-
客户端可以列出邮件列表、下载邮件或删除邮件。
-
完成操作后,客户端发送
QUIT
命令断开连接。
因特网邮件访问协议IMAP
因特网邮件访问协议 IMAP(Internet Message Access Protocol),IMAP4
是其第四个版本,目前还只是因特网建议标准。它是功能比 POP3
强大的邮件读取协议。用户在自己的计算机上就可以操控邮件服务器中的邮箱,就像在本地操控一样,而无需将邮件下载到本地。因此 IMAP
是一个联机协议。
IMAP
基于 TCP 协议,工作在端口143(明文)或端口993(加密)。其工作过程为:
-
客户端与服务器建立 TCP 连接。
-
客户端发送用户名和密码进行认证。
-
客户端可以列出邮箱、选择邮箱、检索邮件、标记邮件等。
-
完成操作后,客户端发送
LOGOUT
命令断开连接。
基于万维网的电子邮件
通过浏览器登录(提供用户名和口令)邮件服务器万维网网站就可以撰写、收发、阅读和管理电子邮件。这种工作模式与 IMAP
很类似,不同的是用户计算机无需安装专门的用户代理程序,只需要使用通用的万维网浏览器。
邮件服务器网站通常都提供非常强大和方便的邮件管理功能,用户可以在邮件服务器网站上管理和处理自己的邮件,而不需要将邮件下载到本地进行管理。
用户在发送和接收邮件时,与服务器之间都使用的是 HTTP 超文本传送协议,而不需要使用 SMTP 和 POP3协议。若用户使用的邮件服务器不同,则邮件服务器使用 SMTP 协议将邮件发送给另一个用户的邮件服务器。
相关文章:
计算机网络:应用层 —— 电子邮件
文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件(E-mail)是因特网上最早…...
Vue3 + Spring WebMVC 验证码案例中的跨域问题与解决方法
最近在基于vue3 SpringWebMVC前后端分离的开发环境中实现一个验证码的案例,在开发过程中遇到了一些复杂的跨域问题,现已解决,故将解决方法分享,希望能帮到有需要的人。 出现的问题: 对于验证码的实现,我选…...
【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Comfy UI 快捷键
Comfy UI 页面的快捷键操作(记录下,以防忘记): 捷径命令Ctrl Enter将当前图表排队等待生成Ctrl Shift Enter将当前图表排成第一个生成图表Ctrl Z/Ctrl Y撤消/重做Ctrl S保存工作流程Ctrl O加载工作流Ctrl A选择所有节点A…...
【C++】Arrays
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、一维数组的定义与初始化1.1、一维数组的定义1.2、一维数组的初始化 2、一维数组的使用3、一维数组与函数4、二维数组4.1、二维数组的定义4.2、二维数组的初始…...
EX_25/2/24
写一个三角形类,拥有私有成员 a,b,c 三条边 写好构造函数初始化 abc 以及 abc 的set get 接口 再写一个等腰三角形类,继承自三角形类 1:写好构造函数,初始化三条边 2:要求无论如何,等腰三角形类对象&#x…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
代码随想录D52-53 图论 Python
目录 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104. 建造最大岛屿 101. 孤岛的总面积 要点: 整体来说是一个图着色的问题。 这道题目的思路符合直觉,但代码实现会和直觉有差别。如果仅使用visit记录不使用着色,会遇到非常多的…...
机器学习(部分算法、模型)
一、KNN 算法 原理 K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别; 如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别 比如: 有10000个样…...
axios几种请求类型的格式
Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…...
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密) 前言 在SpringBoot的项目开发中,大多数情况下 yml 配置文件中存储的密码均以明文形式展示,这种方式显然存在较大的安全隐患。一旦有开发人员离职&…...
【C语言】指针笔试题
前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…...
力扣 下一个排列
交换位置,双指针,排序。 题目 下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列&…...
Three.js 快速入门教程【八】常见材质类型
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
python~http的请求参数中携带map
背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...
爬虫第九篇-结束爬虫循环
最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…...
考研/保研复试英语问答题库(华工建院)
华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…...
《Effective Objective-C》阅读笔记(中)
目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...
前端如何解决跨域
解决前端跨域问题有多种方法 JSONP:利用 <script> 标签的跨域能力,通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求,安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…...
【HDLbits--Comb组合逻辑】
HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中,组合逻辑(Combinational Logic)是指输出仅依赖于当前输入的逻辑电路,没有记忆功能(即没有状态存储)。组合逻辑的特点是: 无时钟信号…...
如何在 Linux 上安装和配置 Zsh
文章目录 如何在 Linux 上安装和配置 Zsh1. 安装 Zsh1.1 在 Ubuntu/Debian 上安装1.2 在 CentOS/RHEL/Fedora 上安装1.3 在 Arch Linux 上安装1.4 验证 Zsh 安装 2. 设置 Zsh 为默认 Shell2.1 验证默认 shell 3. 配置 Zsh3.1 使用 Oh My Zsh3.1.1 安装 Oh My Zsh3.1.2 启用插件…...
Chromedriver与Chrome版本映射表
Chromedriver与Chrome版本映射表如下: Chrome 71-73版本对应Chromedriver 2.46Chrome 70-72版本对应Chromedriver 2.45Chrome 69-71版本对应Chromedriver 2.44Chrome 68-70版本对应Chromedriver 2.43Chrome 67-69版本对应Chromedriver 2.42…...
HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒
一、引言 在 HarmonyOS 那丰富多彩的系统界面中,从简洁直观的应用图标,到交互流畅的操作菜单,再到生动形象的图文展示,每一处细节都经过精心雕琢,为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…...
06C语言——指针
一、指针入门 (1)、准备知识 0、图解: 1、内存地址 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址:系统为了便于区分每一个字节而对…...
Ubuntu DeepSeek磁盘空间不够解决办法
标签: Ubuntu; DeepSeek磁盘空间不够解决办法;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题:Ubuntu 22, DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统,台式…...
东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急
《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...
Qt layout
文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结:示例代码说明:结论: Qt layout 在 Qt 中,当调用 widget->setLayout(layout) 时,layout 的父对象会被自动设置为该 widget…...
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程…...
基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Android MMKV集成指南
首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...
React七Formik
Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理,表单验证以及表单提交。Formik支持React中的所有表单元素和事件,可以很好地与React生态系统中的其他库集成。同时,Formik还提供了一些高级功能…...
5分钟使用Docker部署Paint Board快速打造专属在线画板应用
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...
可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫
一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...
【深度学习神经网络学习笔记(三)】向量化编程
向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术,尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…...
PHP入门基础学习四(PHP基本语法)
运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...
【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...
简单理解Oracle中的latch
可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch: 1、 什么是 Latch? 打个比方,假设数据库的某个内存区域(比如缓存的数据块)是小卖部货架上的最后一包辣条,Latch 就像是货架前的一个狭窄通道&a…...
hbase集群部署
1.hbase集群的搭建(以及内部逻辑) 虽然Hmaster有多个,但是属于热备,起作用的就active上的这个。 部署流程: 因为我配置的hadoop是一个非HA的,所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…...
塔能物联运维保障智慧地下停车场安全与高效
一、智慧地下停车场安全在城市升级改造中的关键地位 随着城市的不断发展和升级改造,智慧地下停车场的重要性日益凸显。在现代城市中,土地资源愈发珍贵,地下停车场成为解决停车难题的关键设施。然而,停车场的安全问题是其正常运行和…...
面试八股文--数据库基础知识总结(2) MySQL
本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…...
深入理解指针2
深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外, 1.sizeof(数组名),sizeof操作符统计的是整个数组的大小,并不是第一个元素…...
QT各种版本下载安装
参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…...
java进阶学习脑图
今天开始分享我的第一篇博客,先放上我自己花费一个月完成的java进阶学习脑图吧! 谁都想像R大一样对JVM可以知无不言,言无不尽; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发; 但是,不能只停留在想…...
Spring 原始注解详解与实战指南
📝 1. 前言 在 Spring 框架的发展过程中,注解的引入大大简化了配置,提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解,包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等,…...
uniapp封装请求
在uniapp中封装HTTP请求,通常我们会使用uni.request方法。uni.request是uni-app提供的一个网络请求API,可以用来发送各种类型的HTTP请求(GET、POST、PUT、DELETE等)。下面是如何在uniapp中封装一个通用的HTTP请求方法,…...
YOLOv10 解析与地平线 征程 6 模型量化
一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推…...
基本网络安全的实现
基本网络安全的实现 一 :AAA AAA 是Authentication,Authorization and Accounting(认证、授权和计费)的简 称,它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架, 它是对网络安全…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
Java数据结构第十四期:走进二叉树的奇妙世界(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树OJ练习题 1.1. 相同的树 1.2. 另一棵树的子树 1.3. 翻转二叉树 1.4. 平衡二叉树 1.5. 对称二叉树 一、二叉树OJ练习题 1.1. 相同的树 判断两棵树是否相同,我们是否只能遍历一…...
GO 进行编译时插桩,实现零码注入
Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...