7. Procedure for UDP-based clients (Procedura per i client UDP)
Un client basato su UDP (UDP-based Client) deve inviare i suoi datagrammi al server relay UDP (UDP Relay Server) alla porta UDP indicata da BND.PORT nella risposta alla richiesta UDP ASSOCIATE. Se il metodo di autenticazione selezionato fornisce l'incapsulamento per scopi di autenticità (Authenticity), integrità e/o riservatezza, il datagramma deve essere incapsulato utilizzando l'incapsulamento appropriato. Ogni datagramma UDP porta con sé un'intestazione di richiesta UDP (UDP Request Header):
+----+------+------+----------+----------+----------+
|RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
+----+------+------+----------+----------+----------+
| 2 | 1 | 1 | Variable | 2 | Variable |
+----+------+------+----------+----------+----------+
I campi nell'intestazione di richiesta UDP:
- RSV Riservato (Reserved) X'0000'
- FRAG Numero di frammento corrente (Current Fragment Number)
- ATYP tipo di indirizzo degli indirizzi seguenti:
- IP V4 address: X'01'
- DOMAINNAME: X'03'
- IP V6 address: X'04'
- DST.ADDR indirizzo di destinazione desiderato
- DST.PORT porta di destinazione desiderata
- DATA dati utente (User Data)
Quando un server relay UDP decide di inoltrare un datagramma UDP, lo fa silenziosamente, senza alcuna notifica al client richiedente. Allo stesso modo, scarterà i datagrammi che non può o non vuole inoltrare. Quando un server relay UDP riceve un datagramma di risposta da un host remoto (Remote Host), deve incapsulare quel datagramma utilizzando l'intestazione di richiesta UDP sopra e qualsiasi incapsulamento dipendente dal metodo di autenticazione.
Il server relay UDP deve acquisire dal server SOCKS l'indirizzo IP previsto del client che invierà datagrammi al BND.PORT fornito nella risposta a UDP ASSOCIATE. Deve scartare qualsiasi datagramma che arriva da qualsiasi indirizzo IP di origine diverso da quello registrato per la particolare associazione.
Il campo FRAG indica se questo datagramma è uno di un certo numero di frammenti (Fragment). Se implementato, il bit di ordine superiore (High-Order Bit) indica la fine della sequenza di frammenti (End-of-Fragment Sequence), mentre un valore di X'00' indica che questo datagramma è autonomo (Standalone). I valori tra 1 e 127 indicano la posizione del frammento all'interno di una sequenza di frammenti. Ogni ricevitore avrà una coda di riassemblaggio (REASSEMBLY QUEUE) e un timer di riassemblaggio (REASSEMBLY TIMER) associati a questi frammenti. La coda di riassemblaggio deve essere reinizializzata e i frammenti associati abbandonati ogni volta che il timer di riassemblaggio scade o arriva un nuovo datagramma con un campo FRAG il cui valore è inferiore al valore FRAG più alto elaborato per questa sequenza di frammenti. Il timer di riassemblaggio deve essere di almeno 5 secondi. Si raccomanda che la frammentazione (Fragmentation) sia evitata dalle applicazioni quando possibile.
L'implementazione della frammentazione è opzionale (Optional); un'implementazione che non supporta la frammentazione deve scartare qualsiasi datagramma il cui campo FRAG sia diverso da X'00'.
L'interfaccia di programmazione (Programming Interface) per un UDP compatibile con SOCKS (SOCKS-aware UDP) deve riportare uno spazio buffer disponibile (Buffer Space) per i datagrammi UDP che è più piccolo dello spazio reale fornito dal sistema operativo:
- se ATYP è X'01' - 10+method_dependent ottetti più piccolo
- se ATYP è X'03' - 262+method_dependent ottetti più piccolo
- se ATYP è X'04' - 20+method_dependent ottetti più piccolo