14.2 测试实例

14.2.1 不同发送方式的比较

下面使用WinPcap提供的四种不同发送方式,来测试不同发送方式之间的区别。测试的基本过程是:在发送方连续发送10万个长度为1514字节的数据包,同时在发送方监视CPU占用率、统计网络流量与每个数据包之间的平均时间间隔。

1.单次发送数据包的重复调用

可通过对pcap_sendpacket函数多次重复调用,来实现多次发送数据包的功能,主要实现代码如下,完整的代码见[ch14/send工程]。


for(int i=0;i<sendtimes;i++)//循环,实现多次重复发送

{

//获得生成的数据包,长度为max_packet_len

gen_packet(buf,max_packet_len,i);

//发送数据包

if((ret=pcap_sendpacket(adhandle,buf,max_packet_len))==-1)

{

//发送失败

……

return-1;

}

}


上述代码中,gen_packet函数的原型如下:


void gen_packet(unsigned char*buf,int len,int order)


上述函数中,参数buf用来存储生成的数据包;参数len用来设置需要生成数据包的长度;参数order用来设置需要生成数据包的序号。

发送时使用如下命令,从而把长度为1514字节的数据包重复发送10万次。


send.exe 100000


发送方CPU的占用率如图14-2所示,接收方的数据包捕获如图14-3所示,网络流量统计如图14-4所示,所接收的每个数据包之间的平均时间间隔为202.22µs。

14.2 测试实例 - 图1

图 14-2 发送方CPU的占用率(平均为5.313%)

14.2 测试实例 - 图2

图 14-3 接收方数据包的捕获

14.2 测试实例 - 图3

图 14-4 接收方的网络流量统计数据

2.重复发送单个数据包

通过调用pcap_set_num_write函数,实现对同一个数据包重复多次发送的功能,主要实现代码如下,完整的代码见[ch14/send_n_wpcap工程]。


/设置重复发送次数/

pcap_set_num_write(adhandle,sendtimes);

/开始数据包发送/

int max_packet_len=1514;

unsigned charbuf=(unsigned char)malloc(max_packet_len);

memset(buf,0x0,max_packet_len);

/获得生成的数据包/

gen_packet(buf,max_packet_len);

if((ret=pcap_sendpacket(adhandle,buf,max_packet_len))==-1)

{

//发送失败

……

return-1;

}

free(buf);


上述代码中,gen_packet函数的原型如下:


void gen_packet(unsigned char*buf,int len)


上述函数中,参数buf用来存储生成的数据包内容;参数len用来设置需要生成数据包的长度。

发送时使用如下命令,从而把长度为1514字节的数据包重复发送10万次。


send_n_wpcap.exe 100000


发送方的CPU占用率如图14-5所示,接收方的数据包捕获如图14-6所示,网络流量统计如图14-7所示,所接收的每个数据包的平均时间间隔为123.27µs。

14.2 测试实例 - 图4

图 14-5 发送方CPU占用率(平均1.865%)

14.2 测试实例 - 图5

图 14-6 接收方数据包捕获

14.2 测试实例 - 图6

图 14-7 接收方的网络流量统计数据

3.发送队列同步方式发送数据包

通过发送队列实现多次发送数据包的功能,此处采用同步方式,每个数据包间隔150µs,具体实现代码见[ch14/send_queue工程]。

该方式的命令格式为:


send_queue.exe数据包长度数据包个数数据包间隔时间


上述代码中,参数[数据包长度]范围为60~1514字节;参数[数据包间隔时间]单位为µs,如果不为0,则以同步方式发送数据包,如果为0,则以非同步方式发送数据包。

本实例的具体使用命令如下:


send_queue.exe 1514 100000 150


发送方的CPU占用率如图14-8所示,接收方的数据包捕获如图14-9所示,网络流量统计如图14-10所示,所接收的每个数据包的平均时间间隔为152.92µs。

14.2 测试实例 - 图7

图 14-8 发送方CPU占用率(平均50.639%)

14.2 测试实例 - 图8

图 14-9 接收方的数据包捕获

14.2 测试实例 - 图9

图 14-10 接收方的网络流量统计数据

4.发送队列异步方式发送数据包

通过发送队列实现多次发送数据包的功能,此处采用异步方式,具体实现代码见[ch14/send_queue工程],可使用如下命令:


>send_queue.exe 1514 100000 0


发送方的CPU占用率如图14-11所示,接收方的数据包捕获如图14-12所示,网络流量统计如图14-13所示,所接收的每个数据包的平均时间间隔为125.62µs。

14.2 测试实例 - 图10

图 14-11 发送方CPU占用率(平均12.500%)

14.2 测试实例 - 图11

图 14-12 接收方的数据包捕获

14.2 测试实例 - 图12

图 14-13 接收方的网络流量统计数据

四种不同发送方式的测试数据结果如表14-2所示,从表中可以看出,在四种发送方式之中,第二种方式(重复发送单个数据包)所占用的发送方的CPU最少,发送速度最快,生成的网络流量最大,不过,该方式的缺点就是无法给数据包本身添加数据包是否掉包的判断依据(如数据包的序号)。第四种方式(发送队列异步方式发送数据包),对CPU的占用率适中,可生成较高的网络流量,同时可以在数据包中添加数据包是否掉包的判断依据,故该方式是最适合进行网络大流量生成与测试的方式。

14.2 测试实例 - 图13