目錄
寒假作業二——高級代碼技工的養成
什么樣的CSDN孕育
什么樣的碼農
碼農:我們不生產代碼
我們只是CSDN的搬運工
圖
Github 鏈接
對完成本次任務的初步預估
完成,這輩子是不可能完成的。 ——人類精神領袖竊格瓦拉
學習的語言
- python(pythonyyds)
- html(沒有用到,但還是有了解一點)
算法
- 在對題目要求的每k流量的處理時,我采用了這樣的做法
- flow_relation_bag_total_sum[cnt_flow//1000+1]=cnt_bags
遇到的困難與解決方式
遇到的困難
- 太多了(不會抓包,抓包的時候被各種博客卡脖子,網絡知識零基礎,pyecharts調位置參數)
解決的方式
- 問小白馬
- 默念小白馬
- 再問問小白馬
- B站,csdn ,奔向大佬的懷抱
學習資源
畫圖模板(flask)
from flask import Flask
from jinja2 import Markup
from pyecharts import options as opts
from pyecharts.charts import Bar,Grid,Pie,Line
app = Flask(__name__, static_folder="templates")
def grid_base() -> Grid():
return "要返回的圖表類型"
@app.route("/")
def index():
c = grid_base()#調用函數並接收圖表
return Markup(c.render_embed())
#控制中心
if __name__ == "__main__":
app.run(port=60)
折線圖模板
折線圖變量名 = (
Line()
.add_xaxis(x軸列表)
.add_yaxis(
series_name="系列名字",
y_axis=y軸列表,
)
)
雙y軸一直搞不出來。。
總結以及實際用時
- 做前撫膺嘆息,做時勝似蹲監,做完感覺良好,
- 自閉一個禮拜(調節:觀看《山海情》)
- 啟動三天
- 畫畫四天(摸魚)
假裝自己是老板
- 問:如果你是競爭對手,能否找到其他進攻方式繞開該規則,或者通過其他網絡手段有效打擊對手?(請勿模仿)
- 答:定期更改自己發送時用的源地址(不包括端口)或源地址端口
- 問:這些懶懶的技術人員制定的判定規則會出現的問題有哪些?
- 答:可能把正常的地址也標記成異常了(就好像一款殺毒軟件對檢測到的東西全標記為進行攻擊,或者像輻射把正常細胞也當成癌細胞進行攻擊)
- 問:評估自己的系統的處理效率
- 答:感覺良好
- 問:老板某日在想桃子:我xxx有一個夢想,建成世界一流 news app!能夠為世界上每個網民提供吃瓜服務。請從多個方向考慮該系統需要改進的地方還有哪些?(數據量,效率,安全性等等)
- 答:讓子彈飛會
代碼
# Author:Hugh
# -*- codeing = utf-8 -*-
# @Time : 2021/2/4 15:17
# @Author : Hugh
# @File : 寒假作業2.py
# @Software: PyCharm
from scapy.all import *
import re
from flask import Flask
from jinja2 import Markup
from pyecharts import options as opts
from pyecharts.charts import Bar,Grid,Pie,Line
#假控制台
control_time = 120
Φ = 300000 #包數
φ = 500000 #包長
#timeout參數用來控制抓包的周期
packet =sniff(timeout=control_time,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}")) #抓包
p=wrpcap('lygg.pcap', packet) #存包
packets=rdpcap("lygg.pcap") #讀包
cnt_udp = 0
cnt_tcp = 0
cnt_arp = 0
cnt_icmp = 0
cnt_igmp = 0
cnt_ospf = 0
cnt_other = 0
cnt_flow = 0
#
cnt_len = 0
cnt_bags = 0
cnt_success_bags = 0
five_tuple = {} #建立五元組字典
flow_relation_bag_total_length = {} #建立一個字典用來統計流的總長
flow_relation_bag_total_sum = {} #建立一個字典用來統計流的總數
# 五元組提取區
for bag in packets:
cnt_bags = cnt_bags + 1
print("這是第{}個包".format(cnt_bags))
flow_relation_bag_total_sum[cnt_flow//1000+1]=cnt_bags
try:
if (bag[1].proto == 6 or bag[1].proto == 17):
PROTO = bag[1].proto
Len= bag[1].len
cnt_success_bags=cnt_success_bags+1
cnt_len=cnt_len+Len
flow_relation_bag_total_length[cnt_flow//1000+1] = cnt_len
if (PROTO == 17):
Proto = "UDP"
cnt_udp = cnt_udp + 1
else:
Proto = "TCP"
cnt_tcp = cnt_tcp + 1
Src = bag[1].src
Dst = bag[1].dst
Sport = bag[1].sport
Dport = bag[1].dport
s = "{:} \n Src : {}:{}\n Dst : {}:{} \n Len : {}".format(Proto, Src, Sport, Dst, Dport, Len)
if s not in five_tuple:
five_tuple[s] = [0,Len]
cnt_flow = cnt_flow + 1#流的數量加一
else:
five_tuple[s][0] = five_tuple[s][0] + 1
five_tuple[s][1] = five_tuple[s][1] + Len
else:
if(bag[1].proto == 1):
cnt_icmp = cnt_icmp + 1
elif(bag[1].proto == 2):
cnt_igmp = cnt_igmp + 1
elif(bag[1].proto == 89):
cnt_ospf = cnt_ospf + 1
except Exception as e:
try:
if (bag[0].type == 2054):
cnt_arp = cnt_arp + 1
else:
cnt_other = cnt_other + 1
except Exception as e:
cnt_other = cnt_other + 1
# print(Five_Tuple)
# 協議:其中1,標識ICMP、2標識IGMP、6標識TCP、17標識UDP、89標識OSPF。
# data.payload.name:'IP','IPV6','ARP'或者其他
#繪圖材料准備區
#1.柱狀圖區
##正則
#s = "{} {}:{} {}:{}".format(Proto, Src, Sport, Dst, Dport)
#pattern = re.compile(r'.*?([1-9][0-9]{0,2}.[1-9][0-9]{0,2}.[1-9][0-9]{0,2}.[1-9][0-9]{0,2}).*?') # re.I 表示忽略大小寫
def Creating_Bar_Source(Five_Tuple):
xaxis = []
yaxis = []
for x,y in Five_Tuple.items():
if y[0] > Φ or y[1] > φ: ##設置閾值
#xsrc=pattern.match(x)
#xaxis.append(xsrc.group(1))
xaxis.append(x)
yaxis.append(y[0])
print(xaxis)
print(yaxis)
return xaxis,yaxis
#2.小bar圖區
xaxis_small=['Φ','φ']
yaxis_small=[Φ,φ]
#3.玫瑰餅圖區
proto_types=["UDP","TCP","ARP","ICMP","IGMP","OSPF","Other"]
proto_nums=[cnt_udp,cnt_tcp,cnt_arp,cnt_icmp,cnt_igmp,cnt_ospf,cnt_other]
zipped=zip(proto_types,proto_nums)
#4.折線區域
##flow_relation_bag_total_length
flow_len_x = []
flow_len_y = []
for lenx,leny in flow_relation_bag_total_length.items():
flow_len_x.append(str(lenx)+'k')
flow_len_y.append(leny)
##flow_relation_bag_total_sum
flow_cnt_x = []
flow_cnt_y = []
for cntx,cnty in flow_relation_bag_total_sum.items():
flow_cnt_x.append(str(cntx)+'k')
flow_cnt_y.append(cnty)
# 繪圖區
app = Flask(__name__, static_folder="templates") #建立一個Flask實例app程序
def grid_base() -> Grid(): #->起到一個修飾提醒的作用
xaxis,yaxis =Creating_Bar_Source(five_tuple)
bar_five = (
Bar(init_opts=opts.InitOpts(width='60px', height='180px',bg_color="#654ea3"),)
.add_xaxis(xaxis)
.add_yaxis(
series_name="count_five",
y_axis=yaxis,
)
.set_global_opts(
title_opts=opts.TitleOpts(title="可疑流量探測器", subtitle="單詞抓取時間周期為{}s".format(control_time),pos_top="1%",pos_left="1%"),
legend_opts=opts.LegendOpts(pos_top="6%",pos_left="1%"),
xaxis_opts=opts.AxisOpts(name="五元組(流)"),
yaxis_opts=opts.AxisOpts(name="五元組總數(流數)")
)
.set_series_opts(label_opts=opts.LabelOpts(is_show= True))
)
bar_threshold = (
Bar(init_opts=opts.InitOpts(width='30px', height='60px'))
.add_xaxis(xaxis_small)
.add_yaxis("閾值大小", yaxis_small)
.set_global_opts(
title_opts=opts.TitleOpts(title="閾值表",pos_top="3%", pos_bottom='80%', pos_left='75%',pos_right="10%"),
legend_opts=opts.LegendOpts(pos_top="7%", pos_bottom='80%', pos_left='75%',pos_right="10%"))
)
pie = (
Pie(init_opts=opts.InitOpts(width="600px",height="300px"))#,is_label_show=True
.add("", [list(z) for z in zipped],rosetype=True,radius=[40,90],center=["17%","80%"])
# .set_colors(["blue", "green", "yellow", "pink"])
.set_global_opts(title_opts=opts.TitleOpts(
title="包種類比例",pos_top="50%",pos_bottom="60%",pos_left="1%"),
legend_opts=opts.LegendOpts(pos_left="1%",pos_top="55%"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
#折線圖
line1 = (
Line(init_opts=opts.InitOpts())
.add_xaxis(flow_len_x)
.add_yaxis(
series_name="total_len",
y_axis=flow_len_y,
yaxis_index=0,
label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值")]),
areastyle_opts=opts.AreaStyleOpts(opacity=0.5)
)
.extend_axis(yaxis=opts.AxisOpts())
.set_global_opts(
title_opts=opts.TitleOpts(title="總包長和總包數與流量的關系", pos_top="50%", pos_left='50%'),
legend_opts=opts.LegendOpts(pos_left="50%", pos_top="55%"), #標簽的位置
xaxis_opts=opts.AxisOpts(name="總流量"), #給x軸貼名字
yaxis_opts=opts.AxisOpts(name="數值"), #給y軸貼名字
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
line2 = (
Line()
.add_xaxis(flow_len_x)
.add_yaxis(
series_name="total_bag_cnt",
y_axis=flow_cnt_y,
yaxis_index=1,
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值")])
)
)
line1.overlap(line2) #圖的疊加,但雙y軸一直用不了
#組合圖
grid = (
Grid(init_opts=opts.InitOpts(width='1400px',height='1000px',bg_color="#f7b733"))#初始化寬度,高度和設置背景顏色
#通過四個位置參數,給各種圖分配位置
.add(bar_five, grid_opts=opts.GridOpts(pos_top="11%",pos_bottom='60%',pos_right="25%"))
.add(bar_threshold, grid_opts=opts.GridOpts(pos_top="10%", pos_bottom='80%', pos_left='80%',pos_right="10%"))
.add(line1, grid_opts=opts.GridOpts(pos_top="60%",pos_bottom="10%",pos_left="50%"))
.add(pie, grid_opts=opts.GridOpts(pos_bottom="10%",pos_left="10%",pos_top="85%",pos_right="90%"))
)
return grid
#flask模板,flask對象和index的連接(@起到對函數修飾的作用)
@app.route("/")
def index():
c = grid_base() # 返回一個Grid()實例
return Markup(c.render_embed())
#控制中心
if __name__ == "__main__":
app.run(port=60)
感謝
感謝小白馬,xsgg,小o,lygg,卷神的指導!!!!