博客地址:http://www.javashuo.com/article/p-aliqapsv-dv.htmlhtml
黑客风波事后,一切又恢复了正常。但你总以为有些不安,按照以前的方法:把全部请求都记录下来,的确能很准确地显示全部用户的请求状况。
可是请求实在太多,把它们都记下来,须要花费巨大的空间来存储,致使许多预算用在了购买记录请求的空间上,并且服务器的速度也降低很多。
有没有更好的办法?你以为本身遇到了瓶颈,但别人确定也遇到过一样的问题,何不借鉴别人的方法?
查阅文献过程当中,果真,发现一种叫作 sketch 的技术十分火热,能够解决这个问题,它能够显著地下降空间的使用。
你很兴奋,你想尽快地把这个技术部署到服务器上。python
服务器正在运转着,也不知道这个技术可不可用,万一服务器被弄崩了,那损失可不小。
因此, 决定在虚拟机上试验一下,不当心弄坏了也不要紧。须要在的电脑上装上虚拟机和linux系统
安装虚拟机(可参考Vmware、Virtual Box等)
安装ubuntu系统(推荐安装16.04版本)
写一个helloworld程序,在ubuntu系统上编译运行
(你可能须要了解linux系统的终端和一些基本命令、文本编辑工具nano、如何编译代码、运行程序)linux
一、安装Virtual Box软件。
二、新建一个虚拟机,按提示均默认便可。
三、下载ubuntu16.04系统镜像,放入对应文件夹。
四、启动虚拟机,根据提示安装系统。(选择中文安装程序时会遇到错误,语言选择为English)
五、安装所需软件git
apt-get install -y nano
sudo apt-get install build-essential
六、编写helloworld.cgithub
nano helloworld.c
#include<stdio.h> int main(){ printf("helloworld!\n"); return 0; }
七、编译并运行helloworld算法
gcc helloworld.c -o hello
./hello
众多sketch的技术中,Count-min sketch 经常使用也并不复杂,但你可能须要稍微了解一点点散列的知识。从它入手不失为一个好选择,把它记录在你的技术博客上:
简单描述什么是sketch
描述Count-min sketch的算法过程ubuntu
sketch:数组
sketch是基于散列的数据结构,经过设置散列函数,将具备相同散列值的键值数据存入相同的桶内,以减小空间开销。
桶内的数据值做为测量结果,是真实值的近似。
利用开辟二维地址空间,多重散列等技术减小散列冲突,提升测量结果的准确度。
--引用《基于sketch的网络测量方法介绍》安全
Count-min sketch:
数据添加:对每一个新的数据,用某个哈希函数映射后添加到一个数组内,再用另外一个哈希函数映射后添加到另外一个数组内,以此类推。
数据查询:对查询的数据,返回全部数组记录值的最小值。服务器
大体了解了Count-min sketch,接下来就须要实现它了。本着不须要重复造轮子的思想,你上github一查,果真发现了相关代码。
并不须要深入理解代码,你只须要会用,你的目标是在虚拟机上跑通Count-min sketch:
克隆一种版本(python或者c语言)的代码,大体了解如何使用这个代码,在ubuntu系统上编译。本身任意编写一个小测试,成功运行这个代码。
你也能够本身实现Count-min sketch。
一、从github上克隆count-min sketch算法代码
参考github库连接:https://github.com/alabid/countminsketch
二、修改test文件进行测试
而后。。。。就出错了。。。
彷佛该代码在linux下有bug:其在新建指针时没有用new开空间,致使有时正常运行,绝大状况为Segmentation fault。
因为在服务器版的ubuntu内修正代码工做量巨大,没能调试完成。
如今须要获取用户的请求信息,其实请求就是网络传输的数据包,可使用本身的网络环境来模拟服务器的请求,使用工具来捕获这个数据包:
安装并使用抓包工具tcpdump
输入tcpdump -n 获取数据包的信息
使用linux 重定向的方法把该信息用文本文件存起来,文件命名为 pakcet_capture.txt。
请求的用户用源ip地址端口号和目的ip地址端口号来标识,请求的大小用包的长度来标识,例如:
11:07:30.240275 IP 203.107.41.32.9018 > 192.168.0.101.55730: Flags [P.], seq 1:36, ack 39, win 17688, length 35
请求的用户
203.107.41.32.9018 > 192.168.0.101.55730
请求的大小
length 35
处理为这样的格式(请求的实际形式)
203.107.41.32.9018>192.168.0.101.55730 35
使用程序把第一条请求处理成第二条请求的格式
使用linux 重定向的方法把该信息用文本文件存起来,命名为Request.txt。
完事具有,只欠东风:
用跑通的Count-min sketch程序读文件,得到最后的处理结果,请求大小超过阈值T认定为黑客,此处T本身定义。
对于你所完成题目,把实现思路和实现结果记录在博客中,把代码提交到github的仓库上。
解释为何 sketch 能够省空间
用流程图描述Count-min sketch的算法过程
拿它和你改进后方法进行对比,分析优劣
为何 sketch 能够省空间:
sketch牺牲了准确度,在必定的数组范围中记录哈希后的索引,没有记录原键值。因哈希的特性不一样键值的索引碰撞,节省碰撞的这部分空间。
从总体数据结构上分析,哈希让数据相对更加均匀地分布,对数组的利用率更高。
流程图:
吐槽Count-min sketch:
很巧妙的方法啊,虽然在准确度上还有不足,但其解决sketch准确度的思路十分简洁有效,实现也比较容易。
在数据量很小时会比直接记录耗费更多的内存。
按基本题中的处理方法,要存请求、处理请求、读请求,速度太慢了,要是能把获取的请求直接用count-min sketch 处理就行了:
尽量减小中间的文件读写环节
实时处理请求
咕咕咕
_________________
Linux超简单文本编辑器:nano http://www.javashuo.com/article/p-cdirrbuz-cq.html
Ubuntu下gcc安装及使用 https://blog.csdn.net/lucifa_li/article/details/79483686
在Linux(Ubuntu)中使用终端编译并运行.c和.cpp文件 http://www.javashuo.com/article/p-betuapjw-cr.html
基于sketch的网络测量方法介绍 https://www.sdnlab.com/22685.html