【寒假作业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相助~
在倾尽全力完成一份困难作业的时候,有人全程陪伴、互相帮助、互相探讨可真是太幸运啦!
大家都超级棒呀!干杯!(指益禾堂新出的桃桃乌龙或者是古茗的酒香沁乌龙

拜年环节🧨

🧧我怕三十晚上的祝福太多,你会不在意我的问候。
🎈我怕初一早上的鞭炮太吵,你会听不到我的祝福。
🦞我怕初二中午的菜肴太香,你会看不见我的短信。
所以就现在~祝走过路过的各位老师、学长、学姐、同学新年快乐!!🎉
新的一年~祝大家心想事成,万事如意!🐮牛年必更牛

posted @ 2021-02-10 22:40  Forest_One  阅读(475)  评论(7编辑  收藏  举报