Wie verwaltet man Sitzungen über UDP für einen Bridge-Zwischenserver zwischen mehreren Clients und einem Dienstserver? - Linux, Netzwerkprogrammierung, UDP

Ich muss eine Brücke wie die folgende Abbildung machen. Es ist nur ein UDP-Server, der Pakete von Clients empfängt und an einen anderen Server weiterleitet. Das Szenario wird von der Figur gut verstanden.

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

Hier die Funktion zum Senden und Empfangen von Datensind an der Seite des Geräts geschrieben. Kommunikationsprozesse sind durch die Nummern 1, 2, 3 und 4 unter den Pfeilzeichen gekennzeichnet. Ich habe versucht, die Figur so zu zeichnen, dass sie eine Zeitleiste darstellen kann: von oben nach unten.

Jetzt komm auf den Punkt.Wenn ich nur einen Client verwalten muss, ist das eine ziemlich einfache Aufgabe. Aber lassen Sie uns annehmen, dass die Kundennummer viele sein kann. Angenommen, die Clients sind Telefone, die mit einem Dialer mit dem Internet verbunden sind, und der Server ist ein SIP-Server, auf dem Asterisk / Freeswitch oder etwas Ähnliches läuft. In einem solchen Szenario können viele Clients anwesend sein. Ich möchte den Bridge-Server nicht als Proxy-Server (mit kamailio und rtpproxy) verwenden, damit die Kommunikation effizient ist.

Asterisk oder ein SIP-Server kann UDP-Sitzungen verwaltenIch kenne. Aber wie kann die Brücke? Da udp keine Sitzungen beibehält, wie kann ich den vierten Schritt abschließen. Wie kann ich die Antwort des Dienstservers für einen Client identifizieren? Welche Art von Software (natürlich leicht für die Effizienz, und ich selbst muss es schreiben) sollte für die Behandlung der Sitzungen geschrieben werden. Wenn jemand mir eine Idee des Sitzungsmanagements durch udp geben kann, wird es sehr hilfreich für mich sein. Ich habe viel gesucht, aber keine passende Antwort gefunden.

Danke im Voraus.

Antworten:

1 für die Antwort № 1

Hier ist ein Algorithmus, den ich in einer generischen Proxy-Implementierung für TCP / UDP-Verkehr verwendet habe:

Programmmodule:

Ein Verbindungs-Creator und mehrere Proxy-Workers

Sie sind als eigenständige Threads implementiert.

Fließen:

Das Creator-Modul ist verantwortlich für das Akzeptieren undhandle neue Verbindungen. Es informiert und übergibt die anfänglichen Daten an einen Arbeiter, der von diesem Punkt an alle E / A für diese Verbindung handhabt, parallel öffnet er eine Verbindung zur anderen Seite (kann auch im Arbeiter getan werden).

Der Arbeiter wird während seines Lebenszyklus eine Verbindung bekommen und dafür verantwortlich sein.

Einige technische Punkte:

Eine UDP-Verbindung wird durch IP und PORT (SRC und DEST) bestimmt.

Der Ersteller wartet möglicherweise auf Nachrichten aus allen Quellen, während der Worker möglicherweise auf Nachrichten von einer bestimmten Quelle (durch Bindung des UDP-Sockets) wartet.

Für die Leistung sollten Arbeiter die Anzahl von passenKerne hat ein System und ermöglicht es jedem, asynchrone Sockets zu handhaben. Wenn ein Mitarbeiter mehrere Sockets verwaltet, muss außerdem ein Algorithmus platziert werden, um das Gleichgewicht zwischen den Arbeitern zu verteilen, wenn der Ersteller / Chef neue Verbindungen verteilt.


Speisekarte