ICQ изнутри

Говорят, больше всего Интернет изменился тогда, когда Macromedia выпустила свой Flash. Может быть, это и так, но мне лично кажется, что не меньше Всемирную сеть изменила и другая технология - ICQ.

Различных клиентов для ICQ масса, и, тем не менее, время от времени появляются желающие написать ещё один. И, что самое интересное, пишут, и потом этими программами люди даже пользуются. Писать программы, работающие с ICQ, иногда приходится и спамерам: им нужны спам-боты. Да и мало ли вообще применений найдётся "Аське"? Знания за плечами не носить.


Протокол ICQ?

На самом деле, как такового, протокола ICQ давно уже не существует в природе. Чтобы понять, что значит эта загадочная фраза, нужно немного углубиться во тьму далёких веков - то есть, в историю ICQ.

Начинается эта славная история, как и история любой другой революции - причём не только революции IT'шной - с того, что собралось несколько евреев. В данном случае, четверо. Собрались они, значит, и решили, что Интернет - штука, конечно, классная, но чего-то в ней не хватает. А чего не хватает? А удобной программы для разговоров в режиме онлайн. Так и появилась фирма Mirabilis, начавшая разработку программы ICQ. И вот к ноябрю 1996 года первая версия была готова и выпущена в свет. Не знаю, чего ожидали разработчики, но результат не мог не превзойти все их ожидания. Популярность была такой, что к 1998 году за 23 дня регистрировались, в среднем, по миллиону новых пользователей. Крохотная Mirabilis уже не справлялась с такими объёмами пользователей и была вынуждена продаться корпорации America Online (AOL). С этого момента начинается качественно новый виток в развитии ICQ. Причём не только с коммерческой, но и с технической стороны.

У AOL к тому времени уже была своя программа для мгновенного обмена сообщениями - AOL Instant Messenger (AIM). Более мощная, более надёжная и лучше продуманная в плане протокола, но, увы, главного в ней не было: она была гораздо менее популярна, чем написанная "на коленке" ICQ. Поэтому решено было унифицировать протоколы для двух мессенджеров и сделать общий протокол - OSCAR. Естественно, за основу был взят более продвинутый протокол от AIM.

В первых версиях протокола ICQ (пока это был ещё протокол ICQ, а не OSCAR) в качестве основы использовался не шибко надёжный протокол UDP. Как известно, этот протокол не поддерживает надёжной передачи данных, то есть постоянного клиент-серверного соединения как бы и нет. Но в AIM вместо UDP использовался более надёжный протокол TCP. А поскольку AOL не сильно озабочена обратной совместимостью разных версий протоколов, то про те, которые были построены на основе UDP, уже можно, казалось бы, со спокойной совестью забыть. Правда... передача файлов до сих пор основана на UDP. Так что всё не так просто, как хотелось бы.


Общие сведения об OSCAR

ICQ удобна тем, что вместо IP-адресов для идентификации пользователей используются специальные номера - UIN'ы. Этот подход удобнее даже чем тот, при котором для идентификации используются уникальные имена пользователей, поскольку в ICQ любой пользователь может ввести любое имя, которое будет ему по вкусу. Однако ни UDP, ни TCP не работают с UIN'ами - им нужны IP-адреса. Поэтому для работы с ICQ пользователь подключается к специальному серверу, который и "выведывает" его IP. Этот сервер позволяет узнать текущий статус пользователя, а при запросах других пользователей их клиентам передаётся его IP-адрес, и далее чат происходит уже напрямую между двумя пользовательскими компьютерами. Если клиентское приложение не может передать сообщение другому клиенту напрямую, то оно отсылает его на ICQ-сервер, который должен будет отослать сообщение, как только пользователь станет доступен.

Двумя ключевыми понятиями ICQ являются список контактов и статус пользователя. Статус - это, фактически, состояние пользователя в данный момент: подключен, отключен, занят, свободен, влюблён и т.д. и т.п. Список контактов - это все UIN'ы пользователей, которые получают извещения о смене статуса данного пользователя, и отправляющие, в свою очередь, ему извещения о смене своего собственного статуса.

Все данные, которыми обмениваются клиент и сервер, упаковываются во FLAP-пакеты. Каждый пакет имеет четыре обязательных поля: Command Start, Channel ID, Sequence Number, Data Length и Data. Command Start имеет длину один байт и в этой версии протокола имеет шестнадцатеричное значение 2А. Это просто заголовок пакета, и особой смысловой нагрузки для клиентского приложения он не несёт. Channel ID - идентификатор канала, то есть он обозначает разные виды каналов, к которым может относиться пакет: канал соединения, канал данных и т.д. Большую часть времени это канал данных. Это поле имеет также длину в один байт. Третье поле - это анахронизм, оставшийся от смутных времён использования UDP, когда порядковый номер пакета, с каждым следующим посланным пакетом увеличивавшийся на единицу, использовался для обеспечения целостности передаваемых данных. Сейчас за нас это делает TCP, но рекомендуется всё рано продолжать инкрементировать номер каждого следующего пакета. Это поле имеет длину в одно слово, как и следующее. Data Length - длина поля данных. Последнее поле - это сами данные, оно имеет произвольную длину, ограниченную лишь тем, что она сама должна уместиться в два байта.

Как видите, внутри протокол устроен довольно просто. Но вся простота кончается на внутреннем устройстве поля с данными, которое вследствие многочисленных корректировок протокола может содержать в себе практически всё, что только можно представить как на трезвую, так и на пьяную голову. Зависит же содержимое поля данных, ясное дело, от того, что пользователь передаёт серверу.


Даёшь коннект!

Итак, для начала, к серверу надо подсоединиться. Начинается этот процесс с авторизации по адресу login.icq.com:5190. 5190 - это номер порта для TCP-протокола. Сервер авторизации должен принять UIN и пароль, а передать FLAP-пакет с DWORD'овым Data, значение которого равно единице.

В ICQ часто используется формат записи данных TLV. TLV - это аббревиатура от Type, Length, Value. В TLV упаковываются практически все данные, включая сами сообщения, однако напрямую эти пакеты используются редко. Чаще всего они упакованы в ещё один вид пакетов - SNAC. SNAC-пакеты используются исключительно и только в канале данных. Внутри этого пакета есть следующие поля: FamilyID (word) - идентификатор типа данных, SubTypeID (тоже word) - идентификатор подтипа, Flags[0] и Flags[1] (byte) - служебные флаги, RequestID (dword) - идентификатор запроса и SNACData (произвольной длины) - собственно, данные. Таким образом, SNAC-пакет записывается в поле Data FLAP-пакета, а FLV-пакет - в DataSNAC-пакета.

Как видите, структуру данных, передаваемых по протоколу OSCAR, особо простой не назовёшь. Если углубляться дальше в структуру, то окажется, что всё ещё сложнее (как то ни печально): каждой возможной комбинации FamilyID и SubTypeID для SNAC-пакетов соответствуют разнообразные вложенные FLV-пакеты, которые могут быть разными даже для одинаковых SNAC'ов. Так что программирование собственного ICQ-клиента превращается в расписывание различных ситуаций, то есть различных комбинаций разных значений двух первых полей SNAC. Обычно их записывают в документации в виде SNAC(XX, YY), где XX - это значение FamilyID, а YY - SubTypeID.

На этом, мы пожалуй, закончим погружение в глубины протокола, по которому общаются клиенты и сервер ICQ, поскольку разные версии протокола и разнятся разными SNAC(XX, YY). Их описание можно найти в Интернете по следующим адресам, приведенным по сноске*.

А сейчас...


Немного о грустном

