previous up next index search
Previous: 4.5.15.2 Расширяемый протокол обмена сообщениями и данными о присутствии (XMPP): Ядро    UP: 4.5.15 Диалог в локальных сетях и в Интернет
    Next: 4.5.15.4 Система Skype

4.5.15.3 ICQ

Семенов Ю.А. (ИТЭФ-МФТИ)
Yu. Semenov (ITEP-MIPT)

Сообщения, посылаемые клиентом
Сообщения, посылаемые сервером
Коммуникации между двумя клиентами с использованием TCP (режим узел-узел)

Протокол ICQ обеспечивает обмен сообщениями в режимах клиент-сервер и клиент-клиент. Идея данного протокола принадлежит израильтянам Яру Голдфингеру (Yair Goldfinger), Арику Валди (Arik Valdi), Сефи Вигизеру (Sefi Visiger) и Амнону Амиру (Amnon Amir). Именно эти люди создали в 1996 году компанию Mirabilis для предоставления клиентам нового вида обмена сообщениями. Протокол ICQ конкурировал с несколькими другими схожими решениями и победил.

Данный протокол позволяет пользователям Интернет легко находить друг друга и столь же легко общаться. Вспомним, что для общения через электронную почту нужно знать почтовый адрес партнера. В ICQ предусмотрена возможность обмена сообщениями более чем с одним партнером (каждому из участников на экране выделяется индивидуальное окно). Для транспортировки данных могут использоваться протоколы UDP (версии 1-5) или TCP (версии выше 6). Те, кто работал с UNIX, возможно пользовались системами обмена сообщениями TALK или PHONE. Эти системы похожи на ICQ, но они предполагают знание LOG-имен партнеров.

