目录
TCP/IP 分层模型 IP 寻址与路由 TCP 可靠传输 UDP 与应用场景 HTTP/HTTPS DNS 原理
01

TCP/IP 分层模型

背景 为什么需要分层?

计算机网络要解决的问题极其复杂:两台机器如何建立连接? 数据传输出错了怎么办? 如何找到对方的物理地址? 如果把所有功能放在一个模块里,代码会变成难以维护的「一团乱麻」。

第一性原理: 分层的本质是「关注点分离」「解耦」。每一层只负责一个特定的问题,层与层之间通过接口交互。这种设计让每一层都可以独立演进(比如把网络层从 IPv4 升级到 IPv6 不会影响传输层),也让不同厂商的设备可以互联互通。

原理 5 层模型 · 封装与解封装

TCP/IP 协议栈通常划分为 5 层(也有 4 层或 7 层 OSI 模型的划分),每一层有明确的职责:

发送方 (Sender) 应用层 (HTTP/FTP/DNS) 传输层 (TCP/UDP) 网络层 (IP) 链路层 (Ethernet/WiFi) 物理层 (光缆/无线) 接收方 (Receiver) 应用层 (HTTP/FTP/DNS) 传输层 (TCP/UDP) 网络层 (IP) 链路层 (Ethernet/WiFi) 物理层 (光缆/无线) 📦 封装 (Encapsulation) | 解封装 (Decapsulation)
图:TCP/IP 5 层模型,数据发送时逐层封装头部,接收时逐层解封装

封装 (Encapsulation):发送数据时,每一层都给数据添加自己的头部(Header),包含控制信息(比如源地址、目标地址、序号等)。

解封装 (Decapsulation):接收数据时,每一层读取自己的头部,处理后去掉头部,把数据交给上一层。

功能协议示例
应用层为应用程序提供网络服务HTTP, HTTPS, DNS, FTP, SMTP
传输层提供端到端的数据传输服务TCP, UDP, QUIC
网络层负责数据包的路由和寻址IP, ICMP, ARP
链路层负责相邻节点的数据传输Ethernet, WiFi, PPP
物理层传输比特流光缆、双绞线、无线电波

演进 从 ARPANET 到现代互联网

  • 1969: ARPANET 诞生,最初只有 4 个节点,使用 NCP 协议
  • 1974: Vint Cerf 和 Bob Kahn 发表论文,提出 TCP/IP 协议的雏形
  • 1983: ARPANET 正式切换到 TCP/IP,这一天被认为是互联网的生日
  • 1990: 万维网 (WWW) 诞生,HTTP 协议开始普及
  • 2012: IPv6 全球部署启动,解决 IPv4 地址耗尽问题
"TCP/IP 的成功在于它的简单性可扩展性。它没有试图解决所有问题,而是提供了一个灵活的框架,让上层协议可以根据需要演进。"
—— 网络协议设计哲学

取舍 设计中的权衡

📦 分层 vs 性能
分层让协议栈清晰可维护,但每一层都有额外的头部开销。实际系统中,有些协议栈会「跨层优化」,牺牲分层的清晰性换取性能。
🔗 无连接 vs 面向连接
IP 是无连接的,每一个数据包独立路由,简单高效但不可靠。TCP 在 IP 之上建立连接,提供可靠传输,但增加了复杂度和延迟。
🌐 IPv4 vs IPv6
IPv4 地址只有 32 位,早已耗尽;IPv6 有 128 位,地址空间几乎无限,但部署缓慢,需要保持双栈支持。
02

IP 寻址与路由

背景 如何在全球范围内找到一台机器?

互联网上有数十亿台设备,每台设备都需要一个唯一的标识符,这就是 IP 地址。但只有地址还不够:如何找到从你的手机到服务器的最佳路径? 这就是 路由 要解决的问题。

第一性原理: 路由的本质是「在图中找一条路径」。互联网是由无数路由器连接起来的大图,每个路由器维护一张路由表,告诉它「去某个地址应该把包发给哪个邻居」。路由协议就是用来交换这些信息的。

原理 子网划分 · CIDR · 路由表

IPv4 地址是 32 位的,通常写成 4 个十进制数(例如 192.168.1.1)。为了高效管理,IP 地址被划分为网络号主机号两部分,通过子网掩码来区分。

IPv4 地址: 192.168.1.100 11000000 10101000 00000001 01100100 子网掩码: 255.255.255.0 (/24) 网络号 (Network) 192.168.1 主机号 (Host) .100
图:IPv4 地址与子网划分,通过子网掩码区分网络号和主机号

CIDR (无类别域间路由):传统的 A/B/C 类地址划分方式太浪费,CIDR 用前缀长度表示子网(例如 /24 表示前 24 位是网络号),大大提高了地址利用率。

