免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5218 | 回复: 12

[日期时间] 如何知道一个 tcpdump 文件的时间范围? [复制链接]

论坛徽章:
0
发表于 2013-07-24 10:25 |显示全部楼层
例如有一个 tcpdump 抓取的文件,你并不知道是抓取了多少秒的数据包。

有没有什么好的方法快速知道呢?

我现在的方法是用

  1. tcpdump -tt -r $capFile 2>/dev/null | sed -n '1p;$p' | awk '{start=$1;getline;end=$1;};END {print end-start}'
复制代码
但这个时间基本等于 tcpdump 运行的时间,也就是如果抓取10秒,那么这个过程也就是10秒,也就是基本等同于重放了

请问各位有没有更好的方法?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2013-07-24 10:46 |显示全部楼层
Anshion>tcpdump -s 1500 -i eth2 host 192.168.2.185 -w 12.pcap                                                
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 1500 bytes
^C4218 packets captured
4220 packets received by filter
0 packets dropped by kernel

论坛徽章:
0
发表于 2013-07-24 10:53 |显示全部楼层
回复 2# zooyo


不好意思,现在的情况是已经有了 tcpdump 的文件,要反过来知道是截取了多长时间   

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2013-07-24 10:56 |显示全部楼层
可以用C写个程序, 每个数据包有时间戳的, 最后一个减第一个的时间就是差值.

论坛徽章:
0
发表于 2013-07-24 11:02 |显示全部楼层
回复 4# zooyo


恩,不过 tcpdump -tt 就可以打印原始时间戳了,我现在用的就是这种方式。

但这种方式,感觉还是需要遍历整个 capture file ,有没有更快的方式呢?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2013-07-24 11:25 |显示全部楼层
本帖最后由 zooyo 于 2013-07-24 11:25 编辑
  1. #include <stdio.h>
  2. #include <pcap.h>
  3. #include <stdlib.h>
  4. #include <time.h>

  5. int flag = 0;
  6. long start = 0;
  7. long end = 0;

  8. static void dispatcher_handler(u_char *args,
  9.                         const struct pcap_pkthdr *header, const u_char *pkt_data) {

  10.         if (!flag) {
  11.                 start = header->ts.tv_sec;
  12.                 flag = 1;
  13.         }
  14.         end = header->ts.tv_sec;
  15. }

  16. main(int argc, char **argv) {
  17.         pcap_t *fp;
  18.         char errbuf[PCAP_ERRBUF_SIZE];
  19.         long sec = 0;

  20.         if(argc < 2) {
  21.                 printf("Usage: %s filename", argv[0]);
  22.                 exit(-1);
  23.         }

  24.         if((fp = pcap_open_offline(argv[1], errbuf)) == NULL) {
  25.                 printf("open the dumpfile failed\n");
  26.                 exit(-2);
  27.         }

  28.         pcap_loop(fp, 0, dispatcher_handler, NULL);

  29.         pcap_close(fp);

  30.         sec = end - start;
  31.         printf("%02lu:%02lu:%02lu\n", sec/3600, sec%3600/60, sec%60);
  32.         return 0;
  33. }



复制代码
先安装pcap开发包:apt-get install libpcap-dev

编译命令: gcc pcap_offline.c -lpcap -o pcap_offline

执行结果:
  1. root@ubuntu-64:/test# ./pcap_offline test.pcap
  2. 00:02:09
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2013-07-24 11:29 |显示全部楼层
64位机器上编译通过, 32位的话, header->ts.tv_sec的类型是long long型, 需要改改.

论坛徽章:
0
发表于 2013-07-24 11:32 |显示全部楼层
多谢 zooyo,我试试

论坛徽章:
0
发表于 2013-07-24 12:48 |显示全部楼层
zooyo 发表于 2013-07-24 11:29
64位机器上编译通过, 32位的话, header->ts.tv_sec的类型是long long型, 需要改改.


测试了,可以用,而且很快.

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2013-07-24 15:35 |显示全部楼层
回复 9# ailms


    是不是很爽?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP