mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
6857 字
19 分钟
互联网全景:一个数据包的旅程
2022-01-23

你此刻正在使用互联网——打开浏览器、输入网址、页面加载完成。这个过程不到一秒,但在这不到一秒的时间里,你的请求穿越了至少十几台路由器、跨越了可能数千公里的光纤、经过了 DNS 查询、TCP 握手、TLS 协商、HTTP 请求/响应……而你对这一切几乎毫无感知。

这正是互联网设计者追求的目标:复杂性对用户透明。但如果你是一个工程师,你需要理解这些复杂性——不是出于好奇,而是因为当页面加载慢了 200 毫秒、当 SSH 连接莫名断开、当微服务之间的调用延迟飙升时,你需要知道问题出在哪一层。

本章是整个系列的”地图”。不会深入任何一层的细节(那是后续章节的任务),而是从宏观视角俯瞰互联网的整体架构:互联网是怎么从一个小型军事实验变成全球基础设施的?为什么 IP 协议是整个网络的”窄腰”?数据包从浏览器到服务器到底经历了什么?端到端原则为什么是互联网最根本的设计哲学?

带着这些问题的答案,后续每一章的学习就有了锚点。

一、互联网是什么:从 ARPANET 到全球互联#

1.1 冷战催生的实验#

1969 年 10 月 29 日晚上 10 点 30 分,UCLA 的程序员 Charley Kline 试图向斯坦福研究所(SRI)发送一条消息——“LOGIN”。他成功发送了”L”和”O”,然后系统崩溃了。第一次互联网传输的数据只有两个字母:“LO”。

这不是一个浪漫的起源故事。ARPANET 的诞生有着明确的军事动机:美国国防部需要一个能在核打击中存活的通信网络。传统的电话网络是中心化的——摧毁一个交换中心,整个区域通信瘫痪。ARPANET 的核心创新是分组交换(Packet Switching):数据被切分成小包,每个包独立寻路,即使部分节点被摧毁,数据包仍能通过其他路径到达目的地。

与分组交换相对的是电路交换——传统电话网络的方式。打电话时,交换机在两端之间建立一条独占的物理通路,通话期间这条通路被你独占,哪怕你沉默不语,带宽也被浪费。分组交换则让所有人共享同一条链路——你的数据包和别人的数据包交替传输,链路利用率大幅提升。

1.2 TCP/IP:统一的语言#

ARPANET 最初使用的协议是 NCP(Network Control Protocol),但它有一个致命缺陷:只能连接同构网络。1973 年,Vint Cerf 和 Bob Kahn 开始设计一种能连接异构网络的协议——这就是 TCP/IP。

关键转折发生在 1983 年 1 月 1 日,ARPANET 从 NCP 切换到 TCP/IP。这一天后来被称为”互联网的生日”。为什么 TCP/IP 如此重要?因为它定义了一种通用的网络互联语言——不管底层是以太网、令牌环网还是电话线,只要运行 TCP/IP,就能互相通信。

这次切换并非一帆风顺。所有 ARPANET 节点必须在同一天完成迁移,任何没有及时升级的节点都会从网络中消失——这大概是历史上最大规模的”flag 日期”(Flag Day)迁移。

1.3 从学术到大众#

1989 年,Tim Berners-Lee 在 CERN 发明了万维网(WWW)。但互联网真正走向大众是 1990 年代的事,而且每一步转折都由一个具体的技术突破驱动:

  • 1993 年:Mosaic 浏览器发布——第一个图形化网页浏览器,让普通人第一次能通过点击浏览网页,而不需要记住命令行参数
  • 1995 年:商业 ISP 出现,互联网不再局限于学术界和军方——Netscape IPO 标志着互联网商业化的开始
  • 2000 年:宽带(DSL/Cable)取代拨号上网——从 56 Kbps 跃升到 1-10 Mbps,流媒体和在线游戏成为可能
  • 2007 年:iPhone 发布,移动互联网时代开启——手机不再是缩小版的电脑,而是重新定义了人与网络的交互方式
  • 2020 年代:5G 与卫星互联网(Starlink)——5G 将移动网络延迟压到 10ms 以下,Starlink 用低轨卫星把互联网覆盖到地球的每一个角落
Note

