寒假第三次做業

學習視頻課程

網絡空間安全概論第五章筆記連接

實驗題(30'+120')

熱身題

①基本思路

  • 安裝虛擬機:Virtual Box
  • 安裝Ubuntu系統
  • 打開終端,安裝gcc
  • 編寫程序

②實現結果:

代碼連接:hello.c

截圖:

基本題

①瞭解新技術

  • 簡單描述什麼是sketch?
    • sketch:
      • sketch是使用哈希(散列)來進行估計網絡流的一種測試方法,無需記錄全部數據,只記錄存儲數據的特徵,以此減小存儲開銷。
      • 具體到CM sketch算法中:使用二維的哈希表, w是哈希表的取值空間, d是哈希函數的個數。對某個元素, 分別使用d個哈希函數計算相應的哈希值, 並在對應的桶上遞增1, 每一個桶的值稱爲sketch。
  • 描述Count-min sketch的算法過程
    • 使用d個哈希函數,每一個哈希函數的取值範圍都在[1,w]內,從而能夠組成一個d*w的二維數組
    • 對於每一個二元組(k,v),表明元素k須要更新v次
    • 分別使用d個哈希函數對k進行哈希操做,獲得d個mapped counter,而後對它們所有加v
      html

    • 當須要查詢某個元素的頻率估計值時,先根據哈希函數獲得mapped counter
    • 而後去其中的最小值(最小值表明出現次數最少,相對最精確)
  • 補充知識(hash函數):
    • 基本概念:
      • Hash,通常翻譯作"散列",也有直接音譯爲"哈希"的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。
      • 這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。
      • 簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
    • 性質:
      • 若是兩個散列值是不相同的(根據同一函數),那麼這兩個散列值的原始輸入也是不相同的。
      • 散列函數的輸入和輸出不是一一對應的,若是兩個散列值相同,兩個輸入值極可能是相同的,但不絕對確定兩者必定相等(可能出現哈希碰撞)。
    • 散列表:
      • 散列表是散列函數的一個主要應用,使用散列表可以快速的按照關鍵字查找數據記錄。(就像英語字典)
    • 哈希碰撞:
      • 簡單來講,若是不一樣的輸入獲得了同一個哈希值,就發生了"哈希碰撞"(collision)。
      • 舉例來講,不少網絡服務會使用哈希函數,產生一個 token,標識用戶的身份和權限。若是兩個不一樣的用戶,獲得了一樣的 token,就發生了哈希碰撞。服務器將把這兩個用戶視爲同一我的,這意味着,用戶 B 能夠讀取和更改用戶 A 的信息,這無疑帶來了很大的安全隱患。
  • 爲何使用多個哈希函數
    • 使用哈希,會有衝突,不一樣的元素哈希到同一個數組的位置索引,這樣,頻率的統計都會偏大。
    • 若是使用多個數組,和多個哈希函數,來計算一個元素對應的數組的位置索引;
    • 那麼,要查詢某個元素的頻率時,返回這個元素在不一樣數組中的計數值中的最小值。這樣仍是有衝突,不過沖突會比較少。

②實現新技術:

基本思路:

  • 在GitHub上面尋找相應代碼
  • 閱讀readme.txt文件瞭解其中的函數如何調用
  • 使用c.update更新:本身任意定義字符串「hello」、「world」
  • 使用c.estimate查詢「hello」、「world」兩個字符串的頻率
  • 輸出查詢獲得的值
  • (感謝程同窗改掉了GitHub上代碼的bug)

實現結果:

③獲取用戶請求:

基本思路:

  • 安裝tcpsump
  • 輸入指令sudo tcpdump -i enp0s3 -n > pakcet_capture.txt 抓取數據並重定向到.txt文件中

實現結果:

④請求格式轉換:

基本思路:

  • 利用fgets函數從文件中讀取數據到字符數組I當中
  • 將請求的用戶,length保存到字符數組O當中
  • 輸出字符數組O
  • 使用 > 重定向輸出到文件Request.txt

實現結果:

⑤測試新技術:

基本思路:

  • 讀取一組數據到數組IP
  • 逆序保存length數值
  • 數組IP僅保留請求的用戶名
  • 使用c.update更新總請求值
  • 判斷此IP是否已經在黑客名單內
  • 若是不在黑客名單內,並且查詢獲得的值大於閾值T,拉入黑客名單
  • 輸出黑客名單

實現結果:

  • 代碼連接:test2
  • 截圖:

開放題

①理論部分:

  • 解釋爲何sketch能夠省空間
    • sketch使用哈希函數,而哈希函數能夠把任意長度的輸入映射爲固定長度的輸出。
    • 因此,不須要把每組數據都存儲下來,只要建立幾個數組來存儲元素sketch的計數。每組數據根據哈希值來分類,各類包再根據哈希值歸來。
    • 如此一來,就能夠節省大量本來用於存儲數據的空間。(特別是當每組數據都很長時)
  • 用流程圖描述count-min sketch的算法過程:
    git

  • 拿它和你改進後的方法對比,分析它的優劣:
    • 優勢:
      • 通用性更強
      • 更好的解決了用戶名很長的問題
      • 對於龐大的數據,處理效率更高,查詢某元素的效率也更高
      • 只須要固定大小的內存和計算時間,和須要統計的元素多少無關
    • 缺點:
      • 當數據總量不夠大時,精確度不是很高
      • 使用hash函數,就可能產生哈希碰撞
  • 吐槽count min sketch:
    • github上面的代碼有些會卻庫缺函數,bug有點多
    • 難度有點大,不易掌握(對我來講)

②實驗部分:

  • 基本思路:
    • 直接從終端上實時獲取數據
    • 格式轉換
    • 使用c.update更新此用戶請求總值
    • 判斷是否已經拉入黑客名單
    • 若是已經拉入黑客名單,則忽略這條請求
    • 若是未拉入黑名單且請求總值超過閾值T,則拉入黑客名單
    • 實時輸出新增黑客(重定向到txt文件當中)
  • 關於實時:
    • 可能須要一我的爲操做來肯定讀取結束(好比CTRL+c),不然只要出現新數據就讀取
  • 實現:沒找到如何解決「實時獲取」的方法
相關文章
相關標籤/搜索