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.