如何在不打开端口的情况下建立 TCP/IP 连接?

Posted

技术标签:

【中文标题】如何在不打开端口的情况下建立 TCP/IP 连接?【英文标题】:How to establish a TCP/IP connection without opening ports? 【发布时间】:2014-08-10 13:27:10 【问题描述】:

我从来没有想过这个问题,而且我已经编程多年了。 P2P 程序(如聊天程序或 torrent 程序)如何设法在两个对等点之间创建连接,而对等点不打开任何端口?我知道我还没有为 Skype 打开一个端口,但我可以向我的朋友发送和接收大文件,而且我很确定所有这些千兆字节不会通过 Skype 服务器。还是他们?

洪流呢?我可以上传数据给同行,我也没有打开任何端口。

我很确定答案将与语言无关,但如果我错了,我主要使用 C++ 编写代码。提前致谢。

【问题讨论】:

en.wikipedia.org/wiki/UPnP 使用嗅探器找出答案。无论如何,“打开”一个端口(即在其上调用 listen() )只是建立连接的一种方式。一旦连接,双方就是对等点,即双方都可以发送和接收任何类型的数据。 @UlrichEckhardt 在这种情况下“打开一个端口”不是listen(),而是更改一个或多个防火墙的配置以允许具有特定端口号的流量通过防火墙. 【参考方案1】:

您只需要为入站连接“打开一个端口”。一个对等点将打开一个侦听端口,然后指示另一个对等点连接到它。如果连接失败,对等方通常会交换角色并重试。如果连接仍然失败,则要么中止传输,要么使用服务器中继(如果可行)。

对于每个侦听对等方,如果端口位于路由器/防火墙后面,对等方可以通过编程方式指示路由器/防火墙打开一个端口,以便将入站连接转发到对等方(一些路由器为此支持 uPNP,而一些防火墙有自己的 API),或者对等方可以尝试使用各种“打孔”技术来欺骗路由器/防火墙打开转发端口(某些路由器/防火墙不易受此影响)。

阅读本文了解更多详情:How Skype & Co. get round firewalls

【讨论】:

哦...我用谷歌搜索了打孔。现在这是有道理的。这是非常狡猾的。谢谢! :P

以上是关于如何在不打开端口的情况下建立 TCP/IP 连接?的主要内容,如果未能解决你的问题,请参考以下文章

查找服务的标准方法(在本地网络中打开端口)

查看端口是否放通

TCP/IP协议连接失败是为啥?

如何开启8080端口

TCP/IP通信建立的过程怎样,端口有啥作用?

TCP/IP 三次握手