文章状态:已完成!
python
热身题部分
题目
- 一、安装虚拟机(可参考Vmware、Virtual Box等)
- 二、安装ubuntu系统(推荐安装16.04版本)
- 三、写一个helloworld程序,在ubuntu系统上编译运行(你可能须要了解linux系统的终端和一些基本命令、文本编辑工具nano、如何编译代码、运行程序)
做业实现
实验环境:VMware上的ubuntu系统
使用Linux指令建立main.c源代码:

linux
编译运行:

git
基本题
1、了解新技术
众多sketch的技术中,Count-min sketch 经常使用也并不复杂,但你可能须要稍微了解一点点散列的知识。从它入手不失为一个好选择,把它记录在你的技术博客上:github
- 一、简单描述什么是sketch
- 二、描述Count-min sketch的算法过程
做业实现
理论题部分
代码:测试时可跑通的代码【须要创建项目,手动输入请求,信息格式“
+ <空格> + <请求大小> ”,如图】
算法
2、实现新技术
- 一、克隆一种版本(python或者c语言)的代码,大体了解如何使用这个代码,在ubuntu系统上编译。本身任意编写一个小测试,成功运行这个代码。
- 二、你也能够本身实现Count-min sketch。
做业实现

备注
- 其中,上面的部分是修改之前的测试数据(“IPxxx格式”输出的即为超过阈值1500的);
- 下面的部分是改进之后的测试数据(“hackIP:xxx格式”输出的即为超过阈值1500的请求)。
- 为了方便起见,IP并未按照规范输入,可是也区分开了
- 能够看出,低频的数据是存在估计误差的(并且其实还挺大的)
测试问题:
- 在windows上能够跑动,可是在虚拟机上出现Segmentation fault(core dumped)问题,通常是内存操做有误(例如数组越界,空指针解引用);
- 大数运算操做,最好分开;(调试了很久)
- 虚拟机会崩~(短暂性无响应状态,让它本身再运行一下子就恢复了);
- 这个代码的原核心是C++我也是用C++修改和调试,测试部分本身用C重写,不知道可不可行。
3、获取用户请求
- 一、安装并使用抓包工具tcpdump
- 二、输入tcpdump -n 获取数据包的信息
- 三、使用linux 重定向的方法把该信息用文本文件存起来,文件命名为 pakcet_capture.txt。
做业实现
抓取数据包而且重定向:

结果:
shell
问题
- 一、直接tcpdump -n还会获得除了IP协议以外的数据包,例如arp协议,所以为了格式上的统一使用了tcpdump ip -n
- 二、ctrl+c才能够中止当前终端的运行并将数据重定向入文本文件中,不然使用”$ tcpdump ip -c + <须要抓取的数据包的数量> ”,能够抓取指定数量的数据包
4、请求格式处理
- 一、使用程序把第一条请求处理成第二条请求的格式
- 二、使用linux 重定向的方法把该信息用文本文件存起来,命名为Request.txt。
做业实现
IPmessage.py实现文件处理:

获得处理之后的Request文件:

代码:处理数据包格式的代码ubuntu
各类问题
- 一、“request denied”,在unix/linux上若要直接运行.py文件:须要对.py文件添加特殊注释->执行权限
- 二、“syntax error near unexpected token ‘ <字符> ’ ”、“$'\r': command not found”等shell脚本执行问题,由windows文件某些字符与Unix文件格式不兼容造,须要转成unix格式:
安装dos2unix-> $ dos2unix <文件名>
- 三、发现获取的IP传输数据包有的length为0,有的甚至不包含length(居然是一堆网址和杂乱的字母?),所以在代码中过滤了这部分的信息,以减小后续的处理。
- 四、python的readlines()函数自带'\n',因此在判断最后一个数字是不是零的时候要考虑‘0\n’
5、测试新技术
- 用跑通的Count-min sketch程序读文件,得到最后的处理结果,请求大小超过阈值T认定为黑客,此处T本身定义。
做业实现
windows实现:

Ubuntu实现:

代码:最终代码windows
备注:数组
- 该实现的阈值T=1500
- 本次代码有多个文件:有packet_capture, Request, output三个文本文件,以及其余代码(包括测试代码和最终代码);
- 从因为是边存边算,因此实现该方法时,并未考虑对于重复IP的处理,因此如图所示,输出了屡次相同HackIP;
- ubuntu实现中,有一次core dumped错误出现是由于,我不当心贴了没修改过的错误代码,后来从新连接编译了正确的代码才完成。
开放题
理论题部分
做业实现
理论题部分
实验题部分
做业实现
暂时有些个改进想法:
一、使用多线程可否会更快(这个靠现阶段的知识暂时不可能实现了,一个线程读,一个线程写);
二、参照上一次的“创建一个黑名单名录”,加速过滤。(这个仍是能够实现的,可是开辟名单、查询名单也算是一部分开销吧)(二更:该点已实现)
三、边读边写,没必要等它所有读完再写,算不算实时?仍是说,能够模拟真实的网络流环境,原始数据“接收、处理、判断、拉黑”一条龙在线服务?实时的具体含义是什么暂时没搞懂。(后者可能能够经过tcpdump -n + 直接屡次重定向,省略掉中间的packet_capture和Request文件的生成,直接实时性写入output.txt中)
实验部分:代码改进
对于第二点——达成了中间处理过程的精简可是容错率上升
代码:实现名单过滤的改进代码
无需另外开辟名单,直接利用hash函数检索,估计上一次是否超过阈值便可。

- 考虑到仅仅一次估测会出错,不妨取三次估测值,若是至少两次超过阈值,才会跳过该IP的输入,尽量提升已经下降的容错率。若是增长前的估计已经超过阈值,那么考虑到接下来还会继续增长数据大小,绝大多数数据能够和估计的偏差相抵消。(四次随机文件读取能够看出对于低频数据的偏差依旧难以抵消)

- 该点改进很重要,对比改进先后文件大小能够看出:以前数据重复写入的数量之多(output_pre是未改进的结果中文件,大小远远高出二次过滤之后的文件)。

Github_address
(须要手动输入,C++/C混编)
(python)
(只须要Request.txt文件便可,C++/C混编)
文章状态:已完成! P.s. 如有各类其余问题,还望指教。