▸ 查看路由表 (Linux)
# 查看路由表 $ ip route default via 192.168.1.1 dev wlan0 proto dhcp 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100 # 抓包查看 IP 头部 $ tcpdump -i wlan0 -n 'ip' 10:00:00.000000 IP 192.168.1.100.12345 > 8.8.8.8.80: Flags [S], seq 123456, win 64240, length 0

路由表:每台路由器都维护一张路由表,包含「目标网络 → 下一跳」的映射。最长前缀匹配 (Longest Prefix Match) 是路由查找的核心规则。

演进 从 RIP 到 BGP

  • RIP: 早期的距离矢量协议,跳数限制为 15,适合小规模网络
  • OSPF: 链路状态协议,适合单个自治系统 (AS) 内部
  • BGP: 路径矢量协议,用于 AS 之间的路由,是互联网的「胶水」
  • SDN: 软件定义网络,将控制平面和数据平面分离,更灵活的路由控制
"BGP 是互联网的神经系统。它不关心路径的「最优」,而关心「可达」和「策略」—— 运营商可以根据商业关系、政策等因素选择路由。"
—— 域间路由设计哲学

取舍 设计中的权衡

🔄 收敛速度 vs 稳定性
网络拓扑变化后,路由协议需要快速收敛。但收敛太快可能导致路由震荡,需要在速度和稳定性之间权衡。
🌍 最优路径 vs 策略路径
BGP 选择路径不一定是「最短」的,而是「最符合策略」的——可能考虑商业关系、政治因素、流量工程等。
📊 路由表大小 vs 聚合程度
聚合路由可以减小路由表大小,但也降低了路由的粒度。需要在转发表大小和路由灵活性之间权衡。
03

TCP 可靠传输

背景 IP 是不可靠的,如何在其上实现可靠传输?

IP 协议只负责「尽力而为」地把数据包送出去:包可能丢失可能乱序到达可能重复。但应用程序(比如下载文件、网页浏览)需要可靠的传输服务——TCP 就是为了解决这个问题的。

第一性原理: 可靠传输的本质是「确认 + 重传」。发送方发出数据后等待确认,如果超时没收到确认就重传。在此基础上,TCP 增加了滑动窗口(提高效率)、拥塞控制(避免网络过载)等机制。

原理 三次握手 · 滑动窗口 · 拥塞控制

三次握手:建立 TCP 连接需要三次握手,主要目的是同步序列号(ISN),让双方知道对方的起始序列号,为后续的可靠传输奠定基础。

客户端 (Client) 服务器 (Server) 1. SYN, seq = x 2. SYN + ACK, seq = y, ack = x+1 3. ACK, ack = y+1 ✅ 连接建立 (ESTABLISHED)
图:TCP 三次握手,同步双方的序列号

滑动窗口:TCP 用滑动窗口实现流量控制可靠传输。发送方可以连续发送多个包而不必等每个包的确认,大大提高了传输效率。

拥塞控制:TCP 必须探测网络的承载能力,避免发送太多数据导致网络过载。核心算法包括:慢启动、拥塞避免、快速重传、快速恢复。

▸ 观察 TCP 三次握手 (tcpdump)
# 抓取 TCP 三次握手 $ tcpdump -i wlan0 -n 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' 10:00:00.000000 IP 192.168.1.100.12345 > 8.8.8.8.80: Flags [S], seq 123456, win 64240, length 0 10:00:00.001000 IP 8.8.8.8.80 > 192.168.1.100.12345: Flags [S.], seq 654321, ack 123457, win 65535, length 0 10:00:00.001500 IP 192.168.1.100.12345 > 8.8.8.8.80: Flags [.], ack 654322, win 64240, length 0

演进 从 TCP 到 QUIC

  • TCP Tahoe/Reno: 早期的拥塞控制算法,奠定了拥塞控制的基础
  • TCP CUBIC: Linux 默认算法,更适合高带宽长延迟链路
  • TCP BBR: Google 提出的基于带宽和延迟的拥塞控制,性能更好
  • QUIC: Google 提出的基于 UDP 的传输协议,解决了 TCP 队头阻塞问题
"TCP 是一个「伟大但不完美」的协议。它在不可靠的 IP 之上建立了可靠的传输,但队头阻塞、建立连接的延迟等问题也催生了 QUIC 等新协议。"
—— 传输协议演进

取舍 设计中的权衡

