tcp握手成功率可通过tcpdump抓取syn/syn-ack/ack包,用tshark+awk按连接去重统计:总尝试数为有syn的流数,成功数为同时存在syn、syn-ack、ack的流数,成功率=成功数/总数×100%。

直接用 tcpdump 捕获握手包,配合 Shell 脚本解析 SYN/SYN-ACK/ACK 流量,就能算出 TCP 握手成功率。关键不是抓全量流量,而是精准匹配三次握手中的关键标志位,并按连接(源IP:端口 → 目标IP:端口)去重统计。
一、用 tcpdump 抓取带 TCP 标志位的握手相关包
只捕获 SYN、SYN-ACK、ACK 三类包,减少干扰,提升后续分析效率:
- 运行命令(建议指定网卡和端口范围,避免噪音):
tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0 and (tcp[tcpflags] & tcp-syn != 0 or (tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0))' -w handshake.pcap -c 10000 - 说明:
•tcp[tcpflags] & (tcp-syn|tcp-ack) != 0筛出含 SYN 或 ACK 的包
• 再细分:SYN 包(SYN=1, ACK=0)、SYN-ACK 包(SYN=1, ACK=1)、纯 ACK(SYN=0, ACK=1,用于确认第三次握手)
•-c 10000限制抓包数量,防脚本长期阻塞;生产环境可用-G 60 -W 1循环写入 60 秒文件
二、Shell 脚本解析 pcap 并统计握手完成率
用 tshark(tcpdump 同源,支持字段提取)或 tcpdump -r + awk 提取关键信息。推荐 tshark 方案更稳:
- 先导出所有握手相关行(含时间、源/目标IP端口、TCP标志):
tshark -r handshake.pcap -T fields -e frame.time_epoch -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport -e tcp.flags.syn -e tcp.flags.ack -E separator=',' > handshake.csv - 用 awk 统计每条流是否完成三次握手:
awk -F',' '{ flow = $2":"$3"->"$4":"$5 if ($6==1 && $7==0) syn[flow] = 1 else if ($6==1 && $7==1) synack[flow] = 1 else if ($6==0 && $7==1) ack[flow] = 1 } END { for (f in syn) { if (synack[f] && ack[f]) success++ total++ } printf "总尝试连接数:%d\n成功完成握手数:%d\n握手成功率:%.2f%%\n", total, success, success/total*100 }' handshake.csv
三、生成简明网络报告(含时间戳与异常提示)
把统计结果加上上下文,输出为可读报告:
- 脚本末尾追加:
echo "=== TCP 握手质量报告 ===" >> report.txt<br> echo "生成时间:$(date)" >> report.txt<br> echo "数据来源:handshake.pcap(共 $(wc -l > report.txt<br> # 上面 awk 结果也重定向进 report.txt
- 可选增强:
• 加一行检测“有 SYN 无 SYN-ACK”的流(疑似丢包或防火墙拦截):awk 'BEGIN{c=0} $6==1&&$7==0{if(!synack[$2":"$3"->"$4":"$5])c++} END{print "SYN超时未响应数:"c}' handshake.csv
• 报告末尾加建议,如“成功率<95% 时建议检查中间设备策略或服务端负载”
四、部署为定时任务自动执行
写成可复用脚本 tcp_handshake_report.sh,加入 crontab 每5分钟跑一次:
- 脚本开头加
#!/bin/bash,设置路径和临时目录
- crontab 示例:
*/5 * * * * /path/to/tcp_handshake_report.sh >> /var/log/tcp-report.log 2>&1 - 注意权限:
chmod +x tcp_handshake_report.shsudo setcap cap_net_raw+ep $(which tcpdump)(免 root 运行抓包)
整个流程不依赖外部数据库或 Python,纯 Shell + tcpdump + tshark 就能闭环。重点是标志位判断要准、连接标识要唯一、失败归因要有线索——这样生成的报告才真能帮运维定位网络层问题。











