不使用libpcap我试图写一个符合pcap文件格式(格式)的日志文件.WireShark需要读取此文件.到目前为止,我用C++编写了这个:
struct pcapFileHeader {
uint32_t magic_number; /* magic number */
uint16_t version_major; /* major version number */
uint16_t version_minor; /* minor version number */
int16_t thiszone; /* GMT to local correction */
uint32_t sigfigs; /* accuracy of timestamps */
uint32_t snaplen; /* max length of captured packets, in octets */
uint32_t network; /* data link type */
};
ofstream fileout;
fileout.open("file.pcap", ios::trunc);
pcapFileHeader fileHeader;
fileHeader.magic_number = 0xa1b2c3d4;
fileHeader.version_major = 2;
fileHeader.version_minor = 4;
fileHeader.thiszone = 0;
fileHeader.sigfigs = …Run Code Online (Sandbox Code Playgroud) 我想要一个接口出站流量的源 IP 地址列表。如何使用 libpcap 找到数据包的方向(无论是入站还是出站读取流量)?我不知道双方的子网信息。而且两边都有客户端/服务器,所以我不能依赖端口号范围来过滤流量。
为什么 libpcap 数据包头中没有有关方向的信息,或者像pcap-filterinbound中那样的过滤器选项?
对pcap文件运行file命令将打印出以下内容:
$ file pcap.pcap
pcap.pcap: tcpdump capture file (little-endian) - version 2.4 ....
Run Code Online (Sandbox Code Playgroud)
我一直在寻找一种方法来创建一个big-endian捕获文件,或者在线下载一个样本,但无济于事.
我也很困惑pcap中究竟是小端还是大端.据我所知,libpcap捕获了它在线上看到的内容.
我想使用libpcap来捕获IP数据包,我想解析IP头和tcp头.`
有IP头和TCP头结构<netinet/ip.h>,<netinet/tcp.h>
IP头相对更容易解析,但对于TCP头,由于有tcp选项,常见的选项是MSS,SACK(选择性确认),时间戳,窗口缩放和NOP.
我想要一个函数parse_pkt():
struct tcphdr tcp_hdr;
struct ip ip_hdr;
parse_pkt(u_char *pcap_packet, struct ip* p_ip, struct tcp* p_tcp);
Run Code Online (Sandbox Code Playgroud)
所以在调用函数后,如果我想知道源IP地址,序列号和MSS,
scr_ip = ip_hdr.src_ip
seq = tcp_hdr.seq
mss = tcp_hdr.mss
Run Code Online (Sandbox Code Playgroud)
有没有类似的源代码/片段可以满足我的要求?谢谢!
我已经阅读了许多关于数据包捕获/处理和主机堆栈的技术文档,试图了解这一切,但有一些地方让我感到困扰,希望有人能提供帮助。
假设您正在运行 tcpdump:在从 NIC 的环形缓冲区(物理 NIC 内存对吗?)复制数据包后,它会立即存储到 mbuf 中吗?然后 BPF从mbuf 中获取数据包的副本,然后将其存储在 BPF 缓冲区中,因此内存中同时存在两个副本?我试图了解确切的过程。
或者更像是:数据包同时从 NIC 复制到 mbuf(用于主机堆栈处理)和 BPF 伪同步?
一旦数据包通过 ip/tcp 输入函数通过主机堆栈处理,将 mbuf 作为位置(指向 mbuf),即数据包存储在 mbufs 中,如果数据包不是为系统寻址,例如通过集线器监控流量接收或 SPAN/Monitor 端口,数据包将被丢弃并且永远不会进入主机堆栈。
我似乎遇到过显示内核“盒子”中的 NIC 环形缓冲区(RX/TX)/将其与用户空间分开的图表,这让我再次猜测环形缓冲区是否实际分配的系统内存与物理内存不同网卡。
假设环形缓冲区是指 NIC 的物理内存,设备驱动程序确定 NIC 环形缓冲区的大小是否正确,将物理限制放在一边?例如,我可以通过修改驱动程序来缩小缓冲区吗?
谢谢!
我正在为VoIP音频开发一个呼叫记录器,音频在CISCO环境中使用g722编解码器进行编码.好吧,我从RTP帧中提取了数据,我已经解码了这个pcm数据如下:
unsigned int payloadSize = htons(udpHdr->len) - (CONSTANT::UDP_HDR_SIZE + CONSTANT::RTP_HDR_SIZE);
char * payload = (char*)rtpHdr + CONSTANT::RTP_HDR_SIZE;
unsigned short m_payloadType = rtpHdr->pt;
//decode_state is initialize like :g722_decode_init(NULL, 64000, G722_SAMPLE_RATE_8000);
outBuffSize = g722_decode(decode_state, decompressed, (const uint8_t*)payload, payloadSize);
Run Code Online (Sandbox Code Playgroud)
我在一个文件中存储了这个解码数据(以及相同流量的所有帧,等于sscr),当试图听到音频时,我只听到噪音.
我认为这个问题是针对CISCO使用的压缩算法.
解码函数的行为是正确的.
有什么建议吗?
我需要将UDP数据包保存到文件中,并希望使用pcap格式重用各种可用工具(wireshark,tcpdump,...).这个帖子中有一些信息,但我找不到如何编写全局文件头'struct pcap_file_header'.
pcap_t* pd = pcap_open_dead(DLT_RAW, 65535);
pcap_dumper_t* pdumper = pcap_dump_open(pd, filename);
struct pcap_file_header file_hdr;
file_hdr.magic_number = 0xa1b2c3d4;
file_hdr.version_major = 2;
file_hdr.version_minor = 4;
file_hdr.thiszone = 0;
file_hdr.sigfigs = 0;
file_hdr.snaplen = 65535;
file_hdr.linktype = 1;
// How do I write file_hdr to m_pdumper?
while( (len = recvmsg(sd, &msg_hdr, 0)) > 0 )
pcap_dump((u_char*)m_pdumper, &m_pcap_pkthdr, (const u_char*)&data);
Run Code Online (Sandbox Code Playgroud)
我该如何编写全局文件头?如果没有可用的特定pcap函数,如何检索文件描述符以使用write()插入标头?
我使用libpcap捕获很多数据包,然后处理/修改这些数据包并将它们发送到另一台主机。
首先,我创建一个 libpcap 处理程序handle并将其设置为非阻塞,并用于pcap_get_selecable_fd(handle)获取相应的文件描述符pcap_fd。
然后我将一个事件添加pcap_fd到 libevent 循环中(就像 select() 或 epoll())。
为了避免频繁轮询这个文件描述符,每次有数据包到达事件时,我使用 pcap_dispatch 收集缓冲区的数据包并将它们放入队列中packet_queue,然后调用process_packet处理/修改/发送队列中的每个数据包packet_queue。
pcap_dispatch(handle, -1, collect_pkt, (u_char *)packet_queue);
process_packet(packet_queue);
Run Code Online (Sandbox Code Playgroud)
我使用 tcpdump 捕获 发送的数据包process_packet(packet_queue),并注意:
我仔细检查了我的源代码,没有发现任何可疑的块或逻辑导致如此大的间隔。所以我想知道是否是由于功能的问题pcap_dispatch。
pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?谢谢!
捕获网络流量以进行调试时,似乎有两种常见方法:
使用原始套接字.
使用libpcap.
在性能方面,这两种方法之间有很大差异吗?libpcap似乎是一种很好的兼容方式来收听真实的网络连接或重放一些固定数据,但是这个功能集是否会带来性能损失?
我正在阅读该模块的一些示例代码片段Net::Pcap::Easy,我偶然发现了这段代码
my $l3protlen = ord substr $raw_bytes, 14, 1;
my $l3prot = $l3protlen & 0xf0 >> 2; # the protocol part
return unless $l3prot == 4; # return unless IPv4
my $l4prot = ord substr $packet, 23, 1;
return unless $l4prot == '7';
Run Code Online (Sandbox Code Playgroud)
在对原始数据包$ raw_bytes进行总十六进制转储后,我可以看到这是一个以太网帧,而不是TCP/UDP数据包.有人可以解释一下上面的代码是做什么的吗?