互联网(Internet)和万维网(World Wide Web)不是一回事。互联网是基础设施——由光缆、路由器、协议组成的全球网络;万维网是运行在互联网上的一个应用——由 HTML、HTTP、URL 组成的信息系统。电子邮件、SSH、在线游戏都运行在互联网上,但它们不是万维网。

1.4 互联网治理:没有”老板”的网络#

互联网最独特的地方在于:没有人拥有整个互联网。它由数以千计的独立网络(Autonomous System,AS)互联而成,每个 AS 由不同的组织运营。你的家庭网络连接到 ISP 的 AS,ISP 的 AS 通过互联网交换中心(IXP)与其他 AS 互联。

# 查看你的网络接口配置
ip addr show
# 典型输出:
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
# link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
# inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
# inet6 fe80::1/64 scope link

从这个输出你能读到:MAC 地址(00:1a:2b:3c:4d:5e)、IPv4 地址(192.168.1.100)、MTU(1500 字节)、接口状态(UP)。这些概念在以太网与交换IP 地址与子网中详细解释。

这种”无中心”的架构不是偶然的,而是设计哲学的体现——理解了分层架构和端到端原则后,你会看到这个哲学贯穿互联网的每一层设计。

二、互联网沙漏模型:为什么 IP 是”窄腰”#

2.1 沙漏的形状#

互联网的协议栈有一个著名的视觉隐喻——沙漏模型(Hourglass Model)。沙漏的顶部是各种应用层协议(HTTP、SMTP、DNS、SSH……),底部是各种链路层技术(以太网、Wi-Fi、光纤、卫星……),而中间最窄的地方只有一个协议:IP

graph TB subgraph 应用层["应用层 — 多种协议"] HTTP["HTTP"] SMTP["SMTP"] DNS["DNS"] SSH["SSH"] FTP["FTP"] MQTT["MQTT"] end subgraph 传输层["传输层 — 两种选择"] TCP["TCP"] UDP["UDP"] end subgraph 网络层["网络层 — 一个协议"] IP["IP<br/>(窄腰)"] end subgraph 链路层["链路层 — 多种技术"] ETH["以太网"] WIFI["Wi-Fi"] PPP["PPP"] LTE["4G/LTE"] SAT["卫星"] end HTTP --> TCP SMTP --> TCP DNS --> UDP SSH --> TCP FTP --> TCP MQTT --> UDP TCP --> IP UDP --> IP IP --> ETH IP --> WIFI IP --> PPP IP --> LTE IP --> SAT style 应用层 fill:#e3f2fd,stroke:#1565c0 style 传输层 fill:#e0f2f1,stroke:#00695c style 网络层 fill:#fff3e0,stroke:#e65100 style 链路层 fill:#fce4ec,stroke:#c62828 style IP fill:#ffe0b2,stroke:#e65100,stroke-width:3px

2.2 窄腰的力量#

IP 为什么是”窄腰”?这背后是一个深刻的工程决策:在异构性最大的地方,用最少的协议做最通用的抽象

试想如果网络层有 10 种不同的协议,就像链路层有 10 种不同的技术一样——那么每个应用层协议都需要为每种网络层协议写一个适配器,每个链路层技术都需要为每种网络层协议写一个驱动。组合数会爆炸。

IP 作为唯一的窄腰,创造了一个解耦点

  • 应用层不需要关心底层用什么链路技术——你写 HTTP 请求时不需要知道数据是通过 Wi-Fi 还是 4G 传输的
  • 链路层不需要关心上面跑什么应用——以太网交换机不需要知道它转发的帧里装的是 HTTP 还是 DNS
  • IP 是唯一的粘合层——它把上面的一切和下面的一切连接起来

这就是为什么互联网能从 1983 年的 ARPANET 演进到今天的 5G 和卫星互联网——底层链路技术换了无数代,应用层协议从 FTP 进化到 HTTP/3,但 IP 这个窄腰始终没变。

2.3 沙漏模型各层对比#

层次协议/技术数量设计目标变化速度典型代表
应用层数十种满足各种应用需求快(每年都有新协议)HTTP/3、gRPC、WebSocket
传输层两种(TCP/UDP)提供不同级别的传输保障慢(TCP 从 1981 年至今基本不变)TCP、UDP、QUIC
网络层一种(IP)提供统一的寻址和路由极慢(IPv4→IPv6 花了 25 年还没完成)IPv4、IPv6
链路层数十种适配各种物理介质中等(以太网不断升级速率)以太网、Wi-Fi 7、5G
Tip

