UDP im Mobilfunknetz realisieren

C

Crymes

Guest
Hallo,
ich möchte mir eine Art Fernsteuerung übers Mobilfunknetz programmieren (später soll man so mal mit einem Raspberry Pi ein RC Car steuern).
Ich weiß dass z.B. VoIP zur Fritzbox über UDP nicht in jedem Mobilfunknetz geht.
Was habe ich für Möglichkeiten so eine Verbindung zu realisieren ?
Kann ich UDP über Port 80 laufen lassen und die Pakete so als TCP tarnen ?
Wie filtern die Mobilfunkanbieter eigentlich die Pakete ?
Wenn das nicht geht, kann ich vollt. TCP irgendwie modifizieren sodass es mehr wie UDP wird ?
Hab mit dem ganzen Netzwerkthema so gut wie keine Erfahrung :rollen:
 
Durch die Portnummer tarnt man nichts als TCP. Für eine bidirektionale Kommunikation per UDP muss das Gerät eingehende Verbindungen zulassen und das wird bei den meisten Mobilnetzen blockiert. An TCP selbst kannst du auch nichts machen. Eine Variante wäre, über einen Proxy zu gehen. Du verbindest dich dann per TCP zu dem Proxy und sendest dem deine Pakete, der leitet die dann per UDP weiter. Vereinfacht gesagt, bei mehr als einem parallelen Teilnehmer muss man da natürlich ein bisschen Logik einbauen, damit die Pakete auch zugeordnet werden können.
 
Das musst du mit VPN machen. Anders geht das kaum. Du kannst zum Beispiel keinen Server hinter einer Mobilfunkverbindung betreiben, da kein Teilnehmer über eine exklusive IP Adresse verfügt. Meines Wissens sind die noch nicht auf v6 Exklusiv umgestellt. Du müsstest also mit exklusiver IP einen VPN aufsetzen und den Pi damit verbunden lassen. Dann sollte bidirektionale Verbindung funktionieren. Die Standard-VPN Ports sind bei den Anbietern selten blockiert, da dies z.B. für Außendienstler wichtig ist.
 
ok dann könnte ich auch gleich vom Raspi aus eine TCP Verbindung aufbauen.
Ich hab mich mal ein bisschen eingelesen und das so verstanden dass wie Ap0II0XT schon schrieb viele Geräte über ein NAT sich eine IP teilen.
Wie kann man dann überhaupt übers Mobilfunknetz kommunizieren ?
Bekommt der TCP Header die Geräte Mac mit ? Aber die müsste ich dann doch auch von Hand eintragen können :rollen:
Ich meine eine 'Verbindung' besteht ja auch nur aus Datenpaketen, da müsste ich doch theoretisch mit dem Raspi kurz ein Paket zu meinem PC schicken können und danach nur noch UDP Pakete zurück und immer mal wieder ein "keep alive" Paket in die andere Richtung ?
 
Nein. Bei Client-Server-Kommunikation baut der Client (hier aus dem Mobilfunknetz) eine Verbindung zu einem Server auf. Diese Verbindung bleibt bestehen (ähnlich einem Tunnel End-to-End). Innerhalb dieser Verbindung kann dann der Austausch der Pakete bidirektional ablaufen. Reißt die Verbindung ab, muss der Client die Verbindung erneut anfragen. Nach diesem Prinzip arbeitet auch VPN. Vom Grundsatz ist VPN nichts anderes als eine permanente TCP Verbindung, über die ein weiteres Netzwerk virtuell abstrahiert wird.

Das einzige, was du machen kannst wäre, den Pi mit sogenanntem Polling zu beauftragen. Damit kann der Pi in regelmäßigen Intervallen ein Statusupdate erfragen. Das macht aber bei Echtzeitanwendungen keinen Sinn. Da solltest du dann schon zu VPN und bidirektionale Kommunikation setzen.
 
Wieso denn unbedingt UDP?

Soweit ich das verstehe willst du eine Pi auf ein RC-Auto klemmen, den Pi mit der FritzBox verbinden und dann vom Smartphone aus über das Mobilnetz den Pi ansprechen?
Dann kannst du ja auf dem Pi einfach einen z.B. REST Server laufen lassen der mit TCP arbeitet? Oder hast du schon etwas im Hinterkopf was du verwenden willst?
 
