从一次 curl 说起:网络到底是什么
不谈调优、不谈参数。用一条命令把 DNS、TCP、TLS、HTTP 串起来,顺手把后面要用的名词认全。
学完这节你能做到
- 说出一次 curl 背后依次发生的五件事,以及各自可能在哪一步失败
- 认识 MAC / IP / 端口 / 网关 / DNS / MTU / RTT 这几个后面天天出现的名词
- 知道自己该按哪条路线学下去,以及哪些内容现在可以先跳过
这一节不讲任何参数
如果你刚毕业、没排查过线上网络问题,从这里开始。这一节不调优、不背参数,只做三件事:
- 用一条命令看清"访问一个网站"到底发生了什么
- 把后面天天出现的名词一次性认全
- 告诉你该往哪条路线走,以及现在可以先跳过什么
学校里学的 OSI 七层没有错,但它给不了排障能力——因为它没告诉你每一步在哪里会坏、怎么看。 这一节补的就是这个。
一条命令,五件事
curl https://example.com
看着是一步,实际依次发生了五件事。顺序很重要,因为故障总是发生在某一步。
① 查地址(DNS) example.com → 93.184.216.34
↓
② 建立连接(TCP) 三次握手,和对方的 443 端口
↓
③ 协商加密(TLS) 交换证书,确认对方是谁,商定密钥
↓
④ 收发数据(HTTP) 发请求、收响应
↓
⑤ 关闭连接
每一步失败的样子完全不同,看报错就能定位到步骤:
| 报错 | 卡在哪一步 | 说明什么 |
|---|---|---|
Could not resolve host | ① DNS | 域名没解析出来,网络本身可能是好的 |
Connection timed out | ② TCP | 包发出去了没人应答:地址不通、防火墙拦了 |
Connection refused | ② TCP | 对方在,但那个端口没有程序在听 |
certificate has expired | ③ TLS | 网络完全正常,证书过期了 |
404 / 500 | ④ HTTP | 网络全对,是应用的问题 |
这是新人最该先分清的一对:
- refused = 你的包到了对面,对面明确说"这个端口没人"。网络是通的,问题在服务没启动或端口写错。
- timeout = 你的包发出去,什么回音都没有。可能是地址不对、路由不通、防火墙静默丢弃。
一个是"到了但被拒绝",一个是"根本没到"。搞混这两个,排查方向会完全相反。
亲手看一遍
-v 会把上面五步逐行打出来。这是最值得养成的习惯:
curl -v https://example.com
* Host example.com:443 was resolved.
* IPv4: 93.184.216.34 ← ① DNS 完成
* Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443 ← ② TCP 完成
* TLS handshake, Certificate (11):
* SSL connection using TLSv1.3 / AES_256_GCM ← ③ TLS 完成
> GET / HTTP/2 ← ④ 发出请求(> 是发出)
> Host: example.com
>
< HTTP/2 200 ← ④ 收到响应(< 是收到)
< content-type: text/html
三个读法记住:
*开头是 curl 自己的过程说明>开头是发出去的内容<开头是收回来的内容
看到最后一行是什么,就知道走到了第几步。
四个地址,各管一段
新人最容易糊的地方:为什么有这么多"地址"?因为每一段路要解决的问题不同。
| 名字 | 例子 | 管什么 | 作用范围 |
|---|---|---|---|
| MAC 地址 | b8:ce:f6:2a:1c:40 | 同一个局域网内找到那台机器 | 只在本网段有意义 |
| IP 地址 | 10.0.12.34 | 跨网段找到那台机器 | 全网 |
| 端口 | 443 | 找到机器上的哪个程序 | 单台机器内 |
| 域名 | example.com | 给人记的名字,靠 DNS 换成 IP | 全网 |
一个类比:IP 是小区地址,MAC 是这栋楼在小区里的门牌,端口是几号房间,域名是"张三家"这个叫法。
所以一次访问需要:域名 →(DNS)→ IP →(路由)→ 找到那台机器 →(端口)→ 找到那个程序。 后面每一节课,本质上都是在讲这条链条上的某一环。
新人术语速查表
这些词后面会反复出现。现在不用记住细节,知道它是干什么的就够了, 遇到时回来查一眼。
硬件与链路
| 名词 | 一句话 |
|---|---|
| 网卡(NIC) | 机器上收发包的硬件。bond0、eth0 这类名字就是它 |
| 交换机 | 同一网段内转发,按 MAC 地址决定往哪个口发 |
| 路由器 | 跨网段转发,按 IP 地址决定下一跳 |
| 网关 | 本网段的出口。目标不在本网段时,包都先交给它 |
| MTU | 一个包最大能多大,默认 1500 字节。端到端必须一致,不一致会出很诡异的故障 |
协议与行为
| 名词 | 一句话 |
|---|---|
| TCP | 可靠传输:保证送到、保证顺序,代价是要握手、会重传 |
| UDP | 不保证送到,但没有握手开销。DNS、视频、RDMA 都用它 |
| ARP | 在同网段里问"这个 IP 是哪块网卡",拿到 MAC 地址 |
| DNS | 域名换 IP |
| NAT | 改写包里的地址。你家路由器让多台设备共用一个公网 IP 就靠它 |
| RTT | 往返时延。一个包过去再回来花的时间,同机房通常零点几毫秒 |
| 丢包 | 包没到。TCP 会重传(变慢),UDP 就直接没了 |
| 重传 | TCP 发现包丢了重新发一遍。重传率高 = 链路有问题 |
排障常用
| 名词 | 一句话 |
|---|---|
| 带宽 | 单位时间能搬多少数据,用 Gbps 计 |
| PPS | 每秒处理多少个包。小包场景下它比带宽更容易先撞墙 |
| 队列 | 处理不过来时排队的地方。排队 = 延迟;队列满 = 丢包 |
| 抓包 | 把经过网卡的包录下来看,工具是 tcpdump |
| 计数器 | 内核和网卡记的各种数字(收了多少、丢了多少)。排障主要靠看它,不是靠猜 |
新人排障最常见的做法是"改一个参数试试",然后网络好了也不知道为什么好。
正确的路子是:每一层都有计数器,看数字说话。 网卡丢了多少包、内核丢了多少、 TCP 重传了多少次——这些都有明确的数字可查。后面《网络观测工具箱》那节会给你一套固定命令, 《一台"网络慢"的机器》那一关会让你用它真的破一个案子。
三个先记住的判断
哪怕后面的课都还没学,这三条也能让你在工作里少走弯路:
ping通不代表业务正常。 ping 用的是很小的包、很低的频率。高负载下丢包、 某个端口没监听、证书过期,ping 全都发现不了。- "网络慢"八成不是网络的问题。 可能是应用读得慢、CPU 忙不过来、DNS 解析慢。 先分清是哪一步慢,再动手。
- 不要一上来就抓包。 抓包信息量太大。先看计数器把范围收窄,带着假设去抓,效率高一个数量级。
接下来学什么
你在这里
↓
L0 网络基础 ← 所有人都该学完,约 3.5 小时
↓
T 代理与隧道 ← 紧接着学这个:门槛低、入职第一周就用得上
↓
├─ 做后端 / 平台 → L1 容器网络
├─ 做 AI 集群 → L2 高性能网络(先跳过标「深入」的,回头再补)
├─ 做方案 / 售前 → L3 网络规划
└─ 想深挖某个点 → L4 进阶专题(按需取用,不用通读)
注意 T 不是"第五阶段",它是一条旁路:只依赖 L0,不依赖 L1/L2/L3。 所以它排在 L0 后面而不是压到最末 —— 学完就能用,比继续堆概念更容易撑住。
几条实际建议:
- L0 按顺序学完,它是后面所有内容的前提,跳过会处处别扭
- 接着去 T 的前两节(HTTP/SOCKS5 代理、SSH 端口转发)—— 入职第一周大概率就要用跳板机,这两节立刻能用上
- 看到标 「深入」 的课可以先跳过,等遇到具体问题再回来
- 课程页顶部的**「建议先学」**会告诉你这一节缺哪些前置,不用自己记依赖关系
- 首页有一条**「新手路线」**,14 节课约 7 小时,照着走就行
检查点
curl 报 Connection refused,最合理的判断是?
下面哪些说法是对的?(多选)
同事报障说「服务访问很慢」。按这节课的思路,第一步该做什么?
这节课的落点
- 一次访问 = DNS → TCP → TLS → HTTP → 关闭,故障总在某一步,看报错就能定位
- timeout(根本没到)与 refused(到了被拒)方向完全相反,先分清这一对
curl -v的*/>/<三种前缀分别是过程、发出、收到- 四个地址各管一段:MAC 管同网段、IP 管跨网段、端口管程序、域名管人记
- 三条先记住:ping 通 ≠ 业务正常;"网络慢"多半不是网络;别一上来就抓包
- 排障靠看计数器,不靠改参数试
- L0 按顺序学完,然后按岗位选方向;标「深入」的可以先跳过
延伸资料
- ·Systems Performance, 2nd Edition — Brendan Gregg