理解沙漏模型是理解互联网演进的关键。当你看到 QUIC(运行在 UDP 上的新传输协议)或 HTTP/3 时,不要觉得它们打破了沙漏——它们恰恰是在沙漏的上半部分创新,而 IP 这个窄腰保持不变。详细的 QUIC 分析见QUIC 与 HTTP/3

三、分层架构:五层模型与封装#

3.1 为什么需要分层#

互联网的协议栈采用分层架构——每一层只关心自己的事情,通过明确定义的接口与相邻层交互。这种设计带来的好处是:

  1. 关注点分离:每一层只需要理解本层的协议,不需要知道其他层的细节
  2. 独立演进:Wi-Fi 从 802.11b 升级到 802.11ax,HTTP 从 1.1 升级到 3,两者互不影响
  3. 故障隔离:网络不通时可以逐层排查——是物理层断线?链路层 MAC 地址冲突?网络层路由错误?传输层端口被占?

3.2 五层模型#

互联网协议栈通常用五层模型来描述(它是 OSI 七层模型的简化版,去掉了现实中几乎不用的表示层和会话层):

层次名称核心任务数据单位关键协议/设备
5应用层定义应用间通信的语义消息(Message)HTTP、DNS、SSH
4传输层端到端的可靠传输报文段(Segment)TCP、UDP
3网络层全局寻址与路由数据报(Datagram)IP、ICMP
2链路层相邻节点间的帧传输帧(Frame)以太网、ARP
1物理层比特流在介质上的传输比特(Bit)光纤、双绞线、无线电波

3.3 封装:俄罗斯套娃#

当你在浏览器中输入 https://example.com 并按下回车,浏览器构造的 HTTP 请求并不是直接扔到网线上的。它要经过逐层封装——每一层都在上层交付的数据前面加上自己的头部(Header),就像俄罗斯套娃一样:

sequenceDiagram participant App as 应用层 participant Trans as 传输层 participant Net as 网络层 participant Link as 链路层 participant Phys as 物理层 App->>Trans: HTTP GET /index.html<br/>[HTTP 请求报文] Note over Trans: 添加 TCP 头部<br/>(源端口、目的端口、序号...) Trans->>Net: TCP Segment<br/>[TCP 头 | HTTP 数据] Note over Net: 添加 IP 头部<br/>(源 IP、目的 IP、TTL...) Net->>Link: IP Datagram<br/>[IP 头 | TCP 头 | HTTP 数据] Note over Link: 添加以太网帧头和帧尾<br/>(源 MAC、目的 MAC、FCS...) Link->>Phys: Ethernet Frame<br/>[帧头 | IP 头 | TCP 头 | HTTP 数据 | 帧尾] Note over Phys: 编码为电信号/光信号<br/>通过物理介质传输

3.4 一个 HTTP GET 请求的封装过程#

用具体的数字来看一个 HTTP GET 请求是如何被封装的:

# 你在浏览器中访问 http://93.184.216.34/
# 浏览器构造的 HTTP 请求:
GET / HTTP/1.1\r\n
Host: example.com\r\n
User-Agent: Mozilla/5.0\r\n
Accept: text/html\r\n
\r\n

第一步:应用层 → 传输层

浏览器将 HTTP 请求交给 TCP。TCP 添加自己的头部(20 字节),包含源端口(如 54321)、目的端口(80)、序号、确认号等:

[TCP 头部: 20 字节] [HTTP 请求: ~150 字节]

第二步:传输层 → 网络层

TCP 段交给 IP。IP 添加自己的头部(20 字节),包含源 IP(如 192.168.1.100)、目的 IP(93.184.216.34)、TTL(64)等:

[IP 头部: 20 字节] [TCP 头部: 20 字节] [HTTP 请求: ~150 字节]

第三步:网络层 → 链路层

IP 数据报交给以太网。以太网添加帧头(14 字节,包含源 MAC 和目的 MAC)和帧尾(4 字节 FCS 校验):

[以太网帧头: 14 字节] [IP 头部: 20 字节] [TCP 头部: 20 字节] [HTTP 请求: ~150 字节] [FCS: 4 字节]

一个约 150 字节的 HTTP 请求,经过封装后变成了约 228 字节的以太网帧。额外的 78 字节都是协议头部——这就是”协议开销”。

