di
Del Grosso Serafina
Corso di laurea specialistica in Economia
Informatica
Università degli studi “G. D’Annunzio”
Pescara
A.A. 2005-2006
ICQ: UN PO’ DI STORIA
 Fino al 1996, era possibile collegarsi al World Wide
Web, ma non era consentita alcuna forma di
interconnessione tra gli utenti on-line.
TUTTO CIO’ CHE SI CONOSCE
 JULE SUL
1996 PROTOCOLLO
- Yair Goldfinger (26
Arik Vardi (27
ICQanni),
E’ STATO
anni), Sefi Vigiser (25 anni) e Ammon Amir (24 anni)
OTTENUTO
DALLA
costituirono
la Mirabilis, con lo scopo
di creare un
nuovo SPERIMENTAZIONE,
modo di comunicare in Internet.
ANALIZZANDO
I
PACCHETTI
 NOVEMBER 1996 – fu sviluppata la prima versione
TRASMESSI E RICEVUTI DAI
dell’ICQ
PROGRAMMI STANDARD.
 Col tempo il protocollo ICQ ha subito diverse
modifiche. Attualmente vi sono otto versioni del
protocollo ICQ, ognuna delle quali è compatibile con la
precedente.
ICQ: ELEMENTI NECESSARI
 PC connesso ad Internet
 Programma “client” sul pc
 Registrazione al server
Mirabilis
COS’E’ L’ICQ?
ICQ suona come “I SEEK YOU”
ICQ è uno dei primi “istant messaging” che dà la
possibilità di instaurare delle conversioni tra
utenti on-line.
COME FUNZIONA ICQ: UN ESEMPIO
• In fase di installazione, ICQ assegna ad ogni utente un
Numero Identificativo Universale (UIN)
• Quando un utente si connette ad Internet, l’ISP gli assegna
un indirizzo IP
SERVER Mirabilis
UIN
12345678
AGGIORNA
43896863
05876584
UIN: 12345678
SEND MESSAGES
131.156.5.9
76540213
87643902
BOB
IP
ANNA
UIN: 87643902
170.23.8.12
IL PROTOCOLLO ICQ
ARCHITETTURA
 Due tipi di comunicazione:
Client-Client e Client-Server
 L’ICQ, a livello di trasporto,
