你好,游客 登录 注册 搜索
背景:
阅读新闻

Tcpreplay源码解析

[日期:2014-01-17] 来源:Linux社区  作者:ttyttytty12 [字体: ]

一:前言:

tcpreplay的作者在写sendpacket()函数时说:希望写一个通用的数据包发送api接口支持BPF, libpcap, libdnet, and Linux's PF_PACKET,因为libnet缺乏活动性,libpcap支持模块比较新,并且缺乏非linux支持,所以作者决定同时支持这四个,他们的匹配顺序如下,如果平台支持其中最先匹配的函数,就使用它发包。由于libpcap不提供可靠的方法获取MAC地址,所以使用PF_PACKET or BPF代替。

51 * 1. PF_PACKET  send()                    (int)send(sp->handle.fd, (void *)data, len, 0); linux上面使用
52 * 2. BPF send()                                            write(sp->handle.fd, (void *)data, len);    freebsd上使用
 53 * 3. libdnet eth_send()                      eth_send(sp->handle.ldnet, (void*)data, (size_t)len);
 54 * 4. pcap_inject()                            pcap_inject(sp->handle.pcap, (void*)data, len);{

                                                                    return (p->inject_op(p, buf, size));

                                                                      }

                                                                handle->inject_op = pcap_inject_linux;

                                                                  pcap_inject_linux(pcap_t *handle, const void *buf, size_t size){

                                                                ret = send(handle->fd, buf, size, 0);

                                                                  }
 55 * 5. pcap_sendpacket()    pcap_sendpacket(sp->handle.pcap, data, (int)len); /* out of buffers, or hit max PHY speed, silently retry */从缓存发送或者使用最大速度发送

  {
if (p->inject_op(p, buf, size) == -1)
return (-1);
return (0);
}

(1)PF_PACKET:linux上使用,不经过协议栈,直接到用户层收发数据数据

(2)BPF:是类Unix系统上数据链路层的一种原始接口,提供原始链路层封包的收发,bsd系统上面使用,不经过协议栈,直接到用户层收发数据

(3)libnet,一个小型的接口函数库,建立一个简单统一的网络编程接口以屏蔽不同操作系统低层网络编程的差别,libnet目前可以在Linux、FreeBSD、Solaris、WindowsNT等操作系统上运行,并且提供了统一的接口

(4) libpcap:一个网络捕获数据包的开放源码,被tcpdump、snort等著名软件包使用。可以在绝大多数类unix平台下工作,如果希望libpcap能在linux上正常工作,则必须使内核支持"packet"协议,也即在编译内核时打开配置选项 CONFIG_PACKET(选项缺省为打开)。windows版本为winpcap。

pcap_inject()来源于OpenBSD,调用p->inject_op,pcap_inject_linux,send发送数据;

pcap_send-packet() 则来源于WinPcap, 与pcap_inject实现一样,只是更改了接口,,返回0表示成功,-1表示失败。两个函数都提供是为了兼容,

1,tcpreplay有tcpreplay tcpbridge tcpprep tcprewrite等几个软件组成的软件包。

http://tcpreplay.sourceforge.net/


http://packages.debian.org/sid/sparc/tcpreplay


http://tcpreplay.synfin.net/wiki/Download#Source


http://tcpreplay.synfin.net/


在以上网站可以查看说明和下载源码,不过都是英文的.

Tcpreplay 的详细介绍请点这里
Tcpreplay 的下载地址请点这里

linux
相关资讯       Tcpreplay 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款