4. 网络协议与网络故障排查:TCP/IP、DNS、HTTP、抓包分析
本讲聚焦运维安全面试最高频的四个网络主题:TCP/IP 协议状态机、DNS 解析链路、HTTP 语义与状态码、tcpdump 抓包实战。核心目标不是背概念,而是建立“现象 → 协议 → 报文 → 根因”的排查思维链。下面用 3 个经典问题卡片 + 公司侧重点 + 面试官画像帮你拆解考点。
📌 问题1:请详细描述TCP三次握手和四次挥手的过程,并说明为什么需要三次握手?
回答框架
- 三次握手:① 客户端发送 SYN (seq=x) → ② 服务端回复 SYN+ACK (seq=y, ack=x+1) → ③ 客户端发送 ACK (seq=x+1, ack=y+1)。
- 四次挥手:① 客户端发送 FIN (seq=u) → ② 服务端回复 ACK (ack=u+1) → ③ 服务端发送 FIN (seq=v) → ④ 客户端回复 ACK (ack=v+1)。
- 三次理由:防止已失效的 SYN 请求突然到达导致重复连接;通过 ISN 协商和序列号确认实现可靠同步。
简短示例
# tcpdump 抓三次握手(精简)
$ tcpdump -i eth0 -nn 'tcp port 443 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'
# 输出形如:
# SYN: 10.0.0.1:54321 > 10.0.0.2:443 Flags [S], seq 123
# SYN-ACK: 10.0.0.2:443 > 10.0.0.1:54321 Flags [S.], seq 456, ack 124
# ACK: 10.0.0.1:54321 > 10.0.0.2:443 Flags [.], ack 457
追问(面试官可能连续深挖)
- 为什么 TIME_WAIT 状态需要 2MSL?
- 大量 CLOSE_WAIT 如何排查?用哪个命令查看?
- 如果第三次握手 ACK 丢了会怎样?
避坑指南
❌ 常见错误:只背“SYN—SYN/ACK—ACK”,不讲状态迁移(LISTEN→SYN_SENT→ESTABLISHED),不对比 ISN 随机性。
✅ 正确做法:画状态机简图 + 结合 /proc/net/tcp 中的状态值说明。
📌 问题2:请说明DNS解析的完整过程,以及常见的DNS故障排查方法。
回答框架
| 步骤 | 过程 | 关键点 |
|---|---|---|
| 1 | 检查本地缓存(hosts / nscd) | /etc/hosts 优先于 DNS |
| 2 | 递归查询本地区DNS服务器(Local DNS) | /etc/resolv.conf |
| 3 | 迭代查询根→顶级域→权威域 | 根服务器全球13个 IP |
| 4 | 返回并缓存解析结果 | TTL 控制缓存时间 |
简短示例
# 使用 dig 追踪递归过程
$ dig +trace example.com
# 输出显示:从 . 到 com. 到 example.com. 的 RTT 和 NS 记录
# 排查 DNS 延迟
$ time nslookup example.com
追问
- DNS 劫持与 DNS 缓存中毒的区别?如何用 DNSSEC 防护?
- 给你一个域名 ping 通但 nslookup 失败,可能原因是什么?
- 如何用 tcpdump 过滤 DNS 查询?
tcpdump -i any port 53 -nn
避坑指南
❌ 常见错误:只讲递归/迭代概念,没讲 /etc/hosts 和 systemd-resolved 的优先级。
✅ 正确做法:先确认本地配置,再用 dig +trace 分步验证,最后结合 tcpdump 看响应包。
📌 问题3:如何使用 tcpdump 抓包分析 HTTP 请求?请给出一次完整排查案例。
回答框架
- 明确目标:抓取指定端口的 HTTP 交互(通常 80 或 8080)。
- 选择过滤:
tcpdump -i eth0 -nn 'tcp port 80 and (tcp[tcpflags] & (tcp-syn) != 0)'仅看握手;或port 80 and tcp[((tcp[12]&0xf0)>>2):4] = 0x474554过滤 GET 请求。 - 保存并分析:
-w http.pcap→ 用 Wireshark 或 tshark 解析。 - 关注重点:请求行、响应状态码、Content-Length、Keep-Alive 头部、传输时间。
简短示例
# 抓取完整 HTTP 请求/响应并只显示协议层信息
$ tcpdump -i eth0 -nn -A 'tcp port 80'
# -A 以 ASCII 显示 payload(慎用于 HTTPS 场景)
# 推荐:只抓握手和首部
$ tcpdump -i eth0 -nn 'tcp port 80 and (tcp[13] = 0x18)' # PS+ACK 包含数据
追问
- 如何用 tcpdump 判断 HTTP 慢请求是服务端处理慢还是网络延迟?
- Retransmission 和 Duplicate ACK 如何定位丢包?
- HTTPS 下如何抓包?需要如何解密?
避坑指南
❌ 常见错误:直接
tcpdump port 80 输出过多,不会用表达式过滤;忘记考虑 wireshark 的 follow tcp stream 功能。
✅ 正确做法:先 -c 100 抓少量测试过滤条件,再用 -w 保存后用 Wireshark 图形化分析。
🏢 公司侧重点
| 公司类型 | 考察重点 | 典型问题 |
|---|---|---|
| 云厂商(阿里云、腾讯云) | 网络性能、SLB 回源、高并发连接 | "大量 TIME_WAIT 怎么优化?" |
| 互联网大厂(字节、美团) | DNS 调度、HTTP/2、QUIC 协议 | "如何用 tcpdump 验证 HTTP/2 多路复用?" |
| 安全公司(奇安信、深信服) | DDoS 检测、TCP 异常流量分析 | "SYN Flood 的包特征是什么?" |
👤 面试官画像
典型背景:资深运维/SRE、网络架构师、安全攻防专家。通常有 5-10 年一线经验,曾亲自处理过某某机房故障或核心链路问题。
考核方式:
- 先问基础流程,观察你能否讲清状态迁移和关键字段;
- 然后给一个真实故障场景(如:“客户反应偶尔连接超时,如何定位?”),看你能否结构化排查(分层、抓包、分析);
- 最后追问优化方案(如:“TIME_WAIT 过多怎么调优?”),考察系统知识深度。
面试官最反感的回答:只背口诀、不画图、不提到具体工具命令、不结合实际运维故障。