utilizza sia il protocollo UDP sia
il protocollo TCP
UDP
UDP
TCP
UDP
messages
CLIENT-SERVER
• Protocollo UDP
• Porta 4000 (o superiori)
UDP
• Numero di sequenza
• “Acknowledgement” per ogni
pacchetto inviato dal client
al server e viceversa
UDP
CLIENT-SERVER
FORMATO PACCHETTI: HEADER
PACCHETTI INVIATI DAL CLIENT AL SERVER:
Length
Name
Description
2 byte
VERSION
Identifies the packet as an ICQ packet
4 byte
UIN
The sender’s UIN
4 byte
SESSION_ID
A random number
2 byte
COMMAND
Code for service the server should
provide
2 byte
SEQ_NUM1
Start at a random number
2 byte
SEQ_NUM2
Start at 1
4 byte
CHECKCODE
variable
PARAMETERS
0 or more parameters (depending on
COMMAND)
CLIENT-SERVER
FORMATO PACCHETTI: HEADER
PACCHETTI INVIATI DAL SERVER AL CLIENT:
Length
Name
Description
2 byte
VERSION
Identifies the packet as an ICQ packet
4 byte
SESSION_ID
Same as in client login packet
2 byte
COMMAND
Code for service the server should
provide
2 byte
SEQ_NUM1
2 byte
SEQ_NUM2
4 byte
UIN
4 byte
CHECKODE
variable
PARAMETERS
The client’s UIN
Parameters for the command being sent
COMUNICAZIONE
CLIENT-SERVER
1. FASE DI REGISTRAZIONE
REG_NEW_USER
UIN
LOGIN_PACKET
LOGIN_REPLY
COMUNICAZIONE
CLIENT-SERVER
2. LISTA DEI CONTATTI
Il client comunica al
server l’elenco degli
utenti con i quali
desidera interagire.
CONTACT_LIST
ACK
FORMATO DEL PACCHETTO
Length Content(if fixed) Designation
Description
1 byte
xx
4 bytes xx xx xx xx
.............
4 bytes xx xx xx xx
NUM_CONTACTS
UIN_1
Number of UINs in this packet
1st UIN in your contact list
UIN_n
Last UIN in your contact list
Il client può, in ogni momento, aggiungere nuovi utenti alla propria lista
dei contatti, mediante l’invio del pacchetto “ADD_TO_LIST”
CLIENT-CLIENT
• Invio di messaggi,
e-mail, url, contatti,
file
• Video conferenze
• Telefonare on-line
• Chat
• Game
• Invio di messaggi
vocali
CLIENT - CLIENT
• Inizialmente
è
necessaria
connessione UDP
una
• La connessione diretta tra client
utilizza il protocollo TCP
TCP
• “Acknowledgement”
• Ogni tipo di connessione (Chat, File,
Message) ha una propria “listening
socket”
• Tipicamente le porte TCP utilizzate
sono nell’intervallo 1200-1300
UDP
CONNESSIONE UDP
LATO CLIENT
non riceve login_reply
invio login_packet
invio login_packet
LOGIN_PACKET
TCP_MSGPORT
Aspetta
login_reply
*/porta che il client
accetterà per le connessioni TCP
PASSWORD
*/max 8 caratteri
Off-line
TCP_MSGIP
TCP_FLAG
Aspetta
ACK
STATUS
*/indirizzo IP del client
no “user_on_line” &&
time-out
*/il client può
riceve login_reply
invio ACK
instaurare una connessione
TCP?
no “user_on_line”
On line
&& no time-out
invio “keep
alive”
*/0x004=si
0x006=no e
aspetta
L
“user_on_line”
*/lo stato del client
durante il login
TCP_VER
*/versione del
protocollo
TCP usata dal client
riceve
“user_on_line”
SEQ_LOGIN
invio ACK uno per ogni “login_packet”
*/numero di sequenza:
TCP
IPOTESI: un solo utente nella “contact_list”
Connessione
CONNESSIONE UDP
LATO SERVER
Aspetta
login
riceve “login_packet”
non riceve ACK
invia “login_reply”
invio login_reply
Aspetta
ACK
Non riceve
keep alive
riceve ACK
Utente off-line
Aspetta
“keep alive”
time-out &&
utenti off-line
L
L
Cerca
utenti
on-line
invia “user_on_line”
riceve “keep alive”
invio ACK
Aspetta
ACK
IPOTESI: un solo utente nella “contact_list”
non riceve ACK
invia “user_on_line”
COMUNICAZIONE TCP
1. FASE DI HANDSHAKE
FORMATO INIT_PACKET
Length
2 byte
1 byte
4 byte
4 byte
4 byte
Name
LENGTH
INIT_IDENT
MY_UIN
MY_IP
MY_PORT
Description
Lunghezza di questo pacchetto
Identifica questo pacchetto come inizializzazione
l’UIN del client che invia questo pacchetto
l’IP del client che invia questo pacchetto
Porta TCP dalla quale il client riceverà messaggi
NOTE:
• Questo messaggio è lo stesso per ogni tipo di socket: Chat, File, Message.
• Per questo messaggio il lato receiver non invierà alcuna risposta
COMUNICAZIONE TCP
2. INVIO DEL MESSAGGIO
FORMATO CHANNEL_MESSAGE
Length
2 byte
Name
LENGTH
Description
Lunghezza di questo pacchetto
4 byte
UIN
UIN del “sender”
2 byte
VERSION
Versione del protocollo ICQ
2 byte
MSG_COMMAND
Tipo di messaggio
2 byte
LENGTH
Lunghezza del messaggio
Variable
MESSAGE
Testo del messaggio
4 byte
IP
Indirizzo IP del sender
4 byte
PORT
Porta TCP per i messaggi in entrata
2 byte
TCP_SEQUENCE
Numero di sequenza
CONNESSIONE TCP
CONTRARIA
1.
2.
3.
4.
5.
6.
7.
8.
Il client A scrive un messaggio da
inviare al client B
Il client A tenta una connessione
al client B ma non ci riesce
Il client A invia il pacchetto
“TCP_REQUEST” al server
il server aggiunge al pacchetto
“TCP_REQUEST”, l’IP e la Porta
TCP del client A e lo invia al
client B
Il client B si connette al client A e
invia il pacchetto “INIT_PACKET”
Il client A invia al client B il
messaggio costruito al punto 1
Il client B legge il messaggio
Da questo momento in poi la
comunicazione continua come se
il client A si fosse appena
connesso al client B
Client A
Client B
ICQ CHAT
COS’E’ UNA “CHAT SESSION”?
CONNESSIONE TRA
DUE O PIÙ UTENTI
IN CUI I MESSAGGI
INVIATI E RICEVUTI
VENGONO
VISUALIZZATI
IN
UNA
STESSA
FINESTRA.
OGNI “CHAT SESSION” HA UNA PROPRIA “listen()socket”
ICQ CHAT
DUE TIPOLOGIE DI “CHAT SESSION”:
1. SINGLE CHAT SESSION:
gli utenti connessi sono solo
due.
2. MULTI CHAT SESSION:
gli utenti connessi sono più
di due
“SINGLE CHAT SESSION”
1.
2.
3.
4.
5.
6.
Il client A chiede al client B di entrare in chat
Il client A crea una “chat listen()socket” che non
sarà inviata al client B ma sarà utilizzata se qualcuno
vuole unirsi alla chat
Il client B accetta la richiesta e crea una
listen()socket che invierà al client A, inserendola nel
pacchetto ACK
Il client A tenta una connessione sulla porta
indicatogli nell’ACK
Il client A e il client B sono connessi
Pacchetti di setup
SINGLE CHAT SESSION
PACCHETTO DI RICHIESTA
SessionLength /always 0x0001 for single chat session
Chat_Session /always 0x00 for single chat session
Chat Port
/always 0x0000
Client B
Client A
PACCHETTO ACK
Client B
Client A
SessionLength /always 0x0001 in the ACK
Chat_Session /always 0x00 in the ACK
Chat Port
/listen()port in intel order
“MULTI CHAT SESSION”
SI DISTINGUONO TRE CASI:
1.
IL RICHIEDENTE E’ IN UNA CHAT SESSION
2.
IL RECEIVER E’ GIA’ IN UNA CHAT SESSION
3.
SIA IL RICHIEDENTE CHE IL RECEIVER SONO GIA’ IN
UNA CHAT SESSION
“MULTI CHAT SESSION”
1° CASO: IL RICHIEDENTE E’ IN UNA CHAT SESSION
1.
2.
3.
4.
5.
6.
7.
Il messaggio iniziale conterrà la lista di tutti gli altri utenti
della chat session e la listen()socket che è stata creata quando
il client A ha inviato, per la prima volta, il messaggio di
richiesta di una chat.
Il client B accetta la richiesta e crea una sua chat
listen()socket che sarà inserita nell’ACK
Dopo aver ricevuto l’ACK, il client A tenta una connessione
sulla listen()socket del client B
La connessione è creata e i pacchetti di setup vengono
scambiati
Nei pacchetti di setup il client A fornisce informazioni sugli
altri membri della chat
Il client B tenta una connessione con gli altri membri
La connessione viene creata e i pacchetti di setup vengono
scambiati tra tutti i membri.
MULTI CHAT SESSION
PACCHETTO DI RICHIESTA
SessionLength /length of the chat session
Chat_Session /list of all those in the session
Chat Port
/chat listen()port for this session in intel
order
Client B
Client A
PACCHETTO ACK
Client B
Client A
SessionLength /always 0x0001 in the ACK
Chat_Session /always 0x00 in the ACK
Chat Port
/listen()port in intel order
“MULTI CHAT SESSION”
2° CASO: IL RECEIVER E’ IN UNA CHAT SESSION
Il richiedente non sa che il receiver è in una chat session
Il richiedente chiederà una ”single chat session”
… COSA CAMBIA?
Il receiver quando riceve la richiesta deciderà se:
• unire il client richiedente alla chat session già aperta (JOIN
OPTION)
L’ACK conterrà la listen()socket della chat session creata precedentemente
I pacchetti di setup conterranno le informazioni sugli altri membri
• creare una nuova single chat session con il client richiedente
“MULTI CHAT SESSION”
3° CASO: IL RECEIVER E IL RICHIEDENTE SONO IN UNA CHAT SESSION
ICQ NON PERMETTE LA FUSIONE TRA DUE “CHAT SESSION”
L’OPZIONE “JOIN” PUO’ ESSERE SELEZIONATA DA UN SOLO CLIENT
1. Se uno dei due client seleziona l’opzione JOIN
2. Se nessuno seleziona l’opzione JOIN
“MULTI CHAT SESSION”
“SINGLE CHAT SESSION”
PACCHETTI DI SETUP
FASE DI INIZIALIZZAZIONE
Client A
Client B
1° pacchetto
2° pacchetto
3° pacchetto
CHAT SESSION
CONNESSIONE TCP CONTRARIA
0.
1.
2.
3.
4.
5.
6.
7.
8.
Il client A fa una richiesta di chat al client B
Il client B accetta la richiesta e il client B invia l’indirizzo IP e
la Porta con il messaggio ACK
Il client A tenta una connessione al client B ma non ci riesce
Il client A invia il pacchetto “TCP_REQUEST” al server
il server aggiunge al pacchetto “TCP_REQUEST”, l’IP e la Porta
TCP del client A e lo invia al client B
Il client B tenta una connessione al client A e ci riesce
Il client B invia il pacchetto “INIT_PACKET” al client A
Il client A e il client B si scambiano i pacchetti di setup
Inizia la chat session
RIFERIMENTI
 www.icqinfo.com
www.icq.com
www.mirabilis.com
Scarica

ICQ - Dipartimento di Matematica e Informatica