寒假第三次做业

学习视频课程

网络空间安全概论第五章笔记连接

实验题(30'+120')

热身题

①基本思路

  • 安装虚拟机:Virtual Box
  • 安装Ubuntu系统
  • 打开终端,安装gcc
  • 编写程序

②实现结果:

代码连接:hello.c

截图:

基本题

①了解新技术

  • 简单描述什么是sketch?
    • sketch:
      • sketch是使用哈希(散列)来进行估计网络流的一种测试方法,无需记录全部数据,只记录存储数据的特征,以此减小存储开销。
      • 具体到CM sketch算法中:使用二维的哈希表, w是哈希表的取值空间, d是哈希函数的个数。对某个元素, 分别使用d个哈希函数计算相应的哈希值, 并在对应的桶上递增1, 每一个桶的值称为sketch。
  • 描述Count-min sketch的算法过程
    • 使用d个哈希函数,每一个哈希函数的取值范围都在[1,w]内,从而能够组成一个d*w的二维数组
    • 对于每一个二元组(k,v),表明元素k须要更新v次
    • 分别使用d个哈希函数对k进行哈希操做,获得d个mapped counter,而后对它们所有加v
      html

    • 当须要查询某个元素的频率估计值时,先根据哈希函数获得mapped counter
    • 而后去其中的最小值(最小值表明出现次数最少,相对最精确)
  • 补充知识(hash函数):
    • 基本概念:
      • Hash,通常翻译作"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫作预映射, pre-image),经过散列算法,变换成固定长度的输出,该输出就是散列值。
      • 这种转换是一种压缩映射,也就是,散列值的空间一般远小于输入的空间,不一样的输入可能会散列成相同的输出,而不可能从散列值来惟一的肯定输入值。
      • 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
    • 性质:
      • 若是两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。
      • 散列函数的输入和输出不是一一对应的,若是两个散列值相同,两个输入值极可能是相同的,但不绝对确定两者必定相等(可能出现哈希碰撞)。
    • 散列表:
      • 散列表是散列函数的一个主要应用,使用散列表可以快速的按照关键字查找数据记录。(就像英语字典)
    • 哈希碰撞:
      • 简单来讲,若是不一样的输入获得了同一个哈希值,就发生了"哈希碰撞"(collision)。
      • 举例来讲,不少网络服务会使用哈希函数,产生一个 token,标识用户的身份和权限。若是两个不一样的用户,获得了一样的 token,就发生了哈希碰撞。服务器将把这两个用户视为同一我的,这意味着,用户 B 能够读取和更改用户 A 的信息,这无疑带来了很大的安全隐患。
  • 为何使用多个哈希函数
    • 使用哈希,会有冲突,不一样的元素哈希到同一个数组的位置索引,这样,频率的统计都会偏大。
    • 若是使用多个数组,和多个哈希函数,来计算一个元素对应的数组的位置索引;
    • 那么,要查询某个元素的频率时,返回这个元素在不一样数组中的计数值中的最小值。这样仍是有冲突,不过冲突会比较少。

②实现新技术:

基本思路:

  • 在GitHub上面寻找相应代码
  • 阅读readme.txt文件了解其中的函数如何调用
  • 使用c.update更新:本身任意定义字符串“hello”、“world”
  • 使用c.estimate查询“hello”、“world”两个字符串的频率
  • 输出查询获得的值
  • (感谢程同窗改掉了GitHub上代码的bug)

实现结果:

③获取用户请求:

基本思路:

  • 安装tcpsump
  • 输入指令sudo tcpdump -i enp0s3 -n > pakcet_capture.txt 抓取数据并重定向到.txt文件中

实现结果:

④请求格式转换:

基本思路:

  • 利用fgets函数从文件中读取数据到字符数组I当中
  • 将请求的用户,length保存到字符数组O当中
  • 输出字符数组O
  • 使用 > 重定向输出到文件Request.txt

实现结果:

⑤测试新技术:

基本思路:

  • 读取一组数据到数组IP
  • 逆序保存length数值
  • 数组IP仅保留请求的用户名
  • 使用c.update更新总请求值
  • 判断此IP是否已经在黑客名单内
  • 若是不在黑客名单内,并且查询获得的值大于阈值T,拉入黑客名单
  • 输出黑客名单

实现结果:

  • 代码连接:test2
  • 截图:

开放题

①理论部分:

  • 解释为何sketch能够省空间
    • sketch使用哈希函数,而哈希函数能够把任意长度的输入映射为固定长度的输出。
    • 因此,不须要把每组数据都存储下来,只要建立几个数组来存储元素sketch的计数。每组数据根据哈希值来分类,各类包再根据哈希值归来。
    • 如此一来,就能够节省大量本来用于存储数据的空间。(特别是当每组数据都很长时)
  • 用流程图描述count-min sketch的算法过程:
    git

  • 拿它和你改进后的方法对比,分析它的优劣:
    • 优势:
      • 通用性更强
      • 更好的解决了用户名很长的问题
      • 对于庞大的数据,处理效率更高,查询某元素的效率也更高
      • 只须要固定大小的内存和计算时间,和须要统计的元素多少无关
    • 缺点:
      • 当数据总量不够大时,精确度不是很高
      • 使用hash函数,就可能产生哈希碰撞
  • 吐槽count min sketch:
    • github上面的代码有些会却库缺函数,bug有点多
    • 难度有点大,不易掌握(对我来讲)

②实验部分:

  • 基本思路:
    • 直接从终端上实时获取数据
    • 格式转换
    • 使用c.update更新此用户请求总值
    • 判断是否已经拉入黑客名单
    • 若是已经拉入黑客名单,则忽略这条请求
    • 若是未拉入黑名单且请求总值超过阈值T,则拉入黑客名单
    • 实时输出新增黑客(重定向到txt文件当中)
  • 关于实时:
    • 可能须要一我的为操做来肯定读取结束(好比CTRL+c),不然只要出现新数据就读取
  • 实现:没找到如何解决“实时获取”的方法
相关文章
相关标签/搜索