|
La Community DCC2 è un gruppo di lavoro per sviluppatori di software
e di tutti coloro interessati ad accertare la compatibilità dei collegamenti
diretti tra i Client.
La DCC2 Community attualmente lavora sulla negoziazione delle connessioni e sull’interscambio
dei file fra i Client.
Per il futuro la DCC2 Community si sta organizzando per creare uno standard sia
per l’inizializzazione delle connessioni tra i Client che per i trasferimenti
di “VoiceChat” e “VideoChat” per concludere poi con
la serie dei caratteri e dei colori.
- INIZIALIZZAZIONE DELLA CONNESSIONE
Il protocollo di inizializzazione della connessione richiama sia Ipv4 che Ipv6,
la crittografia SSL/tls, il NAT e i Firewall. Al contrario dei vecchi sistemi
di trasferimento file, la DCC2 punta a diventare un sistema di trasferimento estendibile
a tutti gli sviluppi futuri in modo da poterli aggiungere con maggiore facilità
per l’esecuzione finale della nuova tecnologia “IRCII. “
- TRASFERIMENTI DI FILE
I trasferimenti di file IRC sono stati limitati storicamente a un singolo
file per sessione, inoltre sono stati improntati nel riconoscere i Byte ricevuti
durante il trasferimento stesso, in modo che il protocollo TCP li potesse accettare.
I trasferimenti in DCC2 sono resi più veloci grazie al beneficio dei
trasferimenti “Multipli” oltre che per la maggiore possibilità
che la negoziazione possa essere stabilita. Infatti il nome del file, le dimensioni
o altre informazioni non passano mai sulla rete IRC. L’integrità
dei file è comunque garantita e controllata con l’ SHA1.
- MISSIONE
1. prevenire la frammentazione dei protocolli di connessione IRC ed assicurare
“L’interoperabilità” fra i diversi Client
2. aumentare la capacità dei Client IRC per poter incorporare le nuove
tecnologie.
3. chiunque sia amministratore di applicazioni IRC o di Services è libero
di partecipare a questo nuovo sistema.
APPUNTI DELLO SVILUPPO DEL LAVORO…
Questo documento descrive un collegamento diretto tra Client nonché
la fase di inizializzazione della struttura della connessione.
Il protocollo DCC2 diventa parte della struttura del CTCP (Client To Client
Protocol).
Contenuti:
1. introduzione
1.1 cenni storici
1.2 motivazioni
1.3 convenzioni
2. DCC2 descrizione
3. DCC2 incapsulamento del messaggio
4. tokens
4.1 pubblicazione dei tokens
4.1.1 network
4.1.2 transport
4.1.3 sicurezza dei trasferimenti
4.1.4 applicazioni
4.1.5 NAT
4.1.6 SID
4.2 DCC2 Tokens della connessione
4.2.1 Ipv4
4.2.2 Ipv6
4.2.3 Port
4.2.4 Tokens di errore
4.2.5 Messaggi di errore
4.3 DCC2 segnali di trasferimento di IRCFile
4.3.1 File
4.3.2 Dimensioni (size)
4.3.3 Offset
4.3.4 Multi
5. DCC2 inizializzazione
5.1 pubblicazione dei parametri di connessione
5.1.1 descrizione
5.1.2 sintassi
5.1.3 esempi
5.2 accettazione dei parametri di connessione
5.2.1 accettazione della negoziazione
5.2.2 accettazione della sintassi
5.2.3 esempi
5.3 connessione
5.3.1 stabilire una connessione TCP
5.3.2 messaggio di inizializzazione
5.3.3 esempi di negoziazione completata
6. Esempi
6.1 DCC2 sessione di Chat
6.2 DCC2 sessione di File
6.3 DCC2 NAT
7. Compatibilità col vecchio DCC
8. Considerazioni sulla sicurezza
1. Introduzione
1.1 cenni storici
DCC2 Direct Client Connection 2.0, è una specifica attualmente in sviluppo
da parte di http://www.dcc2.org .
DCC2 crea una struttura per standardizzare le connessioni fra i Client. Il sistema
DCC2 permette che i Client negoziino in modo automatico i parametri di connessione
così da rendere possibile che i Client degli utenti stabiliscano automaticamente
sia i parametri di connessione che il processo di negoziazione.
1.2 Motivazioni
L’attuale protocollo DCC punta ancora sui vecchi sistemi infatti punta
sul riconoscimento dei file trasferiti o comunque sulle specifiche che il protocollo
TCP già accetta.
[ Torna all'indice ]
2. DCC2 descrizione
DCC2 permette che i Client negoziino le regolazioni del collegamento usando
il meccanismo della “Stretta di mano”.
I protocolli disponibili vengono inviati dal Client offerente al Client ricevente.
Il Client di ricezione può quindi rispondere all’offerta elencando
a sua volta i suoi protocolli disponibili oppure accettare direttamente e automaticamente
l’offerta ricevuta.
I protocolli e le opzioni disponibili sono presenti in una speciale lista (case-insensitive)
comunque separata dai “Token=value”. Questo è il primo passo
verso la “Standardizzazione”.
[ Torna all'indice ]
3. DCC2 incapsulamento del messaggio
Tutti i messaggi DCC2 sono incapsulati in un “IRC PRIVMSG” da
un utente ad un altro in un determinato canale. Questa parte del messaggio di
PRIVMSG deve cominciare e concludersi con un carattere “Ottale”
/001.
Es. PRIVMSG nickname :/001DCC2 application=IRCChat Network=IPv4,IPv6 transportsecurity=SSL3,
tls1 SID=10a/001
[ Torna all'indice ]
4. tokens
4.1 pubblicazione dei tokens
4.1.1 network
Specifica una lista dei network ove è possibile la connessione.
I valori possibili includono IPv4 e IPv6.
Es. Network=IPv4, IPv6
4.1.2 Transport
Specifica una lista dei trasferimenti possibili.
In una connessione i valori possibili includono TCP, SCTP, UPD
Es. Transport=Tcp
4.1.3 TransportSecurity
Specifica una lista delle criptazioni possibili.
In una connessione i valori possibili includono SSL3, TLS
Es. TransportSecurity=SSL3, TLS
4.1.4 Applicazioni
Specifica l’applicazione comune in una connessione. Ci sono alcuni valori
possibili per questo Token. I valori includono IRCChat e IRCFile.
Es. Application=IRCFile
4.1.5 NAT
Specifica che i collegamenti ricevuti non sono disponibili. Questo Token non
ha mai un valore.
4.1.6 SID
Specifica un identificazione per la sessione di collegamento. Infatti per
qualsiasi sessione è importante inviare un segnale ben preciso (identificazione)
per evitare una sorte di ambiguità nella ricezione da parte dell’altro
Client specialmente se si tratta di un trasferimento “Multifile”.
Questo Token deve avere un valore unico per ogni trasferimento ad un utente.
[ Torna all'indice ]
4.2 DCC2 Tokens della connessione
4.2.1 IPv4
Specifica che è presente un interfaccia IPv4. L’IPv4 Token specifica
un indirizzo di tipo IPv4 al quale è possibile connettersi.
Es. IPv4=192.168.23.43
4.2.2 IPv6
Specifica che è presente un interfaccia IPv6. L’IPv6 Token specifica
un indirizzo di tipo IPv6 al quale è possibile connettersi.
Es. IPv6=::C0A8:6464
4.2.3 Port
È la port su cui connettere gli indirizzi IPv4 o IPv6 offerti. Il Port
Token è sempre un valore.
Es. Port=9834
4.2.4 Tokens di errore
Indica il tokens specifico che ha causato l’errore.
Es. ErrorTokens=Network, Transportsecurity
4.2.5 Messaggi di Errore
Specifica a un determinato utente il perché la connessione è
fallita o è stata rifiutata.
Es. ErrorMessage=”I do not trust you”
[ Torna all'indice ]
4.3 Segnali di trasferimeto di IRCFile
4.3.1 File
Specifica il nome del File trasmesso. Non ci sono comunque le informazioni
sulla directory di provenienza. Se il nome del File contiene spazi deve essere
scritto tra le “”. Così si limita ad un singolo File il trasferimento.
Es. File=”my file.txt”
4.3.2 Dimensioni (Size)
Specifica le dimensioni del File espresse in Bites.
Es. Size=93424
4.3.3 Offset
Il bite di offset dal quale fare un eventuale resume
Es. Offset=7543
4.3.4 Multi
Specifica il nome del file, la descrizione e le dimensioni che saranno pubblicati
durante la connessione. Il valore e la dimensione in byte del file multi xml.
Es. Multi=9874
[ Torna all'indice ]
5. DCC2 inizializzazione
5.1 Pubblicazione dei parametri di connessione
5.1.1 Descrizione
Il client offerente manda un messaggio incapsulato usando il CTCP e indicando
le opzioni DCC2 e i parametri di connessione sostenuti. Questo segnale ancora
senza valori, viene inviato al client ricevente. Il tipo di applicazione, il
network e il SID, sono sempre richiesti in questo primo messaggio. Usando il
+ o il – si contrassegnano le opzioni. Il segnale del livello dell’applicazione
può essere mandato durante la connessione. Il segnale di trasferimento
di un file è mandato al Client ricevente tramite un valore nel contesto
del trasferimento. Tutto ciò serve se il Client ricevente ha in ascolto
una connessione inizializzata con NAT.
5.1.2 Sintassi
I parametri di connessione sostenuti da ogni Client sono contenuti in specifici
protocolli. La sintassi che segue mostra degli esempi.
Stringa contenente i connection Tokens e qualsiasi opzione:
Dcc2-publish = dcc2` 1* (space (connectionTokens | AppTokens))
Una o più connection Tokens:
ConnectionTokens = ConnectionToken [ 1* (space ConnectionToken)]
Un connectionToken opzionalmente seguito da una lista di Tokens supportati:
ConnectionToken = 1*TokenChars [(‘=’ | ‘+=’ ) 1*TokenChars
[ 1* (‘,’ 1*TokenChars) ] ]
Apptoken = 1*TokenChars [ (‘=’ | ‘+=’ ) dcc2-quotedname
]
TokenChars 1* (digit | alpha)
Ogni carattere di nome di File valido deve avere le “ se ci sono degli
spazi.
Dcc2-quotedname = 1*filechar | (%d34 1* (filechar | space ) %d34)
Filechar = digit | alpha | filepunct
Un file Punct valido:
!#$%&’()+,-.=@[]^_{}~
Filepunct = %d33 %d35-41 %d43-46 %d61 %d64 %d91 %d93-95 %d123 %d125-126
5.1.3 Esempi
DCC2 Chat:
schemi di una sessione di chat con IPv4 o IPv6 e 2 schemi di criptazione opzionali
DCC2 Application=IRCChat Network=IPv4, IPv6 TransportSecutity+=SSL3 TLS1 SID=1
Sessione di chat con solo IPv6 disponibile
DCC2 Application=IRCChat Network=IPv6 SID=1
Inizializzazione di una sessione di chat con solamente IPv4 disponibile col
Client offerente che non può accettare la connessione
DCC2 Application=IRCChat Network=IPv4 NAT SID=1
DCC2 condivisione di File
Inizializzazione di un trasferimento di File con IPv4 o IPv6 e due schemi
di criptazione disponibili
DCC2 Application=IRCFile Network=IPv4, IPv6 TransportSecurity SSL3 TLS1 SID=1
Filename=”same file.txt” Size=3423
Inizializzazione di una sessione di trasferimento File con solo IPv6 disponibile
DCC2 Application=IRCFile Network=IPv6 SID=1 Filename=samefile.txt Size=3423
Inizializzazione di una sessione di trasferimento File con solo IPv4 disponibile
con il Client offerente che non può accettare la connessione.
DCC2 Application=IRCFile Network=IPv4 NAT SID=1 Filename=somefile.txt Size=3423.
Inizializzazione di una sessione di trasferimento File con solo IPv4 disponibile
usando DCC2 con una descrizione di File fuori dagli standard
DCC2 Application=IRCFile Network=IPv4 SID=1 Multi=983
[ Torna all'indice ]
5.2 Accettazione dei parametric di connessione
5.2.1 Accettazione della negoziazione
Il Client ricevente manda un messaggio incapsulato di accettazione della DCC2
usando il CTCP e indicando quindi I settaggi e le opzioni che può sostenere
per il trasferimento. Questo gruppo di di settagli è un sottoinsieme
dei parametri pubblicati; i connection tokens senza valori possono essere trasmessi
al Client offerente per indicare i protocolli comuni che possono essere usati.
Se il Client offerente indica che non può accettare la connessione in
corso, il Client ricevente può creare una port d’ascolto su un
interfaccia di supporto usando il sottoinsieme dei parametri pubblicati; il
Client ricevente dovrebbe allora trasmettere i parametri di connessione con
valori ben determinati al client offerente.
Se nessuno dei Client può accettare la connessione in corso o non può
generare un interfaccia comune viene spedito un messaggio tipo: “CannotAccept
DCC” il messaggio CannotAccept può contenere il SID e l’ErrorToken
o anche l’ErrorMessage.
Se il Client ricevente nega la connessione può essere spedito un messaggio
di diniego: REFUSED.
Il messaggio di rifiuto può includere il SID o un ErrorMessage.
5.2.2 Accettazione della sintassi
L’accettazione dei parametri di connessione fa si che i Client trovino
dei protocolli comuni. La sintassi che segue spiega come.
Messaggio di accettazione di DCC2 o di guasto con SID
Dcc2-response = ‘DCC2’ space ( ‘Accept’ | ‘CannotAccept’
| ‘Refused’ ) 1* (space) Token = 1*TokenChars [ ‘= ‘dcc2-quotedname
]
5.2.3 Esempi
5.2.3.1 DCC2 Chat
Accettazione di una sessione di chat con IPv4 o IPv6 e schemi di criptazione
disponibili
Client offerente Send
DCC2 Application=IRCChat Network=Ipv4, IPv6 TransportSecurity+=SSL3, TLS1 SID=1
Il Client ricevente vorrebbe usare IPv6 e criptazione TLS1, risponde
DCC2 Accept IPv6 TLS1 SID=1
Oppure se vuole IPv4 senza criptazione manda
DCC2 Accept IPv4 SID=1
Accettazione di una sessione di Chat con solo IPv6 disponibile.
Client offerente manda
DCC2 Application=IRCChat Network=IPv6 SID=2
Il Client Ricevente vuole usare IPv6
DCC2 Accept IPv6 SID=2
Il Client offerente non può usare IPv6 ma solo IPv4 e non può
stabilire la connessione
DCC2 CannotAccept SID=2 ErrorTokens=Network
Esempi di rifiuto…
Sessione di Chat con solo IPv4 disponibile col Client offerente che non può
stabilire la connessione in ingresso.
Client offerente manda
DCC2 Application=IRCChat Network=IPv4 NAT SID=1
Il Client ricevente crea una connessione su IPv4
DCC2 Accept IPv4=192.168.100.100 Port=7323 SID=1
Se invece il Client ricevente non può accettare la connessione :
DCC2 CannotAccept SID=1 ErrorTokens=NAT
5.2.3.2 DCC2 condivisione di File
Accettazione di una sessione di trasferimento file con IPv4 o IPv6 e due criptazioni
disponibili
Il Client offerente manda
DCC2 Application=IRCFile Network=IPv4, IPv6 TransportSecurity=SSL3, TLS1 Filename=’some
file.txt” Size=3423 SID=2
Client ricevente vorrebbe stabilere la connessione con IPv4 SSL3
DCC2 Accept IPv4 SSL3 Filename=”some file.txt” Size 3423 SID=2
Accettazione di una sessione di trasferimento File con solo IPv6 disponibile
Il Client offerente manda:
DCC2 Application=IRCFile Network=IPv6 Filename=somefile.txt Size=3423 SID=a
Il Cliente ricevente stabilirà il download indicando anche un punto
di resume
DCC2 Accept IPv6 Filename=somefile.txt Size=3423 Offset=1202 SID=a
Oppure se il Client ricevente non può accettare IPv6:
DCC2 CannotAccept SID=a ErrorTokens=Network
Oppure se il Client ricevente rifiuta il File proposto:
DCC2 Refused SID=a ErrorMessage=”We ‘ve already got one!”
Accettazione di una sessione di trasferimento File con solo IPv4 disponibile
col Client Offerente che non riesce a stabilire la connessione
Client offerente manda:
DCC2 Application=IRCFile Network=IPv4 NAT Filename=somefile.txt Size=3423 SID=1
Il Client ricevente potrebbe accettare il trasferimento e apre la connessione
DCC2 Accept IPv4=192.168.23.342 Port=8732 Filename=somefile.txt Size=3423 SID=1
Il Cliente offerente non riesce però a stabilire la connessione e manda:
DCC2 CannotAccept SID=1 ErrorTokens=NAT
Accettazione di una sessione di trasferimento file con solo IPv4 disponibile
su banda DCC2
DCC2 Application=IRCFile Network=IPv4 Multi=983 SID=1
Il Client ricevente potrebbe accettare la connessione
DCC2 Accept IPv4 Multi=983 SID=1
Ma non riesce a accettare perché trattasi di trasferimento in multisessione
DCC2 CannotAccept SID=1 ErrorTokens=Multi
[ Torna all'indice ]
5.3 Connessione
5.3.1 Connessione sul TCP stabilita
Il Client offerente riceve un messaggio di accettazione di DCC2 usando CTCP
indicando le opzioni DCC2 e i parametri di connessione disponibili da usare
nella trasmissione. Se i parametri di connessione hanno valori il Client ricevente
attende la connessione. Quindi il Client offerente può connettersi su
una Port specifica. A questo punto non si necessita di messaggi di CTCP addizionali.
Se invece i parametri di connessione non sono associati a valori, il Client
ricevente crea un Socket in ascolto usando dei protocolli poi dettati dal messaggio
di Accept. Il Client offerente può quindi mandare un altro messaggio
di Accept di DCC2 contenente i parametri associati al socket in ascolto creato.
5.3.2 Messaggio di inizializzazione
I parametri di inizializzazione sono specificati su un protocollo comune supportato.
La sintassi è specificata nei paragrafi precedenti.
5.3.3 Esempio di negoziazione completata
5.3.3.1 DCC2 Chat
Fase finale di una sessione di inizializzazione di Chat usando IPv6 TLS1
Client offerente manda:
DCC2 Accept IPv6=::C0A8:6464 Port=8543 TLS1 SID=1
Conclusione di una sessione di inizializzazione di Chat con solo IPv6 disponibile
Il client ricevente vorrebbe usare IPv6 e manda:
DCC2 Accept IPv6 SID=1
Il client offerente accetta e manda:
DCC2 Accept IPv6=::C0A8:6464 Port=8543 SID=1
5.3.3.2 DCC2 condivisione di File
Conclusione di una sessione di trasferimento File con Ipv4 e Ipv6 e due schemi
di criptazione disponibili
Il Client ricevente vorrebbe riprendere usando IPv4 e SSL3
DCC2 Accept IPv4 SSL3 Filename=”some file.txt” Size=3423 Offset=1003
SID=2
Il Client offerente manda:
DCC2 Accept IPv4=192.168.34.231 Port=9341 SSL3 Filename=”some file.txt”
Size=3423 SID=2
Conclusione di una sessione di trasferimento File con IPv6
Il Client ricevente accetta il trasferimento:
DCC2 Accept Ipv6 Filename=”some file.txt” Size=3423 SID=1
Il Client offerente manda:
DCC2 Accept IPv6=::C0A8:6464 Filename=”some file.txt” Size=3423
SID=1
Conclusione di una sessione di trasferimento File con IPv4 disponibile usando
DCC2 con le varie opzioni e parametri descritti
Il Client ricevente accetta il trasferimento
DCC2 Accept IPv4 Multi=983 SID=1
Il Client offerente può quindi spedire:
DCC2 Accept IPv4=192.168.34.231 Port=9251 Multi=983 SID=1
[ Torna all'indice ]
6. Esempi
6.1 Sessione di Chat in DCC2
Proposizione di una sessione di Chat DCC2 con IPv4 o IPv6 e due schemi di
criptazione disponibili
Il Client offerente spedisce i parametri e le opzioni disponibili
DCC2 Application=IRCChat Network=IPv4, IPv6 TransportSecurity=SSL3 TLS1 SID=10a
Il Client ricevente accetta usando l’interfacia IPv6 e TLS1
DCC2 Accept IPv6 TLS1 SID=10a
Il Client offerente apre una port e stabilisce la connessione
DCC2 Accept IPv6=::C0A8:6464 Port=4521 TLS1 SID=10a
6.2 DCC2 Sessione di File
Proposizione di un traesferimento File con Ipv6 e uno schema di criptazione
disponibile facoltativo
Il Client offerente pubblica i suoi parametri di connessione e le opzioni di
trasferimento
DCC2 Application=IRCFile Network=IPv6 TransportSecurity+=TLS1 SID=abcde3 Filename=todo.txt
Size=98342
Il Client ricevente accetta usando IPv6 senza nessuna criptazione
DCC2 Accept IPv6 SID=abcde3 Filename=todo.txt Size=98342
Il Client offerente crea una Port e stabilisce la connessione
DCC2 Accept IPv6=::C0A8:6464 Port=3412 TLS1 SID=10° Filename=todo.txt Size=98342
6.3 DCC2 NAT
Proposizione di una sessione di Chat con IPv4 o IPV6 e due schemi di criptazione
disponibili
Il Client offerente spedisce i suoi parametri e le opzioni disponibili
DCC2 Application=IRCChat Network=IPv4, IPv6 TransportSecurity=SSL3 TLS1 SID=405
Il Client ricevente crea una port e stabilisce la connessione
DCC2 Accept IPv6=::C0A8:6464 Port=7322 TLS1 SID=405
[ Torna all'indice ]
7. Compatibilità col vecchio DCC
Le vecchie connessioni in DCC usano un insieme di parametri Fissi per collegare
le port e stabilire la connessione. La maggior parte dei Client ignorano i parametri
del vecchio DCC permettendo che il DCC2 sia usato in maniera compatibile. Se
un Client desidera creare una connessione che potrebbe essere possibile col
vecchio DCC con interfaccia IPv4 senza criptazioni o firewall, il CLient offerente
puo creare una socket e spedire una richiesta di DCC storico. Il Client ricevente
dovrebbe stabilire la connessione adeguando i propri parametri di DCC2 alla
richiesta di DCC storico.
Se invece questo Client ricevente volesse usare dei parametri aggiuntivi ad
esempio di criptazione, può rispondere con un messaggio DCC2 di accettazione
e spedire comunque quei parametri richiesti prima di stabilire definitivamente
la connessione. Se l’offerente non può supportare questi parametri
la connessione è comunque possibile usando i parametri pubblicati in
partenza da Client offerente con le regole del vecchio DCC.
[ Torna all'indice ]
8. Considerazioni sulla sicurezza
Le porte sotto la 1024 sono privilegiate dai sistemi UNIX e non dovrebbero
essere usate per le DCC in generale.
I produttori di Client dovrebbero essere attenti a questo fattore, nonché
creare dei Client sensibili al controllo delle DCC2 rifiutate o non accettate
per difendersi da potenziali attacchi di Flooding. Dovrebbe sempre essere possibile
inviare un messaggio per spiegare l’errore o il fallimento della connessione.
Traduzione del documento in lingua originale a cura di :
Dario "Flanagan" Ulgharaita dariowt@libero.it
Michele "M|[ck]3y" Bagnoli mickey@ircitaly.net
Sito originale: www.dcc2.org
Ultima revisione: 21 Giugno 2004
|