3.5 解封装:接收端的逆向过程#

当服务器收到这个帧时,解封装的过程恰好相反:

  1. 链路层:检查目的 MAC 是否匹配,验证 FCS,剥离帧头帧尾,将 IP 数据报交给网络层
  2. 网络层:检查目的 IP 是否匹配,检查 TTL,剥离 IP 头部,将 TCP 段交给传输层
  3. 传输层:检查目的端口(80),验证校验和,剥离 TCP 头部,将 HTTP 请求交给应用层
  4. 应用层:Web 服务器解析 HTTP 请求,生成响应

每一层只看自己的头部,不关心其他层的内容——这就是分层的力量。

四、端到端原则:互联网的设计哲学#

4.1 什么是端到端原则#

1984 年,Jerome Saltzer、David Reed 和 David Clark 发表了一篇论文 “End-to-End Arguments in System Design”,提出了互联网最根本的设计原则:

功能应该在通信系统的端点实现,而不是在网络中间实现。

翻译成大白话:网络中间的路由器和交换机应该尽可能”傻”,只做转发;智能逻辑(可靠性、安全性、拥塞控制)应该放在通信的两端(发送方和接收方)。

4.2 电话网络 vs 互联网:两种设计哲学#

为了理解端到端原则,最好的方式是对比两种截然不同的网络设计:

graph TB subgraph 电话网络["电话网络 — 智能网络,傻瓜终端"] direction TB P1[" 模拟电话<br/>(傻瓜终端)"] -->|模拟信号| SW1[" 中心交换机<br/>(智能:建立电路、计费、信令)"] SW1 -->|电路交换| SW2[" 中心交换机"] SW2 -->|模拟信号| P2[" 模拟电话<br/>(傻瓜终端)"] end subgraph 互联网["互联网 — 傻瓜网络,智能终端"] direction TB PC1[" 计算机<br/>(智能:TCP 重传、TLS 加密、HTTP 解析)"] -->|数据包| R1[" 路由器<br/>(傻瓜:只看 IP 地址转发)"] R1 -->|数据包| R2[" 路由器"] R2 -->|数据包| PC2[" 服务器<br/>(智能:TCP 重传、TLS 加密、HTTP 解析)"] end style 电话网络 fill:#e3f2fd,stroke:#1565c0 style 互联网 fill:#e8f5e9,stroke:#2e7d32 style SW1 fill:#bbdefb,stroke:#1565c0,stroke-width:2px style SW2 fill:#bbdefb,stroke:#1565c0,stroke-width:2px style R1 fill:#c8e6c9,stroke:#2e7d32 style R2 fill:#c8e6c9,stroke:#2e7d32 style PC1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px style PC2 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px
维度电话网络互联网
设计哲学智能网络,傻瓜终端傻瓜网络,智能终端
通信方式电路交换(独占一条通路)分组交换(共享网络带宽)
可靠性保障网络保证(交换机负责)端点保证(TCP 重传)
安全性网络保证(物理隔离)端点保证(TLS 加密)
新应用部署需要网络设备升级只需端点软件升级
计费方式按时间/距离按带宽
典型故障模式交换机故障→大面积瘫痪路由器故障→自动绕路

4.3 为什么端到端原则让互联网如此灵活#

考虑一个具体例子:1990 年代,没有人想到互联网上会跑视频通话(Zoom、FaceTime)。如果互联网像电话网络一样,在网络中间实现”通话”功能,那么要支持视频通话就需要升级全球所有的交换机——这几乎不可能。

但互联网是”傻瓜网络”——路由器只做转发,不关心数据包里装的是什么。所以当视频通话应用出现时,只需要在端点(你的电脑和 Zoom 服务器)安装软件就行了,中间的路由器完全不需要改动。

这就是端到端原则的威力:网络中间越简单,端点能做的事情就越多

4.4 端到端原则的例外#

当然,端到端原则不是绝对的。现实中有很多”违反”端到端原则的设计,而且它们有充分的理由:

  • NAT(网络地址转换):在路由器上修改 IP 地址和端口,解决了 IPv4 地址不足的问题,但也破坏了端到端的可达性。详细的 NAT 机制见NAT 与中间盒
  • CDN(内容分发网络):在网络边缘缓存内容,减少延迟,但引入了中间节点
  • 防火墙:在网络中间过滤流量,提供安全性,但违反了”网络不检查内容”的原则
