Como gerenciar sessões por meio de UDP para um servidor de ponte intermediário entre vários clientes e um servidor de serviço? - linux, programação de rede, udp

Eu preciso fazer uma ponte como a figura a seguir. É apenas um servidor UDP que recebe pacotes de clientes, encaminha para outro servidor. O cenário será bem compreendido pela figura.

+--------+sendto()  recvfrom()+-----------+
| client |------------------->|           |                         +-------------+
|        |        1           | bridge    |sendto()      recvfrom() |             |
|        |                    |           |------------------------>|    duty     |
|        |                    |           |           2             |   server    |
|        |                    |           |recvfrom()      sendto() | processing  |
|        |                    |           |<------------------------|             |
|        |recvfrom()  sendto()|           |            3            |             |
|        |<-------------------|           |                         +-------------+
+--------+         4          +-----------+

Aqui a função para enviar e receber dadossão escritas ao longo do lado do dispositivo. Os processos de comunicação são identificados pelos números 1,2,3 e 4, sob os sinais de seta. Eu tentei desenhar a figura de tal forma que ela possa representar uma linha do tempo: de cima para baixo.

Agora vem ao ponto.Quando tenho apenas um cliente para administrar, é uma tarefa muito fácil de fazer isso. Mas vamos supor que o número do cliente possa ser muitos. Suponha que os clientes sejam telefones conectados à Internet usando um discador e o servidor seja um servidor SIP executando o Asterisk / Freeswitch ou algo parecido. Nesse cenário, muitos clientes podem estar presentes. Eu não quero usar o servidor de bridge como um servidor proxy (executando kamailio e rtpproxy) para que a comunicação possa ser eficiente.

Asterisk ou um servidor SIP pode gerenciar sessões do udpEu sei. Mas como pode a ponte. Como o udp não mantém sessões, como posso concluir o quarto passo. Como posso identificar a resposta do servidor de trabalho para um cliente? Que tipo de software (claro, peso leve para eficiência, e eu mesmo preciso escrevê-lo) deve ser escrito para lidar com as sessões. Se alguém puder me dar uma idéia do gerenciamento de sessão através do udp, será muito útil para mim. Eu procurei muito, mas não encontrei nenhuma resposta adequada.

Desde já, obrigado.

Respostas:

1 para resposta № 1

Aqui está um algoritmo que usei em uma implementação genérica do Proxy para o tráfego TCP / UDP:

Módulos do programa:

Criador de uma conexão e vários trabalhadores proxy

Eles são implementados como encadeamentos independentes.

Fluxo:

O módulo Criador é responsável por aceitar elidar com novas conexões. Ele informa e passa os dados iniciais para um trabalhador que manipulará a partir daquele ponto em toda a E / S para essa conexão; em paralelo, ele abrirá uma conexão com o outro lado (também pode ser feito no trabalhador).

O trabalhador terá uma conexão e será responsável por ele durante seu ciclo de vida.

Alguns pontos técnicos:

Uma conexão UDP é determinada por IP e PORTA (SRC e DEST).

O criador pode aguardar mensagens de todas as fontes, enquanto o trabalhador pode aguardar mensagens de uma fonte específica (vinculando o soquete UDP).

Para o desempenho, os trabalhadores devem ajustar o número denúcleos que um sistema possui e permite que cada um manipule soquetes assíncronos. Além disso, se um trabalhador manipular vários soquetes, um algoritmo precisará ser colocado para balancear a carga entre os trabalhadores quando o Criador / Chefe distribuir novas conexões.


Cardápio