Also ich will den Pi über das Mobilfunknetz Steuerbefehle (z.B. Lenkung, Geschwindigkeit) zukommen lassen und vom Pi evt. Ein Videobild übertragen.
Wie ich das verstanden habe geht auf jeden Fall eine TCP Verbindung von DSL zu Pi und zurück.

Wie macht das eigentlich Whatsapp, Skype, Hangouts und Co. wenn man mit VoIP telefoniert ? Die verwenden doch auch UDP im Mobilfunknetz, oder ?
 
Das läuft über eine Art Notification-Schnittstelle ab. Dabei bekommt jedes Gerät eine feste ID und kann über einen Push aus dem Mobilfunknetz über Ereignisse informiert werden. Die Verbindungen müssen auch nicht zwangsläufig UDP sein. Es kommt ganz auf das Protokoll an.

Da du auf UDP pochst, hast du da wohl schon ein fertiges Protokoll für die Steuerung des RC Autos.

Am sinnvollsten ist wirklich ein VPN-Tunnel. Darüber kannst du frei über das Netzwerk alles senden, was du willst. Du musst nur den Pi beibringen, die Verbindung zum Server aufzubauen. Den Server kannst du auch auf deinem PC hosten. No-IP und das passende Forwarding im Router machen es eigentlich recht einfach.
 
Also ich hab noch gar nichts, bin grad in de Planung und schau wie ichs am besten realisiere.
Ein Relayserver wäre kein Problem und im Router kann ich Ports öffnen.
Hab mich jetzt mal zum Thema Hole Punching eingelesen, damit müsste ichs doch auch realisieren können, oder ?
Ich weiß halt nicht wie sehr TCP verzögert, ich hab überhaupt keine Erfahrung mit Netzwerken. Aber ich will vermeiden dass bei einem Mobilfunkzellenwechsel die Steuerbefehle von vor 1-2 Sekunden ausgeführt werden und alles nur noch verzögert geht.
 
Das ist aber völlig normal, das es bei einem Zellenwechsel durch den Handshake eine Verzögerung gibt. Oftmals reißt dabei sogar das UMTS / LTE ganz weg, da du für GSM und 3G/4G unterschiedliche BTS hast. Außerdem hast du je nach Empfang zusätzlich den Technologiewechsel, der ebenfalls zum kurzen Bruch des Stroms führen kann.

TCP verzögert im Grunde auch nichts.

Bei VoIP wird viel durch Kompression rausgeholt. DIe Protokolle sind so ausgetüftelt, das man Latenzen kaum merkt. Aber die Ping im Mobilfunknetz schwankt bei Bewegung extrem. Das solltest du beachten.
 
Also habe mir jetzt folgendermaßen überlegt:
Es wird immer ein Relay Server am DSL mit off nen Port laufen.
Als erstes wird eine direkte Verbindung zwischen 2 Mobilfunkanschlüssen mittels Hole Punching probiert. Geht das nicht wird als 2. eine UDP Verbindung jeweils zwischen dem Relay Server und einem Client probiert (das sollte eigentlich immer funktionieren wenn der Client als erstes ein Paket rausschickt ?)
Schlägt das auch fehl werden vom Relay Server 2 TCP Verbindungen aufgebaut (Das sollte auf jeden Fall funktionieren ?)
Wahrscheinlich fange ich mit dem UDP Relay an, das ist mir am Erfolgversprechendsten.
Eine TCP Verbindung werde ich wahrscheinlich sowieso früher oder später brauchen wenn ich Bilder übertragen will.

Ich hab also als erstes vor in Java einen Relay Server zu schreiben und den Holepunching Algorithmus auszuprobieren, wenn das dann irgendwann läuft kann ich das ja leicht portieren, sodass ich einmal in Java und in C (für den Raspberry wegen h.264 encoding, kann man das auch irgendwie in Java machen für da. 480p oder 360p ?) eine Abstraktionsschicht hab die mir Verbindungen aufbaut und nur Daten zum Senden erwärmt bzw. Daten empfängt.
Soweit müsste das doch realisierbar sein, oder ?

Edit: Gibt es eigentlich irgendwelche genormten Protokolle wie ein UDP Paket innen bei den Daten aussehen sollte ?
Ich meine schreib ich dann z.B. Einfach meine Steuerwerte hintereinander und trenne sie mit einem Leerzeichen oder gibt's da sinnvollere Strukturen ?
 
Zuletzt bearbeitet:
Zurück