当一位现代应用开发者与旧式系统开发者走进一家酒吧...

2024-03-14 17:38

本文主要是介绍当一位现代应用开发者与旧式系统开发者走进一家酒吧...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要: 一位现代应用开发者与其前辈系统开发者走进一家酒吧,聊起了当前的互联网安全问题,由此探讨出设计一幅互联网地图,标出那些容易受病毒侵害的IP端口。从语言选择到存储主机和端口状态等,他们给出了不同的解决方案。

图片描述

题图来自pastemagazine

故事是这样发生的:

一位现代应用开发者以及他的前辈——一位传统的系统开发者走进一家酒吧,几杯酒下肚,他们聊起了当下的互联网安全问题。灵光一闪,两人觉得:如果能设计出一幅互联网地图,标出那些容易受病毒侵害的IP端口,意义将是非凡的。讨论了一番之后,他们决定:

  • 每月对所有IPv4地址(2^32=4,294,967,296)进行端口扫描。端口总共20个,包括一些像FTP(20,21)、telnet(23)、ssh(22)、SMTP(25)等不常见的端口。
  • 他们打算用nmap来扫描IP和端口。
  • 需要将端口状态设置为开启、关闭、过滤、未过滤、开启过滤和关闭过滤。
  • 不论主机状态为“up”还是“down”,都要进行存储。主机状态为“up”须满足以下任意一个条件:

    1. 若主机上有开启的端口,主机状态则可能为“up”;
    2. 若主机以ping来回应,主机状态则可能为“up”。
  • 存储结果的目的是为了将过程写在报告中。

    1. 获得状态为“up”的主机数量;
    2. 判断某个主机处于“up”或“down”的状态;
    3. 判断在特定的/24子网络中,那些主机处于“up”状态;
    4. 获得所有端口开启的主机数量;
    5. 获得过去3个月状态为“up”的主机数量;
    6. 获得本月状态发生改变(由“up”转为“down”,或由“down”转为“up”)的主机数量;
    7. 获得上月状态为“down”,而现在状态为“up”的主机数量;
    8. 获得上月状态为“up”,而现在状态为“down”的主机数量。

现代应用开发者 vs. 旧式系统开发者

假设3亿IP处于开启状态,平均每个有3个开启的端口:

  • 你该如何构建?
  • 如何能更快完成这些任务?
  • 哪些途径更易扩展,例如添加更多端口?
  • 哪些途径耗费更多资源(CPU、内存、硬盘等)?

免责声明:我不太了解ElasticSearch(基于Lucene的搜索服务器),如有错误,还请指正。

语言选择

现代应用开发者:

选择Python,好上手,好维护,简单易懂。

系统开发者:

选择Go,快速高效,简单易懂,易于维护!

存储主机和端口状态

现代应用开发者:

JSON是不二选择!直接解读,无需解析(基于代码库构建),广受欢迎!

{"ip": "10.1.1.1","state": "up","ports": {"20": "closed","21": "closed","22": "open","23": "closed",...}
}

400字节表示一个主机、up/down状态以及20个端口状态。

若是3亿IP,则需112GB的空间来存储所有主机和端口状态。

系统开发者:

使用一个位数组(内存映射文件)来存储主机状态,每个主机为1 bit。若bit为1,则为“up”状态;为0,“down”状态。

因为地址为2^32 IPv4,所以位数组为2^32 / 8=536,870,912或512MBs。无需分开存储IP地址,因为IPv4地址会转换成一个数字,可以充当位数组中的index。

然后使用第二个位数组(内存映射文件)来存储主机状态。6个端口状态,每个为3 bit;20个端口状态,总共60 bit。每个主机用一个uint64来表示端口状态。

所有4B IP大概需要32GB的空间来存储端口状态。存储所有主机和端口状态需要33GB的空间。

假设我们暂时不压缩,用EWAH bitmap compression也能节省一些空间。若采用EWAH 位图压缩,可能就无法获得符合条件的主机的数量了。

获得状态为“up”的主机数量

现代应用开发者:

如果是大数据的问题,推荐使用Hadoop进行映射/化简来处理共3亿主机的JSON结果(文件),然后就知道多少IP为开启状态。

如果是搜索的问题,推荐使用ElasticSearch。

我会在“状态”上用ElasticSearch将共3亿JSON文件编入索引,然后在其中搜索“状态(state)”为“up”的结果。

我意识到还有额外的存储需要用ES来编入索引。假设所需空间是普通文件1/8的大小,那么可能有另外14GB的索引数据,使得总大小变成126GB。

系统开发者:

这是bit counting或popcount()的问题,就是简单的加减法而已。循环访问uint64(~8.4M uint64)数组,清点每个主机有多少bit,然后加起来即可。

