TLS(Transport Layer Security,传输层安全性协议) 是现代互联网安全的基石。简单来说,它的使命就是给原本“裸奔”的 TCP 流量穿上一层防弹衣。


1. TLS 到底解决了什么问题?

在没有 TLS 的年代(比如纯 HTTP),信息传输面临三大威胁:

  • 窃听(Eavesdropping):第三方可以看到你的密码、信用卡号。
  • 篡改(Tampering):第三方可以修改你发送的内容。
  • 冒充(Impersonation):你以为在和银行通信,其实对方是个钓鱼网站。

TLS 的三个核心特性正是为了对症下药:

  1. 机密性(Confidentiality):通过对称加密保障内容只有双方能看懂。
  2. 完整性(Integrity):通过**摘要算法(MAC)**确保内容没被动过。
  3. 身份认证(Authentication):通过数字证书验证对方的真实身份。

2. TLS 的两阶段工作流程

TLS 的运行可以分为两个关键阶段:握手阶段(Handshake)记录阶段(Record Protocol)

第一阶段:握手(协商“保险箱”钥匙)

握手是 TLS 最精彩的部分,其目的是为了在不安全的网络环境下,安全地生成一把只有通信双方知道的对称加密密钥

以主流的 TLS 1.2 为例(TLS 1.3 进行了简化):

  1. Client Hello:客户端给服务端打招呼,告诉对方自己支持哪些加密套件(Cipher Suites)和一个随机数 A
  2. Server Hello:服务端从中选出一套算法,给回一个随机数 B,并附上自己的数字证书
  3. 验证与密钥交换
    • 客户端检查证书是否合法(是否过期、颁发机构是否可信)。
    • 如果证书没问题,客户端利用从证书里拿到的公钥,加密第三个**预主随机数(Pre-master Secret)**发给服务端。
  4. 生成主密钥:双方现在都有了随机数 A、B 和 预主随机数。它们通过特定的函数把这三个数揉在一起,生成最终的对称密钥(Session Key)
  5. 确认开启加密:双方互相发一个“Finished”消息,表示以后的聊天都用这把新钥匙加密了。

为什么不全程用非对称加密(公钥/私钥)?
因为非对称加密太慢了!TLS 极其聪明:先用复杂的非对称加密交换钥匙,一旦钥匙换好了,后面大规模的数据传输全部改用极快的对称加密

非常敏锐的观察!在网络协议的学习中,大家往往会被握手阶段(Handshake Protocol)复杂的数学交换所吸引,而忽略了默默承载数据的记录阶段(Record Protocol)

如果说握手阶段是“谈生意、定合同”,那么记录阶段就是“正式履行合同、运送货物”。


第二阶段:记录协议(Record Protocol)

记录层位于 TLS 握手协议的下方,直接承载在上层协议(如 HTTP, FTP)和下层传输协议(TCP)之间。它的主要任务是:将上层应用数据安全地封装成一个个“记录包”。

记录阶段的四个关键步骤

当你的浏览器想要发送一段 HTTP 请求(比如 GET /index.html)时,记录层会按顺序执行以下操作:

  1. 分段(Fragmentation)
    上层数据可能很大,记录层会将其切分成较小的块(每个记录块通常不超过 16KB),以便于处理。

  2. 压缩(Compression - 可选且现代已弃用)
    早期的 TLS 支持在记录层压缩,但由于存在安全漏洞(如 CRIME 攻击),现代 TLS(包括 TLS 1.3)已经禁止了这一步

  3. 计算 MAC / 添加认证标签(Integrity)

    • 在 TLS 1.2 中:使用握手阶段协商出的密钥和 HMAC 算法为数据计算一个“哈希值”。
    • 在 TLS 1.3 中:采用更先进的 AEAD(关联数据的认证加密) 模式。这一步确保了:如果黑客在传输过程中改动了一个比特位,接收方在校验时就会发现。
  4. 加密(Encryption)
    使用握手阶段生成的对称密钥(如 AES),对“数据 + 认证标签”进行整体加密。此时,数据变成了只有持有钥匙的人才能解开的“密文”。


记录包的结构(抓包视角)

如果你用 Wireshark 观察一个 TLS 记录包,你会发现它通常包含一个简短的头部(Header)

字段 长度 说明
Type 1 Byte 区分包类型(22 是握手包,23 是应用数据包)
Version 2 Bytes TLS 版本(如 0x0303 代表 TLS 1.2)
Length 2 Bytes 后面加密数据的长度
Encrypted Data 变长 真正的加密荷载(含填充和 MAC)

