AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

UDP Hole Punching

Ein Thema von Aphton · begonnen am 28. Jan 2013 · letzter Beitrag vom 30. Jan 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

UDP Hole Punching

  Alt 28. Jan 2013, 08:32
Guten Morgen,
Ich habe vor Ewigkeiten mich über die Technik schlau gemacht und theoretisch kenne ich mich auch aus; ist ja auch nicht allzu komplex.
Ich hab kurzerhand zwei kleine Anwendungen (Übermittler & Peer) geschrieben, um das mal direkt naiv zu testen.

Kurz noch zum Hole-Punching (so wie ich das verstanden habe; bitte korrigieren falls notwendig):
Szenario: Peer A & B befinden sich jeweils hinter einem Router & in verschiedenen Netzen.
Hintergrund: Bei TCP muss ein Portforwarding eingerichtet werden, damit ein Peer (Server) Daten empfangen kann.
Da aber UDP verbindungslos ist, regelt NAT das so, dass sobald von Peer A Pakete an B geschickt werden, ankommende Pakete von B an A weitergeleitet werden;
weil er eben annimmt, dass es Antworten auf die Pakete sind (für solch eine Session gibts auch ein Time-out - deshalb sollte man ein konstantes hole-punching (keep-alive) durchführen).
Technik: Nun verbinden sich beide Peers an den Übermittler, diese reicht dann beide IPs weiter sodass nun beide Peers einander "kennen". Also Peer A kennt die IP (&Port) von Peer B und vice versa.
Nun schicken beide Peers zyklisch Dummy-Pakete zueinander - diese Sorgen dafür, dass NAT eben eingehende Pakete auch weiterleitet (siehe Hintergrund).

NUN zum eigentlichen Problem -.-' Das ganze funktioniert nicht. Die Peers können miteinander nicht kommunizieren.

Ich hab das so eingerichtet, dass ich den "Übermittler" spiele, hab zwei Kollegen die Peer-Anwendung geschickt. Beide konnten sich fehlerfrei zu mir verbinden.
Beide haben dann auch die Daten voneinander übermittelt bekommen. Dabei ist mir übrigens aufgefallen, dass die Ports nicht richtig waren.
Soweit ich mich richtig erinnere, haben die sich sogar ständig geändert -> Potenzielle Problemquelle #1: Port Randomization?

