-c 选项用于限制 tcpdump 抓取并输出/保存的匹配包数量,达到指定数目后自动退出;它只控制用户态行为,不影响内核抓包,常与 -w、-nn、-s0 等配合使用。

-c 选项就是用来设置 tcpdump 抓取数据包的最大个数的,它控制的是最终输出或保存的满足过滤条件的数据包数量,不是监听过程中处理的总包数。
这个参数非常实用,尤其在自动化脚本、定时抓包或避免无限运行导致内存/磁盘耗尽时。
-c 的作用逻辑
- 指定
-c N后,tcpdump 在捕获到 第 N 个匹配过滤表达式的包 时就自动退出; - 如果没有设置过滤表达式,它会统计所有经过接口的包(无论协议、方向),直到达到 N 个;
- 不影响内核抓包过程本身,只控制用户态的输出/保存行为;
- 和
-w配合使用时,文件里只会存满 N 个包,不会多也不会少。
例如:
sudo tcpdump -i eth0 -c 10 -w capture.pcap
抓到第 10 个包后立即停止,并把这 10 个包写入 capture.pcap。
常见搭配建议
-
配合
-nn使用:避免 DNS 解析延迟,加快终止响应sudo tcpdump -i eth0 -c 50 -nn port 22
-
配合
-s0使用:防止截断,确保关键字段完整(如 TCP payload)sudo tcpdump -i any -c 100 -s0 -w full.pcap icmp
-
配合
-G实现循环抓包(虽然-c本身不支持循环,但可组合):sudo tcpdump -i eth0 -c 100 -G 300 -w "hour_%H%M%S.pcap"
每 5 分钟生成一个最多含 100 个包的文件。
注意事项
-
-c对未匹配过滤条件的包不计数,所以实际抓包时间可能远超预期; - 若过滤太严(比如
port 9999但该端口没流量),tcpdump 会一直等待,直到超时或手动中断; - 权限不足时(如非 root 用户),可能因无法进入混杂模式而收不到包,导致
-c看似“卡住”; - 在高流量接口上,建议同时用
-s控制单包长度,避免-c还没触发就因缓冲区满而丢包。
不复杂但容易忽略。

















