我从来没有想过这个,我已经编程多年了。像聊天程序或Torrent程序这样的P2P程序如何在两个对等方之间建立连接而又不对等方打开任何端口的情况下?我知道我还没有为Skype开放端口,但是我可以与 friend 之间收发大型文件,而且我敢肯定,所有这些千兆字节都不会通过Skype服务器。还是他们?
洪流呢?我可以将数据上传到同级,并且也没有打开任何端口。
我很确定答案将是非语言特定的,但是万一我错了,我主要会使用C++进行编码。提前致谢。
最佳答案
您只需为入站连接“打开端口”。一个对等方将打开一个监听端口,然后指示另一对等方连接到该端口。如果连接失败,则对等方通常会互换角色,然后重试。如果连接仍然失败,则要么中止传输,要么使用服务器中继(如果有必要的话)。
对于每个监听对等方,如果端口位于路由器/防火墙后面,则对等方可以可编程地指示路由器/防火墙打开端口以将入站连接转发到对等方(某些路由器为此支持uPNP,而某些防火墙也具有自己的端口) API),或者对等方可以尝试使用各种“打洞”技术来欺骗路由器/防火墙打开转发端口(某些路由器/防火墙对此不敏感)。
阅读此以获取更多详细信息:How Skype & Co. get round firewalls
关于sockets - 如何在不打开端口的情况下建立TCP/IP连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229046/