Nach kurzem recherchieren hab ich rausgefunden, dass es ~3 Arten von NAT gibt und das Verfahren beim "Symmetric NAT" (Potenzielle Problemquelle #2) nicht funktioniert.
Ich darf aber doch davon ausgehen, dass es sich bei den Kollegen nicht um diese Art von NAT handelt, da ja auch Skype und diverse andere P2P Anwendungen bei denen funkltionieren.
(Oder verwenden diese Anwendungen andere Techniken?)

Sofern das Problem #1 tatsächlich ist - was mach ich da? (STUN? Steht #1 mit #2 iwie in Beziehung?)

Achja, was beim Peer wirklich abgeht (vlt tuts ja was zur Sache):
Code:
- in 10 Sek. Abständen ein "Hallo" an "Übermittler" schicken. Der Übermittler aktualisiert seine Peerliste (mit Zeitstempel, sodass Peers die 30 Sek. lang keine Murks von sich gegeben haben, gelöscht werden)
- recvfrom() ausführen
  falls daten vom "Übermittler" gekommen sind
     es handelt sich um die PeerListe - parsen
  sonst (zu diesem Abschnitt kommts nie! =()
     entweder Nachricht von einem Peer empfangen oder hole-punching (nachricht anzeigen, hole punching ignorieren)
- an alle Peers (Peerliste) hole-punching Pakete verschicken
(Das ganze läuft übrigens ~100 x die Sekunde)

Hat einer ne Idee woran es liegen könnte?
Würde mich über jede Kleinigkeit freuen.
Ich hoffe sehr, dass zumindest einer positive Erfahrung damit hat.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (28. Jan 2013 um 08:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: UDP Hole Punching

  Alt 28. Jan 2013, 08:56
Da aber UDP verbindungslos ist, regelt NAT das so, dass sobald von Peer A Pakete an B geschickt werden, ankommende Pakete von B an A weitergeleitet werden;
Das wäre mir neu
Zumindest keiner meiner Router konnte das. Dafür muss man meist per Hand eine Regel festlegen.

Viele Anwendungen benutzten UPnP, um das NAT einzurichten. Skype ist noch etwas komplizierter ... schwarze Magie
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: UDP Hole Punching

  Alt 28. Jan 2013, 08:58
.. hier ist "hole punching" recht anschaulich beschrieben.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: UDP Hole Punching

  Alt 28. Jan 2013, 09:17
@Klaus das kenne ich schon.. Genau das habe ich ja auch beschrieben..
Trotzdem danke
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (28. Jan 2013 um 09:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: UDP Hole Punching

  Alt 28. Jan 2013, 16:45
Skype ist noch etwas komplizierter ... schwarze Magie
.. hier ist "hole punching" recht anschaulich beschrieben.
Ah, das meinte ich. Hatte bloß noch die falsche Erinnerung, dass das ganze über eine vorgegaukelte TCP-Verbindung funktioniert. Also doch keine schwarze Magie


Ich darf aber doch davon ausgehen, dass es sich bei den Kollegen nicht um diese Art von NAT handelt, da ja auch Skype und diverse andere P2P Anwendungen bei denen funkltionieren.
(Oder verwenden diese Anwendungen andere Techniken?)
Wie gesagt, im Normalfall benutzen P2P-Anwendungen UPnP. Skype macht das auch.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (28. Jan 2013 um 16:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: UDP Hole Punching

  Alt 29. Jan 2013, 22:01
Habs gelöst.

Ich schätze - bin mir nicht sicher, muss noch diverese Tests durchführen - dass es daran lag, dass der Peer zyklisch "Hallo" an den Übermittler geschickt hat - damit waren die erzeugten Löcher wieder gestopft, bzw. nur für den Übermittler geöffnet. Da muss man echt vorsichtig sein.

Ich bin aber glücklich darüber, dass es nun klappt ^^

Edit: Geplant ist evt. ne P2P-Filesharing Toolchen, wo Torrenting - Elemente vorkommen werden.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (29. Jan 2013 um 22:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: UDP Hole Punching

  Alt 30. Jan 2013, 08:25
Auf Anfrage veröffentliche ich mal diese kleine "Demo"~.

Es ist theoretisch nicht zu 100% stabil, jedoch bug-free.
Stabil im Sinne von - ich evaluiere z.B. die Anzahl der Bytes, die angekommen sind, nicht ordentlich..
Es reicht für den Test!

Edit:
- Der Tracker ist der "Übermittler".
- Probiert zunächst einmal, dass zu kompilieren - dann wird der Compiler an die Stelle springen, wo Änderungen vorgenommen werden müssen:
IP und Port Daten des Trackers müssen angegeben werden
- Der Port beim Tracker muss gefowardet sein, damit es von außen auch erreichbar ist
- die Peers müssen an sich nichts großartiges tun, einfach an 2 Kollegen hinter 2 verschiedenen NATs schicken und <optimalerweise gleichzeitig!> ausführen lassen (time-outs werden nicht gehandelt - das hier ist wirklich nur eine sehr simple Variante ~hence Demo)

Paper (wichtige Punkte: 2.1 & 3)
Angehängte Dateien
Dateityp: rar Hole Punching - 2nd run.rar (160,2 KB, 155x aufgerufen)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (30. Jan 2013 um 08:52 Uhr)
  Mit Zitat antworten Zitat
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#8

AW: UDP Hole Punching

  Alt 30. Jan 2013, 08:29
Du musst auch bei einigen Routern/Firewalls aufpassen, wenn du von privilegierten Ports sendest.
Meine Fritzbox mochte das überhaupt nicht und hat die Pakete gnadenlos blockiert.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.663 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: UDP Hole Punching

  Alt 30. Jan 2013, 08:30
Danke

war nicht mal E Mule oder so mit Delphi programmiert? Da gibts sicher Sourcen.
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: UDP Hole Punching

  Alt 30. Jan 2013, 08:36
Du musst auch bei einigen Routern/Firewalls aufpassen, wenn du von privilegierten Ports sendest.
Meine Fritzbox mochte das überhaupt nicht und hat die Pakete gnadenlos blockiert.
Ja, das ganze funktioniert ja auch nicht zu 100%.
Da müsste ich halt Spezialfälle berücksichtigen.. Das ganze muss halt noch richtig geplant werden, soweit bin ich noch nicht ^^
Ich spiel gerade noch mit der Technik rum, bis ich etwas Stabiles hab.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (30. Jan 2013 um 08:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz