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.
|