📦 可靠性 vs 延迟
TCP 为了可靠性牺牲了延迟:丢包时需要等待重传。实时应用(视频会议、游戏)更倾向于用 UDP,接受丢包但追求低延迟。
🚪 队头阻塞 (HoL)
TCP 是字节流,包丢失会导致后续包都被阻塞,直到重传。QUIC 用多路复用解决了这个问题。
📈 利用率 vs 公平性
拥塞控制需要在「充分利用带宽」和「不同流之间公平分配」之间权衡。设计不好的算法可能导致饿死或带宽浪费。
04

UDP 与应用场景

背景 TCP 这么好,为什么还需要 UDP?

TCP 提供了可靠传输,但也带来了开销:需要建立连接(三次握手)、需要维护状态、需要重传、队头阻塞。有些应用不需要这些:实时视频通话—— 丢包没关系,只要延迟低;DNS 查询—— 小查询,简单重传就够了。

第一性原理: UDP 提供了「复用/解复用」(通过端口号)和「简单的差错检测」,仅此而已。它把「可靠性」、「拥塞控制」等问题交给了应用层,给应用最大的灵活性。

原理 UDP 头部 · 应用场景

UDP 头部非常简单,只有 8 个字节:源端口、目标端口、长度、校验和。相比之下,TCP 头部至少 20 字节。

特性TCPUDP
连接性面向连接无连接
可靠性可靠传输不可靠
顺序保证顺序不保证
流控
拥塞控制
头部大小20~60 字节8 字节
适用场景文件传输、网页浏览视频通话、DNS、游戏

QUIC: 不是所有应用都想在 UDP 之上重新实现可靠传输。QUIC (Quick UDP Internet Connection) 在 UDP 之上提供了像 TCP 一样的可靠传输和拥塞控制,但又解决了 TCP 的队头阻塞问题,同时集成了 TLS 加密。

▸ 查看 UDP 流量 (DNS)
# 抓取 DNS 查询 (UDP 53 端口) $ tcpdump -i wlan0 -n 'udp port 53' 10:00:00.000000 IP 192.168.1.100.12345 > 8.8.8.8.53: 12345+ A? www.google.com. (32) 10:00:00.001000 IP 8.8.8.8.53 > 192.168.1.100.12345: 12345 1/0/0 A 142.250.185.100 (48)

演进 从 UDP 到 QUIC

  • UDP: 1980 年标准化,简单无连接,多年来变化不大
  • WebRTC: 在 UDP 之上实现可靠传输,用于视频通话
  • QUIC: 2013 年 Google 提出,2022 年标准化为 RFC 9000
  • HTTP/3: 基于 QUIC 的 HTTP,解决了队头阻塞问题
"UDP 是「极简主义」的胜利。它不试图解决所有问题,而是提供一个最小的抽象,让应用自己决定需要什么。"
—— UDP 设计哲学

取舍 设计中的权衡

⚡ 简单 vs 功能
UDP 简单高效,但需要应用自己实现可靠性。TCP 功能丰富,但复杂且有延迟。选择取决于应用的需求。
🎮 实时性 vs 可靠性
实时应用(游戏、视频通话)倾向于低延迟,宁愿丢包也不愿等重传。非实时应用(文件传输)要求数据完整。
🔧 QUIC:最佳折中?
QUIC 试图在 UDP 的灵活和 TCP 的可靠之间找到平衡点:基于 UDP、内置加密、多路复用无队头阻塞。但部署需要时间。
05

HTTP/HTTPS

背景 Web 是如何工作的?

HTTP (HyperText Transfer Protocol) 是 Web 的基础协议:浏览器(客户端)发送请求给服务器,服务器返回响应。但 HTTP 是明文的,任何人都可以窃听或篡改,所以需要 HTTPS——HTTP over TLS,在 HTTP 之下加了一层加密。

第一性原理: HTTP 是一个「无状态」请求-响应协议。无状态意味着每个请求都是独立的,服务器不记得之前的请求。这让服务器简单可扩展,但也需要 Cookie、Session 等机制来维护状态。

原理 请求响应 · TLS 握手 · HTTP/2

HTTP 请求:包含方法(GET、POST 等)、URL、HTTP 版本、请求头、请求体。

HTTP 响应:包含 HTTP 版本、状态码(200 OK、404 Not Found 等)、响应头、响应体。

▸ HTTP 请求响应 (curl)
# 发送 HTTP GET 请求,显示详细信息 $ curl -v http://example.com > GET / HTTP/1.1 > Host: example.com > User-Agent: curl/7.64.1 < HTTP/1.1 200 OK < Content-Type: text/html; charset=UTF-8 < Content-Length: 1256 <!doctype html> <html>...</html>

HTTPS (TLS):在 HTTP 之下加了 TLS 层,提供:加密(防止窃听)、认证(确认服务器身份)、完整性(防止篡改)。

