版本更新
- V1.0.2 直播与CDN网络、短视频与CDN网络
- V1.0.1 添加DNS、CDN部分
- V1.0.0
========================
核心理解:网络层、传输层、应用层各个层次的特点。
面向不靠谱设计,TCP协议充满设计的魅力。
========================
一、网络层
-
常用协议:IP协议(Internet Protocol)是网络层的核心协议,负责在不同网络之间传输数据包。IP协议提供不可靠的、无连接的数据包传输服务。
-
网络层的特点:
- 存储与转发:网络层设备(如路由器)在接收到数据包时,会暂时存储数据包,然后根据路由表的指示将其转发到下一跳。
- 无连接性:IP协议不需要在发送数据之前建立连接,数据包可以独立地传输到目标。
- 不可靠性:网络层不保证数据包的可靠传输,数据包可能会丢失、重复、或以错误的顺序到达目的地。
-
网络层的问题:
- 丢包:由于网络拥塞、设备故障或其他原因,数据包可能会在传输过程中丢失。
- 乱序到达:数据包可能会按照不同的路径到达目的地,导致接收顺序与发送顺序不同。
二、传输层
1. UDP(User Datagram Protocol)
-
特点:
- 协议的实现是操作系统内核。
- UDP是一个简单的、无连接的传输层协议。
- 在IP协议之上增加了端口号,以便将数据包传递到主机上的特定进程。
- 不提供可靠性保障,不负责数据包的重传、排序或错误检测。
-
优点:
- 由于不需要建立连接和维护状态,UDP传输速度快,延迟低。
- 适合要求实时性高、对数据传输可靠性要求较低的应用,如音视频流媒体、在线游戏、DNS查询等。
2. TCP(Transmission Control Protocol)
- 协议的实现是操作系统内核,难以升级,这是h3从TCP转向UDP的重要原因,稳定传输功能在应用层重新实现,升级方便。
- TCP的优势:TCP通过一系列机制将下层不可靠的IP服务转变为可靠的传输服务。
- 实现方式:
- 序号和确认应答:每个TCP报文段都有一个序号,接收方通过确认应答(ACK)告知发送方已接收的序号,以确保数据按顺序到达。
- 超时重传:发送方设置定时器,如果在规定时间内未收到确认应答,则认为数据丢失并重传。
- 流量控制:使用滑动窗口机制,接收方通过通告窗口大小控制发送方的数据流量,防止接收方缓冲区溢出。
- 拥塞控制:包括慢启动、拥塞避免、快速重传和快速恢复等算法,以动态调整发送速率,避免网络拥塞。
- 连接管理:通过三次握手建立连接,确保双方准备就绪;通过四次挥手释放连接,确保数据传输完成并释放资源。
3. TLS/SSL
通过第三方验证的方式来保证通信双方的安全。
三、应用层
- HTTP/HTTPS
- WebSocket:全双工通信通道。
- DNS:DNS协议用于将域名解析为IP地址,使得用户可以通过域名访问网站。
四、DNS和CNAME
1. CNAME
- DNS 最初的规范 RFC 1034 和 RFC 1035,发布于 1987 年,其中就包含了 CNAME 记录的定义。
- 目的:
- 别名管理:允许为同一台服务器或资源创建多个域名,而不需要为每个域名都创建单独的 A 记录。
- 简化管理:当需要更改 IP 地址时,只需更改一处,而不是更新所有指向该 IP 的记录。
- 服务迁移:便于将服务从一个域名迁移到另一个域名,而不影响用户访问。
- 支持第三方服务:例如,集成 CDN 或邮件服务时,可以方便地将域名指向服务提供商的域名。
- 包含CNAME的域名解析过程
- 当 DNS 服务器收到一个域名查询请求时,它首先检查是否有该域名的 CNAME 记录。
- 如果存在 CNAME 记录:
- DNS 服务器会返回 CNAME 记录指向的域名(规范名称)。
- 然后,DNS 解析器会继续查询这个规范名称。
- 如果不存在 CNAME 记录,或者在解析 CNAME 指向的域名时:
- DNS 服务器会查找 A 记录(IPv4)或 AAAA 记录(IPv6),这些记录直接将域名映射到 IP 地址。
- 最终,DNS 解析器会得到一个 IP 地址,并将其返回给请求的客户端。
2. DNS
**特别说明:现实中要比这个复杂的多。这里的描述不一定准确。**理解了这里的内容,后面会说两个具体的应用。
- 树状网络结构进行组织。
- 域名解析过程:
- 先本地缓存查找,有则向下级返回结果;
- 如果没有则向上级查找;等到响应以后先缓存到本地;然后向下级返回结果。
- 传输层采用的是:UDP
- 如何查找DNS网络的入口
- 手动配置
- 通过DHCP自动配置DNS服务器地址
- DNS的效性性(DNS查询结构有一定延时)
- TTL(Time To Live): 缓存有效时间
- 定期刷新: 一些DNS服务器会在TTL到期之前主动刷新常用记录。
- 缓存清理: DNS服务器会定期清理过期的缓存条目。
- 强制刷新: 管理员可以手动刷新DNS缓存,确保获取最新记录。
- 负缓存: 对于不存在的域名,也会缓存一段时间,避免重复查询。
- DNS服务存储的记录类型
- A记录:将域名映射到IPv4地址
- AAAA记录:将域名映射到IPv6地址
- CNAME记录:创建域名别名
- CAA记录:指定哪些CA可以为域名颁发SSL证书
- NS记录:指定域名的权威名称服务器(这个是CDN会用到)
- 还有其他的。
- DNS本地缓存的数据结构
- 结合和树状结构和HASH
struct DNSNode { char* name; DNSRecord* records; HashMap* childrenHash; DNSNode* parent; }; struct DNSCache { DNSNode* root; HashMap* globalHash; }; - 特点:根据hash可以全局快速查找;根据树状结构可以方便管理
- 查找过程:
- 首先在全局哈希表中查找完整域名
- 如果未找到,则从根节点开始,逐级在每层的哈希表中查找(通配符类域名解析)。
- 查找的时间复杂度
- 对于常见查询,时间复杂度接近O(1)
- 最坏情况下(需要遍历整个树),复杂度为O(log n),其中n是域名的层级数
- 结合和树状结构和HASH
3. DEMO
Root (HashMap: {})
└── com (HashMap: {"example": ->})
└── example (HashMap: {"www": ->, "mail": ->, "blog": ->, "api": ->})
│ A Record: 93.184.216.34 ## IPv4: example.com -> 93.184.216.34
│ AAAA Record: 2606:2800:220:1:248:1893:25c8:1946 ## IPv6
│ NS Records:
│ - ns1.example.com
│ - ns2.example.com
│
├── www ## cname: www.example.com -> example.com
│ CNAME Record: example.com
│
├── mail
│ A Record: 93.184.216.35 ## IPv4: mail.example.com -> 93.184.216.35
│ AAAA Record: 2606:2800:220:1:248:1893:25c8:1947 ## IPv6
│
├── blog ## cname: blog.example.com -> example.com
│ CNAME Record: example.com
│
├── api
│ A Record: 93.184.216.36 ## IPv4: api.example.com -> 93.184.216.36
│ AAAA Record: 2606:2800:220:1:248:1893:25c8:1948 ## IPv6
│
├── ns1
│ A Record: 192.0.2.1 ## IPv4: ns1.example.com -> 192.0.2.1
│ AAAA Record: 2001:db8::1 ## IPv6
│
└── ns2
A Record: 192.0.2.2 ## IPv4: ns2.example.com -> 192.0.2.2
AAAA Record: 2001:db8::2 ## IPv6
Global HashMap:
{
"example.com": -> example node,
"www.example.com": -> www node,
"mail.example.com": -> mail node,
"blog.example.com": -> blog node,
"api.example.com": -> api node,
"ns1.example.com": -> ns1 node,
"ns2.example.com": -> ns2 node
}
4. NS
- 通过 NS(Name Server)记录来指定域名的权威名称服务器。NS 记录告诉 DNS 系统哪些服务器是特定域名的权威名称服务器。
- 权威名称服务器:权威名称服务器是对特定域名空间中的 DNS 记录有最终决定权的服务器。它包含了该域名的所有官方 DNS 记录,并被认为是这些记录的权威来源。
- NS的触发添加
- 顶级域名查询:当DNS解析器开始查询一个新的顶级域名时,它会首先查询根服务器。根服务器会返回该顶级域的NS记录,指向负责管理该顶级域的权威名称服务器。
- 子域委派:当一个域名的权威服务器收到对其不直接负责的子域的查询时,它会返回该子域的NS记录,指向负责管理该子域的名称服务器。
- 缓存过期:当DNS解析器中某个域名的缓存过期时,它需要重新查询该域名的NS记录,以确保它仍在使用正确的权威名称服务器。
- NS DEMO解析过程:
- 解析器查询根服务器,获取 .com 的NS记录
- 解析器查询 .com 的NS服务器,获取 example.com 的NS记录
- 解析器查询 example.com 的NS服务器,获取 blog.example.com 的A记录
5. 解析过程中的递归与迭代
- 递归:本节点没有去上游节点查找。
- 迭代:通过NS的引导,一步一步找到权威名称服务。
五、CDN
1. 角色
- 浏览器(客户端):
- 请求CDN资源;
- DNS解析
- 访问:static.yspcdn.com
- 开发者(CDN用户):
- 配置域名:static.yspcdn.com
- 设置CNAME记录,将static.yspcdn.com指向g.alicdn.com
- 配置CDN缓存规则、HTTPS证书等
- 选择内容源站(OSS或自有源站)
- CDN服务提供商:
- 管理CDN域名:g.alicdn.com
- 维护全球节点网络
- 提供DNS负载均衡
- 缓存和分发内容
- 权威DNS服务器:
- 提供最终的DNS解析结果
- 实现智能DNS解析和负载均衡
2. DNS解析过程
- 浏览器发起对static.yspcdn.com的DNS查询
- 本地DNS服务器接收查询,检查缓存
- 如果没有缓存,本地DNS服务器开始递归查询
- 解析static.yspcdn.com,得到CNAME记录指向g.alicdn.com
- 继续解析g.alicdn.com
- 通过NS记录找到g.alicdn.com的权威名称服务器(CDN提供商的DNS服务器)
- CDN的权威名称服务器根据以下因素返回最优CDN节点IP:
- 客户端地理位置
- 网络状况
- CDN节点负载情况
- 节点健康状态
- DNS解析结果返回给浏览器
3. 内容上传形式
- OSS(对象存储服务)方式:
- 开发者将内容上传到OSS
- 配置CDN的源站为OSS bucket
- CDN直接从OSS获取内容
- 优点:简单、可靠、易于管理
- 适用:静态内容、大文件存储
- 自有源站方式:
- 内容存储在开发者自己的服务器上
- 配置CDN的源站为自有服务器地址
- 请求流程:浏览器 -> CDN -> 源站服务器
- 优点:灵活性高,可处理动态内容
- 适用:需要实时生成的内容、动态网站
4. 直播&CDN网络
- 流媒体上传到CDN
- 推流过程:
- 主播端使用编码器(如OBS、XSplit)或移动设备采集音视频。
- 编码器将音视频数据编码成流媒体格式(如RTMP、HLS、DASH)。
- 主播端将编码后的数据推送到CDN的入口节点(也称为边缘推流节点)。
- 推流协议:
- RTMP (Real-Time Messaging Protocol):最常用的直播推流协议。
- WebRTC:支持低延迟的点对点传输。
- SRT (Secure Reliable Transport):适用于不稳定网络环境的安全可靠传输协议。
- 推流地址:
- CDN提供商会为用户分配一个推流地址(URL)。
- 通常格式为:rtmp://push.cdnprovider.com/live/streamkey。
- 推流过程:
- CDN分发流媒体
- 接收和处理:
- CDN入口节点接收推流数据。
- 对接收到的流进行处理,如转码、格式转换等。
- 分发网络:
- CDN使用内部的分发网络将流媒体数据传输到各个边缘节点。
- 采用树状或网状拓扑结构,确保高效传输。
- 边缘节点分发:
- 观众通过最近的CDN边缘节点获取直播流。
- CDN根据观众的地理位置、网络状况选择最优的边缘节点。
- 接收和处理:
- CDN直播特性:低延迟、高并发、动态扩展、多码率自适应、多码率自适应。
- 直播CDN的优化策略
- 边缘缓存:
- 虽然是实时流,CDN仍会在边缘节点短暂缓存几秒钟的内容,以应对网络波动。
- 智能路由:
- 使用高效的路由算法,选择最优的传输路径。
- 协议优化:
- 在推流和分发过程中使用优化的传输协议,如QUIC。
- 边缘缓存:
5. 短视频&CDN网络
- 主要的问题是CDN节点的存储
- 预热:将热点视频预热到CDN边缘节点。
ER&CDN网络
- ER:边缘计算
- 除了CDN的能力,多了一个计算,并且对计算结果进行缓存。