2016-09-26 232 views
0

我需要分析pcap文件並分別計算數據包(TCP,UDP,IP)。我發現很多類似pcap,jnetpcap的庫,但是我想在不使用任何外部庫的情況下執行此操作。 我不需要代碼,只是一個概念性的解釋。無需使用庫從pcap文件(tcpdump輸出)提取幀

Question 

在解析文件PCAP我應該怎麼幀區分(可以是TCP,UDP,IP)。我嘗試閱讀格式,但我不明白的是如何才能知道應該爲特定幀讀取多少字節,以及如何知道它是什麼類型的幀。因爲只有一次我能夠分別提取數據包,我將能夠過濾出其他信息。

+1

_「我想在不使用任何外部庫的情況下做到這一點」_ - 然後深入規範並重新發明輪子。問我們如何這樣做太廣泛。 – CodeCaster

+0

pcap捕獲像他們在電線上的數據。要知道它是IP,TCP,UDP ..你必須瞭解這些協議是如何傳輸的。你不會在pcap規範中找到這些東西,但是在IP,TCP ...規範中。 –

回答

0

您必須分別解析每個幀,併爲每個要計數的值設置一個計數器。假設你正在檢查的捕獲是pcap/pcapng格式,你可能會發現libpcap很有幫助。

爲了讓的你威力要做(假設較低的水平是沒有以太網VLAN標記)一個快速運行

uint64_t ip_count, tcp_count, udp_count; 

void parse_pkt(uint8_t *data, uint32_t data_len) { 
    uint8_t *ether_hdr = data; 
    uint16_t ether_type = ntohs(*(uint16_t *) (data + 12)) 

    if (ether_type != 0x800) { 
     return; 
    } 
    ip_count += 1; 

    uint8_t *ip_hdr = data + 14; 
    protocol = ntohs(*(uint16_t *) (ip_hdr + 9)) 
    //protocol is either udp/tcp/sctp...etc 
    if (protocol == 0x11) { 
     udp_count++; 
    } else if (protocol == 0x06) { 
     tcp_count++; 
    } 
} 

// foreach pkt from libpcap_open call parse_pkt with the data and data_len 

此代碼是脆弱的。沒有適當的長度和類型檢查而直接跳過偏移不是一個好主意。