Stanford CS144 学习笔记 (五):互联网核心应用与网络边缘 (NAT, HTTP, BT, DNS)

Stanford CS144 学习笔记 (五):互联网核心应用与网络边缘 (NAT, HTTP, BT, DNS)

导语 :前几个单元我们学习了网络底层的 IP 路由和 TCP 传输机制。本单元我们将探讨建立在这些基础设施之上的四大核心网络应用/机制:解决 IP 枯竭的 NAT、统治万维网的 HTTP、P2P 巅峰之作 BitTorrent,以及互联网的基石 DNS 与 DHCP。


1. NATs - Introduction (网络地址转换简介)

NAT 是一项在今天家庭和企业网络中无处不在,却又饱受争议的技术。

1.1 Strong End-to-End (被打破的强端到端原则)

  • 网络最初的设计哲学是"强端到端":网络只负责寻找最高效的路径传输 Datagram (数据报),两台 Host 之间使用全球唯一的 IP 直接通信。
  • NAT 打破了这一原则:它在中间横插一杠,悄悄修改了数据包的 IP 地址和端口。

1.2 Network Address Translator (NAT 的本质)

  • 动机:IPv4 地址枯竭。
  • 原理:NAT 允许内部网络的多台主机(如家里的手机、电脑)共享一个外部的公网 IP。
  • 当数据包从内网发出时,NAT 会将源私有 IP(如 10.0.0.101)改写为 NAT 路由器的外部公网 IP(如 128.34.22.8),并分配一个新的端口。外部服务器以为是在和 NAT 路由器通信。

1.3 How a NAT Works? (NAT 是如何工作的?)

  • NAT 路由器像一个中转站,拥有 Internal Interface (内网接口)External Interface (外网接口)
  • 它在内部维护一张 Mapping (映射表)。主要针对 TCP/UDP 的端口进行映射。
  • 私有地址网段10.0.x.x172.16.x.x192.168.x.x 等。

2. Types of NATs (NAT 的四种锥形类型)

为了安全性,NAT 对外部主动发入内网的数据包有不同级别的限制。

2.1 NAT Internal Mapping (内部映射)

具体的技术规范由 RFC 定义,通常分为以下四种严格程度递增的模式。

2.2 Full Cone NAT (全锥形 NAT)

  • 最宽松的模式(开放的大门)。
  • 只要内网主机 A 向外网发起过一次通信,NAT 就在墙上打了一个永久的洞。此后,任何外部设备都可以通过这个洞(公网 IP + 映射端口)主动连接 A。

2.3 Restricted Cone NAT (受限锥形 NAT)

  • IP 级别限制
  • 内网主机 A 曾经向外网主机 B (IP_B) 发送过数据,那么只有 IP_B 能够通过映射端口主动向 A 发数据(不限制 B 使用的端口)。其他陌生 IP 发来的数据会被 NAT 丢弃。

2.4 Port Restricted NAT (端口受限锥形 NAT)

  • IP + 端口级别双重限制
  • 内网主机 A 曾经向外网主机 B 的端口 Y (IP_B : Port_Y) 发过数据,那么只有 IP_B 且必须从 Port_Y 发回来的数据,NAT 才会放行。这是目前大多数家用路由器的默认模式。

2.5 Symmetric NAT (对称 NAT)

  • 最严格的模式
  • 内网主机 A 访问不同的外网目标(不同的 IP 或端口)时,NAT 会为 A 分配完全不同的外部映射端口
  • 特点:安全性极高,但对 P2P 通信极其不友好(极难打洞)。

2.6 NAT Behavioral Recommendations (NAT 行为建议)

  • Hairpinning (发夹弯/回环) :两台都在同一个 NAT 下的内网电脑 A 和 B,如果 A 尝试通过 B 的公网映射地址去访问 B,数据包到了 NAT 后必须像发夹一样"折回来"发给 B。优秀的 NAT 必须支持这种行为。

3. NAT Implications (NAT 带来的深远影响)

NAT 拯救了 IPv4,但也给应用开发带来了巨大的痛苦。

3.1 Applications: Incoming Connections (入站连接的噩梦)

如果一台服务器藏在 NAT 后面,外部用户根本不知道它的私有 IP,也无法主动发起连接。

