2016-11-20 16 views
-1

В настоящее время я разлагаю пакет данных на несколько заголовков.Получить размер ARP-пакета

Вот мой текущий код:

void analyse(struct pcap_pkthdr *header, const unsigned char *packet, int verbose) { 


    // Define headers and payload 
    const struct ether_header *ethernet = NULL; 
    const struct ether_arp *arp = NULL; 
    const struct ip *ip = NULL; 
    const struct tcphdr *tcp = NULL; 
    const char *payload = NULL; 

    /* Ethernet header is the first data block of packet **/ 
    ethernet = (struct ether_header*) packet; 

    // ARP packet following 
    if(ntohs(ethernet->ether_type) == ETHERTYPE_ARP) { 

     arp = (struct ether_arp*) (packet + ETH_HLEN); 

     // If the operation performed by the sender is a reply, we increment the ARP Response Counter 
     if(ntohs(arp->ea_hdr.ar_op) == 2) { 

      arpResponsesCounter++; 

     } 

    } else { // IP packet following 

     ip = (struct ip*) (packet + ETH_HLEN); 

    } 

    // ARP header and IP header don't have the same size 
    if(arp == NULL) { 

     u_int shift_size = (ip->ip_hl)*4; 

    } else { 


    } 


} 

Согласно http://unix.superglobalmegacorp.com/BSD4.4/newsrc/netinet/ip.h.html и http://unix.superglobalmegacorp.com/Net2/newsrc/netinet/if_ether.h.html, размер заголовка IP задается (ip->ip_hl)*4;, но я не могу понять, как получить размер заголовка ARP. Мне нужно, чтобы он правильно определял указатель заголовка TCP.

Thanks

+1

ARP не имеет ничего общего с TCP. Вы не найдете сегмент TCP внутри пакета ARP. –

ответ

0

Я думаю, вы смущены. ARP-пакет - это заголовок ARP. ARP - это протокол для себя, и он не содержит других протоколов в качестве полезных нагрузок в своих пакетах, как это делает IP. Это правильно протокол Link-Layer в том, как ICMP является протоколом сетевого уровня. Оба являются протоколами верхнего уровня и не содержат других протоколов.

Вы можете определить размер ARP-пакета в сети, если вам известен размер адресов уровня 2 и 3 для сети (48 бит для ethernet и 32 бита для IPv4).

Hardware Type is two octets 
Protocol Type is two octets 
Hardware Address Length is one octet 
Protocol Address Length is one octet 
Operation is two octets 
Sender Hardware Address is Hardware Address Length octets 
Sender Protocol Address is Protocol Address Length octets 
Destination Hardware Address is Hardware Address Length octets 
Destination Protocol Address is Protocol Address Length octets 

В принципе, у вас есть восемь октетов, плюс два раза Аппаратный адрес длины, плюс два раза Адрес протокола Длина.

Для IPv4 в сети это означает (8 + (2 * 6) + (2 * 4)) = 28.

+0

Хорошо, но какова связь между Ethernet, IP и ARP? Потому что в этом заголовочном файле http://unix.superglobalmegacorp.com/Net2/newsrc/netinet/if_ether.h.html есть два определяет: '#define \t \t ETHERTYPE_IP 0x0800 \t \t/* IP протокол * /' '#define ETHERTYPE_ARP \t 0x0806 \t \t/* Addr. протокол разрешения */' Я немного смущен –

+0

Протокол уровня 2, для которого требуется адрес уровня 2 адресата, будет использовать ARP для получения адреса назначения уровня 2 с целевого хоста. Ethernet будет использовать ARP для получения MAC-адреса назначения, поэтому ARP-пакет будет полезной нагрузкой для Ethernet-фрейма. Это то, где сетевой стек запускается и останавливается при использовании ARP. –