К сожалению, структура протокола ICQ, как и формат документов Microsoft Office 2003 и более старых, никем никогда не стандартизировалась и, более того, даже не открывалась для посторонних глаз. Все сведения, которые вы можете найти во Всемирной паутине относительно внутреннего устройства протокола, который используется в ICQ, разнюханы самими программистами. Все альтернативные официальному клиенту мессенджеры (Miranda, Trillian, &RQ), фактически, написаны пиратами, расковырявшими протокол ICQ и на свой страх и риск вызнавшими о нём страшные служебные тайны корпорации AOL.

Возможно, вы помните не так давно произошедшую историю, когда America Online внесла некоторые изменения в сервер ICQ и в результате все неофициальные клиенты не могли к нему подключиться до выпуска для них соответствующих патчей и обновлений. Никто не может поручиться, что такая ситуация не повторится. OSCAR - закрытый протокол, поэтому если вы возьмётесь за создание клиента для ICQ, то никто, кроме вас, не будет за это нести никакой ответственности.

Есть и ещё один неприятный момент, касающийся не только разработчиков, но и каждого, кто пользуется ICQ. Правила использования этой системой мгновенного обмена сообщениями гласят в переводе на русский следующее: "Вы соглашаетесь, что вы отказываетесь от авторского права и всех других имущественных прав всего материала, который вы посылаете. В дальнейшем вы разрешаете, что ICQ Inc. имеет право использовать посланный материал или информацию в любом виде и с любой целью, включая, но не ограничиваясь, публикацию и распространение". Так что не посылайте по "аське" рукописей и стихов - если AOL в лице ICQ Inc. их опубликует, вы никому ничего не докажете...

Вадим СТАНКЕВИЧ


* Адреса для знакомства с конкретными описаниями версий протокола OSCAR:

www.icqinfo.ru

iserverd.khstu.ru/oscar

www.xserver.ru/computer/protokol/icq/1

iserverd.khstu.ru/docum_ext/icqkurs.htm

www.micq.org/ICQ-OSCAR-Protocol-v7-v8-v9

icq2000cc.hobi.ru

Версия для печатиВерсия для печати

Номер: 

36 за 2007 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Майкл
"Начинается эта славная история, как и история любой другой революции - причём не только революции IT'шной - с того, что собралось несколько евреев"

Автор - антисемит :\

Аватар пользователя Вадим Станкевич
Автор не антисемит. Просто вспомните Троцкого, Гитлера, Че Гевару - и станет ясно, что я имел в виду.
Аватар пользователя Андрей
На самом же деле ICQ разрабатывалась в Израиле. Вот поэтому Вадим и выразился так :-)

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

Последнее что знаю. QIP показывает на клиентов, которые используют ICQ версии 5, что используется протокол 9 версии. Хотя сам QIP типа использует протокол 11 версии. Вот те раз.

Аватар пользователя Al
Вспомнил Троцкого, Гитлера, Че Гевару. И что? Что вы имели в виду? А указание на национальность - это в любом случае неполиткорректно. Можно было просто сказать: "Собрались как-то в Израиле Сефи Вигисер, Арик Варди, Яир Гольдфингер и Амнон Амир" - и все было бы понятно, тем более что мир должен знать своих героев поименно.
Аватар пользователя Инкогнито
тоже мне герои...
Аватар пользователя Инкогнито
> национальность - это в любом случае неполиткорректно

Убеди, почему? Наелся дерьмократической стряпни?

Аватар пользователя Инкогнито
> Что вы имели в виду?

Al - Алексей Колб, пусть не я, но имел ввиду именно это. Понял!

Аватар пользователя Максим Штирлиц
Не раздувайте из мухи слона, тем более, что Станкевич прав: именно так и начинались революции, хотя и не он первый это заметил. Революцию организовать - тоже надо талант иметь. А уж получить из этого практическую пользу, поставив на коммерческие рельсы!!!... Кто-то футболом зарабатывает, кто-то - охотой на тюленей, кто-то - устрашением стран "оси зла" и насаждением демократии, кто-то - терроризмом, а кто-то банально водку пьет. И мы смело называем кто, у какой нации к чему душа усредненно лежит. Почему не обозначить национальность героев социальных и информационно-технологических революций? Кто кого чем обидел?