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.
JULE 1996 - Yair Goldfinger (26 anni), Arik Vardi (27 anni), Sefi Vigiser (25 anni) e Ammon Amir (24 anni) costituirono la Mirabilis, con lo scopo di creare un nuovo modo di comunicare in Internet.
NOVEMBER 1996 – fu sviluppata la prima versione dell’ICQ
Col tempo il protocollo ICQ ha subito diverse modifiche. Attualmente vi sono otto versioni del protocollo ICQ, ognuna delle quali è compatibile con la precedente.
TUTTO CIO’ CHE SI CONOSCE SUL PROTOCOLLO ICQ E’ STATO OTTENUTO DALLA SPERIMENTAZIONE, ANALIZZANDO I PACCHETTI TRASMESSI E RICEVUTI DAI PROGRAMMI STANDARD.
ICQ: ELEMENTI NECESSARI
PC connesso ad Internet
Programma “client” sul pc
Registrazione al server Mirabilis
ICQ suona come “I SEEK YOU”
ICQ è uno dei primi “istant messaging” che dà la possibilità di instaurare delle conversioni tra utenti on-line.
COS’E’ L’ICQ?
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
UIN: 12345678
SERVER Mirabilis
IP:131.156.5.9
AGGIORNA
BOB ANNA
UIN: 87643902
IP:170.23.8.12
SEND MESSAGES
Anna è on-line Bob è on-line
UIN IP
12345678
76540213
43896863
05876584
87643902
131.156.5.9
170.23.8.12
IL PROTOCOLLO ICQARCHITETTURA
Due tipi di comunicazione: Client-Client e Client-Server
L’ICQ, a livello di trasporto, utilizza sia il protocollo UDP sia il protocollo TCP
UDPUDP
UDP
TCP
Login m
essageLo
gin m
essa
ge
messages
CLIENT-SERVER
UDP UDP
• Protocollo UDP
• Porta 4000 (o superiori)
• Numero di sequenza
• “Acknowledgement” per ogni pacchetto inviato dal client al server e viceversa
CLIENT-SERVER
FORMATO PACCHETTI: HEADER
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)
PACCHETTI INVIATI DAL CLIENT AL SERVER:
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 The client’s UIN
4 byte CHECKODE
variable PARAMETERS Parameters for the command being sent
CLIENT-SERVER
FORMATO PACCHETTI: HEADERPACCHETTI INVIATI DAL SERVER AL CLIENT:
COMUNICAZIONE CLIENT-SERVER
1. FASE DI REGISTRAZIONE
REG_NEW_USER
UIN
LOGIN_PACKET
LOGIN_REPLY
IP dinamico, #porta TCP
COMUNICAZIONE CLIENT-SERVER
2. LISTA DEI CONTATTI
CONTACT_LIST
ACK
Il client comunica al server l’elenco degli utenti con i quali desidera interagire.
FORMATO DEL PACCHETTO
Length Content(if fixed) Designation Description
1 byte xx NUM_CONTACTS Number of UINs in this packet 4 bytes xx xx xx xx UIN_1 1st UIN in your contact list ............. 4 bytes xx xx xx xx 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 una connessione UDP
• La connessione diretta tra client utilizza il protocollo 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
TCP
LATO CLIENT
Off-lineinvio login_packet
Aspetta login_reply
non riceve login_reply
invio login_packet
riceve login_reply
invio ACK
On linee
aspetta “user_on_line”
no “user_on_line” && no time-out
no “user_on_line” && time-out
invio “keep alive”
Aspetta ACK
riceve “user_on_line”invio ACK
Connessione TCP
IPOTESI: un solo utente nella “contact_list”
CONNESSIONE UDP
LOGIN_PACKETTCP_MSGPORT */porta che il client accetterà per le connessioni TCP
PASSWORD */max 8 caratteri
TCP_MSGIP */indirizzo IP del client
TCP_FLAG */il client può instaurare una connessione TCP?
*/0x004=si 0x006=no
STATUS */lo stato del client durante il login
TCP_VER */versione del protocollo TCP usata dal client
SEQ_LOGIN */numero di sequenza: uno per ogni “login_packet”
CONNESSIONE UDPLATO SERVER
Aspetta login
riceve “login_packet”
Aspetta ACK
non riceve ACK
invio login_reply
riceve ACK
invia “user_on_line”
time-out && utenti off-line
Aspetta “keep alive”
riceve “keep alive”
invio ACK
Aspetta ACK
invia “login_reply”
Cerca utenti on-line
Non riceve keep alive
Utente off-line
IPOTESI: un solo utente nella “contact_list”
non riceve ACK
invia “user_on_line”
COMUNICAZIONE TCP1. FASE DI HANDSHAKE
FORMATO INIT_PACKET
Length Name Description 2 byte LENGTH Lunghezza di questo pacchetto1 byte INIT_IDENT Identifica questo pacchetto come inizializzazione4 byte MY_UIN l’UIN del client che invia questo pacchetto4 byte MY_IP l’IP del client che invia questo pacchetto4 byte MY_PORT 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 TCP2. INVIO DEL MESSAGGIO
FORMATO CHANNEL_MESSAGE
Length Name Description 2 byte LENGTH 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
Client A Client B
Richiesta TCP
Richi
esta
TCP
1. Il client A scrive un messaggio da inviare al client B
2. Il client A tenta una connessione al client B ma non ci riesce
3. Il client A invia il pacchetto “TCP_REQUEST” al server
4. il server aggiunge al pacchetto “TCP_REQUEST”, l’IP e la Porta TCP del client A e lo invia al client B
5. Il client B si connette al client A e invia il pacchetto “INIT_PACKET”
6. Il client A invia al client B il messaggio costruito al punto 1
7. Il client B legge il messaggio8. Da questo momento in poi la
comunicazione continua come se il client A si fosse appena connesso al 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. Il client A chiede al client B di entrare in chat2. Il client A crea una “chat listen()socket” che non sarà inviata al
client B ma sarà utilizzata se qualcuno vuole unirsi alla chat3. Il client B accetta la richiesta e crea una listen()socket che
invierà al client A, inserendola nel pacchetto ACK4. Il client A tenta una connessione sulla porta indicatogli
nell’ACK5. Il client A e il client B sono connessi6. Pacchetti di setup
SINGLE CHAT SESSION
PACCHETTO DI RICHIESTA
SessionLength /always 0x0001 for single chat sessionChat_Session /always 0x00 for single chat session Chat Port /always 0x0000 Client A
Client B
Client A
Client B
PACCHETTO ACK
SessionLength /always 0x0001 in the ACKChat_Session /always 0x00 in the ACK Chat Port /listen()port in intel order
“MULTI CHAT SESSION”
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
SI DISTINGUONO TRE CASI:
“MULTI CHAT SESSION”
1. 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.
2. Il client B accetta la richiesta e crea una sua chat listen()socket che sarà inserita nell’ACK
3. Dopo aver ricevuto l’ACK, il client A tenta una connessione sulla listen()socket del client B
4. La connessione è creata e i pacchetti di setup vengono scambiati
5. Nei pacchetti di setup il client A fornisce informazioni sugli altri membri della chat
6. Il client B tenta una connessione con gli altri membri7. La connessione viene creata e i pacchetti di setup vengono
scambiati tra tutti i membri.
1° CASO: IL RICHIEDENTE E’ IN UNA CHAT SESSION
MULTI CHAT SESSION
PACCHETTO DI RICHIESTA
SessionLength /length of the chat sessionChat_Session /list of all those in the session Chat Port /chat listen()port for this session in intel
order Client A
Client B
Client A
Client B
PACCHETTO ACK
SessionLength /always 0x0001 in the ACKChat_Session /always 0x00 in the ACK Chat Port /listen()port in intel order
Il richiedente non sa che il receiver è in una chat session
Il richiedente chiederà una ”single chat session”
“MULTI CHAT SESSION”2° CASO: IL RECEIVER E’ IN UNA 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 “MULTI CHAT SESSION”
2. Se nessuno seleziona l’opzione JOIN “SINGLE CHAT SESSION”
PACCHETTI DI SETUP
FASE DI INIZIALIZZAZIONE
Client A Client B
1° pacchettoUIN, Nick
2° pacchetto
3° pacchetto
UIN, Nick, IP, Count, “altri
membri”
IP, Port
CONNESSIONE TCP CONTRARIA
0. Il client A fa una richiesta di chat al client B1. Il client B accetta la richiesta e il client B invia l’indirizzo IP
e la Porta con il messaggio ACK2. Il client A tenta una connessione al client B ma non ci
riesce3. Il client A invia il pacchetto “TCP_REQUEST” al server4. il server aggiunge al pacchetto “TCP_REQUEST”, l’IP e la
Porta TCP del client A e lo invia al client B5. Il client B tenta una connessione al client A e ci riesce6. Il client B invia il pacchetto “INIT_PACKET” al client A7. Il client A e il client B si scambiano i pacchetti di setup 8. Inizia la chat session
CHAT SESSION
RIFERIMENTI
www.icqinfo.com
www.icq.com
www.mirabilis.com