重定向TCP连接

9
我有一个类似代理服务器的东西(用Java编写),它在客户端和实际视频服务器(用C ++制作)之间运行。客户端发送的所有内容都通过此代理传递,然后被重定向到服务器。
它工作正常,但我有一些问题,并认为如果我能使这个代理服务器仅侦听客户端请求,然后以某种方式告诉服务器已经从客户端发出请求,并且应该直接与客户端建立连接,那将会更好。
基本上,在TCP级别上,我想要发生的事情如下:
1-每当客户端向我的代理发送SYN时,代理只发送消息到真实服务器,告知客户端的IP和端口。
2-服务器将向指定的客户端发送相应的SYN-ACK,从而创建客户端和服务器之间的直接连接。
然后代理将只转发初始请求(但不是后续数据传输)到实际服务器。我只是不知道是否可能。
非常感谢。
Nelson R. Perez
3个回答

3
这种方法在一些游戏(以及Fog Creek CoPilot)中被广泛使用,但它需要服务器和客户端的支持。基本上,代理必须告诉客户端和服务器“尝试直接在此IP和端口上通信”,如果它们无法通过(因为其中一个或两个在NAT或防火墙后面),则回落到通过代理进行通信。
我在http://www.brynosaurus.com/pub/net/p2pnat/找到了关于“点对点TCP打洞”的好描述。

好的,我收回之前的说法 - 看起来CoPilot并没有这样做,或者如果他们曾经这样做,他们已经停止了。请参见https://www.copilot.com/tech/。 - Paul Tomblin

3
代理和服务器是否在同一台机器上?如果是,您可以使用套接字传输或文件描述符传递将连接传递到服务器。您可以在此处找到C语言示例:http://www.wsinnovations.com/softeng/articles/uds.html。如果它们位于不同的机器上,则无法将连接传递到服务器。但是,可以使用VIP(虚拟IP)将IP数据包代理到服务器。这在套接字下面,因此必须使用链路层接口,例如DLPI

2

像这样,你无法在用户空间控制TCP握手。这是防火墙/路由器所做的事情,但所有操作都发生在内核中。查看您平台上的防火墙软件-您甚至可能不需要编写任何代码。


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