之前做学习网络时,做了一个关于“测量链路层交换机转发表容量”的作业,最近整理了一下,拿出来和大家一起交流学习。
利用原始套接字,我们可以按照自己的想法去组建网络中的数据帧。由于是针对链路层的以太帧进行操作,所以我们不用将注意力放到其它层上去。关于利用原始套接字编程的一些细节,大家可以参考一下网络上的一些教程,或者查阅一下相关书籍。
在这里,我利用交换机的过滤和转发特性来测试交换机转发表容量。利用原始套接字提供的接口,我们可以伪造以太帧,然后在主机A将这些伪造好的以太帧发送出去,在主机B接收以太帧,这样在B端根据接收到的以太帧内容来判断转发表容量。
如图:A负责发送以太帧,主机B则对能收到的帧进行抓包和分析输出最终结果。
利用主机A负责发送以太帧,在每发送完一组后就立即重发所有已发送的以太帧,之后再发送下一个新的分组,不断重复上述过程。(但为了能让程序简单,我在实现时只定义了三组,每组中包含数量不等的以太帧。)在第一次发送以太帧时,分组的目的mac地址用广播地址ff-ff-ff-ff-ff-ff,而源mac地址则需要用自己伪造的地址,例如从0递增,第一个帧用00-00-00-00-00-00,第二个帧用00-00-00-00-00-01,后续的依次递增。这样的话,由于每次发送时的源mac地址都是新的地址,如果转发表没有满,交换机就会对这个地址新建一个表项。采用的是广播地址,在接收端会抓到这个包,并进行记录。
在重发时,分组的目的mac地址用上一组的最后一个以太帧中的源地址,而目的mac地址则依次是已经发送过的分组的源mac地址。现在交换机的过滤功能就开始派上用场了,在重发数据帧时,对于目的地址X,如果交换表中已经存有这个表项,则交换机会将这个以太帧过滤掉(因为数据的入口和出口在同一端口上),但是如果X不在交换表中(交换表已经被填满),那么交换机会广播这个以太帧,这样就能在B端抓到这个数据包,当这个组中的以太帧全部发送完时,B端就可以根据自己的记录来算出交换机的转发表容量了。
例如:有两个分组,每组有两个以太帧
第一组G1:00-00-00-00-00-00 、00-00-00-00-00-01
第二组G2:00-00-00-00-00-02 、00-00-00-00-00-03
主机A在第一次发送时以太帧分别是:(至于“帧类型”字段,我在实现时用的是ARP类型,大家可以尝试一下其他类型)
源mac | 目的mac | 帧类型 |
00-00-00-00-00-00 | ff-ff-ff-ff-ff-ff |
|
00-00-00-00-00-01 | ff-ff-ff-ff-ff-ff |
|
当发送完这一组后,重发的以太帧分别是:
00-00-00-00-00-01 | 00-00-00-00-00-00 |
|
00-00-00-00-00-01 | 00-00-00-00-00-01 |
|
然后主机发送第二个分组:
00-00-00-00-00-02 | ff-ff-ff-ff-ff-ff |
|
00-00-00-00-00-03 | ff-ff-ff-ff-ff-ff |
|
当发送完这个分组后,需要从发所有已经发送过的分组:
00-00-00-00-00-03 | 00-00-00-00-00-00 |
|
00-00-00-00-00-03 | 00-00-00-00-00-01 |
|
00-00-00-00-00-03 | 00-00-00-00-00-02 |
|
00-00-00-00-00-03 | 00-00-00-00-00-03 |
|
测试平台:fedora18(不过在其他平台应该也不会有任何问题,对于宿舍中的那个小3层交换机也能测量)。
使用方法:将两台电脑连到交换机上,然后设置网络连接为本地连接。
接收端:sudo ./receiver p4p1(这个是网卡名称,不同的系统名称不一样,用ifconfig命令查看)
发送端:sudo ./sender p4p1 1000(发送帧数量,在这个代码中会发送三次,分别为1000/500/250)
结果:在接收端退出程序后,会显示一些统计信息,其中显示的英文单字会记录收到的帧次数信息,
其中显示“two”的选项就是转发表中的表项数量了(但是还有些细节问题,见下面描述)。
(注意:要先打开接收端,然后再发送。每次测试完后,要将交换机电源拔掉再插上后,才能进行下一次测试。程序在每发送一个帧后都会停50毫秒,如果感觉速度太慢,可以减少暂停时间,例如10毫秒或更少)
不知道以上的叙述是否说的明白,如果大家有不懂的地方欢迎一起讨论。
这个代码中存在的问题:这个方案(实现)还有很多改进之处,另外有一些细节问题需要注意一下,例如:在进行本地连接时,交换机是否会将这两台电脑的真实mac记录到表中?(如何测试?)。在测试结果中会出现一些波动(误差为1条),这个波动正常吗?什么原因引起的?如何解决? 大家可以试试在自己的版本中解决上述问题。
不知道怎么添加附件,代码见“我分享的代码”:利用原始套接字测量链路层交换机转发表容量