如何确定WAN IP地址是否更改并接收大量IP地址广播。

3
我正在开发的系统可能有非常多的客户端(比如说一百万),需要定期向一个中央服务器更新一些信息。客户端是用Java编写的。
具体用例是,服务器后端需要一个最新的IP地址到客户端的映射。但是客户端的IP是动态的,随机改变的。
我考虑的解决方案需要客户端ping服务器来更新它们的IP地址。理想情况下每分钟应该ping一次,但即使1个ping/10分钟也是可以接受的。
我的问题,按顺序:
1.每分钟1M个ping超过了10k/sec。首先我想知道哪些方法可以扩展以处理这样的负载。这是为了了解可用的选项。
2.假设您心中有多种解决方案,其中哪一种最经济实惠?成本效益至关重要。我没有自己的数据中心或静态和粗大的端点在网络上,因此服务器应用程序将需要在某种提供商上运行,最终在云上运行。
注: - 我考虑过使用我自己的ISP提供的连接从家里运行服务器,但我既不确定性能问题,也不知道我的ISP会对持续的ping流做出何种反应。 - 我看不出服务器如何自动发现这些IP更改。

1
为什么他们需要将他们的IP地址发送到服务器? - Thorbjørn Ravn Andersen
因为我有连接到计算机的移动设备,它们需要查询上述服务器以获取计算机的IP地址。由于计算机无法建立与设备的连接,因此设备需要启动套接字连接。 - Erik
这些移动设备需要做什么? - Thorbjørn Ravn Andersen
计算机在设备打开连接后将文件传输到该设备。这是该应用程序的链接:https://play.google.com/store/apps/details?id=com.hellberg.spriid&hl=sv - Erik
@Yahia,通过Java程序我无法知道IP何时更改。如果我每24小时更新一次服务器,则在23小时59分钟55秒内,服务器的IP可能真的是错误的。所以60秒甚至10分钟应该足够了。我之所以用Java来做这件事,只是因为我想针对许多不同的系统。 "成本有效/昂贵"只是一个可行的解决方案,最便宜的费用当然很好。我认为我的问题不是抽象的,只需要合适的人看到它,因此有赏金。 - Erik
显示剩余5条评论
6个回答

2
也许您可以使用SIP协议来实现这个目的? 也许Java SIP库已经解决了您的问题。 顺便说一句,这是一个不错的应用程序。

2
Erik,你的问题比听起来的要简单得多。
这个问题已经存在了十年甚至二十年。没有必要重新发明轮子。
为什么轮询/ping是一个糟糕的想法
由ISP提供的动态IP可能具有可变的租赁时间,但通常至少为24-72小时。每1-10分钟ping您的服务器将是资源的极大浪费,可能在72小时内使每个客户端超过4,320个无用的HTTP请求。每个请求将是大约300字节* 4,320个浪费的HTTP请求等于1.3MB的浪费带宽,乘以您的目标客户端数1百万个客户端,您谈论的是每月浪费的带宽约为1.2TB!那只是浪费的带宽,而不是您可能需要运行应用程序和提供有用信息的其他带宽。
客户端需要比仅频繁ping更聪明。相反,他们应该能够在启动时检查其IP地址是否与DNS匹配,然后仅在IP更改时向服务器发送通知。这将将您的带宽和服务器处理要求减少数千倍。
您所描述的是动态DNS。
你所说的是“动态DNS”(这是技术的描述性名称,也是提供SaaS解决方案的一家公司的名称)。
动态DNS很简单,它是一个DNS服务器,允许您非常快速地更改名称和IP地址之间的映射。通常,这对于使用仅提供动态IP的ISP的设备非常有用。每当动态IP上的路由器/服务器的IP更改时,它都会通知动态DNS服务器进行更改。
  • 动态DNS的事实标准协议已经有很好的文档记录。从这里开始:DNS Update API,我认为你正在寻找的具体内容在这里:DynDNS Perform Update。由于路由器硬件通常具有内置的DynDNS客户端,因此大多数商业实现都非常接近于相同的协议。
  • 大多数路由器(甚至是廉价的路由器)已经内置了动态DNS客户端。(你可以编写自己的软件客户端,但路由器可能是最有效的位置,因为你的客户端可能被NAT到私有IP地址 - 你仍然可以这样做,但需要更多带宽来发现公共IP地址)
  • 快速的谷歌搜索“dynamic DNS java client”会列出像这样的完整源项目:Java DynDNS client(未经测试,只是说明搜索的强大)

系统架构的其他考虑因素

假设IP客户端映射问题得到解决。你已经弄清楚了所有这些并且它完美地工作,你总是知道每个客户端的IP地址。那么你是否拥有一个可靠的系统来从移动设备向客户端传输文件呢?我会说不。
移动设备和家用电脑都可以有多种连接类型,如Wi-Fi、蜂窝数据,可能还有有线数据。每个网络可能都有不同的安全系统。因此,从蜂窝数据移动设备到位于家庭路由器后面的Wi-Fi笔记本电脑的连接将与Wi-Fi移动设备连接到同一Wi-Fi网络上的笔记本电脑的连接看起来非常不同。
你可能需要应对物理路由器防火墙。此外,家用电脑可能启用了Windows防火墙,也可能是诺顿互联网安全、赛门铁克、AVG、ZoneAlarm等等... 你知道所有这些潜在客户端的防火墙考虑因素吗?

