暑期第三次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2023summer
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2023summer/homework/12997
这个作业的目标 学习判断是否存在heavy-hitters(大流),并找到频数最大的k条流(Top-k问题)

1.检测出数据集中的heavy-hitters并解决Top-k问题

我首先定义了一个Count-Min Sketch类,用于创建Count-Min Sketch。Count-Min Sketch使用一个二维矩阵来存储计数信息,其中宽度和深度由参数width和depth指定。

接着打开捕获文件(题目的数据集有两个文件,我这里就选取第一个文件来作为数据集。),并创建Count-Min Sketch实例。然后,遍历每个数据包,检查是否具有IP层,并获取源IP地址。接下来,调用Count-Min Sketch的update方法来更新计数。在遍历结束后,关闭捕获文件。

然后,进行重要元素的检测。设置了top_k变量来指定要获取的前k个重要元素,count_threshold变量来设置计数的阈值,暂定为1000。使用Counter对象来存储重要元素及其计数。再次遍历捕获文件中的数据包,检查是否具有IP层,并获取源IP地址。然后,调用Count-Min Sketch的query

代码如下:

import pyshark
from collections import Counter



# 创建Count-Min Sketch数据结构
class CountMinSketch:
    def __init__(self, width, depth):
        self.width = width  # Count-Min Sketch的宽度
        self.depth = depth  # Count-Min Sketch的深度
        self.sketch = [[0] * width for _ in range(depth)]  # 初始化Count-Min Sketch矩阵

    def update(self, item):
        # 更新Count-Min Sketch
        for i in range(self.depth):
            hash_value = hash((i, item)) % self.width  # 使用哈希函数生成哈希值
            self.sketch[i][hash_value] += 1  # 对应位置计数加1

    def query(self, item):
        # 查询项的最小计数
        min_count = float('inf')
        for i in range(self.depth):
            hash_value = hash((i, item)) % self.width  # 使用哈希函数生成哈希值
            min_count = min(min_count, self.sketch[i][hash_value])  # 更新最小计数
        return min_count

# 打开捕获文件(这里我把数据集保存到了桌面,复制它的链接即可)
cap = pyshark.FileCapture('C:/Users/z/Desktop/trace1.pcap')

# 创建Count-Min Sketch实例
cms = CountMinSketch(width=1000, depth=5)

# 遍历每个数据包
for pkt in cap:
    # 检查数据包是否具有IP层
    if 'IP' in pkt:
        # 获取源IP地址
        src_ip = pkt['IP'].src
        # 更新Count-Min Sketch
        cms.update(src_ip)

# 关闭捕获文件
cap.close()

# 检测重要元素
top_k = 10  # 获取前10个重要元素
count_threshold = 1000  # 设置计数阈值![](https://img2023.cnblogs.com/blog/3199446/202308/3199446-20230823175918075-734929296.png)

counter = Counter()
for pkt in cap:
    if 'IP' in pkt:
        src_ip = pkt['IP'].src
        # 查询Count-Min Sketch的计数
        count = cms.query(src_ip)
        if count >= count_threshold:
            counter[src_ip] = count

# 打印最高频率流
print("最高频率流 (Top 10):")
for ip, count in counter.most_common(top_k):
    print(f"IP地址: {ip}, 计数: {count}")

结果显示:

posted @ 2023-08-23 18:36  Xianhj  阅读(198)  评论(0)    收藏  举报