Previous: 4.5.15.2 Расширяемый протокол обмена сообщениями и данными о присутствии (XMPP): Ядро
UP:
4.5.15 Диалог в локальных сетях и в Интернет Next: 4.5.15.4 Система Skype |
Сообщения, посылаемые клиентом |
Сообщения, посылаемые сервером |
Коммуникации между двумя клиентами с использованием 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 xx | UIN | Уникальный UIN клиента |
4 байта | 77 72 55 FC | ID-cессии | Используется для предотвращения фальсификации |
2 байта | EE C2 | Команда | |
2 байта | A4 01 | SEQ_NUM1 | Начинается со случайного значения |
2 байта | E8 C6 | SEQ_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 00 | ACK | Acknowledgement (подтверждение) |
0E 01 | SEND_MESSAGE | Послать сообщение через сервер (to offline user) |
E8 03 | LOGIN | Авторизоваться на сервере |
06 04 | CONTACT_LIST | Проинформировать сервер о моем контактном списке |
1A 04 | SEARCH_UIN | Поиск пользователя, используя его/ее UIN |
24 04 | SEARCH_USER | Поиск пользователя, используя его/ее имя или e-mail |
2E 04 | KEEP_ALIVE | Послать сообщение для уведомления того, что соединение еще активно |
38 04 | SEND_TEXT_CODE | Послать специальное сообщение серверу в виде текста |
4C 04 | LOGIN_1 | Послать сообщение в процессе авторизации |
60 04 | INFO_REQ | Запросить базовую информацию о пользователе |
6A 04 | EXT_INFO_REQ | Запросить расширенную информацию о пользователе |
9C 04 | CHANGE_PASSWORD | Изменить пароль пользователя |
D8 04 | STATUS_CHANGE | Пользователь изменил свой статус (ушел и т.д.) |
28 05 | LOGIN_2 | Послать сообщение в процессе авторизации |
Некоторые дополнительные команды | ||
0A 05 | UPDATE_INFO | Обновить мои базовые данные |
B0 04 | UPDATE_EXT_INFO | Обновить мои расширенные данные |
3C 05 | ADD_TO_LIST | Добавить пользователя в мой контактный список |
56 04 | REQ_ADD_TO_LIST | Запросить авторизацию, чтобы добавить пользователя в контактный список |
BA 04 | QUERY_SERVERS | Запрос серверу об адресах других серверов |
C4 04 | QUERY_ADDONS | Запрос серверу о глобальных добавлениях |
EC 04 | NEW_USER_1 | Попросить разрешение добавить нового пользователя |
FC 03 | NEW_USER_REG | Зарегистрировать нового пользователя |
A6 04 | NEW_USER_INFO | Send basic information about a new user |
42 04 | CMD_X1 | Не известно |
56 04 | MSG_TO_NEW_USER | Послать сообщение пользователю, которого нет в моем контактном списке |
Следующие команды могут быть посланы сервером клиенту, либо в качестве отклика на команду клиента, либо для уведомления клиента о некотором событии.
Код | Имя | Описание |
0A 00 | ACK | Acknowledgement (подтверждение) |
5A 00 | LOGIN_REPLY | Отклик авторизации |
6E 00 | USER_ONLINE | Пользователь из контактного списка, который активен в данное время, изменил свой статус |
78 00 | USER_OFFLINE | Пользователь из контактного списка вышел (статус=offline) |
8C 00 | USER_FOUND | В рекорде пользователя найдено соответствие критериям поиска |
DC 00 | RECEIVE_MESSAGE | Сообщение через сервер послано в период offline |
A0 00 | END_OF_SEARCH | Не будет более послано USER_FOUND |
18 01 | INFO_REPLY | Возвращение базовой информации о пользователе |
22 01 | EXT_INFO_REPLY | Возвращение расширенной информации о пользователе |
A4 01 | STATUS_UPDATE | Пользователь из контактного списка, который активен в данное время, изменил свой статус |
Некоторые дополнительные команды | ||
1C 02 | REPLY_X1 | Не известно (присылается во время авторизации) |
E6 00 | REPLY_X2 | Не известно (мой UIN подтверждается?) |
E0 01 | UPDATE_REPLY | Подтверждение обновления базовой информации |
C8 00 | UPDATE_EXT_REPLY | Подтверждение обновления расширенной информации |
46 00 | NEW_USER_UIN | Подтверждение создания нового пользователя и нового присвоенного UIN |
B4 00 | NEW_USER_REPLY | Подтверждение базовой информации нового пользователя |
82 00 | QUERY_REPLY | Отклик на QUERY_SEVERS или QUERY_ADDONS |
C2 01 | SYSTEM_MESSAGE | Системное сообщение от кнопки с URL |
Далее UDP-сообщения будут рассмотрены более подробно.
ACK (0A 00) Acknowledgement (подтверждение)
Параметры: Нет
Замечание. В отличии от других команд, в ACK поле SEQ_NUM содержит порядковый номер пакета сервера, который хочет подтвердить клиент. Заметим, что получение подтверждения никогда не подтверждается.
SEND_MESSAGE (0E 01) Послать сообщение через сервер (to offline user)
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
4 байта | xx xx xx xx | RECEIVER_UIN | Сообщение UIN пользователя послано адресату |
2 байта | (см. ниже) | MESSAGE_TYPE | Тип посланного сообщения |
2 байта | xx xx | LENGTH | Длина сообщения, включая NULL |
переменная | MESSAGE | Сообщение, завершаемое NULL (00) |
MESSAGE_TYPE может принимать одно из следующих значений:
01 00 - сообщение является обычным
04 00 - сообщения является URL, и реально состоит из двух частей, разделенных кодом FE.
Первая часть - описание URL, а вторая часть реальное URL.
LOGIN (E8 03) Login on server (авторизация на сервере)
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
4 байта | xx xx xx xx | PORT | Номер TCP порта для входящего соедиения |
2 байта | xx xx | LENGTH | Длина PASSWORD, включая NULL |
переменная | PASSWORD | Пароль пользователя + NULL (максимум 8 символов) | |
4 байта | 78 00 00 00 | X1 | Не известно |
4 байта | xx xx xx xx | USER_IP | IP-адрес пользователя |
1 байт | 04 | X2 | Не известно |
4 байта | xx xx xx xx | STATUS | Текущий статус пользователя (в норме 00 00 00 00) |
4 байта | 02 00 00 00 | X3 | Не известно |
2 байта | xx xx | LOGIN_SEQ_NUM | Порядковый номер авторизации |
4 байта | 00 00 00 00 | X4 | Не известно |
4 байта | 08 00 78 00 | X5 | Не известно |
CONTACT_LIST (06 04) Проинформировать сервер о моем контактном списке
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | NUM_CONTACTS | Следующее число контактов |
4 байта | xx xx xx xx | UIN | UIN пользователя из контактного списка. Последнее поле повторяется столько раз, сколько пользователей указано в NUM_CONTACTS |
Сервер пошлет уведомление online/offline пользователям, зарегистрированным через уведомление CONTACT_LIST.
SEARCH_UIN (1A 04) Поиск пользователя по его/ее UIN
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | SEARCH_SEQ_NUM | Порядковый номер поискового запроса |
4 байта | xx xx xx xx | SEARCHED_UIN | UIN, который надо найти |
Значение SEARCH_SEQ_NUM должно быть уникальным числом, чтобы исключить неоднозначность при поиске. Отклик сервера будет содержать SEARCH_SEQ_NUM, чтобы обеспечить соответствие запроса и отклика.
SEARCH_USER (24 04) Поиск пользователя по его/ее имени или e-mail
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | SEARCH_SEQ_NUM | Порядковый номер поискового запроса |
2 байта | xx xx | LENGTH | Длина NICK_NAME, включая NULL |
переменная | NICK_NAME | Искомое прозвище (Nick name), завершаемое NULL | |
2 байта | xx xx | LENGTH | Длина FIRST_NAME, включая NULL |
переменная | FIRST_NAME | Искомая фамилия, завершаемое NULL | |
2 байта | xx xx | LENGTH | Длина LAST_NAME, включая NULL |
переменная | LAST_NAME | Искомое прозвище (Nick name), завершаемое NULL | |
2 байта | xx xx | LENGTH | Длина 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 xx | LENGTH | Длина TEXT_CODE, включая NULL |
переменная | TEXT_CODE | Сообщение посылаемое серверу, завершаемое NULL | |
2 байта | xx xx | X1 | Не известно (код, обычно 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 xx | INFO_SEQ_NUM | Порядковый номер информации |
4 байта | xx xx xx xx | QUERY_UIN | UIN пользователя для запроса информации о нем |
Сервер откликнется посылкой INFO_REPLY, с тем же INFO_SEQ_NUM.
EXT_INFO_REQ (6A 04) Запрос расширенной информации о пользователе
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | INFO_SEQ_NUM | Порядковый номер информации |
4 байта | xx xx xx xx | QUERY_UIN | UIN пользователя для запроса информации о нем |
Сервер откликнется EXT_INFO_REPLY с тем же INFO_SEQ_NUM.
CHANGE_PASSWORD (9C 04) Изменить пароль пользователя
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | PASSWORD_SEQ_NUM | Порядковый номер изменения пароля |
2 байта | xx xx | LENGTH | Длина NEW_PASSWORD, включая NULL |
переменная | NEW_PASSWORD | Новый пароль с завершающим NULL (максимум 8 символов) |
STATUS_CHANGE (D8 04) Пользователь сменил свой текущий статус (ушел и т.д.)
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
4 байта (см. ниже) | xx xx | STATUS | Текущий статус пользователя |
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 байт | 00 | X1 | Не известно |
ACK (0A 00) Acknowledgement (подтверждение)
Параметры: Нет
Замечание. В отличии от других команд, в ACK поле SEQ_NUM содержит порядковый номер пакета клиента, который подтверждается. Заметим далее, что ACK не должен подтверждаться!
LOGIN_REPLY (5A 00) Login reply (отклик авторизации)
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
4 байта | xx xx xx xx | USER_UIN | UIN пользователя |
4 байта | xx xx xx xx | USER_IP | IP адрес пользователя |
2 байта | xx xx | LOGIN_SEQ_NUM | Порядковый номер авторизации |
2 байта | 01 00 01 00 | X1 | Не известно |
4 байта | xx 00 16 00 | X2 | Не известно (xx=19 или 18) |
4 байта | 8C 00 00 00 | X3 | Не известно |
4 байта | 78 00 05 00 | X4 | Не известно |
6 байтов | 0A 00 05 00 01 00 | X5 | Не известно |
Это сообщение посылается сервером при получении LOGIN. Значение LOGIN_SEQ_NUM то же самое, что и в соответствующем LOGIN.
USER_ONLINE (6E 00) Пользователь из контактного списка изменил свой статус
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
4 байта | xx xx xx xx | REMOTE_UIN | UIN пользователя, который прошел авторизацию |
4 байта | xx xx xx xx | REMOTE_IP | IP адрес пользователя |
4 байта | xx xx xx xx | REMOTE_PORT | Порт TCP пользователя |
4 байта | xx xx xx xx | REMOTE_REAL_IP | Действительный IP адрес пользователя |
1 байт | 04 | X1 | Не известно |
4 байта | xx xx xx xx | STATUS | Новый статус пользователя |
4 байта | xx xx xx xx | X2 | Не известно |
еявляется "внешним" IP адресом удаленного пользователя, REMOTE_REAL_IP является "внутренним" IP адресом. Эти два адреса будут идентичными, если только удаленный пользователь не находится за firewall. REMOTE_IP является "официальным" IP-адресом, как указано напр. в Info-рамке клиента. REMOTE_PORT является TCP портом, используемым когда клиент хочет открыть прямое соединение с удаленным пользователем.
USER_OFFLINE (78 00) Пользователь из контактного списка ушел в режим offline
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
4 байта | xx xx xx xx | REMOTE_UIN | UIN пользователя, который вышел из системы (logged out) |
USER_FOUND (8C 00) Рекорд пользователя, удовлетворяющий критериям поиска
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | SEARCH_SEQ_NUM | Поиск порядкового номера |
4 байта | xx xx хх хх | FOUND_UIN | Найден UIN пользователя |
2 байта | xx xx | LENGTH | Длина NICK_NAME, включая NULL |
переменная | NICK_NAME | Найдено прозвище пользователя (nick name) с завершающим NULL | |
2 байта | xx xx | LENGTH | Длина FIRST_NAME, включая NULL |
переменная | FIRST_NAME | Найдена фамилия пользователя с завершающим NULL | |
2 байта | xx xx | LENGTH | Длина LAST_NAME, включая NULL |
переменная | LAST_NAME | Найдено имя пользователя с завершающим NULL | |
2 байта | xx xx | LENGTH | Длина E_MAIL, включая NULL |
переменная | E_MAIL | Найден e-mail пользователя с завершающим NULL | |
1 байт | xx | AUTHORIZE | Стутус авторизации пользователя |
Для каждого пользователя, отвечающего критериям поиска, будет прислан 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 xx | REMOTE_UIN | UIN пользователя отправителя |
2 байта | xx xx | YEAR | Год, когда послано сообщение |
1 байт | xx | MONTH | Месяц, когда послано сообщение |
1 байт | xx | DAY | День месяца, когда послано сообщение |
1 байт | xx | HOUR | Час, когда послано сообщение по GMT |
1 байт | xx | MINUTE | Минута, когда послано сообщение |
2 байта | xx xx | TYPE | Тип сообщения (сообщение, URL и т.д.) |
2 байта | xx xx | LENGTH | Длина MESSAGE, включая NULL |
переменная | MESSAGE | Сообщения для отправки с завершающим NULL |
Заметим, что HOUR содержит местное время - 1 (если только не используется GMT). TYPE идентифицирует тип сообщения:
01 00 = Обычное сообщение
04 00 = URL (MESSAGE содержит во-первых описание, затем FE, и далее действительный URL)
0C 00 = Сообщение 'You were added' (вы добавлены). (MESSAGE содержит:
<ASCII authorize> is '1' (31) если пользователь позволяет кому-то добавить его/ее в его контактный список, и в противном случае '0' (30).)
END_OF_SEARCH (A0 00) Не будет более послано никаких USER_FOUND
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | SEARCH_SEQ_NUM | Поиск порядкового номера |
1 байт | xx | MORE_FOUND | Найдено больше пользователей, но не отображено? |
Если MORE_FOUND равно 00, тогда возвращаемое USER_FOUND содержит информацию обо всех найденных пользователях. Если однако MORE_FOUND равно 01, тогда сервер нашел больше пользователей, но пока не отобразил. Ограничение на число отображаемых пользователей составляет 40. Если в результате поискового запроса найдено более 40 соответствий, клиенту будут посланы только первые 40 , а MORE_FOUND будет установлено равным 01.
INFO_REPLY (18 01) Возврат базовой информации о пользователе
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | INFO_SEQ_NUM | Информационный порядковый номер |
4 байта | xx xx xx xx | REMOTE_UIN | UIN удаленного пользователя |
2 байта | xx xx | LENGTH | Длина NICK_NAME, включая NULL |
переменная | NICK_NAME | Прозвище удаленного пользователя | |
2 байта | xx xx | LENGTH | Длина фамилии FIRST_NAME, включая NULL |
переменная | FIRST_NAME | Фамилия пользователя | |
2 байта | xx xx | LENGTH | Длина LAST_NAME, включая NULL |
переменная | LAST_NAME | Имя удаленного пользователя | |
2 байта | xx xx | LENGTH | Длина E_MAIL, включая NULL |
переменная | E_MAIL | e-mail удаленного пользователя | |
1 байт | xx | AUTHORIZE | Авторизационный статус пользователя |
Заметим, что параметры те же, что и в случае команды USER_FOUND (8C 00). Для более подробной информации смотри USER_FOUND.
EXT_INFO_REPLY (22 01) Возврат расширенной информации о пользователе
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | INFO_SEQ_NUM | Информационный порядковый номер |
4 байта | xx xx xx xx | REMOTE_UIN | UIN удаленного пользователя |
2 байта | xx xx | LENGTH | Длина CITY, включая NULL |
переменная | CITY | Город удаленного пользователя | |
2 байта | xx xx | COUNTRY_CODE | Код страны удаленного пользователя |
1 байт | xx | COUNTRY_STATUS | Указывает, введен или нет COUNTRY_CODE |
2 байта | xx xx | LENGTH | Длина STATE, включая NULL |
переменная | STATE | Штат удаленного пользователя (только для USA) | |
2 байта | xx xx | AGE | Возраст удаленного пользователя |
1 байт | xx | SEX | Пол удаленного пользователя |
2 байта | xx xx | LENGTH | Длина PHONE, включая NULL |
переменная | PHONE | Город удаленного пользователя | |
2 байта | xx xx | LENGTH | Длина HOME_PAGE, включая NULL |
переменная | HOME_PAGE | Город удаленного пользователя | |
2 байта | xx xx | LENGTH | Длина 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 xx | REMOTE_UIN | UIN пользователя, чей статус изменился |
4 байта | xx xx xx xx | STATUS | Новый текущий статус пользователя |
Значение текущего статуса в STATUS то же, что и в STATUS_CHANGE (D8 04). Подробности смотри в описании STATUS_CHANGE.
Когда пользователь хочет послать сообщение, URL и т.д., другому пользователю (называемому "удаленным" в противоположность "местному" пользователю), местный пользователь проверяет, установлено ли уже соединение с этим пользователем. Если установлено, тогда будет использоваться это соединение. Если же нет, пользователь проверяет IP-адрес и порт удаленного пользователя (информация посылается сервером, когда удаленный пользователь авторизован), и осуществляет соединение с этим адресом. Обычно номера портов лежат в диапазоне 1200-1300 (десятичные). Когда новое соединение установлено, должно быть послано сообщение CHANNEL_INIT. С этого момента всякий раз, когда пользователь хочет послать сообщение, посылается CHANNEL_MESSAGE. Получение всех посланных сообщения должно быть подтверждено адресатом, используя CHANNEL_ACK.
TCP обмен идентичен коммуникации с привлечением UDP. Каждый пакет должен содержать длину пакета (не включая счетчик длины). Код длины занимает два октета. Большинство сообщений содержат UIN отправителя.
CHANNEL_INIT Инициировать межпользовательское взаимодействие, используя TCP
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | 1A 00 | LENGTH | Длина этого пакета |
1 байт | FF | INIT_IDENT | Идентифицирует этот пакет, как запускающий |
4 байта | 02 00 00 00 | X1 | Не известно |
4 байта | 00 00 00 00 | X2 | Не известно |
4 байта | xx xx xx xx | MY_UIN | Местный UIN пользователя |
4 байта | xx xx xx xx | MY_IP | IP адрес пользователя |
4 байта | xx xx xx xx | MY_IP_REAL | Действительный IP адрес пользователя |
1 байт | 04 | X3 | Не известно |
4 байта | xx xx xx xx | MY_PORT | TCP порт пользователя для входящих сообщений |
Заметим, что порт, используемый для "исходящего" соединения, отличается от MY_PORT, порта, который другие клиенты используют для контакта с этим клиентом.
CHANNEL_MESSAGE Послать сообщение активному пользователю
Параметры:
Длина | Содержимое (если задано) | Имя | Описание |
2 байта | xx xx | LENGTH | Длина этого пакета |
4 байта | xx xx xx xx | UIN | UIN местного пользователя |
2 байта | 02 00 | VERSION | Идентифицирует кадр как ICQ пакет |
2 байта | EE 07 | MSG_COMMAND | Тип сообщения для CHANNEL_MESSAGE |
2 байта | 00 00 | X1 | Не известно |
4 байта | xx xx xx xx | UIN_2 | UIN местного пользователя |
2 байта | xx xx | TYPE | Тип сообщения |
2 байта | xx xx | LENGTH | Длина MESSAGE, включая NULL |
переменная | MESSAGE | Сообщение, которое нужно послать, завершаемое кодом NULL | |
4 байта | xx xx xx xx | MY_IP_REAL | действительный IP адрес пользователя |
4 байта | xx xx xx xx | MY_IP | IP адрес пользователя |
4 байта | xx xx xx xx | PORT | TCP порт пользователя для входящих сообщений |
1 байт | 04 | X2 | Не известно |
2 байта | 00 00 | X3 | Не известно |
2 байта | xx xx | CMD_TYPE | Идентифицирует сообщение как новое или как отклик |
4 байта | xx xx xx xx | X4 | Не известно(контрольная сумма? порядковый номер?) |
Код 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 |