Allgemeine Einführung in die Protokoll-Generation 3 & 4 von ICQ
Marc Ruef
 
Die Kommunikation mit einem anderen ICQ-User findet in den Versionen 3 und 4 online mittels einer direkten TCP-Connection zum Gegenüber statt. Alle anderen Konversationen und Übermittlungen von Sonder-Botschaften finden durch UDP-Pakete via den ICQ-Server statt. Eine Wiederholung des Sendevorgangs wird nach 10 Sekunden versucht, falls keine ACK-Nachricht beim Sender eintrifft. Diese ganze Prozedur wird höchsten 2 mal durchgeführt; danach erscheint die Meldung, dass der User den Status offline gewählt hat.

Die Sonderfunktionen Nachrichten an einen User mit Status offline, das Einholen der Details eines Users, Suche im globalen ICQ-Directory und der Wechsel des eigenen Passworts finden durch das Verschicken von UDP-Paketen statt. Diese Pakete beinhalten als simple Vorlage die UIN des Senders, einen speziellen Funktions-Code und optionale Parameter.

Aufbau der UDP-Pakete vom Client an den Server
 

Länge Inhalt Name Beschreibung
2 Bytes 02 00 VERSION Identifiziert das Paket als ICQ-Paket.
2 Bytes xx xx COMMAND Code für die Verarbeitung durch den Server.
2 Bytes xx xx SEQ_NUM Sequenz-Nummer
4 Bytes xx xx xx xx UIN Die UIN des Senders
X Bytes PARAMETERS Zusätzliche Parameter für COMMAND

Aufbau der UDP-Pakete vom Server an den Client
 

Länge Inhalt Name Beschreibung
2 Bytes 02 00 VERSION Identifiziert das Paket als ICQ-Paket.
2 Bytes xx xx COMMAND Code, was der Server bereitstellt..
2 Bytes xx xx SEQ_NUM Sequenz-Nummer
X Bytes PARAMETERS  Zusätzliche Parameter für COMMAND

Das VERSION-Feld ist in allen ICQ-Paketen vorhanden, und identifiziert das Paket eindeutig als ICQ-Nachricht. SEQ_NUM wird zur Sequenz-Nummer genutzt, wobei jedes Paket eine eindeutige Nummer haben muss, egal, ob es sich um eine Wiederholung des Versandes handelt. Dies ist nötig, um sich nicht in der schlacksigen UDP-Kommunikation zu verheddern, denn solche Pakete können ja bekanntlich schnell verloren gehen oder sich replizieren. Normalerweise bauen die Sequenz-Nummer auf die andere mit der Addition 1 auf. Achtung: Der Client und der Server nummerieren ihre abgeschickten Pakete komplett unabhängig voneinander, so dass zwei gleiche Sequenznummern der verschiedenen Parteien nicht auf ein identisches Paket hinweisen. Der Server startet mit der Nummerierung seiner Pakete bei 00 00, und der Client startet bei 01 00, um eine gewisse Übersicht zu wahren.

UDP-Kommandos vom Client an den Server
 

Code Name Beschreibung
0A 00 ACK Antwort-Paket
0E 01 SEND_MESSAGE Nachricht wird durch den Server (an einen User mit Status offline) geschickt.
E8 03 LOGIN Login am Server.
06 04 CONTACT_LIST Informiere den Server über meine Kontakt-Liste.
1A 04 SEARCH_UIN Suche einen User anhand der UIN.
24 04 SEARCH_USER Suche einen User anhand seiner Daten.
2E 04 KEEP_ALIVE Gebe Bescheid, dass noch immer eine Verbindung besteht.
38 04 SEND_TEXT_CODE Schicke eine spezielle Nachricht an den Server als Text.
4C 04 LOGIN_1 Wird während des Logins genutzt.
60 04 INFO_REQ Anfrage der Basis-Infos über einen User.
6A 04 EXT_INFO_REQ Anfrage der reweiterten Infos über einen User.
9C 04 CHANGE_PASSWORD Wechselt das User-Passwort.
D8 04 STATUS_CHANGE Wechselt den Status.
28 05 LOGIN_2 Wird während des Logins genutzt.
0A 05 UPDATE_INFO Updatet die Standart-Informationen.
B0 04 UPDATE_EXT_INFO Updated die erweiterten Informationen.
3C 05 ADD_TO_LIST Fügt einen User zur eigenen Kontakt-Liste hinzu.
56 04 REQ_ADD_TO_LIST Stellt die Anfrage zur Authorisierung um Hinzufügen zur Kontakt-Liste.
BA 04 QUERY_SERVERS Fragt den Server nach Adressen von alternativen Servern.
C4 04 QUERY_ADDONS Fragt den Server nach global definierten Add-Ons.
EC 04 NEW_USER_1 Fragt um Erlaubnis, um einen neuen User zur Kontakt-Liste hinzuzufügen.
FC 03 NEW_USER_REG Registriert einen neuen User.
A6 04 NEW_USER_INFO Sendet die Standart-Informationen des neuen Users.
42 04 CMD_X1 ?
56 04 MSG_TO_NEW_USER Schickt eine Nachricht an einen User, der nicht in der eigenen Kontakt-Liste aufgeführt ist und wird auch bei Authorisierungs-Anfragen genutzt.

