2019寒假訓練營第三次做業

學習視頻課程(20')

  • 學習福州大學網絡課程 網絡空間安全概論,造成學習筆記,發佈專門博客,至少完成第五章的視頻學習。
  • 或學習密歇根大學的網絡課程Internet history,造成學習筆記,另外發布專門的博客。至少完成第二週的視頻學習。
  • 以上兩門課程二選一便可。

博客地址:http://www.javashuo.com/article/p-aliqapsv-dv.htmlhtml


實驗題(30'+120')

背景

黑客風波事後,一切又恢復了正常。但你總以爲有些不安,按照以前的方法:把全部請求都記錄下來,的確能很準確地顯示全部用戶的請求狀況。
可是請求實在太多,把它們都記下來,須要花費巨大的空間來存儲,致使許多預算用在了購買記錄請求的空間上,並且服務器的速度也降低很多。
有沒有更好的辦法?你以爲本身遇到了瓶頸,但別人確定也遇到過一樣的問題,何不借鑑別人的方法?
查閱文獻過程當中,果真,發現一種叫作 sketch 的技術十分火熱,能夠解決這個問題,它能夠顯著地下降空間的使用。
你很興奮,你想盡快地把這個技術部署到服務器上。python

熱身題(30')

服務器正在運轉着,也不知道這個技術可不可用,萬一服務器被弄崩了,那損失可不小。
因此, 決定在虛擬機上試驗一下,不當心弄壞了也不要緊。須要在的電腦上裝上虛擬機和linux系統
安裝虛擬機(可參考Vmware、Virtual Box等)
安裝ubuntu系統(推薦安裝16.04版本)
寫一個helloworld程序,在ubuntu系統上編譯運行
(你可能須要瞭解linux系統的終端和一些基本命令、文本編輯工具nano、如何編譯代碼、運行程序)linux

一、安裝Virtual Box軟件。
二、新建一個虛擬機,按提示均默認便可。
三、下載ubuntu16.04系統鏡像,放入對應文件夾。
四、啓動虛擬機,根據提示安裝系統。(選擇中文安裝程序時會遇到錯誤,語言選擇爲English)
五、安裝所需軟件git

  • 安裝nano編輯器
apt-get install -y nano
  • 安裝gcc
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

基本題 (120')

瞭解新技術(20')

衆多sketch的技術中,Count-min sketch 經常使用也並不複雜,但你可能須要稍微瞭解一點點散列的知識。從它入手不失爲一個好選擇,把它記錄在你的技術博客上:
簡單描述什麼是sketch
描述Count-min sketch的算法過程ubuntu

  • sketch:數組

    sketch是基於散列的數據結構,經過設置散列函數,將具備相同散列值的鍵值數據存入相同的桶內,以減小空間開銷。
    桶內的數據值做爲測量結果,是真實值的近似。
    利用開闢二維地址空間,多重散列等技術減小散列衝突,提升測量結果的準確度。
    --引用《基於sketch的網絡測量方法介紹安全

  • Count-min sketch:
    數據添加:對每一個新的數據,用某個哈希函數映射後添加到一個數組內,再用另外一個哈希函數映射後添加到另外一個數組內,以此類推。
    數據查詢:對查詢的數據,返回全部數組記錄值的最小值。服務器

實現新技術(30')

大體瞭解了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內修正代碼工做量巨大,沒能調試完成。

獲取用戶請求(15')

如今須要獲取用戶的請求信息,其實請求就是網絡傳輸的數據包,可使用本身的網絡環境來模擬服務器的請求,使用工具來捕獲這個數據包:
安裝並使用抓包工具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

請求格式處理(25')

處理爲這樣的格式(請求的實際形式)

203.107.41.32.9018>192.168.0.101.55730 35

使用程序把第一條請求處理成第二條請求的格式
使用linux 重定向的方法把該信息用文本文件存起來,命名爲Request.txt。

測試新技術(30')

完事具有,只欠東風:
用跑通的Count-min sketch程序讀文件,得到最後的處理結果,請求大小超過閾值T認定爲黑客,此處T本身定義。
對於你所完成題目,把實現思路和實現結果記錄在博客中,把代碼提交到github的倉庫上。

開放題(50')

理論部分(25')

解釋爲何 sketch 能夠省空間
用流程圖描述Count-min sketch的算法過程
拿它和你改進後方法進行對比,分析優劣

爲何 sketch 能夠省空間
sketch犧牲了準確度,在必定的數組範圍中記錄哈希後的索引,沒有記錄原鍵值。因哈希的特性不一樣鍵值的索引碰撞,節省碰撞的這部分空間。
從總體數據結構上分析,哈希讓數據相對更加均勻地分佈,對數組的利用率更高。

流程圖

吐槽Count-min sketch
很巧妙的方法啊,雖然在準確度上還有不足,但其解決sketch準確度的思路十分簡潔有效,實現也比較容易。
在數據量很小時會比直接記錄耗費更多的內存。

實驗部分(25')

按基本題中的處理方法,要存請求、處理請求、讀請求,速度太慢了,要是能把獲取的請求直接用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

相關文章
相關標籤/搜索