在没有服务器的情况下,在两台计算机之间创建TCP连接

5
  • 两台计算机处于不同的子网。
  • 两台计算机均为Windows机器。
  • 它们之间有2-5个支持IGMP的路由器。
  • 它们可以通过多播协议连接(它们已加入相同的多播组,并知道彼此的存在)。

如何在没有任何公共服务器的情况下建立可靠的TCP连接?

编程语言:C ++,WinAPI

(我需要一个TCP连接来发送一些重要的大数据,我不能把它们委托给UDP)


@bmargulies,如何指定“IP:端口”?它们位于不同的子网中,可能在5个路由器后面。在不同的子网中可能会有不同的IP类。如果我简单地指定另一个子网的IP地址,连接会建立吗? - Andrew
简单的答案是“是”。这就是路由协议的作用。请查看我的编辑。 - bmargulies
1个回答

3
您没有指定编程语言,所以这个问题可能与主题不符。
子网并不是问题。路由是问题所在。无论是否有路由设置,都是你的问题。如果它们(例如)都在NAT盒后面,则取决于nat盒的配置。如果它们仅位于路由网络的两个不同子网中,则网络管理员的工作是设置路由。因此,每个机器都有一个IP地址,它们可以相互寻址。
在一台机器上,您将创建一个套接字,将其绑定到您选择的某个端口,并进行监听。在另一台机器上,您将连接到第一台机器的IP地址+选择的端口。
编辑
我要再试一次,但我感觉这里有一个巨大的概念差距。
从前,TCP/IP被发明出来。在最初的构思中,网络上的每个项目都有一个IPV4地址,并且每台机器通过路由都能够到达其他任何机器,除了“私人”地址空间的机器(10.x等)。
在很早的时候,“子网”的唯一'子网'是“类A,类B,类C”。后来,通过掩码对网络进行细分的想法被添加。 '子网'的概念只是描述整个网络中所有主机可以通过某种传输方式进行一次跳转互相传递数据包的方式。在正确配置的网络中,这只关系到操作系统驱动程序。普通程序只需通过网络寻址数据包即可到达。
实现此连接始终是通过路由协议完成的。如果此处有(物理)以太网A和(物理)以太网B通过某种点对点链路连接,则A上的机器需要知道将数据包发送到B的位置。或者确切地说,它们需要知道从哪里发送'非-A'数据包,并且无论它们发送到哪里都需要知道将' B '数据包发送到哪里。在简单的情况下,这是通过显式配置完成的:将路由规则装入路由器框中甚至是带有多个物理接口的计算机中。在较复杂的情况下,路由框通过像EGP、BGP或IGMP这样的协议进行互相通信来学习网络拓扑结构。
如果使用Windows的“route”命令,则将看到系统用于发送需要离开本地子网的数据包的“默认路由”。它通常是负责将信息从本地子网移动到其他所有地方的路由器框的地址。
整个路由的目标是安排从a.b.c.d到e.f.g.h发送的数据包能够到达。TCP与UDP没有区别,除了您无法通过组播或广播到达:您需要知道通信方的精确地址。
DNS是为了让主机在没有人类发送它们的电子邮件消息的情况下学习彼此的IP地址而发明的。
所有这些都将在人们开始使用NAT和防火墙关闭路由时停止工作。 NAT的整个概念是,NAT盒子后面的计算机根本不可寻址。它们似乎都有一个IP地址。它们可以发送信息,但只有在NAT盒子为它们映射端口时才能接收信息。
从您的原始消息中,我有点怀疑这里是否使用了NAT。我只是不理解您的评论“我无法访问网络”。您说您已经发送了UDP数据包到这里和那里。那么您是如何做到的?您使用了什么地址?

那么,活动的IGMP连接对这个任务没有任何帮助? - Andrew
IGMP是用于建立路由能力的工具之一,因此它是乐观的原因。这两台机器的IP地址是什么?如果您从一个地址使用'traceroute'命令到达另一个地址,您会看到什么? - bmargulies
我仍然无法访问那个网络,因此我必须准备一些通用的方法来完成它。你的意思是没有通用的方法,一切都取决于当前的网络配置?那么哪种配置更受欢迎呢? - Andrew
非常感谢您的解释!很抱歉我之前的评论有些愚蠢,我的意思是我现在无法在那个多路由器网络中测试我的软件,但我以后会尝试。UDP组播之前在那里运行良好,但我不确定路由器是否能够处理TCP连接。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接