3.2 Connection Reversal (连接反转)

  • 解决思路 :如果 A 在公网,B 在 NAT 后。A 无法连接 B,那就找个中间服务器告诉 B:"A 想找你"。然后由 B 主动向 A 发起连接,从而绕过 NAT 限制。

3.3 Relays (中继服务器)

  • 如果 A 和 B 都在严格的 NAT 后面(互相无法主动连接),只能引入中心化的中继服务器(如 TURN 服务)。
  • A 发给中继,中继转发给 B。这彻底违背了端到端原则,且极其消耗中继服务器的带宽,是无奈之举。

3.4 Applications: NAT Hole-Punching (NAT 打洞术)

  • 利用一台公网的 STUN 服务器,A 和 B 分别向服务器发包,得知自己的"公网映射端口"。
  • 然后 A 和 B 互相向对方的公网端口发包,强行在各自的 NAT 防火墙上"凿出一个洞",从而建立直接的 P2P 通信。

3.5 NAT Debate (关于 NAT 的争论)

  • Tremendously useful (极其有用):地址复用,兼具底层防火墙的安全性。
  • Tremendously painful (极其痛苦):应用开发极其复杂,限制了端到端的自由通信。
  • 结论:争论毫无意义,因为 NAT 已经根深蒂固 (NATs are here to stay)。

4. Nats - Operations (NAT 的 RFC 规范)

4.1 NAT Internal Mapping

NAT 设备如何将内网私有地址静态或动态映射到公网地址。

4.2 UDP (RFC 4787)

规范了 NAT 在处理无连接的 UDP 时的超时机制和端口分配行为。

4.3 TCP (RFC 5382)

规范了 NAT 在处理 TCP 长连接时的状态机跟踪,防止连接被意外切断。


5. HTTP (超文本传输协议)

5.1 World Wide Web (HTTP)

  • 核心机制 :经典的 Request - Response (请求-响应) 模型。
  • 示例 :客户端发送 GET / HTTP/1.1,服务器响应 HTTP/1.1 200 OK 并附带 HTML 数据。

5.2 HTTP Request Format

  • 请求格式:请求行 + 请求头 (Headers) + 空行 + 消息体 (Body)。
  • GET 请求通常只有头部没有消息体;POST 请求会在消息体中携带表单或文件数据。

5.3 HTTP/1.0 speed (HTTP/1.0 的速度瓶颈)

  • 在 HTTP/1.0 时代,每一次请求(比如网页里的每一张小图片)都要重新建立一次 TCP 三次握手!
  • 导致大量时间浪费在网络延迟 (Latency) 和慢启动上。

6. HTTP 1.1 Keep-alive & SPDY

6.1 HTTP 1.1 Keep-alive

  • Open connection:HTTP 1.1 默认开启 Keep-alive。请求完成后,TCP 连接不关闭,后续的图片、脚本请求继续复用这条连接,极大降低了延迟。

6.2 SPDY

  • Google 提出的一种实验性协议,为了极致加速 Web 网页加载。
  • 核心改进:Request Pipelining (多路复用流水线)、Header Compression (去除冗余的头部信息压缩)。
  • 影响 :SPDY 后来成为了 HTTP/2 协议的基石。

7. BitTorrent (P2P 协议的巅峰)

BitTorrent (BT) 把大文件切成小块,让用户一边下载一边上传。

7.1 Torrent File & Hash Check

  • .torrent 种子文件不包含数据,只包含文件的元数据(分块信息)和 Tracker 服务器地址。
  • Hash Check:每个小块都有对应的 SHA-1 哈希值(指纹),下载完后立刻比对,防止有人恶意篡改或注入病毒。
  • DHT:后期的 BT 引入了分布式哈希表,连 Tracker 服务器都不需要了,实现了完全的去中心化。

7.2 What to Say? (Rarest-First 最稀缺优先)

  • 策略:客户端会优先去下载整个网络中"最少人拥有"的文件块。
  • 目的:确保稀有片段迅速扩散,防止唯一拥有该片段的种子用户下线后,导致所有人卡在 99% 无法下载完整文件。

