root/trunk/doc/icq091.txt

Revision 1111, 37.2 kB (checked in by kuhlmann, 8 years ago)

merge with stable

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 ########################
2 ##  THE ICQ PROTOCOL  ##
3 ########################
4
5 Version 0.91
6 Last update 12 April 1998
7 (Minor update 11 May 1998 and 26 August 1998)
8 Created by Magnus Ihse (d95-mih@nada.kth.se)
9 Copyright © 1998
10
11 The home page of this specification is
12 http://www.student.nada.kth.se/~d95-mih/icq/
13
14 To participate in the mailing list icq-devel, send a mail to
15 majordomo@lists.realminfo.com, with the message body consisting only of the
16 line "subscribe icq-devel".
17
18 About this document
19 -------------------
20 Please note: I am in no way affiliated with Mirabilis. This is an unofficial
21 specification, based solely on TCP/UDP packet traces and my own guesswork.
22 This means that the information in here might be (and probably _will_ be
23 :-)) incorrect. It also means that even _if_ some parts of this specification
24 _is_ correct, they may change at any moment due to the Divine Will of
25 Mirabilis.
26
27 I am a computer science student at the Royal Institute of Technology in
28 Sweden, and this is a hobby project - something I have been doing in my
29 free time (i.e., late in the nights :-)). This means that I don't have
30 much time to spend on updating this document.
31
32 Recently I have received a lot of requests for this document, and many
33 persons have offered to help me complete and correct it. I am very thankful
34 for such help, and all contributions will of cource receive proper credit.
35 Otherwere in this document is described in more detail what you can do to
36 help, and how you should do it.
37
38 Legal information
39 -----------------
40 Aa far as I can tell (but I am not a laywer), the way I have extracted
41 this information complies with Mirabilis License agreement, which states:
42 "You agree not to reverse engineer, decompile or disassemble the software."
43 I have not reverse engineered, decompiled or disassembled the software
44 (i.e. Mirabilis ICQ client) to get this information. I have only been
45 looking at the TCP and UDP packets send out from, and received by, my
46 computer.
47
48 If you are a Mirabilis employee, and you feel that this document still
49 violates the License agreement, or if you on other grounds think that
50 this document is dubious - please contact me as soon as possible!
51 (My e-mail address given at top of this document.)
52
53
54 Copyright
55 ---------
56 This document is protected under international copyright law. You may
57 not modify this document. You may, however, make an unlimited number
58 of copies of this document, as long as it is kept intact. You may
59 freely distribute this document electronically (on the Internet or
60 otherwise) or on paper.
61
62 Any trademarks mentioned in this text belongs to their respective owner.
63
64 Disclaimer
65 ----------
66 LICENSE AGREEMENT
67
68 This document and the information present herein is provided by Magnus Ihse
69 ("the Author") for your personal use only. You agree to the full
70 responsibility for the results of your use of this document or the information
71 present herein.
72
73 By using this document or the information present herein, you accept
74 the terms of this license agreement.
75
76 THIS INFORMATION IS PROVIDED ON AN "AS IS" BASIS. THE AUTHOR MAKES NO
77 WARRANTIES, EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THOSE OF
78 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THIS
79 DOCUMENT AND THE INFORMATION PRESENT HEREIN. THE AUTHOR DOES NOT WARRANT,
80 GUARANTEE OR MAKE ANY REPRESENTATIONS REGARDING THE USE OR THE RESULTS OF
81 THE USE OF THIS DOCUMENT OR THE INFORMATION PRESENT HEREIN, IN TERMS OF THE
82 ACCURACY, RELIABILITY, QUALITY, VALIDITY, STABILITY, COMPLETENESS,
83 CURRENTNESS, OR OTHERWISE. THE ENTIRE RISK OF USING THE INFORMATION PRESENT
84 IN THIS DOCUMENT IS ASSUMED BY THE USER.
85
86 IN NO EVENT WILL THE AUTHOR BE LIABLE TO ANY PARTY (i) FOR ANY DIRECT,
87 INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING,
88 BUT NOT LIMITED TO, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
89 INTERRUPTION, LOSS OF PROGRAMS OR INFORMATION, AND THE LIKE), OR ANY OTHER
90 DAMAGES ARISING IN ANY WAY OUT OF THE AVAILABILITY, USE, RELIANCE ON, OR
91 INABILITY TO USE THIS DOCUMENT OR THE INFORMATION PRESENT HEREIN, EVEN IF
92 THE AUTHOR HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, AND
93 REGARDLESS OF THE FORM OF ACTION, WHETHER IN CONTRACT, TORT, OR OTHERWISE;
94 OR (ii) FOR ANY CLAIM ATTRIBUTABLE TO ERRORS, OMISSIONS, OR OTHER
95 INACCURACIES IN, OR DESTRUCTIVE PROPERTIES OF ANY INFORMATION.
96
97 Writing an ICQ clone
98 --------------------
99 Since the public release of this document, at least two different ICQ clones
100 have been created. They are at the time of writing very much under
101 development, but are at least partly functioning. :-) More information can
102 be found on my web page, or through the icq-devel mailing list.
103 (For web page URL or subscription information, see top of this document.)
104
105 What needs to be done
106 ---------------------
107 The worst deficiency of this document is the lack of information about
108 version 3 and version 4 of the protocol. These versions are used by ICQ98
109 (older beta versions of ICQ98 seems to have used only version 3, the latest
110 version as of today seems to use both version 3 and version 4). This document
111 only describes version 2 of the protocol, which was used by versions up to
112 but not including ICQ98 (I think v1.113 was the latest version of ICQ using
113 version 2 of the protocol). Note that the ICQ version numbers refer to the
114 Windows 95/NT version of ICQ. I think that the Mac and Java version still
115 uses version 2, but I haven't checked this (please correct me if I'm wrong!).
116
117 So, what's the difference between version 2 and 3/4? As far as I can tell,
118 the major difference is that all packets in version 3/4 has some sort of
119 unique code attached to it. I think it is part of an anti-spoof scheme, but
120 I am not sure. I have not been able to figure out how this code is generated,
121 and I definitely need help on this. There are also minor changes in the
122 packet format. The basic structure still seems intact, however.
123
124 That this document doesn't cover version 3 and 4 doesn't mean that it can't
125 be used for building an ICQ clone, however. Mirabilis servers still supports
126 version 2 clients (or at least they did when I last checked). There is
127 reason to suspect that this might change some day, since the version 1
128 clients have been phased out, and are not useable any more.
129
130 Furthermore are there some fields in the packets which I just couldn't figure
131 out. You will find these marked "Unknown", and some typical value in the
132 Content column.
133
134 Many packet types are missing from this description for sure. If Mirabilis
135 have used all multiples of 10 for their codes, there seem to be a lot of
136 them missing. :-)
137
138 There is much about the peer-to-peer communication that still is not
139 clear to me. (This protocol seems not to have changed in ICQ98, however.)
140
141 And finally, some of the features of ICQ have not even been addressed in this
142 document. This includes file transfer and chat, but also some of the new
143 features of ICQ98.
144
145 If you can help in filling any of these gaps, or correct the information
146 given here, please do not hesitate to contact me! I'd prefer if you
147 send an e-mail to d95-mih@nada.kth.se with subject "ICQ Update".
148 (Please note! Sending an empty mail with the subject "ICQ Update" does
149 NOT mean that I'll mail you a copy of the spec when it's updated! If
150 you are interested in keeping up to date with the ICQ specification, please
151 join the mailing list instead.)
152
153 Introduction
154 ------------
155 Communication with persons online is done through a direct TCP connection
156 to that person. All other communication is done through UDP packets sent to
157 the ICQ server. All UDP packets must be acknowledged by the receiver.
158 Retransmission will occur in 10 seconds if a acknowledgement is not
159 received. After 6 unsuccessfull transmissions, a B_MESSAGE_ACK message will
160 be sent. The whole procedure is repeated 2 times. If there is still no
161 reply, the ICQ client will assume the user to be disconneced.
162
163 Before any communication between users can take place, the client must
164 register at the server by logging in. During the login process, the client
165 sends information about itself to the server, including its IP address, the
166 TCP port reserved for ICQ, the user's password and the user's contact list.
167 From now on, the client will assume itself to be 'connected', and will every
168 now and then send a 'keep alive' message to the server. This keep alive
169 message performs two functions: it makes the client sure that it still has
170 access to the server, and it makes the server sure that the user is still
171 online. By default, the client will 'connect' to the server on UDP port 4000.
172
173 Functions such as sending messages to offline users, getting information
174 about a user, searching for users in the ICQ Global Directory and changing
175 password is done by sending UDP packets to the ICQ server. These packets do
176 all follow a simple template, including the senders UIN, a special code
177 indicating which function the server should perform, and optional
178 parameters.
179
180 When a user sends a message/URL/etc to another user that is currently
181 connected, the ICQ client will establish a TCP connection directly to that
182 user, and send the message using a format similar (but not identical) to the
183 format used by the UDP packet messaging. After the message has been sent,
184 the TCP connection is not closed, but instead kept open and used for future
185 messages to that user. The connection is closed when either of the two users
186 disconnect from their ICQ connection.
187
188 Please note that throughout this document, all numbers are in hexadecimal
189 unless stated otherwise. Integers consisting of more than one byte is stored
190 with the least significant byte first, and the most significant byte last
191 (as is usual on the PC/Intel architecture). All text strings etc are
192 preceded by a two byte long LENGTH field, indicating the length of the
193 string. All strings are also NULL terminated, i.e. followed by the byte with
194 the value 00. When reading packets, either information may be used to
195 determine the length of the string, but when sending both must be present.
196 All strings are coded as usual MS Windows texts, i.e. in ISO Latin-1
197 charset, and lines terminated by CR/LF. (Not all strings may contain line
198 breaks. This should be clear from context.)
199
200
201
202          COMMUNICATION BETWEEN SERVER AND CLIENT USING UDP
203          =================================================
204
205
206 The UDP packet sent from the client to the server has the following general
207 layout:
208
209  Length   Content (if fixed)    Name             Description
210  ------   ------------------    ----             -----------
211  2 bytes  02 00                 VERSION          Identifies the packet as an ICQ packet
212  2 bytes  xx xx                 COMMAND          Code for service the server should provide
213  2 bytes  xx xx                 SEQ_NUM          Sequence number
214  4 bytes  xx xx xx xx           UIN              The senders UIN
215  variable                       PARAMETERS       0 or more parameters (depending on COMMAND)
216
217 The UDP packet sent from the server to the client has the following general
218 layout:
219
220  Length   Content (if fixed)    Name             Description
221  ------   ------------------    ----             -----------
222  2 bytes  02 00                 VERSION          Identifies the packet as an ICQ packet
223  2 bytes  xx xx                 COMMAND          Code for service the server should provide
224  2 bytes  xx xx                 SEQ_NUM          Sequence number
225  variable                       PARAMETERS       0 or more parameters (depending on COMMAND)
226
227 The VERSION field is present on all ICQ packets, and identifies the packet
228 as a ICQ message. The SEQ_NUM contains a sequence number for the packet. All
229 packets must have a unique sequence number (unless it is a retransmission).
230 This is used to avoid confusion if a UDP packet is lost or duplicated (as
231 may happen). Normally, the SEQ_NUM of the current packet is <the SEQ_NUM of
232 the previous packet> + 1. Note that the server and the client has separate
233 numbering, so that SEQ_NUM = 3 of a packet sent from the server is different
234 from SEQ_NUM = 3 of a packet sent from the client. Note also that the server
235 start counting on 00 00, and the client start counting on 01 00.
236
237 The following commands are available for the client to send to the server:
238
239  Code        Name             Description
240  ----        ----             -----------
241  0A 00       ACK              Acknowledgement
242  0E 01       SEND_MESSAGE     Send message through server (to offline user)
243  E8 03       LOGIN            Login on server
244  06 04       CONTACT_LIST     Inform the server of my contact list
245  1A 04       SEARCH_UIN       Search for user using his/her UIN
246  24 04       SEARCH_USER      Search for user using his/her name or e-mail
247  2E 04       KEEP_ALIVE       Sent to indicate connection is still up
248  38 04       SEND_TEXT_CODE   Send special message to server as text
249  4C 04       LOGIN_1          Sent during login
250  60 04       INFO_REQ         Request basic information about a user
251  6A 04       EXT_INFO_REQ     Request extended information about a user
252  9C 04       CHANGE_PASSWORD  Change the user's password
253  D8 04       STATUS_CHANGE    User has changed online status (Away etc)
254  28 05       LOGIN_2          Sent during login
255
256 Not yet described in detail (v0.1 of this document)
257  0A 05       UPDATE_INFO      Update my basic information
258  B0 04       UPDATE_EXT_INFO  Update my extended information
259  3C 05       ADD_TO_LIST      Add user to my contact list
260  56 04       REQ_ADD_TO_LIST  Request authorization to add to contact list
261  BA 04       QUERY_SERVERS    Query the server about address to other servers
262  C4 04       QUERY_ADDONS     Query the server about globally defined add-ons
263  EC 04       NEW_USER_1       Ask for permission to add a new user
264  FC 03       NEW_USER_REG     Register a new user
265  A6 04       NEW_USER_INFO    Send basic information about a new user
266  42 04       CMD_X1           *Unknown
267  56 04       MSG_TO_NEW_USER  Send a message to a user not on my contact list
268  (this one is also used to request permission to add someone with 'authorize'
269  status to your contact list)
270
271 The following commands can be sent from the server to the client, either as
272 a response to a client command, or to notify the client of some event.
273
274  Code        Name             Description
275  ----        ----             -----------
276  0A 00       ACK              Acknowledgement
277  5A 00       LOGIN_REPLY      Login reply
278  6E 00       USER_ONLINE      User on contact list is online/has changed online status
279  78 00       USER_OFFLINE     User on contact list has gone offline
280  8C 00       USER_FOUND       User record found matching search criteria
281  DC 00       RECEIVE_MESSAGE  Message sent while offline/through server
282  A0 00       END_OF_SEARCH    No more USER_FOUND will be sent
283  18 01       INFO_REPLY       Return basic information about a user
284  22 01       EXT_INFO_REPLY   Return extended information about a user
285  A4 01       STATUS_UPDATE    User on contact list has changed online status (Away etc)
286
287 Not yet described in detail (v0.1 of this document)
288  1C 02       REPLY_X1         *Unknown (returned during login)
289  E6 00       REPLY_X2         *Unknown (confirm my UIN?)
290  E0 01       UPDATE_REPLY     Confirmation of basic information update
291  C8 00       UPDATE_EXT_REPLY Confirmation of extended information update
292  46 00       NEW_USER_UIN     Confirmation of creation of new user and newly assigned UIN
293  B4 00       NEW_USER_REPLY   Confirmation of new user basic information
294  82 00       QUERY_REPLY      Response to QUERY_SEVERS or QUERY_ADDONS
295  C2 01       SYSTEM_MESSAGE   System message with URL'ed button
296
297 The UDP messages will now be examined in closer detail.
298
299
300
301          MESSAGES SENT BY THE CLIENT
302          ===========================
303
304
305 ACK (0A 00)  Acknowledgement
306 ---
307
308 Parameters: None
309
310 NOTE! Unlike all other commands, in ACK the field SEQ_NUM contains the
311 sequence number of the *server's* packet the client wishes to acknowledge.
312 Note further that an ACK should *not* be acknowledged!
313
314
315 SEND_MESSAGE (0E 01)  Send message through server (to offline user)
316 ------------
317
318 Parameters:
319  Length   Content (if fixed)    Name             Description
320  ------   ------------------    ----             -----------
321  4 bytes  xx xx xx xx           RECEIVER_UIN     UIN of the user the message is sent to
322  2 bytes  (see below)           MESSAGE_TYPE     Type of message being sent
323  2 bytes  xx xx                 LENGTH           Length of MESSAGE including NULL
324  variable                       MESSAGE          The message, ended by a NULL (00)
325
326 MESSAGE_TYPE can be one of the following:
327  01 00 - the message is a normal message
328  04 00 - the message is an URL, and actually consists of two parts,
329  separated by the code FE.
330 The first part is the description of the URL, and the second part is the
331 actual URL.
332
333
334 LOGIN (E8 03)  Login on server
335 -----
336
337 Parameters:
338  Length   Content (if fixed)    Name             Description
339  ------   ------------------    ----             -----------
340  4 bytes  xx xx xx xx           PORT             The TCP port to use for incoming connections
341  2 bytes  xx xx                 LENGTH           Length of PASSWORD including NULL
342  variable                       PASSWORD         The user's password + NULL (max 8 chars)
343  4 bytes  78 00 00 00           X1               *Unknown
344  4 bytes  xx xx xx xx           USER_IP          The user's IP address
345  1 byte   04                    X2               *Unknown
346  4 bytes  xx xx xx xx           STATUS           Users online status (normally 00 00 00 00)
347  4 bytes  02 00 00 00           X3               *Unknown
348  2 bytes  xx xx                 LOGIN_SEQ_NUM    Login sequence number
349  4 bytes  00 00 00 00           X4               *Unknown
350  4 bytes  08 00 78 00           X5               *Unknown
351
352
353 CONTACT_LIST (06 04)  Inform the server of my contact list
354 ------------
355
356 Parameters:
357  Length   Content (if fixed)    Name             Description
358  ------   ------------------    ----             -----------
359  2 bytes  xx xx                 NUM_CONTACTS     Number of contacts following
360 {4 bytes  xx xx xx xx           UIN              UIN of user on contact list }
361 The last field is repeated for as many users as NUM_CONTACTS indicate.
362
363 The server will send online/offline notification to client only of users
364 registered using CONTACT_LIST.
365
366
367 SEARCH_UIN (1A 04)  Search for user using his/her UIN
368 ----------
369
370 Parameters:
371  Length   Content (if fixed)    Name             Description
372  ------   ------------------    ----             -----------
373  2 bytes  xx xx                 SEARCH_SEQ_NUM   Search sequence number
374  4 bytes  xx xx xx xx           SEARCHED_UIN     The UIN to search for
375
376 The SEARCH_SEQ_NUM should be a unique number, to distinguish from other
377 searches. The reply from the server will contain the SEARCH_SEQ_NUM of the
378 search, to facitilate matching query and answer.
379
380
381 SEARCH_USER (24 04)  Search for user using his/her name or e-mail
382 -----------
383
384 Parameters:
385  Length   Content (if fixed)    Name             Description
386  ------   ------------------    ----             -----------
387  2 bytes  xx xx                 SEARCH_SEQ_NUM   Search sequence number
388  2 bytes  xx xx                 LENGTH           Length of NICK_NAME including NULL
389  variable                       NICK_NAME        Nick name to search for, NULL terminated
390  2 bytes  xx xx                 LENGTH           Length of FIRST_NAME including NULL
391  variable                       FIRST_NAME       First name to search for, NULL terminated
392  2 bytes  xx xx                 LENGTH           Length of LAST_NAME including NULL
393  variable                       LAST_NAME        Nick name to search for, NULL terminated
394  2 bytes  xx xx                 LENGTH           Length of E_MAIL including NULL
395  variable                       E_MAIL           E-mail to search for, NULL terminated
396
397 Note that search fields (NICK_NAME, FIRST_NAME, LAST_NAME, E_MAIL) may be
398 empty, but not all at the same time, i.e. at least one field must contain
399 data. Note also that you may only search either on E_MAIL (in which the
400 other fields must be empty), or on name (in which E_MAIL must be empty, and
401 one or more of the other fields must contain data).
402
403
404 KEEP_ALIVE (2E 04)  Sent to indicate connection is still up
405 ----------
406
407 Parameters: None
408
409 This command should be sent at regular intervals (normally every 2 minutes,
410 or 120 seconds) from the client to the server.
411
412
413 SEND_TEXT_CODE (38 04)  Send special message to server as text
414 --------------
415
416 Parameters:
417  Length   Content (if fixed)    Name             Description
418  ------   ------------------    ----             -----------
419  2 bytes  xx xx                 LENGTH           Length of TEXT_CODE including NULL
420  variable                       TEXT_CODE        Message to send to server, NULL terminated
421  2 bytes  xx xx                 X1               *Unknown (code, usually 04 00 or 05 00)
422
423 The TEXT_CODE can contain for instance:
424  "B_USER_DISCONNECTED" (in which case the X1 field should containt 05 00) if
425   the user has disconnected.
426  "B_MESSAGE_ACK" (in which case the X1 field should containt 05 00) if the
427   client has problem connecting to the server. This is a request for the
428   server to answer immediately to the client.
429
430
431 LOGIN_1 (4C 04)  Sent during login
432 -------
433
434 Parameters: None
435
436 This is sent during login. The exact purpose of this command is *Unknown.
437
438
439 INFO_REQ (60 04)  Request basic information about a user
440 --------
441
442 Parameters:
443  Length   Content (if fixed)    Name             Description
444  ------   ------------------    ----             -----------
445  2 bytes  xx xx                 INFO_SEQ_NUM     Information sequential number
446  4 bytes  xx xx xx xx           QUERY_UIN        UIN of user to request information about
447
448 The server will respond with a INFO_REPLY, with the same INFO_SEQ_NUM.
449
450
451 EXT_INFO_REQ (6A 04)  Request extended information about a user
452 ------------
453
454 Parameters:
455  Length   Content (if fixed)    Name             Description
456  ------   ------------------    ----             -----------
457  2 bytes  xx xx                 INFO_SEQ_NUM     Information sequential number
458  4 bytes  xx xx xx xx           QUERY_UIN        UIN of user to request information about
459
460 The server will respond with a EXT_INFO_REPLY, with the same INFO_SEQ_NUM.
461
462
463 CHANGE_PASSWORD (9C 04)  Change the user's password
464 ---------------
465
466 Parameters:
467  Length   Content (if fixed)    Name             Description
468  ------   ------------------    ----             -----------
469  2 bytes  xx xx                 PASSWORD_SEQ_NUM Password changing sequential number
470  2 bytes  xx xx                 LENGTH           Length of NEW_PASSWORD including NULL
471  variable                       NEW_PASSWORD     The new password, NULL terminated (max 8 chars)
472
473
474 STATUS_CHANGE (D8 04)  User has changed online status (Away etc)
475 -------------
476
477 Parameters:
478  Length   Content (if fixed)    Name             Description
479  ------   ------------------    ----             -----------
480  4 bytes  (see below)           STATUS           User's online status (Away etc)
481
482 The STATUS may take four different values:
483  00 00 00 00 = Online/connected
484  01 00 00 00 = Away
485  11 00 00 00 = Do Not Disturb (DND)
486  00 01 00 00 = Invisible
487
488
489 LOGIN_2 (28 05)  Sent during login
490 -------
491
492 Parameters:
493  Length   Content (if fixed)    Name             Description
494  ------   ------------------    ----             -----------
495  1 byte   00                    X1               *Unknown
496
497
498
499          MESSAGES SENT BY THE SERVER
500          ===========================
501
502
503 ACK (0A 00)  Acknowledgement
504 ---
505
506 Parameters: None
507
508 NOTE! Unlike all other commands, in ACK the field SEQ_NUM contains the
509 sequence number of the *client's* packet the server acknowledges. Note
510 further that an ACK should *not* be acknowledged!
511
512
513 LOGIN_REPLY (5A 00)  Login reply
514 -----------
515
516 Parameters:
517  Length   Content (if fixed)    Name             Description
518  ------   ------------------    ----             -----------
519  4 bytes  xx xx xx xx           USER_UIN         The user's UIN
520  4 bytes  xx xx xx xx           USER_IP          The user's IP address
521  2 bytes  xx xx                 LOGIN_SEQ_NUM    Login sequence number
522  4 bytes  01 00 01 00           X1               *Unknown
523  4 bytes  xx 00 16 00           X2               *Unknown (xx=19 or 18)
524  4 bytes  8C 00 00 00           X3               *Unknown
525  4 bytes  78 00 05 00           X4               *Unknown
526  6 bytes  0A 00 05 00 01 00     X5               *Unknown
527
528 This is sent from the server upon receipt of a LOGIN. The LOGIN_SEQ_NUM is
529 the same as in the corresponding LOGIN.
530
531
532 USER_ONLINE (6E 00)  User on contact list is online/has changed online status
533 -----------
534
535 Parameters:
536  Length   Content (if fixed)    Name             Description
537  ------   ------------------    ----             -----------
538  4 bytes  xx xx xx xx           REMOTE_UIN       The UIN of the user who has logged in
539  4 bytes  xx xx xx xx           REMOTE_IP        The IP address of the user
540  4 bytes  xx xx xx xx           REMOTE_PORT      The TCP port of the user
541  4 bytes  xx xx xx xx           REMOTE_REAL_IP   The actual IP address of the user
542  1 byte   04                    X1               *Unknown
543  4 bytes  xx xx xx xx           STATUS           New status of the user
544  4 bytes  02 00 00 00           X2               *Unkown
545
546 The REMOTE_IP is the "outer" IP address of the remote user, the
547 REMOTE_REAL_IP is the "inner" IP address. These two will be identical unless
548 the remote user is behind a firewall. The REMOTE_IP is the "official" IP
549 address, as shown e.g. by the Info box in the client. The REMOTE_PORT is the
550 TCP port number to use when the client wishes to open a direct connection
551 to the remote user.
552
553
554 USER_OFFLINE (78 00)  User on contact list has gone offline
555 ------------
556
557 Parameters:
558  Length   Content (if fixed)    Name             Description
559  ------   ------------------    ----             -----------
560  4 bytes  xx xx xx xx           REMOTE_UIN       The UIN of the user who has logged out
561
562
563 USER_FOUND (8C 00)  User record found matching search criteria
564 ----------
565
566 Parameters:
567  Length   Content (if fixed)    Name             Description
568  ------   ------------------    ----             -----------
569  2 bytes  xx xx                 SEARCH_SEQ_NUM   Search sequence number
570  4 bytes  xx xx xx xx           FOUND_UIN        Found user's UIN
571  2 bytes  xx xx                 LENGTH           Length of NICK_NAME including NULL
572  variable                       NICK_NAME        Found user's nick name, NULL terminated
573  2 bytes  xx xx                 LENGTH           Length of FIRST_NAME including NULL
574  variable                       FIRST_NAME       Found user's first name, NULL terminated
575  2 bytes  xx xx                 LENGTH           Length of LAST_NAME including NULL
576  variable                       LAST_NAME        Found user's last name, NULL terminated
577  2 bytes  xx xx                 LENGTH           Length of E_MAIL including NULL
578  variable                       E_MAIL           Found user's e-mail, NULL terminated
579  1 byte   xx                    AUTHORIZE        User's authorization status
580
581 For each user found matching the criterion, a USER_FOUND will be returned.
582 When all USER_FOUND's have been sent, the server will send an END_OF_SEARCH.
583 If no users where found matching the criterion, an END_OF_SEARCH will be
584 sent immediately, and no USER_FOUND will be sent. The AUTHORIZE determine
585 wether the user allow anyone to include him/her on their contact list, or
586 wether the user must accept first. Possible values of AUTHORIZE:
587  00 = The user must authorize the client to include him/her on the client's
588  contact list
589  01 = The user allows anyone to include him/her on their contact list
590
591
592 RECEIVE_MESSAGE (DC 00)  Message sent while offline/through server
593 ---------------
594
595 Parameters:
596  Length   Content (if fixed)    Name             Description
597  ------   ------------------    ----             -----------
598  4 bytes  xx xx xx xx           REMOTE_UIN       The sending user's UIN
599  2 bytes  xx xx                 YEAR             The year the message was sent
600  1 byte   xx                    MONTH            The month the message was sent
601  1 byte   xx                    DAY              The day of the month the message was sent
602  1 byte   xx                    HOUR             The hour the message was sent in GMT
603  1 byte   xx                    MINUTE           The minute the message was sent
604  2 bytes  xx xx                 TYPE             The type of message (message, URL, etc)
605  2 bytes  xx xx                 LENGTH           Length of MESSAGE including NULL
606  variable                       MESSAGE          The message sent, NULL terminated
607
608 Note that the HOUR contains the local time - 1 (unless GMT is involved
609 somehow?). The TYPE identifies the type of message this is:
610  01 00 = Normal message
611  04 00 = URL (MESSAGE contains first the description, then a FE, and then
612  the actual URL)
613  0C 00 = 'You were added' message. (MESSAGE contains: <nick name> FE <first
614  name> FE <last name> FE <e-mail> FE <ASCII authorize>. The <ASCII
615  authorize> is '1' (31) if the user allows anyone to add him/her to their
616  contact list, and '0' (30) otherwise.)
617
618
619 END_OF_SEARCH (A0 00)  No more USER_FOUND will be sent
620 -------------
621
622 Parameters:
623  Length   Content (if fixed)    Name             Description
624  ------   ------------------    ----             -----------
625  2 bytes  xx xx                 SEARCH_SEQ_NUM   Search sequence number
626  1 byte   xx                    MORE_FOUND       More users found but not displayed?
627
628 If MORE_FOUND is 00, then the returned USER_FOUND's contain information
629 about all matching users. If MORE_FOUND is 01 however, then the server has
630 found more users matching, but will not display more matches. The limit is
631 drawn by 40 users. If a search request results in more than 40 matches,
632 only the 40 first will be sent to the client, and MORE_FOUND will be set to
633 01.
634
635
636 INFO_REPLY (18 01)  Return basic information about a user
637 ----------
638
639 Parameters:
640  Length   Content (if fixed)    Name             Description
641  ------   ------------------    ----             -----------
642  2 bytes  xx xx                 INFO_SEQ_NUM     Information sequence number
643  4 bytes  xx xx xx xx           REMOTE_UIN       The remote user's UIN
644  2 bytes  xx xx                 LENGTH           Lenght of NICK_NAME including NULL
645  variable                       NICK_NAME        The remote user's nick name
646  2 bytes  xx xx                 LENGTH           Lenght of FIRST_NAME including NULL
647  variable                       FIRST_NAME       The remote user's first name
648  2 bytes  xx xx                 LENGTH           Lenght of LAST_NAME including NULL
649  variable                       LAST_NAME        The remote user's last name
650  2 bytes  xx xx                 LENGTH           Lenght of E_MAIL including NULL
651  variable                       E_MAIL           The remote user's e-mail
652  1 byte   xx                    AUTHORIZE        User's authorization status
653
654 Note that the parameters are identical to command USER_FOUND (8C 00). For
655 more information about the fields, see USER_FOUND.
656
657 EXT_INFO_REPLY (22 01)  Return extended information about a user
658 --------------
659
660 Parameters:
661  Length   Content (if fixed)    Name             Description
662  ------   ------------------    ----             -----------
663  2 bytes  xx xx                 INFO_SEQ_NUM     Information sequence number
664  4 bytes  xx xx xx xx           REMOTE_UIN       The remote user's UIN
665  2 bytes  xx xx                 LENGTH           Lenght of CITY including NULL
666  variable                       CITY             The remote user's city
667  2 bytes  xx xx                 COUNTRY_CODE     The remote user's country code
668  1 byte   xx                    COUNTRY_STATUS   Indicates if COUNTRY_CODE is entered or not
669  2 bytes  xx xx                 LENGTH           Lenght of STATE including NULL
670  variable                       STATE            The remote user's state (USA only)
671  2 bytes  xx xx                 AGE              The remote user's age
672  1 byte   xx                    SEX              The remote user's sex
673  2 bytes  xx xx                 LENGTH           Lenght of PHONE including NULL
674  variable                       PHONE            The remote user's city
675  2 bytes  xx xx                 LENGTH           Lenght of HOME_PAGE including NULL
676  variable                       HOME_PAGE        The remote user's city
677  2 bytes  xx xx                 LENGTH           Lenght of ABOUT including NULL
678  variable                       ABOUT            The remote user's city
679
680 The code used in COUNTRY_CODE is the international telephone prefix, e.g.
681 01 00 (1) for the USA, 2C 00 (44) for the UK, 2E 00 (46) for Sweden, etc.
682 COUNTRY_STATUS is normally FE, unless the remote user has not entered a
683 country, in which casse COUNTRY_CODE will be FF FF, and COUNTRY_STATUS will
684 be 9C. The field AGE has the value FF FF if the user has not entered his/her
685 age. The field SEX has three (!) possible values:
686  00 = Not specified
687  01 = Female
688  02 = Male
689 The ABOUT field is an optional free form field that allows the user to make
690 a personal presentation of himself/herself.
691
692
693 STATUS_UPDATE (A4 01)  User on contact list has changed online status (Away etc)
694 -------------
695
696 Parameters:
697  Length   Content (if fixed)    Name             Description
698  ------   ------------------    ----             -----------
699  4 bytes  xx xx xx xx           REMOTE_UIN       UIN of the user whos status has changed
700  4 bytes  xx xx xx xx           STATUS           The new online status of the user
701
702 The online status in STATUS is the same as used in STATUS_CHANGE (D8 04).
703 See STATUS_CHANGE for details.
704
705
706
707          COMMUNICATION BETWEEN TWO CLIENTS USING TCP (Peer to peer mode)
708          ===============================================================
709
710 When a user wishes to send a message, an URL etc, to another user (called
711 the "remote" user as opposite to the "local" user), the local user first
712 checks to see if a TCP connection already is established to that user. If
713 so is the case, then that connection will be used. If not, the user checks
714 the remote users IP address and port number (information sent to the user
715 from the server when the remote user logged in), and makes a connection to
716 that address. Typical port numbers are in the range 1200-1300 (decimal).
717 When a new connection is formed, a CHANNEL_INIT message must be sent. From
718 there on, however, every time the user wishes to send a message, a
719 CHANNEL_MESSAGE is sent. All messages sent must be acknowledged by the other
720 side, using CHANNEL_ACK. Furthermore, all messages is replied to by another
721 message from the receiver - which most often is empty, unless the user has
722 posted a Away/DND message, in case this will be sent as a reply.
723
724 The TCP communication is similar to the UDP communication, in that all
725 communication is done trough separate packets (often, but now always
726 associated with individual TCP packets). Each packet must contain the
727 packet's length (excluding the length count) as the first two bytes. Most
728 messages contains the senders UIN as the next field.
729
730 CHANNEL_INIT  Initiate inter-user communication using TCP
731 ------------
732
733 Parameters:
734  Length   Content (if fixed)    Name             Description
735  ------   ------------------    ----             -----------
736  2 bytes  1A 00                 LENGTH           Length of this packet
737  1 byte   FF                    INIT_IDENT       Identifies this packet as an initiation
738  4 bytes  02 00 00 00           X1               *Unknown
739  4 bytes  00 00 00 00           X2               *Unknown
740  4 bytes  xx xx xx xx           MY_UIN           The local user's UIN
741  4 bytes  xx xx xx xx           MY_IP            The user's IP address
742  4 bytes  xx xx xx xx           MY_IP_REAL       The user's actual IP address
743  1 byte   04                    X3               *Unknown
744  4 bytes  xx xx xx xx           MY_PORT          The user's TCP port for incoming messages
745
746 Note that the port used for the "outgoing" connection is different from
747 MY_PORT, the port other clients use to connect to this client. For the
748 difference between MY_IP and MY_IP_REAL, see USER_ONLINE.
749
750 CHANNEL_MESSAGE  Send message to online user
751 ------------
752
753 Parameters:
754  Length   Content (if fixed)    Name             Description
755  ------   ------------------    ----             -----------
756  2 bytes  xx xx                 LENGTH           Length of this packet
757  4 bytes  xx xx xx xx           UIN              The local user's UIN
758  2 bytes  02 00                 VERSION          Identifies this as a ICQ packet
759  2 bytes  EE 07                 MSG_COMMAND      The message type for CHANNEL_MESSAGE
760  2 bytes  00 00                 X1               *Unknown
761  4 bytes  xx xx xx xx           UIN_2            The local user's UIN
762  2 bytes  xx xx                 TYPE             Message type
763  2 bytes  xx xx                 LENGTH           Length of MESSAGE including NULL
764  variable                       MESSAGE          The message to be sent, NULL terminated
765  4 bytes  xx xx xx xx           MY_IP_REAL       The user's actual IP address
766  4 bytes  xx xx xx xx           MY_IP            The user's IP address
767  4 bytes  xx xx xx xx           PORT             The user's TCP port for incoming messages
768  1 byte   04                    X2               *Unknown
769  2 bytes  00 00                 X3               *Unknown
770  2 bytes  xx xx                 CMD_TYPE         Identifies message as new message or reply
771  4 bytes  xx xx xx xx           X4               *Unknown (checksum? sequence number?)
772
773 The TYPE is the same as described in RECEIVE_MESSAGE. The difference between
774 MY_IP and MY_IP_REAL is described in USER_ONLINE. The CMD_TYPE can have two
775 possible values:
776  10 00 = This is a new ('real', user initiated) message
777  00 00 = This is an auto reply
778 The auto reply is sent as an acknowledgement to all 'real' messages. They
779 usually contains an empty message, but if the remote user is 'Away' or in
780 DND mode, the reply will contain the Away/DND message. The X4 field is a
781 bit tricky. It is always between 00 FF FF FF and FF FF FF FF, but the exact
782 function of the field is unknown.
Note: See TracBrowser for help on using the browser.