Перенаправить TCP-соединение - PullRequest
7 голосов
/ 04 июня 2010

У меня есть что-то вроде прокси-сервера (написанного на java), работающего между моими клиентами и реальным видеосервером (сделанным на c ++). Все, что отправляют клиенты, проходит через этот прокси и затем перенаправляется на сервер.

Это работает нормально, но у меня есть некоторые проблемы, и я думаю, что было бы лучше, если бы я мог сделать этот прокси-сервер только для прослушивания запросов клиентов и затем каким-то образом сообщить серверу, что запрос был сделан со стороны клиента, и что предполагается создать соединение с клиентом напрямую.

В основном на уровне TCP, то, что я хочу, происходит примерно так:

1 - всякий раз, когда клиент отправляет SYN моему прокси, прокси просто отправляет сообщение на реальный сервер, сообщая IP-адрес и порт клиента.

2 - Сервер затем отправит соответствующий SYN-ACK указанному клиенту, создав прямое соединение между клиентом и сервером.

Тогда прокси будет просто передавать начальные запросы (но не последующую передачу данных) фактическому серверу. Я просто не знаю, возможно ли это.

Большое спасибо

Нельсон Р. Перес

Ответы [ 3 ]

3 голосов
/ 04 июня 2010

Прокси и сервер живут на одной машине?Если это так, вы можете передать соединение на сервер, используя Socket Transfer или File Descriptor Passing.Вы можете найти примеры в C здесь:

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

Если они находятся на разных машинах, то нет способа передать соединение на сервер.Тем не менее, есть возможность прокси IP-пакетов на сервер, используя VIP (виртуальный IP).Это ниже сокета, поэтому вы должны использовать интерфейс канального уровня, например DLPI .

3 голосов
/ 04 июня 2010

Это очень похоже на то, как это делают некоторые игры (и Fog Creek CoPilot), но для этого требуется поддержка как на сервере, так и на клиенте. По сути, прокси должен сказать клиенту и серверу «попробуйте установить связь с напрямую по этому ip и этому порту», ​​и если они не могут пройти (потому что один или оба находятся за NAT или межсетевым экраном), они отступают к через прокси.

Я нашел это хорошее описание «перфорации в одноранговой сети» на http://www.brynosaurus.com/pub/net/p2pnat/

2 голосов
/ 04 июня 2010

Вы не можете контролировать TCP-рукопожатие в такой пользовательской среде. Это то, что делают брандмауэры / маршрутизаторы, но все это происходит в ядре. Посмотрите на программное обеспечение брандмауэра для вашей платформы - вам даже не нужно ничего кодировать.

...