为什么记录阶段很重要?

  1. 防重放攻击:记录层会给每个包维护一个隐式的序列号。即使黑客截获了一个合法的加密包并原封不动地再次发送,接收方也会因为序列号对不上而丢弃它。
  2. 前向安全性:虽然记录阶段使用对称加密,但它依赖于握手阶段产生的临时密钥。
  3. 效率优化:由于记录块大小上限的存在,TLS 可以在接收到部分数据时就开始解密,而不必等待整个网页下载完,这提升了流式传输的效率。

总结

  • 握手阶段:确定算法、交换随机数、验证身份、生成密钥。(逻辑核心
  • 记录阶段:分段、计算校验、加密、增加包头。(执行核心

3. 数字证书:如何证明“你是你”?

你可能会问:“如果黑客伪造一个服务端发给我公钥怎么办?”
这就是 CA(数字证书认证机构) 的作用。

  • CA 签名:服务端会将自己的信息和公钥交给 CA。CA 用自己的私钥对这些信息进行哈希后签名。
  • 客户端验证:你的浏览器/系统里内置了这些顶级 CA 的公钥。只要用 CA 的公钥能解开这个签名,就证明这个服务器的身份是经过权威认证的。

4. TLS 1.2 vs 1.3:时代的进步

目前 TLS 1.3 已经非常普及,它相比 1.2 有两个巨大的飞跃:

  1. 更快的速度(1-RTT):TLS 1.2 握手需要往返两次(2-RTT),而 1.3 只需要一次往返就能建立连接。
  2. 安全性升级:删除了很多陈旧、不安全的加密算法(比如 MD5, SHA-1, RSA 密钥交换等),强制要求具有**前向安全性(Forward Secrecy)**的算法(如 ECDHE)。

总结

如果用一个生活中的例子来类比:

  • TCP 是快递公司,负责把箱子送到目的地。
  • TLS 则是你在寄快递前,先和收件人商量好一个复杂的暗号(握手),并把信件放进一个坚固的保险箱里(加密)。即使快递员(黑客)半路截获了箱子,他也打不开,更没法伪造里面的内容。

TCP/IP 五层模型协议全景图

5. 应用层 (Application Layer)

功能: 直接为用户的应用程序提供服务。这是你最常打交道的一层。

  • HTTP / HTTPS:网页浏览的核心(你刚才提到的 Google 访问)。
  • DNS:域名解析(把域名变成 IP)。
  • FTP / SFTP:文件传输。
  • SMTP / POP3 / IMAP:电子邮件收发。
  • SSH:远程加密登录服务器。
  • DHCP:自动给你的电脑分配 IP 地址。

4. 传输层 (Transport Layer)

功能: 负责端到端的数据传输,确保数据到达正确的端口。

  • TCP (Transmission Control Protocol):可靠传输。像发挂号信,有握手、序号、确认和重传机制。
  • UDP (User Datagram Protocol):不可靠传输。像发普通平信,速度快但不管对方收没收到(如 DNS 查询、视频直播)。

3. 网络层 (Network Layer)

功能: 负责寻址和路由选择,决定数据包在互联网中怎么走。

  • IP (IPv4 / IPv6):核心协议,负责通过 IP 地址标识主机。
  • ICMP:网络探测协议。你常用的 ping 命令就是基于它,用来检查网络通不通。
  • ARP (Address Resolution Protocol)关键桥梁。负责把 IP 地址翻译成 MAC 地址(它是网络层和链路层的交界)。
  • IGMP:组播管理。

功能: 负责在同一个局域网(LAN)内的两个相邻节点之间传输数据。

  • Ethernet (以太网):家里插网线的物理标准和协议。
  • Wi-Fi (802.11):无线局域网协议。
  • PPP (Point-to-Point Protocol):拨号上网常用的点对点协议。
  • VLAN:虚拟局域网。

1. 物理层 (Physical Layer)

功能: 定义了接口的机械、电气特性,处理纯粹的比特流(0 和 1)。

  • 协议/标准:RJ-45(网口标准)、光纤接口标准、USB标准、各种编码调制方式(如 QAM)。

TCP/IP 五层模型协议

层次 传输单位 核心协议示例 关注点
应用层 消息 (Message) HTTP, DNS, DHCP 数据的内容和格式
传输层 段 (Segment/Datagram) TCP, UDP 端口号、可靠性
网络层 包 (Packet) IP, ICMP, ARP IP地址、路径选择
数据链路层 帧 (Frame) Ethernet, Wi-Fi MAC地址、物理寻址
物理层 比特 (Bit) 1000Base-T, 802.11n 电压、光脉冲、线缆

我们以五层模型为标准,把你家里的设备“对号入座”:


1. 硬件设备与协议层的对应关系

设备名称 对应主要层次 功能描述
电脑/手机 所有层 (1-5层) 它是终端设备。从最底层的网卡信号到最顶层的浏览器软件,它完整运行整套 TCP/IP 协议栈。
路由器 (Router) 网络层 (第3层) 核心功能是路由转发NAT(网络地址转换)。它根据 IP 地址决定数据包该往哪走,并连接内网和外网。
交换机 (Switch) 数据链路层 (第2层) 核心功能是局域网内寻址。它通过 MAC 地址 把数据准确地发给家里某台特定的电脑。
光猫 (Modem) 物理层 (第1层) 核心功能是调制解调。它把家里的电信号/数字信号变成光纤里的光信号。

注意: 现在家里的“路由器”通常是三合一的(路由器+交换机+无线接入点),有的甚至集成了光猫功能。


2. 什么是交换机 (Switch)?

—— 它是局域网内部的“快递分拣员”

交换机工作在 第2层(数据链路层)

  • 功能:它维护一张 MAC 地址表。当一个数据帧进入交换机时,它会看一眼“目的 MAC 地址”,然后直接把包甩给对应的那根网线,而不是广播给所有人。
  • 在家的位置:你路由器背后的那 4 个 LAN 口,其实内部就是一个集成的交换机。

3. 什么是网关 (Gateway)?

—— 它是局域网的“海关/大门”

“网关”其实是一个逻辑概念,但在家庭网络里,路由器就是你的网关

  • 功能:当你电脑发现要访问的 IP(比如 8.8.8.8)不在本地局域网时,它不知道路该怎么走,于是就把包交给“网关”。
  • 形象理解:你在家里(局域网)说话,大家都能听到;但你想给远在国外的同学写信,你必须把信件投递到邮局(网关),由邮局负责跨网络转运。

4. 完整的家庭上网路径

当你输入网址,数据包的“奇幻漂流”如下:

  1. 电脑:封装好 IP 数据包。
  2. 网关(路由器逻辑):电脑通过 ARP 协议 找到网关的 MAC 地址,把包发给路由器。
  3. 交换机(路由器物理口):路由器内部的交换芯片把信号传给处理器。
  4. 路由器(三层转发):路由器执行 NAT,把你的私网 IP 换成公网 IP,重新封装,发给 WAN 口。
  5. 光猫:把这些电信号转换成光脉冲,通过光纤传向运营商(ISP)。

总结一下:

  • 交换机:管“家里人”怎么互相传东西(看 MAC 地址)。
  • 路由器:管“家里人”怎么去“外面世界”(看 IP 地址)。
  • 网关:就是那扇通往外面的“门”。

交换机 vs. 路由器的本质区别

为了让你在考试或实际排障中不出错,记住这个本质区别

特性 交换机 (Switch) 路由器 (Router)
识别身份 MAC 地址 (物理地址) IP 地址 (逻辑地址)
隔离范围 隔离冲突域 (Collision Domain) 隔离广播域 (Broadcast Domain)
工作目的 维持一个小圈子内部的通信 连接两个完全不同的网络

为什么路由器要隔离“广播域”?因为如果全世界的电脑都接在交换机上,某台电脑发一个寻找邻居的广播包,全世界的电脑都要收一下,那互联网瞬间就会被这些广播垃圾信息塞满瘫痪。所以,**路由器(网关)**的作用就是把广播挡在门里。

1. 应用层 (Application Layer)

动作:封装 DNS 请求报文

当你输入网址时,浏览器发现本地缓存没有该 IP,于是调用操作系统的解析器。

  • 生成内容:产生一个 DNS 查询报文,里面包含关键信息:“请问 www.google.com 的 IP 地址是多少?”
  • 协议:DNS 协议(通常使用 UDP 协议,因为查询任务小、要求快)。

2. 传输层 (Transport Layer)

动作:添加端口号(数据段 Segment)

数据包下移到传输层。

  • 封包:给 DNS 报文加上一个 UDP 首部
  • 关键信息
    • 源端口:客户端随机开启的一个高端口(如 54321)。
    • 目的端口53(这是 DNS 服务器的标准监听端口)。
  • 意义:确保数据回到你的电脑时,能准确找到是哪个进程在等这个结果。

3. 网络层 (Network Layer)

动作:添加 IP 地址(数据包 Packet)

数据下移到网络层。

  • 封包:加上 IP 首部
  • 关键信息
    • 源 IP:你电脑的局域网 IP(如 192.168.1.5)。
    • 目的 IP:DNS 服务器的 IP(如 Google 的 8.8.8.8 或运营商提供的 DNS)。
  • 路由决策:路由器会根据这个目的 IP,决定把包发往哪个网关。

动作:添加 MAC 地址(数据帧 Frame)

这是最容易被忽略的一步,也是局域网传输的核心。

  • 封包:加上 以太网首部FCS 校验序列
  • 关键信息
    • 源 MAC:你电脑网卡的物理地址。
    • 目的 MAC下一跳设备的 MAC 地址(通常是你的家用路由器/网关)。
    • 注意:这里如果不知道网关的 MAC,会先触发一个 ARP 协议去询问。

核心节点:路由器的 NAT 转换

当 DNS 请求(UDP 包)到达路由器时,会发生以下变换:

属性 进入路由器前 (LAN) 离开路由器后 (WAN)
源 IP 你的私网 IP (如 192.168.x.x) 路由器的公网 IP
源端口 你的原始端口 (如 54321) 路由器 NAT 映射的新端口
目的 IP DNS 服务器 IP (8.8.8.8) 不变
目的 MAC 路由器的内网 MAC 下一跳(ISP 运营商)的 MAC

为什么要改端口? 因为如果宿舍/实验室里多个人同时访问 Google,路由器必须通过不同的公网端口来区分回传的 DNS 响应应该给哪台电脑。


5. 物理层 (Physical Layer)

动作:比特流传输

  • 转换:将上述完整的“数据帧”转换成电信号、光信号或无线电波(WiFi)。
  • 传输:通过网线或空气发往你的路由器。

6. 到达 DNS 服务器后的“逆向工程”

当数据包经过漫长的互联网路径到达 DNS 服务器后,过程正好相反(解封装):

  1. 物理层:接收电信号,转回二进制。
  2. 数据链路层:拆掉以太网头,检查 MAC 地址对不对,校验数据是否损坏。
  3. 网络层:拆掉 IP 头,看到目的 IP 是自己,于是继续往上送。
  4. 传输层:拆掉 UDP 头,看到目的端口是 53,知道这是给 DNS 服务的。
  5. 应用层:DNS 服务进程读取报文:“哦,他在找 google 的 IP”,然后查表回复。

一、Markdown 是什么?

Markdown 是一种轻量级标记语言,核心思想:

👉 用“接近自然语言”的方式写文档 → 自动转换为 HTML / PDF / 网页

常用于:

  • 技术文档(GitHub)
  • 博客(静态站点)
  • README
  • 笔记(Obsidian / Typora)

二、入门级(必须掌握)

1. 标题

1
2
3
# 一级标题
## 二级标题
### 三级标题

效果:

一级标题

二级标题

三级标题

2. 段落 & 换行

1
2
3
这是第一段

这是第二段

👉 空一行 = 新段落

3. 强调

1
2
3
*斜体*
**加粗**
***加粗斜体***

效果:

斜体
加粗
加粗斜体

4. 列表

无序列表

1
2
3
- 苹果
- 香蕉
- 橘子

有序列表

1
2
3
1. 第一
2. 第二
3. 第三

5. 链接

1
[Google](https://www.google.com)

6. 图片

1
![描述](图片URL)

7. 代码

行内代码

1
使用 `python` 编程

代码块

1
2
3
```python
print("Hello World")
```

8. 引用

1
> 这是引用

效果:

这是引用


9. 分割线

1
---

三、进阶用法


1. 表格

1
2
3
4
| 名字 | 年龄 | 城市 |
|------|------|------|
| 张三 | 18 | 北京 |
| 李四 | 20 | 上海 |

👉 表格使用 | 分割列,- 分割表头和内容,: 表示对齐方式

效果:

名字 年龄 城市
张三 18 北京
李四 20 上海

2. 任务列表(TODO)

1
2
- [x] 已完成
- [ ] 未完成

👉 任务列表使用 - [ ] 开头,[x] 表示已完成,[ ] 表示未完成

效果:

  • 已完成
  • 未完成

3. HTML 混写(关键能力)

Markdown 支持 HTML:

1
<div style="color:red">红色文字</div>

👉 用于:

  • 自定义样式
  • 布局控制

效果:
红色文字

4. 锚点跳转

1
[跳到二级标题](#二级标题)

跳到二级标题

5. 表情符号

😊🎉🎁✔💃👌

👉 详情参考:表情符号

四、高级玩法


1. 数学公式(LaTeX)

很多编辑器支持:

1
2
3
4
5
6
行内公式:$E = mc^2$

块级公式:
$$
\int_a^b f(x) dx
$$

👉 行内公式使用 $ 包裹,块级公式使用 $$ 包裹

效果:

行内公式:$E = mc^2$

块级公式:
$$
\int_a^b f(x) dx
$$


2. Mermaid 图

1
2
3
4
```mermaid
graph TD
A --> B
B --> C

👉 可画:

  • 流程图
  • 架构图
  • 时序图

Mermaid


3. 代码高亮 + 行号

1
2
3
```python {linenos}
def hello():
print("hi")

👉 使用 {linenos} 添加行号

1
2
def hello():
print("hi")

4. 脚注

这是一个说明[^1]

[^1]: 这里是脚注

👉 脚注使用 [^编号] 添加,[编号]: 脚注内容 定义


当你在浏览器输入 www.google.com 时,这不仅仅是一个简单的跳转,而是一次跨越数千公里的、多层协议协同工作的复杂接力。

🏗️ 基础复习:ISO 七层 vs. TCP/IP 四层

虽然 ISO 提出的 OSI 七层参考模型是学术界的标准,但现实中我们使用的是更精简的 TCP/IP 四层(或五层)模型。

OSI 七层模型 TCP/IP 四层模型 核心功能 常见协议/硬件
应用层 / 表示层 / 会话层 应用层 产生原始数据,定义交互规则 HTTPS, DNS, HTTP
传输层 传输层 端到端连接,保证可靠性 TCP, UDP
网络层 网络层 IP寻址,选择路由路径 IP, ICMP, 路由器
数据链路层 / 物理层 网络接口层 帧同步、物理信号传输 以太网, Wi-Fi, 交换机

🚀 深度解析:访问 Google 的数据包之旅

我们将这个过程拆解为三个主要阶段。

1. 第一阶段:DNS 域名解析(寻找 IP 地址)

浏览器不知道 www.google.com 在哪,它需要一个 IP 地址。

  • 应用层:浏览器生成一个 DNS 查询包(问:google 的 IP 是多少?)。
  • 传输层:DNS 主要使用 UDP 协议进行快速查询。数据被封装成 UDP 段。
  • 网络层:打上源 IP 和 DNS 服务器 IP 的标签,封装成 IP 数据包。
  • 解析流程:
  1. 检查浏览器和操作系统本地缓存。
    1. 若无,请求递归 DNS 服务器(通常是你的宽带运营商提供)。
    2. 递归服务器层层上推,询问根域名服务器、TLD (.com) 服务器,最终拿到 Google 的 IP 地址。

2. 第二阶段:TCP 三次握手(建立连接)

拿到 IP 后,客户端需要和服务器“打个招呼”建立可靠通道。

  • 第一次握手 (SYN):客户端发送一个带 SYN=1 标志的 TCP 段给服务器(“我想连你”)。
  • 第二次握手 (SYN+ACK):服务器回复确认(“收到,我准备好了,你呢?”)。
  • 第三次握手 (ACK):客户端再次确认(“收到,我们开始吧!”)。
  • ✨ 封装过程:TCP 段 → IP 包 → 以太网帧(包含 MAC 地址)。

3. 第三阶段:HTTPS 安全连接与数据请求

由于是 HTTPS,在正式传数据前还要进行 TLS 握手(加密过程)。

  1. TLS 握手:
  • 双方交换证书,验证服务器身份。
    • 协商加密算法,生成一个“对称密钥”。此后的所有数据都将被这个密钥加密。
  1. 发送 HTTPS 请求:
  • 应用层:浏览器构造一个 HTTP GET 请求报文。
    • 加密层:TLS 将该报文内容加密。
    • 传输层:TCP 将其切分为段,确保不丢包。
    • 网络层:IP 协议负责把这些段路由到 Google 的数据中心。
    • 数据链路层:通过网线/光纤将电磁信号发出去。

4. 第四阶段:服务器响应与渲染

  • Google 服务器解封数据包,看到 GET 请求。
  • 服务器发回 HTML 代码。
  • 浏览器通过相同的层级结构“剥洋葱”得到 HTML。
  • 浏览器解析 HTML/CSS/JS,最后你看到了搜索页面。

💡 总结:数据包的“剥洋葱”原理

  • 发送时(封装):从上往下,每一层都给数据加一个“信封”(报头)。
  • 接收时(解封):从下往上,每一层都拆开一个“信封”,读取属于自己的控制信息。
0%