2009-04-04 9 views
11

So che la parola "connessione" in realtà non è appropriata quando si parla di UDP, ma ...UDP, NAT e la creazione di "connessioni"

Come fa un server (quello con la nota IP) ottiene i suoi pacchetti UDP attraverso Internet a un client che si trova dietro NAT?

Ad esempio: un client si connette e autentica al server utilizzando alcuni messaggi su TCP. A questo punto il server è pronto per avviare lo streaming dei dati sul client tramite UDP, ma come fa il server a sapere dove indirizzare i pacchetti UDP in modo che possano trovare la loro strada attraverso qualsiasi router NAT verso il client?

Se il pugno del client invia un messaggio "Sono pronto per lo streaming per favore" su UDP, i router NAT terranno aperta la porta in modo che il server possa rispondere con il proprio flusso di dati UDP?

O vengo fuori pista qui?

+0

stai progettando il tuo protocollo o stai cercando di far funzionare un protocollo esistente? – Alnitak

+0

Implementerei qualcosa di nuovo. – chardy

risposta

1

Generalmente il NAT di fronte al client a livello TCP sarà in grado di determinare che la connessione all'UDP è stata creata. Detto questo, il NAT sul lato client dovrà essere configurato per accettare i pacchetti UDP dalla porta del server SRC e quindi inoltrarli all'IP di destinazione interno (client). Una cosa importante da ricordare se NAT è chi è il chiamante e chi è il chiamato. I NAT differiscono per implementazione e capacità, quindi una soluzione generica e facile da implementare è probabilmente ciò che potresti voler implementare, a seconda delle tue esigenze.

Hai ragione nel presupporre, penso, che nel tuo caso il cliente non sarà in grado di ricevere il flusso UDP nelle informazioni. Nel tuo caso il tuo cliente dovrà inviare la sua WAN IP al tuo server per avviare la connessione UDP. Trovare i WAN IP dei tuoi clienti può essere complicato, ma ci sono siti Web che ti aiuteranno a determinare il tuo IP WAN restituendolo in una pagina di testo.

Se la connessione UDP viene creata dopo la connessione TCP dal server che apre un socket al client a una porta UDP conosciuta, allora UPnP potrebbe valere la pena di esaminarlo per consentire di configurare automaticamente la porta in avanti sul NAT , questo è solo se il tuo NAT supporta UPnP come nel caso dei router DSL.

Un lavoro sarebbe un client per aprire socket TCP e UDP al server. Poiché il client dietro il NAT ha avviato la connessione, gli stati delle connessioni TCP e UDP verranno aggiunti alla tabella delle connessioni NAT.

+0

"Un lavoro-a-round sarebbe al client per aprire socket TCP e UDP al server." Si tratta di un metodo standard e affidabile per riportare i datagrammi del server sul client? Sto cercando il minimo problema per la persona che sta usando client. – chardy

4

Ignorando la fornitura di nota la traduzione della porta (dati ovvero su questa porta va a questo indirizzo) nel router (fornendo il NAT), è possibile utilizzare UDP Hole Punching.

Presumo che non si parli di multicasting, in cui ogni peer si unisce a un gruppo e lo annuncia alle parti interessate (in questo caso il router), che può quindi eseguire il routing appropriato. Sebbene ciò sia normalmente utilizzato per instradare il traffico in modo efficiente a più host, il meccanismo di routing per gruppo funzionerebbe per la descrizione che precede.

+0

Grazie Brian per queste informazioni - Come ho capito, UDP Hole Punching verrebbe utilizzato in uno scenario peer-peer in cui entrambe le estremità sono dietro un firewall? Questo sarebbe ancora necessario se il mio server è su un IP WAN? – chardy

+0

Non credo, ma confesso di non essere un esperto. –

1

Se si parla di protocolli di streaming come SIP o RTSP, il modo in cui funziona è che la porta UDP che il client desidera venga inviata al server sia specificata nella richiesta di impostazione della chiamata.

Il server invierà a quella porta e il traffico può o non può arrivare fino al client a seconda se il NAT ha tradotto la scelta del numero di porta su un numero diverso o meno.

Quando il server riceve il primo pacchetto in streaming UDP dal client e se si trova su una porta diversa da quella che stava inviando, passerà ad esso. Ciò consente al server UDP di passare attraverso il NAT poiché il client ha già creato il mapping NAT inviando al server.