【问题标题】:Redirect a TCP connection重定向 TCP 连接
【发布时间】:2010-06-04 18:35:34
【问题描述】:

我有一个代理服务器(用 java 编写)在我的客户端和实际的视频服务器(用 c++ 制作)之间运行。客户端发送的所有内容都通过此代理,然后重定向到服务器。

它工作正常,但我有一些问题,我认为如果我可以让这个代理服务器只监听客户端请求,然后以某种方式告诉服务器客户端已经发出请求,那会更好,并且它应该直接与客户端创建连接。

基本上在 TCP 级别我想要发生的事情是这样的:

1- 每当客户端向我的代理发送 SYN 时,代理只会向真实服务器发送一条消息,告知客户端的 ip 和端口。

2- 然后服务器将相应的 SYN-ACK 发送到指定的客户端,从而在客户端和服务器之间建立直接连接。

然后,代理将只是将初始请求(而不是后来的数据传输)中继到实际服务器。我只是不知道这是否可能。

非常感谢

纳尔逊·R·佩雷斯

【问题讨论】:

    标签: java c++ tcp connection


    【解决方案1】:

    这与某些游戏(和 Fog Creek CoPilot)非常相似,但它需要服务器和客户端的支持。基本上,代理必须对客户端和服务器说“尝试直接在这个 ip 和这个端口上进行通信”,如果他们无法通过(因为一个或两个都在 NAT 或防火墙后面),他们会退回去通过代理。

    我在http://www.brynosaurus.com/pub/net/p2pnat/ 找到了“点对点 tcp 打孔”这个很好的描述

    【讨论】:

    • 好的,我收回这一点 - CoPilot 似乎没有这样做,或者如果他们这样做了,他们就停止了。见copilot.com/tech
    【解决方案2】:

    代理和服务器是否位于同一台机器上?如果是这样,您可以使用套接字传输或文件描述符传递将连接传递到服务器。您可以在此处找到 C 语言示例,

    http://www.wsinnovations.com/softeng/articles/uds.html

    如果它们在不同的机器上,则无法将连接传递到服务器。但是,可以使用 VIP(虚拟 IP)将 IP 数据包代理到服务器。这是在socket下面所以你必须使用Link层接口,比如DLPI

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        相关资源
        最近更新 更多