Lesson 0012:网络协议——TCP、DNS、TLS 面试三件套

← Lesson 0011 教你排错。排错需要理解底层——这课讲 DevOps 面试最常考的三个网络协议。

模型:TCP/IP 四层

应用层    HTTP, DNS, TLS, SSH     ← 你的代码在这一层
传输层    TCP, UDP                 ← 端口、连接、可靠性
网络层    IP, ICMP                 ← 寻址、路由
链路层    Ethernet, Wi-Fi          ← 物理传输

面试问「浏览器输入 URL 后发生了什么」,答案就是这四层从上到下再回来。

Topic 1:TCP——三次握手,四次挥手

三次握手(建立连接)

Client                           Server
  | -------- SYN -------→        |  1. 客户端:我想连你
  | ←--- SYN + ACK ------        |  2. 服务端:好的,我也想连你
  | -------- ACK -------→        |  3. 客户端:确认

为什么三次不是两次?防止旧的 SYN 包让服务端错误打开连接。

四次挥手(关闭连接)

Client                           Server
  | -------- FIN -------→        |  1. 客户端:我不发了
  | ←------- ACK --------        |  2. 服务端:收到(可能还有数据)
  | ←------- FIN --------        |  3. 服务端:我也不发了
  | -------- ACK -------→        |  4. 客户端:收到

为什么挥手多一次?TCP 是全双工——双方独立关闭。服务端收到 FIN 后可能还有数据要发。

关键连接状态

状态含义注意
LISTEN等待连接正常
ESTABLISHED连接中正常
TIME_WAIT主动关闭方等待 2MSL(~60s)正常,大量出现调内核参数
CLOSE_WAIT收到 FIN 但自己没关⚠️ 堆积 = 应用 bug(忘了 close)

Topic 2:DNS——域名怎么变成 IP

example.com → ?
  1. 浏览器缓存
  2. OS 缓存(/etc/hosts)
  3. Local DNS Resolver(路由器 / 8.8.8.8)
     → 4. Root DNS(根服务器)
     → 5. TLD DNS(.com 服务器)
     → 6. Authoritative DNS(example.com 的 NS 服务器)
  7. 返回 IP: 93.184.216.34

常见记录类型:

类型作用例子
A域名 → IPv4example.com. A 93.184.216.34
AAAA域名 → IPv6example.com. AAAA 2606:2800:...
CNAME别名 → 真名www.example.com. CNAME example.com.
MX邮件服务器example.com. MX 10 mail.example.com.
NS权威 DNS 服务器example.com. NS ns1.example.com.
TXT任意文本SPF、DKIM、域名验证
# DNS 排查工具
dig example.com                    # 完整 DNS 查询过程
dig example.com +short             # 只输出结果
dig -x 93.184.216.34               # 反向查询(IP → 域名)
dig example.com NS                  # 查 NS 记录
dig @8.8.8.8 example.com           # 指定 DNS 服务器

Topic 3:TLS——HTTPS 的 S 是怎么工作的

Client                           Server
  | -- ClientHello ---------→    |  "我支持 TLS 1.3, 这些加密套件"
  | ←- ServerHello + 证书 -----  |  "用这个套件,这是我的证书"
  |                               |
  | 验证证书链:                   |
  |  example.com 证书              |
  |    ↑ 由中间 CA 签发            |
  |    ↑ 由根 CA 签发(信任锚点)  |
  |                               |
  | -- 密钥交换 ------------→     |  生成对称加密密钥
  | ←- 确认 ---------------      |
  |                               |
  | ==== 之后所有通信都加密 ======

证书链:你的域名证书 ← 中间 CA 证书 ← 根 CA 证书(预装在操作系统/浏览器里)。任何一环断了就是「证书不受信任」。

# 用 openssl 看证书
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates
# notBefore=...  notAfter=...    ← 证书有效期

# 看完整证书链
openssl s_client -connect example.com:443 -showcerts

# 测试 TLS 版本
openssl s_client -connect example.com:443 -tls1_3
面试常问:HTTP 和 HTTPS 的区别,答四层:① 加密(TLS 加密数据)② 认证(证书验证身份)③ 完整性(防止篡改)④ 默认端口不同(80 vs 443)。

HTTP 状态码速记

范围含义经典
2xx成功200 OK, 201 Created, 204 No Content
3xx重定向301 永久, 302 临时, 304 缓存未修改
4xx客户端错误400 请求错误, 401 未认证, 403 无权限, 404 未找到, 429 请求太多
5xx服务端错误500 内部错误, 502 网关错误, 503 服务不可用, 504 网关超时

502 vs 504:502 = Nginx 连不上后端(后端挂了/没启动)。504 = Nginx 连上了但后端太久不响应。

小测验

Q1:TCP 为什么是三次握手而不是两次?
Q2:502 Bad Gateway 和 504 Gateway Timeout 的区别?
Q3:TLS 证书链的「信任锚点」是什么?

下一步

Lesson 0013:网络实战与负载均衡 →——Nginx upstream、健康检查、限流、CDN 原理、真实排错场景。

← Lesson 0011 · Lesson 0013 → · 术语表