文章目录
- 前情提要
- 何为网络流量
- 网络流量分析(NTA)
- 网络流量组成
- 网络流量处理过程
- 预测网络流量的工具
- wireshark
- brim(zui)
- 机器学习中的网络流量预测
- 参考文章
前情提要
记录一些有关网络流量的学习
何为网络流量
网络流量是指在计算机网络中数据的传输量,通常是在一段时间内通过网络的数据包的数量或大小。它可以是一种指标,用于衡量网络的使用情况和负载。网络流量可以分析网络的性能、监控资源使用情况、优化网络结构、确保网络安全,并帮助诊断网络问题。它对于网络运营商、网站管理员和网络安全专家来说都是非常重要的,因为它影响到网络的性能、可用性和安全性。
网络流量分析(NTA)
1.检查网络流量以表征所使用的常用端口和协议
2.为我们的环境建立监视和响应威胁以及确保尽可能深入地了解我们组织的网络行为
网络流量的管理和分析是确保网络健康、安全和高效运行的关键组成部分。
网络流量组成
网络流量的主要组成部分包括以下几个方面:
-
应用层数据:这是用户实际传输和接收的数据,如网页内容、电子邮件、文件传输、视频流、音频流等。这些数据是网络流量的主要载体,直接为用户提供服务。
-
传输层协议:
- TCP(传输控制协议):提供面向连接的、可靠的数据传输,确保数据包按顺序且无误地到达目的地。常用于网页浏览、电子邮件等需要可靠传输的应用。
- UDP(用户数据报协议):提供无连接、不保证可靠性的快速传输,适用于对速度要求高且能容忍一定数据丢失的应用,如视频直播、在线游戏。
-
网络层协议:
- IP(互联网协议):负责定义数据包的地址和路由,使数据能够在不同的网络之间传输。包括IPv4和IPv6版本。
-
链路层协议:如以太网协议、Wi-Fi协议等,负责在同一网络段内传输数据。
-
控制和管理流量:
- ARP(地址解析协议):用于将IP地址解析为物理MAC地址。
- ICMP(互联网控制消息协议):用于网络诊断和错误报告,如ping命令。
- 路由协议:如OSPF、BGP,用于更新和维护路由信息。
-
安全协议和加密数据:
- SSL/TLS:用于安全的网页浏览和数据传输。
- VPN(虚拟专用网络)流量:用于建立安全的网络连接,保护数据的机密性和完整性。
-
多媒体流量:
- VoIP(网络语音协议):用于语音通信。
- 视频会议和流媒体:占用较大带宽,对实时性要求高。
-
广播和组播流量:用于在网络中向多个节点发送数据,如网络服务发现、IPTV等。
-
文件共享和P2P流量:如BT下载、eMule等,涉及大量的数据传输。
-
恶意流量:
- 网络攻击:如DDoS攻击、网络入侵等。
- 病毒和蠕虫传播:消耗网络带宽,可能导致网络性能下降。
网络流量处理过程
获取流量、过滤降噪、分析探索、检测和警报、修复和监控
预测网络流量的工具
以下提到两款工具,一个是经典的wireshark,另外一个是birm
wireshark
官网地址:https://www.wireshark.org/
很多网络安全学习者对于这款工具并不陌生,在集成工具库镜像kali中,自带有这款工具
若是与CTF、取证分析等方面上,则更是需要与这款工具打很多交道。
网络分析工具——WireShark的使用(超详细)
brim(zui)
这款工具我也是近日接触,还没过多上手,不过ui界面方面的话会比wireshark更加舒服些(功能上可以与wireshark联动使用)
官网下载地址:https://www.brimdata.io/download/,如图可以下载桌面版软件
安装后,名称实际为zui
我试着测试了下载的pcap数据包(https://aistudio.baidu.com/datasetdetail/52162),加载了差不多半小时才好。
可以进行一些查询,比如模糊查询secret
还有http id.orig_h==203.181.20.82
机器学习中的网络流量预测
深度学习
主要应用算法:
卷积神经网络CNN、循环神经网络RNN、长短记忆网络、自编码器、卷积递归神经网络
环境准备
pip install numpy pandas keras tensorflow scikit-learn
数据处理
flowdata.csv下载地址:https://github.com/ftconan/python3/blob/master/pandas_demo/flowdata.csv
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 加载数据
data = pd.read_csv('flowdata.csv')
# 选择时间序列数据
time_series = data['flow'].values
# 归一化数据
scaler = MinMaxScaler()
time_series_scaled = scaler.fit_transform(time_series.reshape(-1, 1))
# 分割数据集,定义lookback窗口大小
lookback = 60
X, y = [], []
# 创建输入X和输出y
for i in range(lookback, len(time_series_scaled)):
X.append(time_series_scaled[i-lookback:i, 0])
y.append(time_series_scaled[i, 0])
X, y = np.array(X), np.array(y)
# Reshape输入数据以适应LSTM的输入格式
X = np.reshape(X, (X.shape[0], X.shape[1], 1))
# 分割训练集和测试集
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
from keras.models import Sequential
from keras.layers import Dense, LSTM
# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(X_train.shape[1], 1)))
model.add(Dense(1))
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32)
# 进行预测
predicted_flow = model.predict(X_test)
# 将预测的结果反归一化
predicted_flow = scaler.inverse_transform(predicted_flow)
# 输出预测结果
print(predicted_flow)
MinMaxScaler 用于归一化数据,因为LSTM对数据的缩放比较敏感。
LSTM 模型 是一个简单的两层结构,适合处理时间序列数据。
训练数据 被分割为80%的训练集和20%的测试集。
另有一个使用R语言来处理网络流量的项目:https://github.com/rankinjl/internet-traffic-stats-project/blob/master/DataSetProject.R
我将之转换成了对应python代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import acf, pacf
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.seasonal import seasonal_decompose
# 加载数据
inttraffic = pd.read_csv('inttraffic.csv')
# 解析时间和流量数据
inttraffic['Time'] = pd.to_datetime(inttraffic['Time'], format='%m.%d.%Y %H:%M')
time = inttraffic['Time']
traffic = inttraffic['Internet traffic data (in bits) from a private ISP with centres in 11 European cities. The data corresponds to a transatlantic link and was collected from 06:57 hours on 7 June to 11:17 hours on 31 July 2005. Data collected at five minute intervals.'].astype(float)
T = len(time)
t = np.arange(1, T + 1)
# 绘制时间和流量图
plt.plot(t, traffic)
plt.title('Internet Traffic vs Time')
plt.xlabel('Time (every 5 minutes)')
plt.ylabel('Traffic (bits)')
plt.show()
# 去除最后100个数据点
traffic = traffic[:-100]
T -= 100
t = t[:-100]
# 线性拟合
linearfit = LinearRegression()
linearfit.fit(t.reshape(-1, 1), traffic)
traffic_pred = linearfit.predict(t.reshape(-1, 1))
# 绘制线性拟合
plt.plot(t, traffic, label='Actual Traffic')
plt.plot(t, traffic_pred, label='Linear Fit', color='red', linestyle='dashed')
plt.title('Linear Fit of Traffic')
plt.xlabel('Time (every 5 minutes)')
plt.ylabel('Traffic (bits)')
plt.legend()
plt.show()
# 残差图
residuals = traffic - traffic_pred
plt.plot(t, residuals)
plt.title('Residuals vs Time')
plt.xlabel('Time (every 5 minutes)')
plt.ylabel('Residuals')
plt.show()
# 检查自相关
plt.acorr(residuals, maxlags=50)
plt.title('Autocorrelation of Residuals')
plt.show()
# 使用ARIMA模型进行拟合
model = ARIMA(traffic, order=(1, 2, 3))
fit_model = model.fit()
# 预测100个未来数据点
forecast = fit_model.forecast(steps=100)
# 绘制预测结果
plt.plot(t, traffic, label='Actual Traffic')
plt.plot(np.arange(T, T + 100), forecast, label='Forecast', color='blue')
plt.title('Forecasts from ARIMA(1,2,3)')
plt.xlabel('Time (every 5 minutes)')
plt.ylabel('Traffic (bits)')
plt.legend()
plt.show()
# 计算预测误差 (SSE)
last_forecasts = traffic[-100:]
sse = mean_squared_error(last_forecasts, forecast[:len(last_forecasts)]) * len(last_forecasts)
print(f'Sum of Squared Errors (SSE): {sse}')
代码说明
数据加载:
使用 pandas 加载CSV文件并解析时间序列数据。
绘图和线性拟合:
1.使用 Matplotlib 绘制时间和流量图。
2.通过 LinearRegression 进行线性拟合,并绘制拟合曲线。
3.计算残差,并绘制残差图以检查线性模型的残差。
ARIMA模型:
1.使用 statsmodels 库的 ARIMA 模型来拟合流量数据,预测未来100个数据点。
2.使用 mean_squared_error 计算最后100个点的预测误差 (SSE)。
绘制预测结果:
绘制ARIMA模型的预测值,与实际流量进行比较。
结果
1.线性拟合 将简单地拟合趋势,绘制出实际流量数据的线性趋势。
2.ARIMA预测 则捕捉了数据的自相关特性,提供了更加复杂的预测结果。
3.SSE(误差) 表示模型预测与实际数据的误差大小。
参考文章
借鉴
网络流量详解
深度学习中的网络流量预测