Warning

NAT 是互联网最大的”技术债”。它解决了 IPv4 地址耗尽的燃眉之急,但也让 P2P 通信变得困难、让端到端加密更复杂、让网络调试更痛苦。IPv6 的设计目标之一就是消除 NAT,但迁移进度远比预期慢。IPv6 的详细分析见NAT 与中间盒

五、一个数据包的完整旅程预览#

现在,把前面学到的所有概念串起来,跟踪一个数据包从浏览器到服务器的完整旅程。这个旅程会经过后续几乎每一章涉及的主题。

5.1 场景:访问 https://example.com#

你在浏览器地址栏输入 https://example.com 并按下回车。接下来发生的事情:

graph LR B[" 浏览器"] -->|1. DNS 查询| DNS[" DNS 服务器<br/><i>Ch16 DNS</i>"] DNS -->|2. IP 地址| B B -->|3. TCP SYN| TCP[" TCP 三次握手<br/><i>Ch13 TCP</i>"] TCP -->|4. TLS ClientHello| TLS[" TLS 握手<br/><i>Ch17 TLS</i>"] TLS -->|5. HTTP GET| HTTP[" HTTP 请求<br/><i>Ch18 HTTP</i>"] HTTP -->|6. 封装成帧| SWITCH[" 交换机<br/><i>Ch3 以太网</i>"] SWITCH -->|7. 转发| ROUTER[" 路由器<br/><i>Ch7 域内路由</i>"] ROUTER -->|8. 下一跳| ISP[" 本地 ISP<br/><i>Ch10 骨干网</i>"] ISP -->|9. 对等互联| IXP[" IXP 交换中心<br/><i>Ch11 IXP</i>"] IXP -->|10. 跨域传输| PEER[" 对端 ISP<br/><i>Ch8 BGP</i>"] PEER -->|11. 最后路由| DC[" 数据中心<br/><i>Ch20 SDN</i>"] DC -->|12. 解封装| SERVER[" 服务器"] style B fill:#e3f2fd,stroke:#1565c0 style DNS fill:#e8f5e9,stroke:#2e7d32 style TCP fill:#fff3e0,stroke:#e65100 style TLS fill:#fce4ec,stroke:#c62828 style HTTP fill:#f3e5f5,stroke:#6a1b9a style SWITCH fill:#e0f2f1,stroke:#00695c style ROUTER fill:#e0f2f1,stroke:#00695c style ISP fill:#bbdefb,stroke:#1565c0 style IXP fill:#bbdefb,stroke:#1565c0 style PEER fill:#bbdefb,stroke:#1565c0 style SERVER fill:#e8f5e9,stroke:#2e7d32

5.2 旅程的每一步#

第 1 步:DNS 查询 — 浏览器需要知道 example.com 的 IP 地址。它向 DNS 服务器发送查询,DNS 服务器返回 93.184.216.34。DNS 是互联网的”电话簿”——把人类可读的域名翻译成机器可读的 IP 地址。详细机制见DNS 域名系统

第 2 步:TCP 三次握手 — 拿到 IP 地址后,浏览器与服务器建立 TCP 连接。三次握手(SYN → SYN-ACK → ACK)确保双方都准备好收发数据。为什么需要握手?因为网络是不可靠的——旧的连接请求可能还在网络中游荡,握手可以避免混淆。详细分析见TCP 连接管理

第 3 步:TLS 握手 — 因为 URL 以 https 开头,浏览器需要与服务器协商加密参数。TLS 握手交换证书、协商密钥、验证身份,确保后续数据传输是加密的。详细过程见TLS 与安全通道

第 4 步:发送 HTTP 请求 — TLS 通道建立后,浏览器发送 HTTP GET 请求。HTTP 定义了请求的格式和语义。详细协议分析见HTTP 协议演进

第 5 步:交换机转发 — 数据包从你的电脑出发,首先到达本地交换机。交换机工作在链路层,根据 MAC 地址转发帧。它不关心 IP 地址,只看”下一跳”的 MAC 地址。详细的以太网和交换机机制见以太网与交换

第 6 步:路由器转发 — 数据包到达路由器,路由器工作在网络层,根据 IP 地址查路由表决定下一跳。路由表是怎么构建的?这涉及路由协议(OSPF、BGP)。详细机制见域内路由BGP 与域间路由