7.3 Whom To Talk To? (Tit-for-Tat 以牙还牙)

  • 策略:客户端会互相评估。谁给我上传的速度快,我就给谁上传数据;对于只下载不上传的"吸血鬼",我会无情地"Choke (阻塞)"他们。
  • 目的:用博弈论的方法,强制鼓励整个生态系统中的用户积极贡献带宽。

7.4 BitTyrant

  • 这是一个"更聪明(也更自私)"的 BT 客户端。它通过精确计算算法,在遵守 Tit-for-Tat 规则的前提下,用最小的上传量骗取别人最大的下载带宽,吞吐量可提升 70%。

7.5 Summary (BitTorrent 总结)

  • File broken into pieces (切块) →\to→ Find peers (找节点) →\to→ Metadata exchange (交换信息) →\to→ Rarest-first (稀缺优先) →\to→ Tit-for-tat (以牙还牙)。

8. DNS - 1 (域名解析系统)

8.1 Parsing a URL

人类善于记忆名称 (www.stanford.edu),而路由器只认识 IP 地址 (171.67.21.225)。DNS 就是这两者之间的翻译官。

8.2 HOSTS.TXT (远古时期的做法)

  • 最初,斯坦福的 SRI 机构维护着一个巨大的 HOSTS.TXT 文本文件,记录全网 IP。
  • 所有主机定期下载。但随着互联网爆发,集中式更新根本无法扩展。

8.3 Domain Name System (DNS 的诞生)

DNS 之所以能通过分布式架构成功运作,依赖两个特性:

  1. Read-mostly (只读为主):域名和 IP 的映射极少改变。
  2. Loose consistency (松散一致性) :允许数据在一段时间内不一致,不影响全局。
    这两点允许 DNS 大规模使用 Caching (缓存),极大地减轻了根服务器的压力。

8.4 DNS Name Architecture (层级命名架构)

  • 倒置的树状结构:Root (.) →\to→ TLD 顶级域 (.com) →\to→ 二级域 (example.com) →\to→ 主机名 (www)。

8.5 DNS Servers

  • Hierarchical zones (分层区域):每个区域独立管理。
  • Root Zone (根区域):全球共有 13 组根服务器(编号 A-M),通过 Anycast (任播) 技术分布在全球各地的几百个数据中心,极度冗余。

8.6 DNS Query (查询过程)

  • Recursive (递归查询):你问本地 DNS 服务器,本地服务器帮你一路问到底,直接把最终 IP 扔给你。(保姆式服务)
  • Non-recursive / Iterative (非递归/迭代查询):你问根服务器,根服务器说"我不知道,但你去问 .com 服务器吧"。你顺藤摸瓜一层一层自己问。
  • 协议 :DNS 默认使用 UDP 端口 53,为了极速响应。早期的 UDP 报文限制大小为 512 Bytes。

9. DNS - 2 (资源记录与报文格式)

9.1 Resource Records (资源记录 RR)

DNS 数据库里的基本信息单元,包含:

  • Name: 域名
  • Type: 记录类型 (A, MX 等)
  • Class: IN (Internet)
  • TTL: 存活时间(决定可以被缓存多久)
  • Data: 目标 IP 或文本

9.2 DNS Header Structure (RFC 1035)

DNS 报文的头部极具逻辑性:

  • ID: 会话标识,防伪造。
  • Flags: 标明是查询还是响应,是否要求递归等。
  • 四大计数器: QDCOUNT (问题数)、ANCOUNT (回答数)、NSCOUNT (权威服务器数)、ARCOUNT (附加记录数)。

9.3 DNS Name Compression (名称压缩机制)

因为 UDP 有 512 字节限制,DNS 采用了指针压缩技术。如果报文中多次出现 example.com,后续的记录只需要用 2 个字节的指针指向第一次出现该字符串的位置,极大节省了空间。

9.4 DNS A Record

最常用的记录,将域名映射到 IPv4 地址


10. DNS Details (DNS 记录深入)

10.1 Traversing Zones (穿越区域)

解析 www.google.com:查 Root 得 .com 的 NS →\to→ 查 .comgoogle.com 的 NS →\to→ 查最终 IP。

