Stanford CS144 学习笔记 (五):互联网核心应用与网络边缘 (NAT, HTTP, BT, DNS)
发布时间:2026/7/19 6:02:11
分类:文化教育
浏览:1234
:互联网核心应用与网络边缘 (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.x、172.16.x.x、192.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 MappingNAT 设备如何将内网私有地址静态或动态映射到公网地址。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 SPDY6.1 HTTP 1.1 Keep-aliveOpen connectionHTTP 1.1 默认开启 Keep-alive。请求完成后TCP 连接不关闭后续的图片、脚本请求继续复用这条连接极大降低了延迟。6.2 SPDYGoogle 提出的一种实验性协议为了极致加速 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 之所以能通过分布式架构成功运作依赖两个特性Read-mostly (只读为主)域名和 IP 的映射极少改变。Loose consistency (松散一致性)允许数据在一段时间内不一致不影响全局。这两点允许 DNS 大规模使用Caching (缓存)极大地减轻了根服务器的压力。8.4 DNS Name Architecture (层级命名架构)倒置的树状结构Root (.)→\to→TLD 顶级域 (.com)→\to→二级域 (example.com)→\to→主机名 (www)。8.5 DNS ServersHierarchical 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→查.com得google.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 RecordsSOA: 区域起始授权记录定义该区域的主副服务器同步规则。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 实现了即插即用Discover (发现)客户端在局域网大喊广播“有没有 DHCP 服务器”Offer (提供)所有的 DHCP 服务器听到后各自预留一个 IP 并回复“我这有 IP192.168.1.10要吗”Request (请求)客户端挑一个顺眼的服务器广播回复“我就要刚才服务器 A 给我的那个 IP。”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利用分块下载、稀缺优先和以牙还牙策略将带宽利用率发挥到极致的去中心化共享协议。