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