把整个 IPV4 存储到数据库里,仅仅记录某个 IP 开放的 TCP 端口。该选用什么数据库和数据格式??

2021-05-31 15:18:25 +08:00
 RedFlag2233

把整个 IPV4 存储到数据库里,仅仅记录某个 IP 开放的 TCP 端口。该选用什么数据库和数据格式?? 比如,8.8.8.8 开放了 53 就记录一下。

1297 次点击
所在节点    数据库
13 条回复
RedFlag2233
2021-05-31 15:22:47 +08:00
UP
zpfhbyx
2021-05-31 15:23:34 +08:00
134744072.53
Kinnice
2021-05-31 15:25:16 +08:00
ip 转 int 做主键,后面端口用 list[80,53]
imdong
2021-05-31 15:25:39 +08:00
记录一些 IP 的话,估计就是 Long IP?

如果要记录所有 IPv4 地址的话,那就是面试题中有限空间存数据的问题,需要 0xffffffff 长度的完整空间,对应点位置 0 / 1
knives
2021-05-31 15:41:41 +08:00
如果用 PostgreSQL 的话,可以试试 cidr/inet 类型来存储 IP 。端口号独立字段,可以考虑使用数组存储。
moen
2021-05-31 15:43:03 +08:00
pg 直接 inet 类型存 IP,integer[] 存端口。想抠存储空间用 smallint[] 也不是不行,就是得转成有符号数
ch2
2021-05-31 15:44:07 +08:00
mongo
yukiww233
2021-05-31 15:50:16 +08:00
是想扫一份全网的开放端口么 😮
RedFlag2233
2021-05-31 15:52:44 +08:00
@yukiww233 是的 :)
RedFlag2233
2021-05-31 15:54:19 +08:00
@imdong 是的,就是想记录所有的 IPV4 。能把您说的面试题的问题给一个参考链接吗?我去学习一下。
imdong
2021-05-31 16:02:03 +08:00
啊这,我随便说的,之前的面试题大概是这样的:

大量 url 去重但内存有限怎么做.

你这个思路就是 255.255.255.255:65535 可以对应到一个内存 /文件地址上.

0xFFFFFFFF-0xFFFF 上,开放 1,不开放 0.
Akkuman
2021-05-31 23:07:52 +08:00
ipv4 用 int 存,因为 ipv4 是 32 位的数,这个可以直接定义为主键,然后 port 可以用 smallint 存,16 位,也可以定义为主键,然后看你是用中间表多对多关联,还是像上面说的 port 存成一个 list,还是怎样存,看你的查询需求了
qyvlik
2021-06-01 08:52:50 +08:00
ipv4 用 int 存,一个 ip 的可用端口数的理论值是 65535 左右,用 bitmap + 压缩保存。
然后查询可以用 redis 的 位操作命令加速。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/780351

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX