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

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

相关文章

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用