谢谢您的解释。我认为您的 DNS 解决方案应该可以行得通。所有客户端将查询同一 DynDNS 帐户,并通过这样做查看 IP 是否更改。这是您最初想要的吗?这样,只有在 IP 更改时,客户端才会 ping 服务器。关于防火墙问题和每个 Java 客户端如何获取入站连接,我认为可以使用 UPnP 创建端口转发,但不确定。其思路是在固定的家用电脑上安装客户端程序。如果他们在 Wi-Fi 笔记本电脑上安装它,而该笔记本电脑一整天都在 IP 跳跃,则必须简单地不在该笔记本电脑上安装客户端。 - Erik

1
我建议你对Java程序进行优化,以了解IP更改并仅在此时调用Web服务。
你可以这样做:
  1. 在Java程序启动时提取机器的IP并将其存储在全局变量或更好的一些属性文件中。
  2. 运行一个批处理/计划程序,每30秒/1分钟检查IP是否有更改。 Java Quartz Scheduler 对你来说非常方便。
  3. 在IP更改时调用Web服务。
这样可以减少服务器的作用,从而降低流量和连接数。

只有当计算机直接连接到互联网并因此具有WAN IP时,才能正常工作。 - Erik

1

你可以在UDP之上创建自己的协议,例如基于XML。定义3个消息:

  • 请求 - 客户端请求从服务器获取挑战
  • 挑战 - 服务器回复挑战(基本上是一个随机数)
  • 响应 - 客户端将用户名和哈希密码+挑战发送回服务器

它很轻量级,流量不太大。您可以在任何层面或使用负载均衡器将其负载平衡到多个服务器。

任何普通PC都可以处理每分钟数百万次此类请求,前提是您使用C/C++进行服务器端处理(我不知道Java网络性能如何)。


我认为在这里使用UDP是明智的选择。+1(顺便说一句,Java的网络性能相当不错。唯一的问题是在预算内运行JVM将会超出预算主机选项的内存配额。) - alphazero

0
请看一下no-ip是如何工作的。你的需求与它所做的完全相同。

0

我是否理解了使用情况?一群用户都想互相接收图片吗?您不想在服务器上托管图像,而是直接向所有用户广播它们?

这里有两个问题。第一个问题是“如何知道我的WAN IP地址是否已更改。”

如果您没有进行NAT,则:

InetAddress.getLocalHost()

会告诉你你的IP地址。

如果你是NATed,那么使用动态DNS并解析自己的主机名就可以解决问题。

第二个问题类似于“如何在互联网上来去自如的主机之间共享图片”。

可能的解决方案包括:

IP组播,可能带有前向纠错和旋转,例如FLUTE。

文件病毒式扩散-例如比特流。

使用Jabber、AMQP、JMS、STOMP或类似协议的发布/订阅消息总线解决方案。适合的实现包括RabbitMQ、ActiveMQ等。这里的关键概念是JMS主题。

该解决方案应避免在IP层执行任务所造成的巨大开销。


谢谢你的见解。获得这样的评论真是太好了。我有很多阅读要做 :) 之所以不直接发送文件,是因为大多数移动设备使用的网络不稳定。这样,发送/接收设备将连接到一个不会出现问题的服务器,提高发送/接收速度。我知道还有更好的方法,但目前这是我能做到的最好的。 - Erik
动态DNS在这里并没有什么帮助 - 服务器的IP和DNS是静态和已知的。这是一个发布/订阅问题。如果您认为网络在数据包丢失方面存在问题,那么您可能需要前向纠错编码(FLUTE是一种经典解决方案),但实际上这看起来更像是文件扩散场景(例如比特流)。还可以查看具有文件传输功能的聊天应用程序。 - Julian
我认为一个计算机Java客户端可以ping一个DynDNS并获得回复,从而读取它自己的WAN IP地址。这样,客户端就不必每60秒ping服务器一次,只有在WAN IP更改时才需要ping。也许我在错误的方向寻找。 - Erik
你可以通过接口 InetAddress addr = InetAddress.getLocalHost(); 查询自己的地址,但是为什么需要这样做呢?如果你订阅了消息总线,堆栈会处理断开和重新连接,并且你只需等待数据即可。 - Julian
这里有两个问题。第一个问题是“如何知道我的WAN IP地址是否已更改。”如果您没有进行NAT,则:InetAddress.getLocalHost()将告诉您您的IP地址。如果您进行了NAT,则使用动态DNS并解析自己的主机名将起作用。 - Julian
我认为动态DNS是问题的一部分答案。这样客户端只有在IP更改时才会连接到服务器。发布/订阅模式我需要再仔细研究一下。一个设备可以向一个或多个其他设备发送消息,包括PC。谢谢 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接