使用 pcap 头文件嗅探数据包,返回的 tcp 头似乎被截断或变形

问题描述 投票:0回答:0

我正在创建一个小型数据包嗅探器程序并使用 pcap API 来实现这一点。目前,我基于源端口或目标端口 80 (http) 的数据包进行嗅探。使用文档 - https://www.tcpdump.org/pcap.html,使用 pcap_loop 例程处理返回的数据包,该例程接受会话处理程序指针、要嗅探的数据包数量、get_packet 回调例程和其他参数可以设置为 NULL.

pcap_loop(ppcap,-1,get_packet,NULL);

运行数据包嗅探的接口是 wlp2s0。在文档的末尾,它说明了包含以下内容的数据包的结构:

以太网头(??不知道为什么有以太网头,因为没有使用以太网协议) IP头 TCP头 有效载荷 在处理传入数据包的 get_packet 例程中,我有以下实现:

void get_packet(u_char *args, const struct pcap_pkthdr *header,const u_char *packet){
        
        // packet structured in four layers 
    
        /*
            - Ethernet header 
            - ip header 
            - TCP header 
            - payload (containing data being transmitted)
    
            Each header is assumed to be in contigous memory position on the heap.
            
            ∴ 
            
            ethernet header pointer  = packet pointer
            ip header pointer = packet pointer  + ethernet header size
            TCP header pointer = packet pointer + ethernet header size + ip header size
    
            Each pointer is typecasted to its type
        */
    
        printf("GOT PACKET - %s\n\n",packet);
    
        ethernet = (const struct sniff_ethernet *)(packet); // typecasting packet pointer of type u_char to type const struct sniff_ip
    
        ip = (const struct sniff_ip * )(packet + SIZE_ETHERNET); // ip header which is located packet + eth address len (6 bytes), type casted to type const struct sniff_ip
       
        size_ip = IP_HL(ip) *4; // returns size of ip header
    
        if (size_ip < 20) {
            // triggered if ip header is less than 20 bytes
            return;
        }

根据文档定义,返回的 TCP 标头必须至少为 20 个字节,但在运行程序后,TCP 标头返回 4 个字节。我不知道为什么 TCP 标头大小似乎被截断或变形了。我是网络新手,但了解最基本的知识,相信这个项目可以成为一个很好的跳板。

networking tcp pcap
© www.soinside.com 2019 - 2024. All rights reserved.