什么时候轮到抓包
应用日志、APM、系统指标都查完仍然两头对不上的问题,才轮到抓包出场:请求到底发出去没有(发都没发,是客户端的锅)、对端到底回没回(回了没收到,是链路的锅)、连接是谁先断的(看 FIN/RST 谁先出手)。抓包是终审证据——它记录的是网卡上真实发生的每一个字节,不掺任何一层的谎。
三分钟上手
# 抓指定目标的包,数字形式显示地址和端口(不做 DNS 反查,快且不抖动)
$ tcpdump -i any -nn host 10.0.0.20 and port 6379 -c 100
# 常用过滤表达式(BPF 语法)
host 10.0.0.20 # 收发双方任一是它
src 10.0.0.5 and dst port 443 # 源地址 + 目标端口
tcp port 8080 or udp port 53 # 或条件
not port 22 # 排除 SSH(不然终端自己刷屏)
net 10.244.0.0/16 # 整个网段
# 常用参数
-i any # 所有网卡(容器环境必用)
-nn # 不解析域名/端口名
-c 100 # 抓满 100 个包自动停(线上保命参数)
-w out.pcap # 原始字节存文件,拿回本地用 Wireshark 细看
-s 0 # 完整抓包不截断(新版本默认已完整)读懂三次握手的真身
12:01:01.123456 IP 10.0.0.5.52333 > 10.0.0.20.6379: Flags [S], seq 1200, win 64240
12:01:01.123502 IP 10.0.0.20.6379 > 10.0.0.5.52333: Flags [S.], seq 8800, ack 1201
12:01:01.123511 IP 10.0.0.5.52333 > 10.0.0.20.6379: Flags [.], ack 8801
// Flags 含义:S=SYN .=ACK F=FIN R=RST P=PSH(有数据快取走)
// [S.] 是 SYN+ACK 合并包;纯 [.] 是普通确认
// 时间戳精确到微秒——RTT 直接两行相减就算出来两个高频判读:只有 [S] 没有 [S.]——SYN 发出去石沉大海,防火墙丢包或对端没监听;出现 [R]——连接被粗暴拒绝,配合“谁发的 R”定位责任方:服务端发 R 是没进程监听或主动踢,中间设备发 R 常是超时清理。
线上抓包的正确姿势
抓包本身有开销(内核拷贝每一帧给用户态),大流量机器上无过滤地抓等于 DoS 自己。守三条规矩:第一,过滤表达式写窄——限定 host + port,绝不抓 any any;第二,-c 限包数或 timeout 限时——tcpdump timeout 命令包一层,防止忘了它还挂着;第三,-w 存盘离线分析——生产机上只负责抓,细看回本地 Wireshark。容器环境注意 -i any 配合 netns,veth 两端会看到重复包,去重后再下结论。
和 tcpdump 搭配的兄弟
轻量场景有更省力的选择:ss -i 看单条连接的 RTT、重传、窗口(第九篇用过);nstat / netstat -s 看内核协议栈统计(重传包总数、RST 计数);strace -e trace=network 看进程的 connect/send/recv 系统调用。原则:先用统计缩小嫌疑,再用抓包定罪。下一篇:Wireshark——拿到 pcap 文件之后,怎么三步定位一次慢请求。
评论 (0)