UDP-Kommandos vom Server an den Client

Folgende Definitionen werden in Paketen vom Server an den Client genutzt, um entweder auf eine Anfrage zu antworten oder den Client über etwas zu informieren.
 

Code Name Beschreibung
0A 00 ACK Antwort-Paket
5A 00 LOGIN_REPLY Antwort auf den Login-Versuch.
6E 00 USER_ONLINE Ein auf der lokalen Kontakt-Liste aufgeführter User hat den Status online.
78 00 USER_OFFLINE Ein auf der lokalen Kontakt-Liste aufgeführter user hat den Status offline.
8C 00 USER_FOUND Es wurde eine Übereinstimmung bei der Suche nach einem User gefunden.
DC 00 RECEIVE_MESSAGE Die Nachricht wurde offline oder durch den Server gesendet.
A0 00 END_OF_SEARCH Es werden keine USER_FOUND mehr gesendet: Das Ende der Suche ist erreicht.
18 01 INFO_REPLY Retournierung der Standart-Informationen über den User.
22 01 EXT_INFO_REPLY Retournierung der erweiterten Informationen über den User.
A4 01 STATUS_UPDATE Der User auf der lokalen Kontakt-Liste hat seinen Status geändert.
1C 02 REPLY_X1 Unbekannte Retournierung beim Login.
E6 00 REPLY_X2 Unbekannte Retournierung der UIN *?*
E0 01 UPDATE_REPLY Bestätigung des Updates der Standart-Informationen.
C8 00 UPDATE_EXT_REPLY Bestätigung des Updates der erweiterten Informationen.
46 00 NEW_USER_UIN Bestätigung der erfolgreichen Erstellungeines neuen Users mit neuer/eigener UIN.
B4 00 NEW_USER_REPLY Bestätigung der neuen Standart-Informationen.
82 00 QUERY_REPLY Antwort auf QUERY_SERVERS oder QUERY_ADDONS.
C2 01 SYSTEM_MESSAGE Spezielle System-Nachricht

Die UDP-Nachrichten werden im folgenden noch detaillierter beschrieben und Erklärt:

ACK (0A 00) Antwort-Paket

Parameter: Keine

Im Gegensatz zu allen anderen Kommandos enthält das Antwortpaket ACK zusätzlich die Sequenz-Nummer, die vom Server vergeben wird. ACK-Pakete werden grundsätzlich nicht mit einem ACK-Paket beantwortet.

SEND_MESSAGE (0E 01) Nachricht (an einen User mit Status offline) durch den Server schicken

Parameter:
 

Länge Inhalt Name Beschreibung
4 Bytes xx xx xx xx RECEIVER_UIN UIN des Empfängers
2 Bytes siehe unten! MESSAGE_TYPE Nachrichten-Typ, der gerade gesendet wird.
2 Bytes xx xx LENGHT Länge der Nachricht inklusive einer Null
X Bytes MESSAGE Die eigentlich gesendet wird. Das Ende wird mit einer Null signalisiert.

Der MESSAGE_TYP kann folgende Zustände haben:

01 00 - Dies ist eine normale Nachricht.
04 00 - Diese Nachricht ist eine URL, und wird in zwei Schüben geschickt, die jeweils durch den Code FE getrennt wird.