第 7 步:穿越 ISP — 数据包从你的家庭网络进入 ISP 的网络。ISP 是互联网的”骨干”——它们拥有大范围的光纤网络和路由器集群。详细的 ISP 生态见运营商骨干网与流量工程

第 8 步:经过 IXP — 如果目标服务器不在你的 ISP 网络内,数据包需要通过 IXP(互联网交换中心)转移到另一个 ISP 的网络。IXP 是不同 ISP 之间”握手”的地方。详细机制见IXP 与互联网交换

第 9 步:到达服务器 — 数据包经过对端 ISP 的路由器,最终到达目标服务器所在的数据中心。服务器逐层解封装,最终将 HTTP 响应沿同一路径(或不同路径)返回。

5.3 用 traceroute 观察真实路径#

你可以用 traceroute 命令观察数据包经过的每一跳路由器:

# Linux/macOS
traceroute example.com
# Windows
tracert example.com

典型的输出如下:

traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
1 _gateway (192.168.1.1) 0.523 ms 0.389 ms 0.312 ms
2 10.0.0.1 (10.0.0.1) 1.234 ms 1.156 ms 1.089 ms
3 isp-router-1.net (203.0.113.1) 5.678 ms 5.432 ms 5.321 ms
4 core-router-2.net (198.51.100.1) 12.345 ms 12.234 ms 12.123 ms
5 ixp-peering.net (185.0.1.1) 15.678 ms 15.567 ms 15.456 ms
6 peer-router-1.net (172.16.0.1) 18.901 ms 18.789 ms 18.678 ms
7 dc-edge.example.com (93.184.216.1) 20.123 ms 20.012 ms 19.901 ms
8 example.com (93.184.216.34) 21.456 ms 21.345 ms 21.234 ms

每一行代表一跳路由器,三个时间值是三次探测的延迟。从这个输出可以看到:数据包从家庭网关(第 1 跳)出发,经过 ISP 路由器(第 3-4 跳),穿越 IXP(第 5 跳),到达对端网络(第 6-8 跳)。

traceroute 的原理很巧妙:它发送 TTL(Time To Live)从 1 开始递增的 IP 数据包。每经过一个路由器,TTL 减 1;当 TTL 减到 0 时,路由器丢弃该包并返回 ICMP 超时消息。这样就能逐跳探测路径。TTL 和 ICMP 的详细机制见IP 地址与子网

5.4 用 ping 测量延迟#

# 测量到 example.com 的往返延迟
ping -c 5 example.com
# 输出:
# PING example.com (93.184.216.34) 56(84) bytes of data.
# 64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=21.3 ms
# 64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=20.8 ms
# 64 bytes from 93.184.216.34: icmp_seq=3 ttl=56 time=21.1 ms
# 64 bytes from 93.184.216.34: icmp_seq=4 ttl=56 time=20.9 ms
# 64 bytes from 93.184.216.34: icmp_seq=5 ttl=56 time=21.0 ms
# --- example.com ping statistics ---
# rtt min/avg/max/mdev = 20.800/21.020/21.300/0.172 ms

ping 使用 ICMP 协议(工作在网络层),发送一个 Echo Request,等待对方返回 Echo Reply。从输出可以看到:5 个包全部到达,平均往返延迟约 21ms,丢包率 0%。

六、互联网的关键数字#

理解互联网不仅需要概念框架,还需要对真实数据有直觉。以下数字帮助你建立这种直觉。

6.1 延迟:距离的代价#

光速是物理定律,它给网络延迟设定了不可逾越的下限。光在真空中的速度约 300,000 km/s,但在光纤中(折射率约 1.5)只有约 200,000 km/s。再加上路由器的处理延迟和排队延迟,实际延迟远高于光速极限:

# 查看本机路由表
ip route show
# 典型输出:
# default via 192.168.1.1 dev eth0
# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

第一行是默认路由——所有不知道怎么走的数据包都发给 192.168.1.1(你的家庭路由器)。路由的详细机制见IP 地址与子网

路径距离光纤延迟(理论)实际 RTT倍率
同城(~50 km)50 km~0.5 ms1-3 ms2-6x
同国(~1000 km)1000 km~10 ms15-30 ms1.5-3x
跨洲(~8000 km)8000 km~80 ms100-150 ms1.3-1.9x
跨太平洋(~10000 km)10000 km~100 ms120-200 ms1.2-2x

