3 Icq

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







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

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

Заголовок пакета ICQ (сторона клієнта)

Параметри надісланій команди

Мал. 3. Формат кадру для ICQv5

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

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

Коли користувач посилає повідомлення / URL / і т.д. іншому користувачеві, який підключений до сервера, клієнт ICQ встановить TCP з'єднання безпосередньо з цим користувачем, і посилає повідомлення, використовуючи формат, схожий з (але не ідентичний) використовуваним при відправці UDP пакетів. Після того як повідомлення надіслано, TCP з'єднання не переривається, а зберігається відкритим і використовується для подальшого обміну повідомленнями. З'єднання закривається, коли будь-який з користувачів розриває ICQ з'єднання.







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

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

Нижче представлений список команд, які може послати клієнт сервера:

USER_OFFLINE (78 00) Користувач з контактного списку пішов в режим offline

Вміст (якщо задано)

UIN користувача, який вийшов з системи (logged out)

USER_FOUND (8C 00) Рекорд користувача, що задовольняє критеріям пошуку

Вміст (якщо задано)

Пошук порядкового номера

Знайдений UIN користувача

Довжина NICK_NAME, включаючи NULL

Знайдено прізвисько користувача (nick name) з завершальним NULL

Довжина FIRST_NAME, включаючи NULL

Знайдена прізвище користувача з завершальним NULL

Довжина LAST_NAME, включаючи NULL

Знайдено ім'я користувача з завершальним NULL

Довжина E_MAIL, включаючи NULL

Для кожного користувача, який відповідає критеріям пошуку, буде надіслано USER_FOUND. Коли все USER_FOUND надіслані, сервер пошле END_OF_SEARCH. Якщо користувачів, які відповідають критеріям відбору, що не знайдено, буде негайно надіслане END_OF_SEARCH, і не буде послано жодного USER_FOUND. AUTHORIZE визначає дозволяє користувач комусь включати когось в контактний список. Можливими значеннями AUTHORIZE є:

1 = Користувач дозволяє будь-якому включити його / її в контактний список

RECEIVE_MESSAGE (DC 00) Повідомлення, надіслане через сервер, коли клієнт offline

Вміст (якщо задано)

Новий поточний статус користувача

Значення поточного статусу в STATUS той же, що і в STATUS_CHANGE (D8 04). Подробиці дивись в описі STATUS_CHANGE.

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

CHANNEL_INIT Ініціювати межпользовательское взаємодія, використовуючи TCP

Вміст (якщо задано)