博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用原始套接字测量链路层交换机转发表容量
阅读量:6854 次
发布时间:2019-06-26

本文共 2107 字,大约阅读时间需要 7 分钟。

  hot3.png

之前做学习网络时,做了一个关于“测量链路层交换机转发表容量”的作业,最近整理了一下,拿出来和大家一起交流学习。

利用原始套接字,我们可以按照自己的想法去组建网络中的数据帧。由于是针对链路层的以太帧进行操作,所以我们不用将注意力放到其它层上去。关于利用原始套接字编程的一些细节,大家可以参考一下网络上的一些教程,或者查阅一下相关书籍。

在这里,我利用交换机的过滤和转发特性来测试交换机转发表容量。利用原始套接字提供的接口,我们可以伪造以太帧,然后在主机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-0000-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条),这个波动正常吗?什么原因引起的?如何解决?  大家可以试试在自己的版本中解决上述问题。

不知道怎么添加附件,代码见“我分享的代码”:利用原始套接字测量链路层交换机转发表容量

转载于:https://my.oschina.net/dujp/blog/150450

你可能感兴趣的文章
关于去除QQ和暴风音影的广告
查看>>
JavaScript:isNaN("21"):js函数判断字符串是否为数字
查看>>
IOS KVC运用代码详解
查看>>
java enum转换工具类
查看>>
Visual Studio 文件没发布出来
查看>>
linux 小脚本
查看>>
不要为数据持久层编写单元测试
查看>>
使用Mycat实现MySQL数据库的读写分离
查看>>
linux安装软件命令
查看>>
在centos 6 下安装mysql 5.6
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Linux集群服务知识点总结及通过案例介绍如何实现高性能web服务
查看>>
linux 运维从初级到高级的修炼
查看>>
关于Hadoop系列文章
查看>>
JAVA学习日志(7-3-抽象类)
查看>>
Linux date命令的用法(转)
查看>>
Linux shell 之 提取文件名和目录名的一些方法
查看>>
test.
查看>>
树莓派3B连接WIFI
查看>>