用libpcap分析CAIDA的网络流量文件的猝发性
生活随笔
收集整理的這篇文章主要介紹了
用libpcap分析CAIDA的网络流量文件的猝发性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在這個程序中我們將對一個CAIDA的流量文件equinix-nyc.dirB.20180419-131800.UTC.anon.pcap進行分析.?這個流量文件中包含的數據包數為74940702個, 其中TCP和UDP數據包為70084416個,?數據包到達速率大約為1.25Mpps. 我們使用容量無限, 流出速率為12.5Mpps的先進先出隊列對這個流量文件進行處理, 并計算在最壞情況下隊列的長度 (即隊列最擁塞的時候隊列中的數據包數).?
//解析.c #include <pcap.h> #include <net/ethernet.h> #include <netinet/ip.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <netinet/udp.h> #include <arpa/inet.h> #include <stdio.h> #include <翻譯包.h> #include <網絡.h> #include <內存.h>_類體_ _緩沖區_{公共域:_緩沖區_(_整數_ 緩沖區長度) {本地->緩沖區 = 新建 _流標識符_[緩沖區長度];本地->隊首 = 0;本地->隊尾 = 0;本地->緩沖區長度 = 緩沖區長度;}~_緩沖區_() {刪除[] 本地->緩沖區;}空返 入隊(_流標識符_ 元數據) {如果(本地->隊首 != (本地->隊尾 + 1)%本地->緩沖區長度) {_復制內存((_字符_*)&本地->緩沖區[本地->隊尾], \(_字符_*)&元數據, _長度(_流標識符_));本地->隊尾 = (本地->隊尾 + 1)%本地->緩沖區長度; }}空返 出隊(_流標識符_& 元數據) {如果(本地->隊首 == 本地->隊尾) {_重置內存((_字符_*)&元數據, _長度(_流標識符_));}否則 {_復制內存((_字符_*)&元數據, (_字符_*)&本地->緩沖區[本地->隊首],\_長度(_流標識符_));本地->隊首 = (本地->隊首 + 1)%本地->緩沖區長度;}}_整數_ 為空() {如果(本地->隊首 == 本地->隊尾) 返回 1;否則 返回 0;}_整數_ _求隊列長度() {返回 (本地->隊尾 - 本地->隊首 + 本地->緩沖區長度)%本地->緩沖區長度;}私有域:_流標識符_* 緩沖區;_整數_ 隊首;_整數_ 隊尾;_整數_ 緩沖區長度; };空返 _提取數據包(pcap_t* 文件柄, _整數_& 結束, _流標識符_& 標識符, \_浮數64_& 時間戳, _浮數64_ 權重) {const u_char* packet;struct pcap_pkthdr header;const struct ip* ipHeader;const struct tcphdr* tcpHeader;const struct udphdr* udpHeader;_正整數16_ 源端口號, 目標端口號;_正整數32_ 源地址, 目標地址;結束 = 1;packet=pcap_next(文件柄, &header);循環(空值 != packet) {ipHeader = (struct ip*) packet;標識符.源地址 = ntohl(ipHeader->ip_src.s_addr);標識符.目標地址 = ntohl(ipHeader->ip_dst.s_addr);如果 (ipHeader->ip_p == IPPROTO_TCP) {時間戳 = (header.ts.tv_sec + header.ts.tv_usec/1000000.0)/權重;tcpHeader = (struct tcphdr*)(packet + sizeof(struct ip));標識符.源端口號 = ntohs(tcpHeader->th_sport);標識符.目標端口號 = ntohs(tcpHeader->th_dport);標識符.協議類型 = IPPROTO_TCP;結束 = 0;break;}否則 如果 (ipHeader->ip_p == IPPROTO_UDP) {時間戳 = (header.ts.tv_sec + header.ts.tv_usec/1000000.0)/權重;udpHeader = (struct udphdr*)(packet + sizeof(struct ip));標識符.源端口號 = ntohs(udpHeader->uh_sport);標識符.目標端口號 = ntohs(udpHeader->uh_dport);標識符.協議類型 = IPPROTO_UDP;結束 = 0;break;}packet=pcap_next(文件柄, &header);} }int main() {pcap_t *descr;char errbuf[PCAP_ERRBUF_SIZE];// open capture file for offline processingchar 文件名[] = "/Users/zongyi/traces/caida/equinix-nyc.dirB.20180419-131800.UTC.anon.pcap";descr = pcap_open_offline(文件名, errbuf);if (descr == NULL) {printf("pcap_open_offline() failed: %s\n", errbuf);return 1;}_浮數64_ 權重 = 0.001;_浮數64_ 流出速率 = 12500000.0; // 流出速率為12.5Mpps_浮數64_ 流出時間單位 = 1.0/(權重*流出速率);_正整數16_ 源端口號, 目標端口號;_正整數32_ 源地址, 目標地址;_緩沖區_ 隊列(100000);_整數_ 最大隊列長度 = 0;_流標識符_ 標識符;_浮數64_ 時間戳;_整數_ 結束;_提取數據包(descr, 結束, 標識符, 時間戳, 權重);_浮數64_ 下一次流出時間 = 時間戳;_整數_ 數據包數 = 0;循環(0 == 結束 || 0 == 隊列.為空()) {如果(時間戳 < 下一次流出時間) {如果(0 == 結束) { // 流量文件中還有新的數據包隊列.入隊(標識符);_提取數據包(descr, 結束, 標識符, 時間戳, 權重);++數據包數;}否則 時間戳 *= 2; // 流量文件中的數據包已處理完畢}否則 如果(下一次流出時間 < 時間戳) {如果(0 == 隊列.為空()) { // 隊列中還有數據包隊列.出隊(標識符);}否則 下一次流出時間 = 時間戳; // 隊列中已經沒有數據包下一次流出時間 += 流出時間單位;}否則 {如果(0 == 結束) {隊列.入隊(標識符);_提取數據包(descr, 結束, 標識符, 時間戳, 權重);++數據包數;}否則 時間戳 *= 2;如果(0 == 隊列.為空()) {隊列.出隊(標識符);}否則 下一次流出時間 = 時間戳;下一次流出時間 += 流出時間單位;}如果(隊列._求隊列長度() > 最大隊列長度) 最大隊列長度 = 隊列._求隊列長度();}pcap_close(descr);_輸出("最大隊列長度:%d\n", 最大隊列長度);_輸出("數據包數:%d\n", 數據包數);return 0; }?
總結
以上是生活随笔為你收集整理的用libpcap分析CAIDA的网络流量文件的猝发性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微博应用 php源码,新版微测试应用平台
- 下一篇: Maven创建第一个java项目(官方教