前端技术专家面试-网络层&传输层&应用层

158 阅读11分钟

版本更新

  • 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服务转变为可靠的传输服务。
  • 实现方式
    1. 序号和确认应答:每个TCP报文段都有一个序号,接收方通过确认应答(ACK)告知发送方已接收的序号,以确保数据按顺序到达。
    2. 超时重传:发送方设置定时器,如果在规定时间内未收到确认应答,则认为数据丢失并重传。
    3. 流量控制:使用滑动窗口机制,接收方通过通告窗口大小控制发送方的数据流量,防止接收方缓冲区溢出。
    4. 拥塞控制:包括慢启动、拥塞避免、快速重传和快速恢复等算法,以动态调整发送速率,避免网络拥塞。
    5. 连接管理:通过三次握手建立连接,确保双方准备就绪;通过四次挥手释放连接,确保数据传输完成并释放资源。

3. TLS/SSL

通过第三方验证的方式来保证通信双方的安全。

三、应用层

  1. HTTP/HTTPS
  2. WebSocket:全双工通信通道。
  3. DNS:DNS协议用于将域名解析为IP地址,使得用户可以通过域名访问网站。

四、DNS和CNAME

1. CNAME

  • DNS 最初的规范 RFC 1034 和 RFC 1035,发布于 1987 年,其中就包含了 CNAME 记录的定义。
  • 目的:
    • 别名管理:允许为同一台服务器或资源创建多个域名,而不需要为每个域名都创建单独的 A 记录。
    • 简化管理:当需要更改 IP 地址时,只需更改一处,而不是更新所有指向该 IP 的记录。
    • 服务迁移:便于将服务从一个域名迁移到另一个域名,而不影响用户访问。
    • 支持第三方服务:例如,集成 CDN 或邮件服务时,可以方便地将域名指向服务提供商的域名。
  • 包含CNAME的域名解析过程
    1. 当 DNS 服务器收到一个域名查询请求时,它首先检查是否有该域名的 CNAME 记录。
    2. 如果存在 CNAME 记录:
      • DNS 服务器会返回 CNAME 记录指向的域名(规范名称)。
      • 然后,DNS 解析器会继续查询这个规范名称。
    3. 如果不存在 CNAME 记录,或者在解析 CNAME 指向的域名时:
      • DNS 服务器会查找 A 记录(IPv4)或 AAAA 记录(IPv6),这些记录直接将域名映射到 IP 地址。
    4. 最终,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是域名的层级数

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的触发添加
    1. 顶级域名查询:当DNS解析器开始查询一个新的顶级域名时,它会首先查询根服务器。根服务器会返回该顶级域的NS记录,指向负责管理该顶级域的权威名称服务器。
    2. 子域委派:当一个域名的权威服务器收到对其不直接负责的子域的查询时,它会返回该子域的NS记录,指向负责管理该子域的名称服务器。
    3. 缓存过期:当DNS解析器中某个域名的缓存过期时,它需要重新查询该域名的NS记录,以确保它仍在使用正确的权威名称服务器。
  • NS DEMO解析过程:
    1. 解析器查询根服务器,获取 .com 的NS记录
    2. 解析器查询 .com 的NS服务器,获取 example.com 的NS记录
    3. 解析器查询 example.com 的NS服务器,获取 blog.example.com 的A记录

5. 解析过程中的递归与迭代

  • 递归:本节点没有去上游节点查找。
  • 迭代:通过NS的引导,一步一步找到权威名称服务。

五、CDN

1. 角色

  1. 浏览器(客户端):
    • 请求CDN资源;
    • DNS解析
    • 访问:static.yspcdn.com
  2. 开发者(CDN用户):
    • 配置域名:static.yspcdn.com
    • 设置CNAME记录,将static.yspcdn.com指向g.alicdn.com
    • 配置CDN缓存规则、HTTPS证书等
    • 选择内容源站(OSS或自有源站)
  3. CDN服务提供商:
    • 管理CDN域名:g.alicdn.com
    • 维护全球节点网络
    • 提供DNS负载均衡
    • 缓存和分发内容
  4. 权威DNS服务器:
    • 提供最终的DNS解析结果
    • 实现智能DNS解析和负载均衡

2. DNS解析过程

  1. 浏览器发起对static.yspcdn.com的DNS查询
  2. 本地DNS服务器接收查询,检查缓存
  3. 如果没有缓存,本地DNS服务器开始递归查询
  4. 解析static.yspcdn.com,得到CNAME记录指向g.alicdn.com
  5. 继续解析g.alicdn.com
  6. 通过NS记录找到g.alicdn.com的权威名称服务器(CDN提供商的DNS服务器)
  7. CDN的权威名称服务器根据以下因素返回最优CDN节点IP:
    • 客户端地理位置
    • 网络状况
    • CDN节点负载情况
    • 节点健康状态
  8. DNS解析结果返回给浏览器

3. 内容上传形式

  1. OSS(对象存储服务)方式:
    • 开发者将内容上传到OSS
    • 配置CDN的源站为OSS bucket
    • CDN直接从OSS获取内容
    • 优点:简单、可靠、易于管理
    • 适用:静态内容、大文件存储
  2. 自有源站方式:
    • 内容存储在开发者自己的服务器上
    • 配置CDN的源站为自有服务器地址
    • 请求流程:浏览器 -> CDN -> 源站服务器
    • 优点:灵活性高,可处理动态内容
    • 适用:需要实时生成的内容、动态网站

4. 直播&CDN网络

  1. 流媒体上传到CDN
    1. 推流过程:
      • 主播端使用编码器(如OBS、XSplit)或移动设备采集音视频。
      • 编码器将音视频数据编码成流媒体格式(如RTMP、HLS、DASH)。
      • 主播端将编码后的数据推送到CDN的入口节点(也称为边缘推流节点)。
    2. 推流协议:
      • RTMP (Real-Time Messaging Protocol):最常用的直播推流协议。
      • WebRTC:支持低延迟的点对点传输。
      • SRT (Secure Reliable Transport):适用于不稳定网络环境的安全可靠传输协议。
    3. 推流地址:
      • CDN提供商会为用户分配一个推流地址(URL)。
      • 通常格式为:rtmp://push.cdnprovider.com/live/streamkey。
  2. CDN分发流媒体
    1. 接收和处理:
      • CDN入口节点接收推流数据。
      • 对接收到的流进行处理,如转码、格式转换等。
    2. 分发网络:
      • CDN使用内部的分发网络将流媒体数据传输到各个边缘节点。
      • 采用树状或网状拓扑结构,确保高效传输。
    3. 边缘节点分发:
      • 观众通过最近的CDN边缘节点获取直播流。
      • CDN根据观众的地理位置、网络状况选择最优的边缘节点。
  3. CDN直播特性:低延迟、高并发、动态扩展、多码率自适应、多码率自适应。
  4. 直播CDN的优化策略
    1. 边缘缓存:
      • 虽然是实时流,CDN仍会在边缘节点短暂缓存几秒钟的内容,以应对网络波动。
    2. 智能路由:
      • 使用高效的路由算法,选择最优的传输路径。
    3. 协议优化:
      • 在推流和分发过程中使用优化的传输协议,如QUIC。

5. 短视频&CDN网络

  • 主要的问题是CDN节点的存储
  • 预热:将热点视频预热到CDN边缘节点。

ER&CDN网络

  1. ER:边缘计算
    1. 除了CDN的能力,多了一个计算,并且对计算结果进行缓存。