【寒假作業02】 瓜田刺猹——可視化流量監控的實現


【寒假作業02】 🍉瓜田刺猹——可視化流量監控的實現

🛫 Fly to 作業鏈接 ~

💻 作業成果的前端展示

1. Setting 閾值設置界面

2. Netraffic 可視化流量監控界面

  • 當前閾值與異常流List

  • 總數量/總包長雙Y軸統計圖 (可實現折線圖/柱形圖切換保存到本地

🔗 Github鏈接

📋 學習&作業記錄

1. 網絡編程基礎知識

2. Python語言程序設計基礎

  • 有空的時候翻翻Python課的教材《Python語言程序設計基礎(第2版)》,學習基本的語法。
  • 輔以網絡視頻教學的資源,需要實現某功能的時候就可以查找相關的用法,還是很容易上手的。
  • 還有runoob.com的網頁版Python 3教程,分模塊也很方便去學習需要的知識。

3. 抓包與解析

4. 分析題意&設計算法

  • 初次讀題會有些一頭霧水、不知所措、十臉茫然、無從下手,不過漸漸去了解一下相關知識背景(指的是NetworkProgramming!不是指ZS的瓜)就會慢慢開竅。當完全讀懂題干中的名詞之后,很容易就能理解這個任務的要求。

  • 提煉出大體實現步驟,理清數據包五元組包長等幾個重要關鍵詞后,再開始思考算法,就會發現其實思路很清晰。難點不在抓包之后的數據處理,而是難在運用一些你剛學的、並不熟悉的語言去實現你想完成的目標。
    (抓包→讀包→在python中做數據處理→數據傳送到Web前端)

對數據包的遍歷處理程序:

    for cnt in range(len(dpkt)):
        print("Packet No.{:0>5d}".format(cnt+1),end="")
        if dpkt[cnt][Ether].type !=2048:
            continue
        if dpkt[cnt][IP].proto == 6:
            proto = "TCP"
        elif dpkt[cnt][IP].proto ==17:
            proto = "UDP"
        else: continue
        ipSrc = dpkt[cnt][IP].src           # 源IP
        sport = dpkt[cnt][proto].sport      # 源端口號
        ipDst = dpkt[cnt][IP].dst           # 目的IP
        dport = dpkt[cnt][proto].dport      # 目的端口號
        length = len(dpkt[cnt])             # 包長
        print("\t{0}:{1} -> {2}:{3} \t{4} length={5}".format(ipSrc,sport,ipDst,dport,proto,length))
        five_tuple = f"{proto} {ipSrc}:{sport} -> {ipDst}:{dport}"
        if five_tuple not in tuple_cnt:     # 五元組初始化
            tuple_cnt[five_tuple] = 0
            tuple_len[five_tuple] = 0
            tuple_abn[five_tuple] = 0
            tupleCnt += 1                   # 流數
        tuple_cnt[five_tuple] += 1          # 對應流的包數
        tuple_len[five_tuple] += length     # 對應流的包長
        total_cnt += 1                      # 總包數
        total_len += length                 # 總包長
        if tuple_cnt[five_tuple] > VisitTimesMax or tuple_len[five_tuple] > PackageLenMax:   # 超過閾值
            tuple_abn[five_tuple] = 1       # 判定為異常流
        if tupleCnt % 100 == 0:             # 折線圖結算點
            k = tupleCnt / 100
            k = int(k)
            # print("Here {0} total_cnt={1} total_len={2}".format(k,total_cnt,total_len))
            dateY1[k-1] = total_cnt
            dateY2[k-1] = total_len
        if k == 10:
            break

5. 運用Flask編寫Web應用框架

  • 閾值設置界面與流量可視化主界面(參考資料:Flask速成

6. HTML前端基礎

(參考資料:HTML教程與在線編輯器 )

7. ECharts圖表設計基礎

  • ECharts是基於JavaScript實現的開源可視化庫

  • 官網的各種可視化圖模板真的是讓人琳琅滿目

  • 雖然是開源代碼但是使用起來還是有一點難度

  • 不過最后我做出來的這個雙縱軸圖感覺還挺酷

  • 耶!(參考資料:ECharts教程 ECharts官網 )

🎣 心得體會

靈飛學長說話算話,說不在過年的時候布置作業,於是把Deadline設在了大年廿九
終於拿下了這份沉甸甸的大禮包🎁,心情還是很愉悅的,雖然過程一如既往的艱難。
首先值得一提的是,很佩服撰寫這篇題干文案的飛哥。原本有些枯燥的作業內容,經過這番“結合時事”,居然能讓人從中品出樂趣來。敘述完故事背景后又能無縫銜接到任務要求中,而且把任務細節敘述得很清晰,給加個大雞腿🍗 這些天我是真的把這篇任務要求從頭到尾反反復復讀了好多遍(還不是人菜遲遲沒有動工)常讀常新,每次品讀都能發現一些新的東西!

不過看到這個題,腦海中浮現的是這個畫面:

深藍的天空中掛着一輪金黃的圓月,下面是海邊的沙地,都種着一望無際的西瓜。其間有一個十八九歲的少年,面對着電腦,手捏着鼠標,面對“異常流量”面露難色……

關於完成這份作業的感受,依舊是苦盡甘來哈哈哈!就像前面說的那樣,初次讀題會有些一頭霧水、不知所措、十臉茫然、無從下手,不過漸漸去了解一下相關知識背景就會慢慢開竅。當完全讀懂題干中的名詞之后,提煉出大體實現步驟,就會發現其實思路很清晰。難點不在抓包之后的數據處理,而是難在運用一些剛學的、並不熟悉的語言去實現各種小環節,然后再通過多方挖掘,將“小環節們”串聯起來(我感覺這兒是最難的,沒有太詳細的教程,需要自己感悟),最終完成目標。

致謝環節🥂

感謝我親愛的超級熱心的hygg、khgg、Lucy、Gjy、 ikkk、Zly、Exungsh相助~
在傾盡全力完成一份困難作業的時候,有人全程陪伴、互相幫助、互相探討可真是太幸運啦!
大家都超級棒呀!干杯!(指益禾堂新出的桃桃烏龍或者是古茗的酒香沁烏龍

拜年環節🧨

🧧我怕三十晚上的祝福太多,你會不在意我的問候。
🎈我怕初一早上的鞭炮太吵,你會聽不到我的祝福。
🦞我怕初二中午的菜餚太香,你會看不見我的短信。
所以就現在~祝走過路過的各位老師、學長、學姐、同學新年快樂!!🎉
新的一年~祝大家心想事成,萬事如意!🐮牛年必更牛


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM