4. 网络协议与网络故障排查:TCP/IP、DNS、HTTP、抓包分析

本讲聚焦运维安全面试最高频的四个网络主题:TCP/IP 协议状态机、DNS 解析链路、HTTP 语义与状态码、tcpdump 抓包实战。核心目标不是背概念,而是建立“现象 → 协议 → 报文 → 根因”的排查思维链。下面用 3 个经典问题卡片 + 公司侧重点 + 面试官画像帮你拆解考点。

TCP 三次握手回答框架 1. 流程还原 SYN → SYN+ACK → ACK 2. 核心字段 seq/ack/ISN/MSS/WS 3. 为什么是三次 防历史重复连接 追问:半连接队列 追问:SYN Flood 追问:TFO 追问:tcpdump验证 加分点:讲清「三次握手→连接建立→四次挥手」完整闭环 + 结合 /proc/sys/net/ipv4/tcp_syncookies 说明防护 + 用 tcpdump 展示实际报文确认序列号

📌 问题1:请详细描述TCP三次握手和四次挥手的过程,并说明为什么需要三次握手?

回答框架

  1. 三次握手:① 客户端发送 SYN (seq=x) → ② 服务端回复 SYN+ACK (seq=y, ack=x+1) → ③ 客户端发送 ACK (seq=x+1, ack=y+1)。
  2. 四次挥手:① 客户端发送 FIN (seq=u) → ② 服务端回复 ACK (ack=u+1) → ③ 服务端发送 FIN (seq=v) → ④ 客户端回复 ACK (ack=v+1)。
  3. 三次理由:防止已失效的 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 请求?请给出一次完整排查案例。

回答框架

  1. 明确目标:抓取指定端口的 HTTP 交互(通常 80 或 8080)。
  2. 选择过滤:tcpdump -i eth0 -nn 'tcp port 80 and (tcp[tcpflags] & (tcp-syn) != 0)' 仅看握手;或 port 80 and tcp[((tcp[12]&0xf0)>>2):4] = 0x474554 过滤 GET 请求。
  3. 保存并分析:-w http.pcap → 用 Wireshark 或 tshark 解析。
  4. 关注重点:请求行、响应状态码、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 图形化分析。
网络故障排查追问路径 用户反馈:访问慢/超时 ping 连通性? traceroute 路由 DNS 解析正常? dig +trace 应用层正常? tcpdump 抓包

🏢 公司侧重点

公司类型考察重点典型问题
云厂商(阿里云、腾讯云)网络性能、SLB 回源、高并发连接"大量 TIME_WAIT 怎么优化?"
互联网大厂(字节、美团)DNS 调度、HTTP/2、QUIC 协议"如何用 tcpdump 验证 HTTP/2 多路复用?"
安全公司(奇安信、深信服)DDoS 检测、TCP 异常流量分析"SYN Flood 的包特征是什么?"

👤 面试官画像

典型背景:资深运维/SRE、网络架构师、安全攻防专家。通常有 5-10 年一线经验,曾亲自处理过某某机房故障或核心链路问题。

考核方式:

  • 先问基础流程,观察你能否讲清状态迁移和关键字段;
  • 然后给一个真实故障场景(如:“客户反应偶尔连接超时,如何定位?”),看你能否结构化排查(分层、抓包、分析);
  • 最后追问优化方案(如:“TIME_WAIT 过多怎么调优?”),考察系统知识深度。

面试官最反感的回答:只背口诀、不画图、不提到具体工具命令、不结合实际运维故障。