目录
寒假作业二——高级代码技工的养成
什么样的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 = "{:}
Src : {}:{}
Dst : {}:{}
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,卷神的指导!!!!