![UDP 打洞和 UPnP 有什么区别?](https://linux22.com/image/1369859/UDP%20%E6%89%93%E6%B4%9E%E5%92%8C%20UPnP%20%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
因此 Skype 和其他 p2p 类型的应用程序通常采用所谓的打洞技术(请参阅简单指南这里) 使两个客户端相互连接,并且两个客户端都位于阻止传入连接的防火墙后面。
uPnP 还用于避免用户手动转发端口。它与上面描述的打洞方式究竟有何不同?我认为它的工作方式一定不同,因为大多数路由器都有打开/关闭它的设置,而我认为没有人能阻止上述类型的 UDP 打洞方式(除了阻止传出连接和已建立/相关的传入连接)。
其次,如果说 Skype/bittorrent 可以通过打洞技术在 AB 之间建立直接连接,这是否意味着它不需要在路由器上启用 upnp?
答案1
要使 UPnP 正常工作,相关路由器必须支持该功能。具有 UPnP 的设备基本上会要求启用 UPnP 的路由器打开一个端口并将流量转发到该端口。除非 LAN 的路由器配置严重错误或完全开放给全世界,否则 LAN 之外的任何一方都无法执行此操作。
打洞技术利用了UDP无连接的特性:
- A 在端口+IP 上发送 UDP 数据包给 B
- A 的 NAT 会记住这一点,并且由于 A 发起了数据包,因此认为 A 已经开始了对话(尽管从技术上讲,使用 UDP 无法确定这一点),然后允许该端口 + IP 上的传入流量
- 由于 B 的防火墙将阻止传入流量,因此仍然需要中间方(在您提供的文章中,即 Skype“交换”服务器),但现在交换服务器可以进行 MITM 并通过 A 的端口 +IP 发送响应,该响应应该到达 A,因为 NAT 是由于 A 发起流量而进行转发的。
打洞技术基本上可以让 LAN 外部的一方通过中介机构的帮助到达 NAT 后面的监听对象。