如何知道WAN IP是否已经改变并接收大量IP地址广播

时间:2012-03-31 11:08:27

标签: java ip wan

我正在开发的系统可能有大量客户端(比方说一百万)需要定期更新中央服务器并提供一些信息。客户端是用Java编写的。

具体的用例是服务器后端需要具有最新的IP地址到客户端的映射。但客户端IP是动态的,并且受(有效随机)变化的影响。

我想到的解决方案要求客户端ping服务器以更新其IP。理想情况下,这段时间应该是每分钟一次,但即使是1分钟/ 10分钟也是可以接受的。

我的问题,按顺序:

  1. 每1分钟1M次ping超过10k / sec。 首先,我想知道 这些方法可以扩展以处理这样的负载。这是了解可用的选项。

  2. 假设您有多个解决方案,其中哪一个 会是最经济的吗? 成本效益至关重要。我没有自己的数据中心或 网上的静态和胖端点,所以服务器应用程序会 需要在某种提供商或最终在云上运行。

  3. 注意:

    • 我考虑过使用我自己的ISP提供的连接从家里运行服务器,但我不确定性能问题,也不知道我的ISP会不会想到持续的ping流。

    • 我无法看到服务器如何自动发现这些IP更改。

6 个答案:

答案 0 :(得分:2)

也许您可以将SIP用作协议用于此目的? 可能java SIP库已经解决了你的问题。

顺便说一句不错的应用程序。

答案 1 :(得分:2)

埃里克,你的问题比听起来要简单得多。

这个问题已经持续了十年左右。无需在这里重新发明轮子。

为什么轮询/ Ping是一个坏主意

ISP提供的动态IP可以具有可变的租约时间,但通常至少需要24-72小时。每隔1-10米ping一次服务器将是一个可怕的资源,可能会在72小时内产生超过4,320个无用的HTTP客户端请求。每个请求都会说大约300字节* 4,320浪费的http请求等于1.3mb浪费带宽乘以你的目标客户端数量为100万客户端,你说的是每月浪费的带宽~1.2 TB !这只是浪费的带宽,而不是运行应用程序并提供有用信息所需的其他带宽。

客户需要更聪明,而不仅仅是经常ping。相反,他们应该能够在启动时检查他们的IP地址是否与DNS匹配,然后仅在IP更改时,向服务器发送通知。这将使您的带宽和服务器处理要求减少数千次。

您所描述的是动态DNS

您所谈论的是“动态DNS”(既是技术的描述性名称,也是提供SaaS解决方案的公司的名称)。

动态DNS非常简单,是一种DNS服务器,可以让您快速更改名称和IP地址之间的映射。通常,这对使用仅提供动态IP的ISP的设备很有用。每当IP在动态IP上更改路由器/服务器时,它都会通知动态DNS服务器该更改。

  • 动态DNS的事实标准协议已有详细记录。从这里开始:DNS Update API,我认为您要查找的具体内容如下:DynDNS Perform Update。由于路由器硬件通常具有每个人都想使用的内置DynDNS客户端,因此大多数商业实现都非常接近相同的协议。
  • 大多数路由器(甚至便宜的路由器)已经内置了动态DNS客户端。 (您可以编写自己的软客户端,但路由器可能是最有效的位置,因为您的客户端可能使用私有IP进行NAT访问 - 您仍然可以这样做,但代价是公共IP发现的带宽更多)
  • 快速谷歌搜索“动态DNS Java客户端”会带来像这样的完整源项目:Java DynDNS client(未经测试,只是说明了搜索的强大功能)

系统架构的其他注意事项

让我们说IP-client映射的东西得到解决。你认为这一切都完美无缺,你总是知道每个客户的IP。那么您是否有一个可靠的系统来从移动设备向客户端传输文件?我会说不。

手机和家用电脑都可以有多种连接类型,Wi-Fi,蜂窝数据,也可能是有线数据。这些网络中的每一个都可以具有不同的安全系统。因此,从家庭路由器后面的蜂窝数据移动设备到wifi笔记本电脑的连接看起来与连接到同一wifi网络上的笔记本电脑的wifi移动设备看起来非常不同。

您可能需要物理路由器防火墙才能应对。家用电脑也可能启用了Windows防火墙,可能是诺顿网络安全,也许是赛门铁克,也许是AVG,也许是区域警报等等...你知道所有这些潜在客户的防火墙考虑因素吗?

答案 2 :(得分:1)

我建议你更好地调整你的java程序以了解IP更改,然后只打网页服务。

你可以这样做,

  1. 在你的java程序启动时提取机器的IP和存储 它在全局变量或更好的属性文件。
  2. 运行批处理/ 计划程序,每隔30秒/ 1分钟检查一次IP,以便进行更改。Java Quartz Scheduler对您来说非常方便。
  3. 如果更改了IP,则调用Web服务。
  4. 这样可以减少您的服务器角色,从而减少流量和连接。

答案 3 :(得分:1)

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

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

它重量轻,而且不会太繁重。您可以将其负载平衡到任何层的多个服务器或使用负载平衡器。

如果你在C / C ++中做服务器端(我不知道java网络性能),任何普通的PC每分钟都可以处理数百万次点击

答案 4 :(得分:0)

请查看no-ip的工作原理。您的要求与它的要求完全相同。

答案 5 :(得分:0)

我有用例吗?用户社区都希望彼此接收图片?您不希望在服务器上托管图像,而是直接将它们广播给所有用户?

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

如果你没有被NAT,那么:

InetAddress.getLocalHost()

会告诉你你的IP地址。

如果您是NATed,那么使用动态DNS并解析您自己的主机名将起作用。

第二个问题是“如何在互联网上出现的主机之间共享图片”。

可能的解决方案空间包括:

IP多播,可能具有前向纠错和轮播,例如FLUTE。

文件群集 - 例如BitTorrent的。

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

解决方案应避免在IP级别处理大量开销。