Login (E8 03) Login beim Server

Parameter:
 

Länge Inhalt Name Beschreibung
4 Bytes xx xx xx xx PORT Der genutzte TCP-Port für die ankommende Verbindung.
2 Bytes xx xx LENGHT Länge des Passworts inklusive eine Null.
X Bytes PASSWORD Das Benutzer-Passwort plus eine Null
4 Bytes 78 00 00 00 X1 ?
4 Bytes xx xx xx xx USERE_IP Die IP-Adresse des Users.
1 Byte 04 X2 ?
4 Bytes xx xx xx xx STATUS Der aktuelle Status des Users (normalerweise online)
4 Bytes 02 00 00 00 X3 ?
2 Bytes xx xx LOGIN_SEQ_NUM Die Sequenz-Nummer des Logins
4 Bytes 00 00 00 00 X4 ?
4 Bytes 08 00 78 00 X5 ?

CONTACT_LIST (06 04) Informiert den Server über die eigene Kontak-Liste

Parameter:
 

Länge Inhalt Name Beschreibung
2 Bytes xx xx NUM_CONTACTS Die Anzahl der nun folgenden Kontakt-Einträge in der Liste
4 Bytes xx xx xx xx UIN Die UIN der jeweiligen User in der Kontakt-Liste

Die Information UIN wird natürlich jeweils für jeden Nutzer separat gesendet, wodurch diese so oft geschickt wird, wie bei NUM_CONTACTS definiert wurde.

SEARCH_UIN (1A 04) Suche nach einem User anhand seiner UIN

Parameter:
 

Länge Inhalt Name Beschreibung
2 Bytes xx xx SEARCH_SEQ_NUM Die Sequenz-Nummer des Suchvorgangs
4 Bytes xx xx xx xx SEARCHED_UIN Die gesuchte UIN

Die Sequenz-Nummer des Suchvorgangs muss zwingend eine eindeutige, noch nicht gebrauchte Nummer sein, um die Suche von einer anderen unterscheiden zu können. Die Antwort des Servers beinhaltet die SEARCH_SEQ_NUMMER, eventuelle Übereinstimmungen der Suche und natürlich die Antwort darauf.

SEARCH_USER (24 04) Suche nach einem User anhand seiner Daten

Parameter:
 

Länge Inhalt Name Beschreibung
2 Bytes xx xx SEARCH_SEQ_NUM Die Sequenz-Nummer des Suchvorgangs
2 Bytes xx xx LENGHT Die Länge des gesuchten Nicknames inklusive einer Null
X Bytes NICK_NAME Der Nickname, nach dem gesucht werden soll, inklusive einer Null
2 Bytes xx xx LENGHT Die Länge des gesichten Vornamens inklusive einer Null
X Bytes FIRST_NAME Der Vorname, nach dem gesucht werden soll, inklusive einer Null.
2 Bytes xx xx LENGHT Die Länge des gesuchten Nachnamens inklusive einer Null
X Bytes LAST_NAME  Der Nachname, nach dem gesucht werden soll, inklusive einer Null
2 Bytes xx xx LENGHT Die Länge der gesuchten E-Mail-Adresse inklusive einer Null
X Bytes E_MAIL Die E-Mail-Adresse, nach der gesucht werden soll, inklusive einer Null

Die Felder NICK_NAME, FIRST_NAME, LAST_NAME und E_MAIL können in einigen Suchvorgängen leer gelassen werden, jedoch nicht alle auf einmal: Mindestens ein Feld muss Daten enthalten.

KEEP_ALIVE (2E 04) Sende Information, dass noch immer eine Verbindung besteht

Parameter: Keine

Dieses Kommando sollte in regulären Intervallen von normalerweise 120 Sekunden vom Client an den Server geschickt werden, um die Verbindung zu jenem aufrecht zu erhalten.

Wenn ein ICQ-Nutzer eine Message oder URL an einen anderen schickt, der momentan mit dem Internet verbunden ist, so wird en ähnliches Paket-Schema durch die TCP-Verbindung übermittelt. Nach dem Versand wird die TCP-Verbindung nicht geschlossen, um zukünftige Nachrichten des Empfängers einzusehen. Diese TCP-Verbindung wird erst geschlossen, wenn einer der beiden Kommunikations-Partner den Status offline wählt.