![检测网络上运行服务的所有计算机](https://linux22.com/image/1258246/%E6%A3%80%E6%B5%8B%E7%BD%91%E7%BB%9C%E4%B8%8A%E8%BF%90%E8%A1%8C%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%89%80%E6%9C%89%E8%AE%A1%E7%AE%97%E6%9C%BA.png)
我正在尝试编写一个文件同步协议(把它当作一种爱好,我知道(因为有很多文件同步器)我想创建一种自动同步网络内容的方法。我听说这可以通过 UDP 来实现,但我完全不知道如何实现。
如果我使用 UDP,是否仍需要 ping 192.168.X.0 - 192.168.X.255?或者 UDP 能找到解决方法吗?有没有办法可以绕过防火墙,这样我就不必访问网络上的每台计算机并允许传入流量到达给定的 UDP 端口?
请原谅我对此如此无知,这是我第一次尝试实施协议;)
答案1
您可以使用nmap扫描主机以查看它们是否有在某个端口上监听的服务。
- UDP 不太适合双向通信。您必须自行建立查询/应答关联。即使您向一个方向发送数据,您也常常希望接收方确认,这是向另一个方向发送的数据。
- UDP 不可靠。如果数据包丢失或重复,那就麻烦了。
- UDP 按数据包传输。如果你的数据包太大,系统会丢弃它,这很麻烦。
- UDP 引入了一些安全问题,例如容易导致分布式拒绝服务。因此,许多防火墙会阻止或严格限制它。
- 很少有协议使用 TCP,因此默认关闭的防火墙不会让任何协议通过(除了 DNS,它们对其进行了严格限制)。
- UDP 不进行拥塞管理。如果网络拥塞,您的数据包将被随机丢弃。另一方面,TCP 会将借方限制在网络可以承受的范围内。
当然,你可以向一台机器发送一个 UDP 数据包,看看是否有东西响应。你甚至可以发送一个 UDP播送看看进展如何,或者发送一个 UDP多播并希望它能够到达。
网络数据包(UDP 或 TCP)触发目标计算机上的操作需要满足两个要求。首先,数据包路径上的所有路由器和防火墙都必须允许数据包到达目的地。其次,目标计算机上必须有一个应用程序在监听。这可能是您的同步器,也可能是服务启动器,例如inetd或者你可以嵌入同步器到的更高级别协议的服务器,例如HTTP(S)或者SSH。
如果你的数据包被防火墙拦截,那么原则上就没有办法绕过它。否则防火墙就没有发挥作用。当然,在实践中,防火墙确实存在漏洞,例如即插即用()。与 UDP 相比,您更有可能通过 TCP 绕过防火墙(尤其是通过 HTTPS,防火墙通常无法有选择地阻止 HTTPS,因此必须允许其通过以允许 Web 浏览)。
如果目标端口上没有任何监听,那么您将无法控制目标计算机并使其执行您的应用程序。(这将是不安全的典型,就像某些未打补丁的旧版 Windows 一样。)这是搭载 SSH 等通用协议的优势:您只需启用一项服务,然后就可以通过它执行您想做的事情,包括文件同步。
答案2
如果您只对本地网络感兴趣,并且假设客户端知道服务器的端口号,则客户端可以广播 UDP 消息,服务器将使用单播消息回复该消息,从而建立通信。
或者,您可以考虑使用一些现有的发现协议,例如 Bonjour/Zero Conf 或 UPnP(通用即插即用)来定位您的设备。
防火墙是一个单独的问题,无论如何你必须确保它对你的发现数据包是开放的。