10.2 Glue Record Example (胶水记录)

  • 死锁问题 :如果 foo.com 的权威名称服务器叫 ns1.foo.com。你想知道 ns1 的 IP 就得查 foo.com,想查 foo.com 就得联系 ns1
  • 解决 :父级区域(.com)除了返回 NS 记录外,会在"附加部分"直接附带上 ns1.foo.com 的 IP 地址,这就是起到粘合作用的"胶水记录"。

10.3 CNAME Record (别名记录)

  • 将一个域名指向另一个域名。比如让 mail.example.com 指向 ghs.google.com
  • 注意:CNAME 具有排他性,设置了 CNAME 的节点不能再设置 MX 或 TXT 等其他记录。

10.4 MX Record (邮件交换记录)

告诉发件方,如果要发邮件给 @example.com,应该把 TCP 25 端口的邮件流量路由到哪台具体的服务器上。

10.5 Many Other Kinds of Records

  • SOA: 区域起始授权记录,定义该区域的主副服务器同步规则。
  • TXT: 任意文本记录(常用于 SPF 反垃圾邮件和域名所有权验证)。
  • AAAA : 映射到 IPv6 地址

11. DHCP (动态主机配置协议)

当你把网线插进电脑,或者连上 WiFi 时,你的电脑是如何上网的?全靠 DHCP。

11.1 Communicating with IP

要让一台设备能上网,至少需要 4 样东西:IP 地址子网掩码Gateway (默认网关)DNS 服务器 IP

11.2 旧的方法 (手动配置)

  • 早期全靠网管手动去每台电脑敲 IP。
  • 痛点:移动性极差(换个办公室就上不了网)、易冲突、无法做 Garbage Collection (电脑关机了 IP 无法自动回收给别人用)。

11.3 DHCP (工作原理:DORA 四步曲)

DHCP 实现了即插即用:

  1. Discover (发现):客户端在局域网大喊广播:"有没有 DHCP 服务器?"
  2. Offer (提供):所有的 DHCP 服务器听到后,各自预留一个 IP 并回复:"我这有 IP:192.168.1.10,要吗?"
  3. Request (请求):客户端挑一个顺眼的服务器,广播回复:"我就要刚才服务器 A 给我的那个 IP。"
  4. Ack (确认):服务器 A 回复确认,并告知 Lease Time (租期,即你可以用多久)。

11.4 Communicating Without IPv4

  • 在客户端还没有 IP 的时候,怎么通信?
  • 使用 UDP 协议。服务器监听 Port 67 ,客户端使用 Port 68
  • 底层利用了链路层的广播 MAC 地址和特殊的 IP 广播地址 255.255.255.255

12. Applications (总结)

12.1 NAT (网络地址转换)

利用私有地址和外部端口的映射,极大扩展了 IPv4 的生命力,但带来了 P2P 连接的痛点。

12.2 DNS (域名系统)

基于 UDP 的全球分布式 Read-mostly 数据库,人类可读名称与机器 IP 的翻译官。

12.3 HTTP (超文本传输协议)

基于 TCP,采用 Request-Response 模型,是今天万维网和所有互联网接口的基石。

12.4 BitTorrent

基于 TCP,利用分块下载、稀缺优先和以牙还牙策略,将带宽利用率发挥到极致的去中心化共享协议。

相关推荐
杨了个杨89826 小时前
docker的网络模式
网络·docker·容器
万岳科技系统开发7 小时前
智慧医院小程序开发满足医疗机构多场景服务需求
数据库·学习·小程序
大熊背7 小时前
双目拼接中色差消除优化
网络
Sagittarius_A*7 小时前
Command Injection 命令注入漏洞:系统命令拼接缺陷与执行利用技术
网络·安全·web安全·dvwa·命令注入漏洞
笑鸿的学习笔记7 小时前
C++笔记之内存映射、零拷贝与共享内存(学习三)-操作系统术语概念图
笔记·学习
既然如此,那就开摆7 小时前
ULIP总结
笔记·学习
曙光_deeplove8 小时前
海康機器人工業相機(丢失帧、空帧和残帧/不完整帧)
网络
xin(n_n)b8 小时前
科研小白的进阶笔记(一)
人工智能·笔记
杨浦老苏8 小时前
实测2.8MB的Rust笔记服务:MinimaMemosa部署教程
笔记·docker·群晖
Android洋芋8 小时前
漏洞挖掘与赏金攻略
网络·安全·web安全