HTTP (明文) HTTP 数据 (明文) TCP HTTPS (加密) HTTP 数据 (加密) TLS TCP HTTP/2 (多路复用) 流 1 流 2 流 3 HTTP 缓存 浏览器缓存 CDN / 代理缓存
图:HTTP vs HTTPS,HTTP/2 多路复用,HTTP 缓存层次

HTTP/2:主要改进:多路复用(多个请求共享一个 TCP 连接,无队头阻塞)、二进制分帧头部压缩服务器推送

HTTP 缓存:通过 Cache-Control、ETag、Last-Modified 等头部控制缓存,大大减少重复请求,提高性能。

演进 从 HTTP/0.9 到 HTTP/3

  • 1991: HTTP/0.9,只有 GET 方法,没有头部
  • 1996: HTTP/1.0 (RFC 1945),增加了头部、状态码、多种方法
  • 1999: HTTP/1.1 (RFC 2616),持久连接、Host 头部、缓存控制
  • 2015: HTTP/2 (RFC 7540),多路复用、二进制分帧
  • 2022: HTTP/3 (RFC 9114),基于 QUIC,无 TCP 队头阻塞
"HTTP 的成功在于它的「简单性」「可扩展性」。它从一个简单的文档传输协议,演变成了现代 Web 应用的通用协议。"
—— HTTP 设计哲学

取舍 设计中的权衡

🔒 安全 vs 性能
HTTPS 提供了安全,但 TLS 握手需要额外的往返时间 (RTT)。HTTP/2 和 HTTP/3 试图在安全和性能之间找到平衡。
� 性能 vs 复杂度
HTTP/2 和 HTTP/3 提高了性能,但也大大增加了协议的复杂度。实现和调试都更困难。
💾 缓存 vs 新鲜度
缓存可以大大提高性能,但也可能导致用户看到过期的内容。需要根据内容的特性合理设置缓存策略。
06

DNS 原理

背景 如何用名字找到 IP 地址?

IP 地址是给机器看的(比如 142.250.185.100),人很难记住。DNS (Domain Name System) 就是互联网的「电话簿」:把人类可读的域名(比如 www.google.com)转换成机器可读的 IP 地址。

第一性原理: DNS 的本质是一个分布式数据库,用层次化的结构管理域名。没有单一的权威,而是由根域名服务器、顶级域名服务器、权威域名服务器层层负责,通过缓存提高效率。

原理 递归查询 · 迭代查询 · 缓存

DNS 层次结构:域名从右往左读,用点分隔。例如 www.google.com:com 是顶级域 (TLD),google 是二级域,www 是主机名。

根 (.) .com .org google.com wikipedia.org 本地 DNS
图:DNS 层次结构,从根到顶级域再到权威域

递归查询:客户端问本地 DNS「帮我找到 www.google.com 的 IP」,本地 DNS 会负责一层层问下去,最后把结果返回给客户端。

迭代查询:本地 DNS 问根服务器「.com 的服务器在哪?」,根服务器返回 .com 服务器的地址;本地 DNS 再问 .com 服务器「google.com 的服务器在哪?」,如此迭代直到找到答案。

缓存:DNS 查询结果会被缓存一段时间(TTL,Time To Live),避免每次都从头查询,大大提高效率。

▸ DNS 查询 (dig)
# 查询 www.google.com 的 A 记录 $ dig www.google.com ;>DiG 9.10.6<<>> www.google.com ;;ANSWER SECTION: www.google.com. 300 IN A 142.250.185.100 # 跟踪整个查询过程 $ dig +trace www.google.com

演进 从 hosts 文件到 DNSSEC

  • 1970s: 使用 hosts 文件,手动维护域名到 IP 的映射
  • 1983: DNS 标准化 (RFC 882, 883)
  • 1990s: DNS 扩展,支持更多记录类型
  • 2005: DNSSEC 部署,为 DNS 提供安全认证
  • 2018: DNS over HTTPS (DoH) 开始普及,加密 DNS 查询
"DNS 是互联网的「隐形基础设施」。它每天处理万亿次查询,但大多数人甚至不知道它的存在。"
—— DNS 设计哲学

取舍 设计中的权衡

⚡ 性能 vs 新鲜度
TTL 决定了缓存时间:TTL 太短会增加查询负载,太长会导致信息不新鲜。需要在性能和准确性之间权衡。
� 安全 vs 可用性
DNSSEC 提供了安全认证,但增加了复杂性和查询大小。DoH 加密了查询,但也可能被用于绕过网络过滤。
🌐 集中 vs 分布
DNS 是分布式的,没有单点故障,但也带来了一致性的挑战。根域名服务器虽然重要,但也有多个副本。