为什么实际延迟是理论值的 1.5-3 倍?因为数据包不是走直线——光纤沿着海底地形铺设,路由策略可能绕行,每跳路由器还有处理和排队延迟。理解了这些,你就知道”延迟不可能低于光速极限”这个硬约束。

6.2 带宽:管道的宽度#

带宽和延迟是两个独立的维度——带宽是”管道有多宽”,延迟是”管道有多长”。高带宽不等于低延迟:

# 查看网络接口信息
ifconfig eth0
# 典型输出:
# eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
# inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
# inet6 fe80::1 prefixlen 64 scopeid 0x20<link>
# ether 00:1a:2b:3c:4d:5e txqueuelen 1000 (Ethernet)
# RX packets 1234567 bytes 890123456 (890.1 MB)
# TX packets 987654 bytes 567890123 (567.9 MB)
连接类型典型下行带宽典型延迟典型场景
拨号上网56 Kbps100-200 ms1990 年代的互联网
家庭宽带100-1000 Mbps5-20 ms大多数家庭用户
企业专线1-10 Gbps1-5 ms数据中心互联
5G 移动网络100-1000 Mbps10-30 ms移动设备
卫星互联网(Starlink)50-200 Mbps20-40 ms偏远地区

一个经典的类比:带宽是高速公路的车道数,延迟是你从起点到终点需要开多久。增加车道数(带宽)不能缩短行车时间(延迟),但能让更多车同时上路(吞吐量)。

6.3 丢包率与可靠性#

互联网是”尽力而为”(Best-Effort)的网络——IP 协议不保证数据包一定到达。丢包的原因包括:网络拥塞(路由器缓冲区溢出)、链路错误(光纤损坏)、路由环路(TTL 耗尽)。

# 查看网络连接统计
ss -s
# 典型输出:
# Total: 234 (kernel 0, TCP: 156, UDP: 12, RAW: 0)
# TCP: 156 (estab 89, closed 23, orphaned 0, timewait 12)
# Transport Total IP IPv6
# RAW 0 0 0
# UDP 12 8 4
# TCP 156 120 36
# INET 168 128 40
# FRAG 0 0 0
# 查看网络接口的丢包统计
netstat -i
# 典型输出:
# Kernel Interface table
# Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
# eth0 1500 1234567 0 12 0 987654 0 0 0 BMRU
# lo 65536 56789 0 0 0 56789 0 0 0 LRU

netstat -i 的输出中,RX-DRP(接收丢包)和 TX-DRP(发送丢包)列告诉你是否有丢包。上例中 eth0 接收了 12 个丢包——可能是缓冲区不足或中断处理不及时。

网络环境典型丢包率影响
局域网< 0.01%几乎无影响
家庭宽带0.01%-0.1%TCP 自动重传,用户无感知
移动网络0.1%-1%视频通话可能卡顿
跨洲链路0.01%-0.5%TCP 吞吐量下降
拥塞链路1%-5%明显卡顿,TCP 急剧降速

6.4 互联网规模#

# 查看 DNS 解析配置
cat /etc/resolv.conf
# 典型输出:
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# search localdomain
指标数值说明
全球互联网用户~55 亿约占全球人口的 68%
全球网站数量~19 亿包含大量不活跃站点
全球 AS 数量~75,000独立运营的网络
全球 IPv4 地址~43 亿已全部分配完毕
全球 IPv6 采用率~40%各国差异巨大
跨太平洋光纤延迟~70 ms单程,光速限制
典型网页加载时间~2-3 秒包含 DNS、TCP、TLS、HTTP
全球日均 DNS 查询~2 万亿每秒约 2300 万次
海底光缆总长~140 万公里绕地球 35 圈
典型 MTU1500 字节以太网最大传输单元

6.5 用 curl 观察完整的请求过程#