也可以创建多个goroutine(假设语言为Go),分步来做,跟映射/化简相似,计算起来更快。

判断某个主机处于“up”或“down”的状态

现代应用开发者:

用ElasticSearch搜索即可。

除了上文提到的“状态(state)”,这次我用ElasticSearch将“ip”编入索引。对于任何IP而言,都可以搜索满足条件的IP,从这个文件中,找到“状态(state)”的值。

系统开发者:

这很容易,只需将IPv4的整数值作为位数组的index,然后判断bit值是1还是0即可。

判断在特定的/24子网络中,哪些主机处于“up”状态

现代应用开发者:

这跟搜索单个IP有点儿像。搜索IP在子网络中(在ES中使用CIDR标记搜索)状态为“up”的文件。然后循环一系列搜索结果,找到主机IP。

Or

或者仅仅用映射/简化来处理3亿JSON文件,然后寻找/24子网络中状态为“up”的主机IP。

系统开发者:

这只是另外一个bit迭代的问题了。我打算用子网络的第一个IP地址来判断先选哪个位数组,然后清点子网络中的IP数量。然后循环访问位数组,若bit值为1,则将其index转换为IPv4地址,就知道多少主机状态为“up”了。

获得所有端口开启的主机数量

举个例子,报告可能仅仅如下所示:

20: 3,023
21: 3,023
22: 1,203,840
.
.
.

现代应用开发者:

这是大数据的问题了,我选择使用Hadoop进行映射/简化,返回的结果显示每个端口的主机数量。

用ElasticSearch也可以解决这个问题,ElasticSearch要求端口状态为index,这会增加index所占空间。然后清点搜索的端口22=“open”的结果,每个端口重复一遍即可。

系统开发者:

这就是数数而已。先过一遍主机状态位数组,针对状态为“up”的主机,用bit作为端口状态uint64数组的index,然后得到一个表示那个主机所有端口状态的uint 64。接下来在所有端口3 bit大小的bundle中寻找“up”状态的端口,就能知道符合条件的主机有多少个。

同样也可以用创建多个goroutine的方式来解决这个问题。

获得过去3个月状态为“up”的主机数量

现代应用开发者:

每个月都检索一遍状态为“up”的主机清单,然后把3个清单都过一遍,再缩减到一个清单,这需要一点处理和迭代的操作。

系统开发者:

我可以每3个月在位数组上进行一个简单的OR操作,然后查看有多值为1的bit。

获得本月状态发生改变(由“up”转为“down”,或由“down”转为“up”)的主机数量

现代应用开发者:

这个……还真没什么简单的方法。我直接循环访问上个月的主机,看看状态是否更改了。然后循环访问这个月没有查看过的主机,根据上个月的结果再过一遍清单。

系统开发者

可以在过去两个月的位数组上进行一个简单的XOR操作,然后清点显示在结果中的位数组值为1的bit。

获得上月状态为“down”,而现在状态为“up”的主机数量

现代应用开发者:

可以从上个月ES中检索状态为“up”的主机,然后再在其中寻找本月状态为“down”的主机,清点数量即可。

系统开发者:

操作如下:(this_month XOR last_month) AND last_month。如果主机状态符合条件,返回的位数组会有一个位组(bit set),然后清点显示在结果中的位数组值为1的bit。

获得上月状态为“up”,而现在状态为“down”的主机数量

现代应用开发者:

我可以从ES中检索状态上个月为“down”的主机,再在其中搜索当月状态为“up”的主机,然后清点数量。

系统开发者:

操作如下: (this_month XOR last_month) XOR this_month。如果主机符合条件的话,会返回一个有位组(bit set)的位数组,然后清点结果显示的位数组值为1的bit。

英文来源:A Modern App Developer and An Old-Timer System Developer Walk Into a Bar
作者:zhen
翻译:张新慧
审校/责任编辑:唐小引,欢迎技术投稿、约稿,给文章纠错,请致件tangxy@csdn.net

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。

图片描述

2016年3月18日-19日,由CSDN重磅打造的数据库核心技术与实战应用峰会、互联网应用架构实战峰会将在上海举行。这两场峰会将邀请业内顶尖的架构师和技术专家,共同探讨高可用/高并发系统架构设计、新技术应用、移动应用架构、微服务、智能硬件架构、云数据库实战、新一代数据库平台、产品选型、性能调优、大数据应用实战等领域的热点话题与技术。

2月29日24点前仍处于最低六折优惠票价阶段,单场峰会(含餐)门票只需799元,5人以上团购或者购买两场峰会通票更有特惠,限量供应,预购从速。(票务详情链接)。

这篇关于当一位现代应用开发者与旧式系统开发者走进一家酒吧...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809177

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、