Через четыре месяца после основания фирмы Mirabilis появилась первая версия реализации ICQ ("I seek you"). В июне 1998 года по инициативе America Online приемником Mirabilis Ltd. стала компания ICQ Inc. (см. также http://home.cnet.com/, http://www.mirabilis.com или www.megasecurity.org).

Каждый пользователь ICQ имеет список людей, с которыми он/она хочет общаться. Этот список может увеличиваться. Для каждого пользователя из контактного списка отображается его статус.

Протокол ICQ позволяет передавать не только сообщения, но и файлы. К сожалению существует несколько модификаций стандарта. Кроме того, следует учитывать тот факт, что протокол ICQ не является публичным (права на него принадлежат компании Mirabilis). По этой причине приводимые описания нельзя считать официальными и приводятся здесь исключительно для образовательных целей.. На рис. 1 показана общая схема взаимодействия пользователей с сервером и друг с другом.

Рис. 1. Схема взаимодействия пользователей в ICQ

Первоначально пользователи устанавливают соединение с ICQ-сервером. После авторизации и выбора партнера пользователи могут установить соединение непосредственно между собой, минуя сервер (например, клиенты, отмеченные цифрами 1 и 3). Пользователи могут быть подключенными к серверу (режим on-line) и отключенными (2,6, 9 и 11; режим off-line). На рис. 2 показан формат пакета ICQv4.

Рис. 2. Формат кадра для ICQv4

На рис. 3 показан формат кадра версии ICQ 5.

Заголовок пакета ICQ (сторона клиента)
ДлинаСодержимое (если задано) НазначениеОписание
2 байта05 00ВерсияВерсия протокола
4 байта00 00 00 00НульПросто нули, назначение не известно
4 байтаxx xx xx xxUINУникальный UIN клиента
4 байта77 72 55 FCID-cессииИспользуется для предотвращения фальсификации
2 байтаEE C2Команда 
2 байтаA4 01SEQ_NUM1Начинается со случайного значения
2 байтаE8 C6SEQ_NUM2Начинается с 1
4 байтахх хх хх xхCHECKCODE  
Переменнаяxx …ПараметрыПараметры посланной команды

Рис. 3. Формат кадра для ICQv5

Первые два байта характеризуют версию протокола. Далее после четырех нулевых октетов следует уникальный идентификатор клиента UIN. После идентификатора сессии следует код команды. В данном конкретном случае код коданды для разрыва соедиения - 0xC2EE (обратный порядок байтов). Поля ID-сессии и порядковые номера (SEQ_NUM1,SEQ_NUM2) служат для целей безопасности.

Контакт с партнером устанавливается через TCP соединение. Все остальные коммуникации осуществляются с использованием UDP дейтограмм, посылаемых ICQ-серверу. Получение всех UDP-дейтограмм должны подтверждаться получателем. Если в течение 10 секунд не пришло подтверждение, происходит повторная передача. После 6 неудачных повторных передач посылается сообщение B_MESSAGE_ACK. Процедура повторяется 2 раза. Если отклика не получено, ICQ клиент считается отключенным.

Прежде чем коммуникация между пользователями станет возможной, клиент должен зарегистрироваться в сервере. В процессе авторизации, клиент посылает серверу данные о себе, включая свой IP-адрес, TCP-порт, зарезервированный для ICQ, пароль пользователя и контактный список. С этого момента клиент считает себя подключенным, и будет посылать регулярно серверу сообщения 'keep alive' (еще жив). Эти сообщения выполняют две функции: это позволяет клиенту быть уверенным в том, что он имеет доступ к серверу, а серверу знать, что клиент все еще подключен. По умолчанию клиент будет подключен к серверу через UDP порт 4000. Такие функции как отправка сообщений пользователям offline, получение информации о пользователе, поиск пользователей в глобальном каталоге ICQ и изменение пароля осуществляется путем посылки UDP дейтограмм ICQ серверу. Все эти пакеты следуют простому шаблону, включая UIN отправителя, специальный код, определяющий функцию, которую должен осуществить сервер, и опционные параметры.

Когда пользователь посылает сообщение /URL/и т.д. другому пользователю, который подключен к серверу, клиент ICQ установит TCP соединение непосредственно с этим пользователем, и посылает сообщение, используя формат, сходный с (но не идентичный) используемым при отправке UDP пакетов. После того как сообщение послано, TCP соединение не прерывается, а сохраняется открытым и используется для последующего обмена сообщениями. Соединение закрывается, когда любой из пользователей разрывает ICQ соединение.

Все текстовые строки начинаются с двухбайтового поля длины, указывающего число байт в строке. Любые строки в данном протоколе завершаются кодом 00. При чтении пакетов может использоваться любая информация для определения, длины строки, но при отправке следует использовать как поле длины, так и завершающие два нулевых байта. Все строки используют кодировку MS Windows, т.e. символьный набор ISO Latin-1, а текстовые строки завершаются CR/LF. (Не все строки могут содержать разрывы строк.)

Поле VERSION присутствует во всех ICQ пакетах, и идентифицируют пакет как ICQ сообщение. Поле SEQ_NUM содержит порядковый номер пакета. Все пакеты должны иметь уникальный порядковый номер (если это только не повторная передача). Это делается для того, чтобы исключить путаницу, если UDP пакет потерян или задублирован. В норме, SEQ_NUM текущего пакета равен <SEQ_NUM предыдущего пакета> + 1. Заметим, что сервер и клиент имеют разную нумерацию, так что SEQ_NUM = 3 пакета, посланного сервером отличается от SEQ_NUM = 3 пакета, посланного клиентом. Заметим также, что сервер начинает нумерацию с 00 00, а клиент - с 01 00.

Ниже представлен список команд, которые может послать клиент серверу:

КодИмяОписание
0A 00ACKAcknowledgement (подтверждение)
0E 01SEND_MESSAGEПослать сообщение через сервер (to offline user)
E8 03LOGINАвторизоваться на сервере
06 04CONTACT_LISTПроинформировать сервер о моем контактном списке
1A 04SEARCH_UINПоиск пользователя, используя его/ее UIN
24 04SEARCH_USERПоиск пользователя, используя его/ее имя или e-mail
2E 04KEEP_ALIVEПослать сообщение для уведомления того, что соединение еще активно
38 04SEND_TEXT_CODEПослать специальное сообщение серверу в виде текста
4C 04LOGIN_1Послать сообщение в процессе авторизации
60 04INFO_REQЗапросить базовую информацию о пользователе
6A 04EXT_INFO_REQЗапросить расширенную информацию о пользователе
9C 04CHANGE_PASSWORDИзменить пароль пользователя
D8 04STATUS_CHANGEПользователь изменил свой статус (ушел и т.д.)
28 05LOGIN_2Послать сообщение в процессе авторизации
Некоторые дополнительные команды
0A 05UPDATE_INFOОбновить мои базовые данные
B0 04UPDATE_EXT_INFOОбновить мои расширенные данные
3C 05ADD_TO_LISTДобавить пользователя в мой контактный список
56 04REQ_ADD_TO_LISTЗапросить авторизацию, чтобы добавить пользователя в контактный список
BA 04QUERY_SERVERSЗапрос серверу об адресах других серверов
C4 04QUERY_ADDONSЗапрос серверу о глобальных добавлениях
EC 04NEW_USER_1Попросить разрешение добавить нового пользователя
FC 03NEW_USER_REGЗарегистрировать нового пользователя
A6 04NEW_USER_INFOSend basic information about a new user
42 04CMD_X1Не известно
56 04MSG_TO_NEW_USERПослать сообщение пользователю, которого нет в моем контактном списке

Следующие команды могут быть посланы сервером клиенту, либо в качестве отклика на команду клиента, либо для уведомления клиента о некотором событии.


КодИмяОписание
0A 00ACKAcknowledgement (подтверждение)
5A 00LOGIN_REPLYОтклик авторизации
6E 00USER_ONLINEПользователь из контактного списка, который активен в данное время, изменил свой статус
78 00USER_OFFLINEПользователь из контактного списка вышел (статус=offline)
8C 00USER_FOUNDВ рекорде пользователя найдено соответствие критериям поиска
DC 00RECEIVE_MESSAGEСообщение через сервер послано в период offline
A0 00END_OF_SEARCHНе будет более послано USER_FOUND
18 01INFO_REPLYВозвращение базовой информации о пользователе
22 01EXT_INFO_REPLYВозвращение расширенной информации о пользователе
A4 01STATUS_UPDATEПользователь из контактного списка, который активен в данное время, изменил свой статус
Некоторые дополнительные команды
1C 02REPLY_X1Не известно (присылается во время авторизации)
E6 00REPLY_X2Не известно (мой UIN подтверждается?)
E0 01UPDATE_REPLYПодтверждение обновления базовой информации
C8 00UPDATE_EXT_REPLYПодтверждение обновления расширенной информации
46 00NEW_USER_UINПодтверждение создания нового пользователя и нового присвоенного UIN
B4 00NEW_USER_REPLYПодтверждение базовой информации нового пользователя
82 00QUERY_REPLYОтклик на QUERY_SEVERS или QUERY_ADDONS
C2 01SYSTEM_MESSAGEСистемное сообщение от кнопки с URL

Далее UDP-сообщения будут рассмотрены более подробно.

Сообщения, посылаемые клиентом

ACK (0A 00) Acknowledgement (подтверждение)

Параметры: Нет

Замечание. В отличии от других команд, в ACK поле SEQ_NUM содержит порядковый номер пакета сервера, который хочет подтвердить клиент. Заметим, что получение подтверждения никогда не подтверждается.

SEND_MESSAGE (0E 01) Послать сообщение через сервер (to offline user)

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxRECEIVER_UINСообщение UIN пользователя послано адресату
2 байта(см. ниже)MESSAGE_TYPEТип посланного сообщения
2 байтаxx xxLENGTHДлина сообщения, включая NULL
переменная MESSAGEСообщение, завершаемое NULL (00)

MESSAGE_TYPE может принимать одно из следующих значений:

01 00 - сообщение является обычным
04 00 - сообщения является URL, и реально состоит из двух частей, разделенных кодом FE.

Первая часть - описание URL, а вторая часть реальное URL.

LOGIN (E8 03) Login on server (авторизация на сервере)

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxPORTНомер TCP порта для входящего соедиения
2 байтаxx xxLENGTHДлина PASSWORD, включая NULL
переменная PASSWORDПароль пользователя + NULL (максимум 8 символов)
4 байта78 00 00 00X1Не известно
4 байтаxx xx xx xxUSER_IPIP-адрес пользователя
1 байт04X2Не известно
4 байтаxx xx xx xxSTATUSТекущий статус пользователя (в норме 00 00 00 00)
4 байта02 00 00 00X3Не известно
2 байтаxx xxLOGIN_SEQ_NUMПорядковый номер авторизации
4 байта00 00 00 00X4Не известно
4 байта08 00 78 00X5Не известно

CONTACT_LIST (06 04) Проинформировать сервер о моем контактном списке

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxNUM_CONTACTSСледующее число контактов
4 байтаxx xx xx xxUINUIN пользователя из контактного списка. Последнее поле повторяется столько раз, сколько пользователей указано в NUM_CONTACTS

Сервер пошлет уведомление online/offline пользователям, зарегистрированным через уведомление CONTACT_LIST.

SEARCH_UIN (1A 04) Поиск пользователя по его/ее UIN

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxSEARCH_SEQ_NUMПорядковый номер поискового запроса
4 байтаxx xx xx xxSEARCHED_UINUIN, который надо найти

Значение SEARCH_SEQ_NUM должно быть уникальным числом, чтобы исключить неоднозначность при поиске. Отклик сервера будет содержать SEARCH_SEQ_NUM, чтобы обеспечить соответствие запроса и отклика.

SEARCH_USER (24 04) Поиск пользователя по его/ее имени или e-mail

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxSEARCH_SEQ_NUMПорядковый номер поискового запроса
2 байтаxx xxLENGTHДлина NICK_NAME, включая NULL
переменная NICK_NAMEИскомое прозвище (Nick name), завершаемое NULL
2 байтаxx xxLENGTHДлина FIRST_NAME, включая NULL
переменная FIRST_NAMEИскомая фамилия, завершаемое NULL
2 байтаxx xxLENGTHДлина LAST_NAME, включая NULL
переменная LAST_NAMEИскомое прозвище (Nick name), завершаемое NULL
2 байтаxx xxLENGTHДлина E_MAIL, включая NULL
переменная E_MAILИскомый E-mail, завершаемый NULL

Заметим, что поля поиска (NICK_NAME, FIRST_NAME, LAST_NAME, E_MAIL) могут быть пустыми, но не все одновременно, т.e. по крайней мере одно поле должно содержать данные. Заметим также, что вы можете искать либо по E_MAIL (другие поля должны быть пустыми), или по имени (в котором E_MAIL должен быть пустым, а одно или более других полей содержать данные).

KEEP_ALIVE(2E 04) Посылается для индикации того, что соединение еще активно

Параметры: Нет

Эта команда должна посылаться клиентом серверу регулярно (в норме, каждые две минуты, или 120 секунд).

SEND_TEXT_CODE (38 04) Послать специальное сообщение серверу в виде текста

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxLENGTHДлина TEXT_CODE, включая NULL
переменная TEXT_CODEСообщение посылаемое серверу, завершаемое NULL
2 байтаxx xxX1Не известно (код, обычно 04 00 или 05 00)

Поле TEXT_CODE может содержать, например:

"B_USER_DISCONNECTED" (в этом случае поле X1 должно содержать 05 00) если пользователь отсоединен.

"B_MESSAGE_ACK" (в этом случае поле X1 должно содержать 05 00) если у клиента имеются проблемы с подключением к серверу. Это запрос, при котором сервер должен немедленно ответить клиенту.

LOGIN_1 (4C 04) Послать во время авторизации

Параметры: Нет

Точное назначение команды не известно.

INFO_REQ (60 04) Запрос базовой информации о пользователе

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxINFO_SEQ_NUMПорядковый номер информации
4 байтаxx xx xx xxQUERY_UINUIN пользователя для запроса информации о нем

Сервер откликнется посылкой INFO_REPLY, с тем же INFO_SEQ_NUM.

EXT_INFO_REQ (6A 04) Запрос расширенной информации о пользователе

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxINFO_SEQ_NUMПорядковый номер информации
4 байтаxx xx xx xxQUERY_UINUIN пользователя для запроса информации о нем

Сервер откликнется EXT_INFO_REPLY с тем же INFO_SEQ_NUM.

CHANGE_PASSWORD (9C 04) Изменить пароль пользователя

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxPASSWORD_SEQ_NUMПорядковый номер изменения пароля
2 байтаxx xxLENGTHДлина NEW_PASSWORD, включая NULL
переменная NEW_PASSWORDНовый пароль с завершающим NULL (максимум 8 символов)

STATUS_CHANGE (D8 04) Пользователь сменил свой текущий статус (ушел и т.д.)

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байта (см. ниже)xx xxSTATUSТекущий статус пользователя

STATUS может иметь четыре значения:

00 00 00 00 = Online/connected (подключен)
01 00 00 00 = Away (убыл)
11 00 00 00 = Do Not Disturb (DND)(не беспокоить)
00 01 00 00 = Invisible (не виден)

LOGIN_2 (28 05) Sent during login (посылается при авторизации)

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
1 байт00X1Не известно

Сообщения, посылаемые сервером

ACK (0A 00) Acknowledgement (подтверждение)

Параметры: Нет

Замечание. В отличии от других команд, в ACK поле SEQ_NUM содержит порядковый номер пакета клиента, который подтверждается. Заметим далее, что ACK не должен подтверждаться!

LOGIN_REPLY (5A 00) Login reply (отклик авторизации)

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxUSER_UINUIN пользователя
4 байтаxx xx xx xxUSER_IPIP адрес пользователя
2 байтаxx xxLOGIN_SEQ_NUMПорядковый номер авторизации
2 байта01 00 01 00X1Не известно
4 байтаxx 00 16 00X2Не известно (xx=19 или 18)
4 байта8C 00 00 00X3Не известно
4 байта78 00 05 00X4Не известно
6 байтов0A 00 05 00 01 00X5Не известно

Это сообщение посылается сервером при получении LOGIN. Значение LOGIN_SEQ_NUM то же самое, что и в соответствующем LOGIN.

USER_ONLINE (6E 00) Пользователь из контактного списка изменил свой статус

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxREMOTE_UINUIN пользователя, который прошел авторизацию
4 байтаxx xx xx xxREMOTE_IPIP адрес пользователя
4 байтаxx xx xx xxREMOTE_PORTПорт TCP пользователя
4 байтаxx xx xx xxREMOTE_REAL_IPДействительный IP адрес пользователя
1 байт04X1Не известно
4 байтаxx xx xx xxSTATUSНовый статус пользователя
4 байтаxx xx xx xxX2Не известно

еявляется "внешним" IP адресом удаленного пользователя, REMOTE_REAL_IP является "внутренним" IP адресом. Эти два адреса будут идентичными, если только удаленный пользователь не находится за firewall. REMOTE_IP является "официальным" IP-адресом, как указано напр. в Info-рамке клиента. REMOTE_PORT является TCP портом, используемым когда клиент хочет открыть прямое соединение с удаленным пользователем.

USER_OFFLINE (78 00) Пользователь из контактного списка ушел в режим offline

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxREMOTE_UINUIN пользователя, который вышел из системы (logged out)

USER_FOUND (8C 00) Рекорд пользователя, удовлетворяющий критериям поиска

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxSEARCH_SEQ_NUMПоиск порядкового номера
4 байтаxx xx хх ххFOUND_UIN Найден UIN пользователя
2 байтаxx xxLENGTHДлина NICK_NAME, включая NULL
переменная NICK_NAMEНайдено прозвище пользователя (nick name) с завершающим NULL
2 байтаxx xxLENGTHДлина FIRST_NAME, включая NULL
переменная FIRST_NAMEНайдена фамилия пользователя с завершающим NULL
2 байтаxx xxLENGTHДлина LAST_NAME, включая NULL
переменная LAST_NAMEНайдено имя пользователя с завершающим NULL
2 байтаxx xxLENGTHДлина E_MAIL, включая NULL
переменная E_MAILНайден e-mail пользователя с завершающим NULL
1 байтxxAUTHORIZEСтутус авторизации пользователя

Для каждого пользователя, отвечающего критериям поиска, будет прислан USER_FOUND. Когда все USER_FOUND присланы, сервер пошлет END_OF_SEARCH. Если пользователей, отвечающих критериям отбора, не найдено, будет немедленно послано END_OF_SEARCH, и не будет послано ни одного USER_FOUND. AUTHORIZE определяет позволяет ли пользователь кому-то включать кого-то в контактный список. Возможными значениями AUTHORIZE являются:

0 = Пользователь должен авторизовать клиента, чтобы включить его/ее в контактный список

1 = Пользователь позволяет любому включить его/ее в контактный список

RECEIVE_MESSAGE (DC 00) Сообщение, посланное через сервер, когда клиент offline

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxREMOTE_UINUIN пользователя отправителя
2 байтаxx xxYEARГод, когда послано сообщение
1 байтxxMONTHМесяц, когда послано сообщение
1 байтxxDAYДень месяца, когда послано сообщение
1 байтxxHOURЧас, когда послано сообщение по GMT
1 байтxxMINUTEМинута, когда послано сообщение
2 байтаxx xxTYPEТип сообщения (сообщение, URL и т.д.)
2 байтаxx xxLENGTHДлина MESSAGE, включая NULL
переменная MESSAGEСообщения для отправки с завершающим NULL

Заметим, что HOUR содержит местное время - 1 (если только не используется GMT). TYPE идентифицирует тип сообщения:

01 00 = Обычное сообщение
04 00 = URL (MESSAGE содержит во-первых описание, затем FE, и далее действительный URL)
0C 00 = Сообщение 'You were added' (вы добавлены). (MESSAGE содержит: FE FE FE FE .

<ASCII authorize> is '1' (31) если пользователь позволяет кому-то добавить его/ее в его контактный список, и в противном случае '0' (30).)

END_OF_SEARCH (A0 00) Не будет более послано никаких USER_FOUND

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxSEARCH_SEQ_NUMПоиск порядкового номера
1 байтxxMORE_FOUNDНайдено больше пользователей, но не отображено?

Если MORE_FOUND равно 00, тогда возвращаемое USER_FOUND содержит информацию обо всех найденных пользователях. Если однако MORE_FOUND равно 01, тогда сервер нашел больше пользователей, но пока не отобразил. Ограничение на число отображаемых пользователей составляет 40. Если в результате поискового запроса найдено более 40 соответствий, клиенту будут посланы только первые 40 , а MORE_FOUND будет установлено равным 01.

INFO_REPLY (18 01) Возврат базовой информации о пользователе

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxINFO_SEQ_NUMИнформационный порядковый номер
4 байтаxx xx xx xxREMOTE_UINUIN удаленного пользователя
2 байтаxx xxLENGTHДлина NICK_NAME, включая NULL
переменная NICK_NAMEПрозвище удаленного пользователя
2 байтаxx xxLENGTHДлина фамилии FIRST_NAME, включая NULL
переменная FIRST_NAMEФамилия пользователя
2 байтаxx xxLENGTHДлина LAST_NAME, включая NULL
переменная LAST_NAMEИмя удаленного пользователя
2 байтаxx xxLENGTHДлина E_MAIL, включая NULL
переменная E_MAILe-mail удаленного пользователя
1 байтxxAUTHORIZEАвторизационный статус пользователя

Заметим, что параметры те же, что и в случае команды USER_FOUND (8C 00). Для более подробной информации смотри USER_FOUND.

EXT_INFO_REPLY (22 01) Возврат расширенной информации о пользователе

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxINFO_SEQ_NUMИнформационный порядковый номер
4 байтаxx xx xx xxREMOTE_UINUIN удаленного пользователя
2 байтаxx xxLENGTHДлина CITY, включая NULL
переменная CITYГород удаленного пользователя
2 байтаxx xxCOUNTRY_CODEКод страны удаленного пользователя
1 байтxxCOUNTRY_STATUSУказывает, введен или нет COUNTRY_CODE
2 байтаxx xxLENGTHДлина STATE, включая NULL
переменная STATEШтат удаленного пользователя (только для USA)
2 байтаxx xxAGEВозраст удаленного пользователя
1 байтxxSEXПол удаленного пользователя
2 байтаxx xxLENGTHДлина PHONE, включая NULL
переменная PHONEГород удаленного пользователя
2 байтаxx xxLENGTHДлина HOME_PAGE, включая NULL
переменная HOME_PAGEГород удаленного пользователя
2 байтаxx xxLENGTHДлина ABOUT, включая NULL
переменная ABOUTГород удаленного пользователя

Код, используемый в COUNTRY_CODE является международным телефонным префиксом, напр. 01 00 (1) для USA, 2C 00 (44) для UK, 2E 00 (46) для Швеции, и т.д.. COUNTRY_STATUS в норме равен FE, если только удаленный пользователь не ввел код страны, в этом случае COUNTRY_CODE будет равен FF FF, а COUNTRY_STATUS будет равен 9C. Поле AGE имеет значение FF FF, если пользователь не ввел его/ее возраст. Поле SEX имеет три (!) возможных значения:

00 = не специфицирован
01 = женщина
02 = мужчина

Поле ABOUT является опционно свободную форму, которая позволяет пользователю охарактеризовать себя.

STATUS_UPDATE (A4 01) Пользователь из контактного списка изменил свой статус

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
4 байтаxx xx xx xxREMOTE_UINUIN пользователя, чей статус изменился
4 байтаxx xx xx xxSTATUSНовый текущий статус пользователя

Значение текущего статуса в STATUS то же, что и в STATUS_CHANGE (D8 04). Подробности смотри в описании STATUS_CHANGE.

Коммуникации между двумя клиентами с использованием TCP (режим узел-узел)

Когда пользователь хочет послать сообщение, URL и т.д., другому пользователю (называемому "удаленным" в противоположность "местному" пользователю), местный пользователь проверяет, установлено ли уже соединение с этим пользователем. Если установлено, тогда будет использоваться это соединение. Если же нет, пользователь проверяет IP-адрес и порт удаленного пользователя (информация посылается сервером, когда удаленный пользователь авторизован), и осуществляет соединение с этим адресом. Обычно номера портов лежат в диапазоне 1200-1300 (десятичные). Когда новое соединение установлено, должно быть послано сообщение CHANNEL_INIT. С этого момента всякий раз, когда пользователь хочет послать сообщение, посылается CHANNEL_MESSAGE. Получение всех посланных сообщения должно быть подтверждено адресатом, используя CHANNEL_ACK.

TCP обмен идентичен коммуникации с привлечением UDP. Каждый пакет должен содержать длину пакета (не включая счетчик длины). Код длины занимает два октета. Большинство сообщений содержат UIN отправителя.

CHANNEL_INIT Инициировать межпользовательское взаимодействие, используя TCP

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байта1A 00LENGTHДлина этого пакета
1 байтFFINIT_IDENTИдентифицирует этот пакет, как запускающий
4 байта02 00 00 00X1Не известно
4 байта00 00 00 00X2Не известно
4 байтаxx xx xx xxMY_UINМестный UIN пользователя
4 байтаxx xx xx xxMY_IPIP адрес пользователя
4 байтаxx xx xx xxMY_IP_REALДействительный IP адрес пользователя
1 байт04X3Не известно
4 байтаxx xx xx xxMY_PORTTCP порт пользователя для входящих сообщений

Заметим, что порт, используемый для "исходящего" соединения, отличается от MY_PORT, порта, который другие клиенты используют для контакта с этим клиентом.

CHANNEL_MESSAGE Послать сообщение активному пользователю

Параметры:

ДлинаСодержимое (если задано)ИмяОписание
2 байтаxx xxLENGTHДлина этого пакета
4 байтаxx xx xx xxUINUIN местного пользователя
2 байта02 00VERSIONИдентифицирует кадр как ICQ пакет
2 байтаEE 07MSG_COMMANDТип сообщения для CHANNEL_MESSAGE
2 байта00 00X1Не известно
4 байтаxx xx xx xxUIN_2UIN местного пользователя
2 байтаxx xxTYPEТип сообщения
2 байтаxx xxLENGTHДлина MESSAGE, включая NULL
переменная MESSAGEСообщение, которое нужно послать, завершаемое кодом NULL
4 байтаxx xx xx xxMY_IP_REALдействительный IP адрес пользователя
4 байтаxx xx xx xxMY_IPIP адрес пользователя
4 байтаxx xx xx xxPORTTCP порт пользователя для входящих сообщений
1 байт04X2Не известно
2 байта00 00X3Не известно
2 байтаxx xxCMD_TYPEИдентифицирует сообщение как новое или как отклик
4 байтаxx xx xx xxX4Не известно(контрольная сумма? порядковый номер?)

Код TYPE тот же, что описан для RECEIVE_MESSAGE. CMD_TYPE может иметь следующие два значения:

10 00 = Это новое сообщение ('реальное', инициированное пользователем)
00 00 = это автоматический отклик

Ауто отклик посылается как подтверждение доставки всех 'реальных' сообщений. Они обычно содержат пустое сообщение, но, если удаленный пользователь 'ушел' или находится в режиме DND, отклик будет содержать сообщение Away/DND. Функция поля X4 замысловата. Его содержимое лежит всегда между 00 FF FF FF и FF FF FF FF, но точная функция не известна.

Действующая версия протокола имеет уязвимости. Аутентификация осуществляется без использования шифрования и т.д., понятно, что по мере совершенствования протокола эти уязвимости будут устранены.


Previous: 4.5.15.2 Расширяемый протокол обмена сообщениями и данными о присутствии (XMPP): Ядро    UP: 4.5.15 Диалог в локальных сетях и в Интернет
    Next: 4.5.15.4 Система Skype