# 使用 curl -v 观察一次完整的 HTTP 请求
curl -v https://example.com
# 输出(简化):
# * Trying 93.184.216.34:443...
# * Connected to example.com (93.184.216.34) port 443
# * ALPN: curl offers h2,http/1.1
# * TLSv1.3 (OUT), TLS handshake, Client hello (xxx bytes)
# * TLSv1.3 (IN), TLS handshake, Server hello (xxx bytes)
# * TLSv1.3 (IN), TLS handshake, Certificate (xxx bytes)
# * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1 bytes)
# * TLSv1.3 (OUT), TLS handshake, Finished (xxx bytes)
# * TLSv1.3 (IN), TLS handshake, Finished (xxx bytes)
# * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
# > GET / HTTP/1.1
# > Host: example.com
# > User-Agent: curl/8.x.x
# > Accept: */*
# >
# < HTTP/1.1 200 OK
# < Content-Type: text/html
# < Content-Length: 1256
# <
# <!doctype html>...

从这个输出可以看到完整的连接过程:DNS 解析 → TCP 连接 → TLS 握手 → HTTP 请求/响应。每一步的详细机制都会在后续章节展开。

# 只测量连接各阶段耗时
curl -w "DNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null -s https://example.com
# 典型输出:
# DNS: 0.023s
# TCP: 0.045s
# TLS: 0.089s
# TTFB: 0.112s
# Total: 0.125s

这个输出清晰地展示了各阶段耗时:DNS 查询 23ms,TCP 连接 45ms,TLS 握手 89ms,首字节到达 112ms,总耗时 125ms。注意 TLS 握手占了总耗时的 70%——这就是为什么 TLS 1.3 致力于减少握手往返次数。

七、动手实践:感受互联网#

7.1 观察你的网络接口#

# 查看网络接口详细信息(新版工具)
ip addr show
# 典型输出:
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
# link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
# inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
# inet6 fe80::1/64 scope link

从这个输出你能读到:MAC 地址(00:1a:2b:3c:4d:5e)、IPv4 地址(192.168.1.100)、MTU(1500 字节)、接口状态(UP)。这些概念在以太网与交换IP 地址与子网中详细解释。

7.2 观察路由表#

# 查看完整路由表
ip route show
# 典型输出:
# default via 192.168.1.1 dev eth0
# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

第一行是默认路由——所有不知道怎么走的数据包都发给 192.168.1.1(你的家庭路由器)。路由的详细机制见域内路由

7.3 观察 ARP 表#

# 查看 ARP 缓存(IP → MAC 映射)
ip neigh show
# 典型输出:
# 192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE
# 192.168.1.5 dev eth0 lladdr 11:22:33:44:55:66 STALE

ARP 协议把 IP 地址映射到 MAC 地址——这是链路层和网络层之间的桥梁。详细的 ARP 机制见ARP 与首跳路由

7.4 观察活跃连接#

# 查看所有 TCP 连接
ss -tnp
# 典型输出:
# State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
# ESTAB 0 0 192.168.1.100:54321 93.184.216.34:443 users:(("chrome",pid=1234))
# ESTAB 0 0 192.168.1.100:54322 140.82.121.6:443 users:(("chrome",pid=1234))
# TIME-WAIT 0 0 192.168.1.100:54320 151.101.1.69:443

从这个输出可以看到:你的浏览器与哪些服务器建立了 TCP 连接、连接处于什么状态(ESTAB/TIME-WAIT)、对应的进程是什么。TCP 状态机的详细分析见TCP 连接管理

八、本章小结#

主题核心要点关键词
互联网简史从 ARPANET 的军事实验到 TCP/IP 的统一,从学术网络到全球基础设施ARPANET、TCP/IP、分组交换
沙漏模型IP 是窄腰——上面是多种应用协议,下面是多种链路技术,中间只有一个 IP窄腰、解耦、异构互联
分层架构五层模型(物理→链路→网络→传输→应用),每层封装/解封装,关注点分离封装、解封装、协议头部
端到端原则智能在端点而非网络中间——这让互联网能不断演进而不需要升级核心设备傻瓜网络、智能终端、灵活性
数据包旅程浏览器→DNS→TCP→TLS→HTTP→交换机→路由器→ISP→IXP→服务器全链路、逐跳转发
关键数字光纤延迟≈5ms/1000km,跨太平洋≈70ms,典型网页≈2-3s,用户≈55亿延迟、带宽、丢包率

带着这个全景视角,接下来深入协议栈的最底层——物理介质与编码,看看比特是如何在铜线、光纤和无线电波中传输的。

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

互联网全景:一个数据包的旅程
https://blog.souloss.com/posts/internet-architecture/internet-overview/
作者
Souloss
发布于
2022-01-23
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时