it-place.net > Уроци > Други
Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 CTCP протокол
  1. CTCP протокол
Inventive
     
Автор  Inventive (27.02.2005 21:06)  съобщение до автора
Погледнат  4008 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (0)  абонирай се за Други
    Страница 1 / 1

 



Преведено от Светослав Генов (me) !

Оригинал: sojge@docs.uu.se

Клиент-към-клиент протокола (CTCP) *13*

Този клиент-към-клиент протокол е създаден да се използва при следните
две ситуации:
    1/    главно за изпращане на структурирани данни (като графики
                гласова и различни информации за фонта) между потребителските
                клиенти, и по-точно
    2/    да се пусне заявка към потребителският клиент и да се получи
                отговор.

От сега, само прост метод за текстово криптиране се използва в първата
категория, и няколко двойки заявки/отговори в категория 2. Тази статия ще
бъде концентриране главно върху последната категория.

*********************************************
ОСНОВНИЯ ПРОТОКОЛ МЕЖДУ КЛИЕНТИТЕ И СЪРВЪРИТЕ
*********************************************

Символите между клиента и сървъра са 8-бита байтове (познати още
като октети) и имат numeric стойности от осмично 0 до осмично 0337 (което
включва в себе си от 0 до 255 десетичните числа). Някои символи са
специални.

    CHARS    ::= '�00' .. '377' /* Символи */
    NUL    ::= '�00'           /* Нула */
    NL    ::= 'n'             /* Нов ред */
    CR    ::= 'r'             /* Керидж ретурн лайн */

Линия пратена към сървъра, или получена от сървъра (тук наречена
"съобщение от ниско ниво") се състои или от 0 или от няколко октета (като
не се вземат предвид NUL, NL, и CR) с или NL или CR в края.

    L-CHARS    ::= '�01' .. '�11' | '�13' | '�14' |
            '�16' .. '377'
    L-LINE    ::= L-CHARS* CR LF

NUL никога не се праща до сървър.

**********************************************
ПОСТАВЯНЕ НА КАВИЧКИ В СЪОБЩЕНИЯ ОТ НИСКО НИВО
**********************************************

Тей като съобщеният от и към сървърите не могат да съдържат NUL, NL и
CR, но все още може да бъде желано да се праща ВСЕКИ символ (в така
наречените "съобщения от средно ниво") между клиентите, тези три символа
трябва да бъдат поставени в кавички. Затова се използват специален символ
като кавичка, кавичката трябва също да бъде поставена в кавичка.

    M-QUOTE    ::= '�20'

(т.е. CNTRL/P). /* КОНТРОЛ+P */

Когато пращате съобщение от средно ниво, ако се намери един символ от
тези - NUL, NL, CR или M-QUOTE, този символ ще бъде заменен с двусимволна 
серия според следната таблица.

    NUL    --> M-QUOTE '0'
    NL    --> M-QUOTE 'n'
    CR    --> M-QUOTE 'r'
    M-QUOTE    --> M-QUOTE M-QUOTE

Когато получите съобщение от ниско ниво и видите M-QUOTE, вижте
следващият символ и ги заменете водейки се от таблицата, за да
получите съответно съобщение от средно ниво).

    M-QUOTE '0'    --> NUL
    M-QUOTE 'n'    --> NL
    M-QUOTE 'r'    --> CR
    M-QUOTE M-QUOTE    --> M-QUOTE

Ако символът след M-QUOTE не е някой от описаните символите в
таблицата, това е грепка, затова махнете M-QUOTE символа от
съобщението, по избор можете да съобщите това на потребителя.
Например стринг 'x' M-QUOTE 'y' 'z'
>от сървъра се преобразува по следния начин 'x 'y' 'z'.

Преди поставянето на кавички в съобщения от ниско ниво, съобщение
към сървъра (и в обратната посока: след като махате кавичките от
съобщението от ниско ниво, което съобщение идва от сървъра) изглежда така

    M-LINE    ::= CHARS*

******************
ЗАКЛЮЧИТЕЛНИ ДАННИ
******************

За изпращането както на обширни данни така и на двойка заявка/отговор
межди клиентите, форматът на разширенети данни е нужен. Разширените данни
се пращат в текстовата част на съобщението от средно ниво (след
поставянето на кавички в съобщения от ниски нива, както и в текстовата
част на съобщенията от ниски нива).

За да пратите разширени данни във текст, трябва по някакъв начин да ги
разделим. Това се прави като разширените данни се обградят с разделящ
символ.

    X-DELIM    ::= '�01'

Като се има предвид, че както началният символ за обграждане така и
последния символ за обграждане са едни и същи, всеки втори X-DELIM се
нарича четен, а всеки първи нечетен. Всеки първи X-DELIM в съобщението е
нечетен.

Когато се слагат кавички (и обратно, преди да се махнат кавичките) всеки
един брой от символи независимо от кой вид, изключение прави X-DELIM, може
да се използва в разширените данни, например, между X-DELIM двойка.

    X-CHR    ::= '�00' | '�02' .. '377'

Разширените съобщение или е празно (нищо между четният и нечетният
разделител), има едно или много символи, които не са празни места
(например, всеки символ, но не и '�40'), или един или много символи,
които не са празни места, които са последвани от празно място, последвано
от нула или много символи.

    X-N-AS    ::= '�00'  | '�02' .. '�37' | '�41' .. '377'
    SPC    ::= '�40'
    X-MSG    ::= | X-N-AS+ | X-N-AS+ SPC X-CHR*

Първите символи до първият SPC (или ако няма SPC, цялото X-MSG) се наричат
заключителни за разширеното съобщение. Заключението се използва, за да се
разбере какъв тип от разширени данни е бил използван.

Заключинието може да бъде *всеки* стринг от символи, и даже и те да са
букви, ще има разлика между големите и малките букви, затова големите и
малките бикви имат значение.

Разширените данни са валидни само в командите PRIVMSG и NOTICE. Ако
разширените данни са отговор на заявка, се изпраща NOTICE, в противен
случай се използва PRIVMSG. Както PRIVMSG, така и NOTICE към потребител и
към канал може да съдържа разширени данни.

Текстовите части от PRIVMSG и NOTICE може да съдържат нула или няколко
разширени съобщения, смесени с нула или няколко големи количества от
не-разширени данни.

*********************************************
Поставяне на кавички в съобщения от CTCP ниво
*********************************************

За да пратите разделителя X-DELIM между съобщения с разширени данни,
трябва да бъде поставен в кавички. Това въвежда друг символ като кавичка
(който се различава от символите използвани за кавички в съобщеният с
ниско ниво, дотолкова че той няма нужда да бъде в кавички).

    X-QUOTE    ::=    '134'

(т.е., наклонена черта).

Когато слагате кавички от ниво CTCP, само истинското CTCP съобщение
(т.е. разширените данни, заявките, отговорите) се поставят в
специалният символ. Това позволява на потребителя да прати X-QUOTE
символите, когато иска. Следните преводи трябва да се използват:

    X-DELIM    --> X-QUOTE 'a'
    X-QUOTE    --> X-QUOTE X-QUOTE

и когато се прави обработването на вече получено съобщение от ниво
CTCP, само CTCP съобщението ще се обработи, където ще се използва
следната таблица:

    X-QUOTE 'a'    --> X-DELIM
    X-QUOTE X-QUOTE    --> X-QUOTE

Ако X-QUOTE се види с друг символ различен от тези по-горе, това е грешка
и X-QUOTE символа трябва да бъде премахнат. Т.е. CTCP стрингът 'x' X-QUOTE
'y' 'z' ще се преобразува в трисимволен стринг 'x' 'y' 'z'.

Ако X-DELIM е намерен извън CTCP съобщение, съобщението ще съдържа
X-DELIM. (Това трябва да се случи само с последния X-DELIM, когато има
четен брой X-DELIM в съобщение от средно ниво.)

*******************************
Примери за поставяне на кавички
*******************************

Има три основни нива на съобщения. Най-високото ниво (H) е текстът при
нивото потребител-към-клиент. Средното ниво (M) е ниво, при което CTCP
поставянето в кавички се прави към съобщението от ниво H. Най-ниското ниво
(L) е нивото клиент-към-сървър., където се прави поставяне на кавички
от нисо ниво към съобщение от ниво M.

Следните взаимоотношения са истински, с lowQuote(message) като
функция правеща поставяне на кавички от ниско ниво, lowDequote(message) махане
на кавичките от ниско ниво, ctcpQuote(message) поставяне на кавички от ниво CTCP,
ctcpDequote(message) махане на кавичките от ниво CTCP, и ctcpExtract(message)
махане на всички CTCP съобщения от съобщението. Оператора || разделя различните
серии.

    L = lowQuote(M)
    M = ctcpDequote(L)

    M = ctcpQuote(H)
    H = ctcpDequote(ctcpExtract(M))

Когато пращате CTCP съобщение заедно с нормален текст

    M = ctcpQuote(H1) || '�01' || ctcpQuote(X) || '�01' || ctcpQuote(H2)

Разбира се, може да има нула или повече нормални съобщения и нула или повече CTCP
съобщения смесено.

- --- Пример 1 -----------------------------------------------------------------

Потребителя (наречен адресат) иска да прати стринга

    Hi there!nHow are you?

към потребителя цел, т.е., съобщение, в което потребителя е въвел нов ред
(как е направено това, ако е направено изобщо, се различава от клиент
до клиент), ще се види вътрешно от клиента в следната командата

    PRIVMSG victim :Hi there!nHow are you? K?

което ще се постави в кавички от ниво CTCP така

    PRIVMSG victim :Hi there!nHow are you? \K?

което на свой ред ще се превърне в съобщение поставено в кавички от ниско ниво

    PRIVMSG victim :Hi there!�20nHow are you? \K?

и ще се прати към сървъра като преди това се постави нов ред в края.

Това ще се яви на потребителя цел така

    :actor PRIVMSG victim :Hi there!�20nHow are you? \K?

(където \K ще изглежда подобно на OK в SIS D47 et al), което след
всички махания на кавички от ниско ниво ще стане така

    :actor PRIVMSG victim :Hi there!nHow are you? \K?

и след махане на кавичките от ниво CTCP

    :actom PRIVMSG victim :Hi there!nHow are you? K?

Как това ще бъде показано зависи от клиент до клиент, но се предполага,
че ще има нов ред между думите "there" и "How".

- --- Пример 2 -----------------------------------------------------------------

Ако клиента на адресата иска да прати стринг "Emacs wins," това може да
се преобразува като стринг "ntbig�20�01�00\:", когато се криптира
чрез SED, използвайки някакъв ключ, така клиентът започва с поставяне
на кавички от ниво CTCP на стринга и го прави на "ntbig�20\a�00\\:"
и построява командата от M-ниво

    PRIVMSG victim :�01SED ntbig�20\a�00\\:�01

което след поставяна на кавички от ниско ниво се преобразува в

    PRIVMSG victim :�01SED �20ntbig�20�20\a�200\\:�01

което ще се прати към сървъра, с нов ред в края.

От другата страна, стрингът

    :actor PRIVMSG victim :�01SED �20ntbig�20�20\a�200\\:�01

ще бъде получен от сървъра и кавичките от ниско ниво ще бъдат махнати и стринга
ще се преобразува в

    :actor PRIVMSG victim :�01SED ntbig�20\a�00\\:�01

след което на стринга "ntbig�20\a�00\\:" ще бъдат махнати кавичките
от ниво CTCP до "ntbig�20�01�00\:" и чак след това ще има SED декодиране,
което ще върне "Emacs wins", ако се използва правилния ключ.

- --- Пример 3 -----------------------------------------------------------------

Ако адресата иска да прати заявка USERINFO към потребителя цел, и е по средата
на разговор, клиентът може да реши прекрепи USERINFO молбата ктм нормалното
текстово съобщение. Тогава клиентът иска прати текстовото съобщение
"Say hi to Ronnt/actor" и CTCP заявката "USERINFO" към целта.

    PRIVMSG victim :Say hi to Ronnt/actor

плюс

    USERINFO

което след слагане на кавички от ниво CTCP става

    PRIVMSG victim :Say hi to Ronnt/actor

плюс

    USERINFO

което се слепва в

    PRIVMSG victim :Say hi to Ronnt/actor�01USERINFO�01

и след слагане на кавички от ниско ниво

    PRIVMSG victim :Say hi to Ron�20nt/actor�01USERINFO�01

се праща към сървъра.

От другата страна, съобщението

    :actor PRIVMSG victim :Say hi to Ron�20nt/actor�01USERINFO�01

пристига. При него се махат кавичките от ниско ниво

    :actor PRIVMSG victim :Say hi to Ronnt/actor�01USERINFO�01

и след това се разделя на

    :actor PRIVMSG victim :Say hi to Ronnt/actor

плюс

    USERINFO

След махането на кавичките от ниво CTCP и в двете съобщение, съобщението

    :actor PRiVMSG victim :Say hi to Ronnt/actor

се появява, докато на CTCP командата

    USERINFO

се отговаря. Отговорът може да бъде

    USERINFO :CS studentn�01test�01

на което ще се сложат кавички от ниво CTCP

    USERINFO :CS studentn\atest\a

и ще се прати NOTICE, тей като това е отговор:

    NOTICE actor :�01USERINFO :CS studentn\atest\a�01

и ще се сложат кавички от ниско ниво,

    NOTICE actor :�01USERINFO :CS student�20n\atest\a�01

след което се праща към сървъра на потребителя цел.

Когато се появи на адресата, на съобщението

    :victim NOTICE actor :�01USERINFO :CS student�20n\atest\a�01

се махат кавичките от ниско ниво

    :victim NOTICE actor :�01USERINFO :CS studentn\atest\a�01

До сега, всички CTCP отговори се разделят, давайки 1 CTCP отговор и нормален
NOTICE

    USERINFO :CS studentn\atest\a

На оставащият отговор му се махат кавичките от ниво CTCP

    USERINFO :CS studentn�01test�01

и се показва на адресата.

*****************************
Познати двойки ЗАЯВКА/ОТГОВОР
*****************************

Двойката заявка/отговор се праща между двата клиента в две фази.
Първата е да се прати заявката. Това става с "privmsg"
командата (или към канал, или към псевдоним -- няма значение).

Втората фаза е пращането на отговор. Това става с "notice"
командата.

Ето ги и познатите двойки, които могат да се използват.

CLIENTINFO    - Dynamic master index of what a client knows
ERRMSG        - Used when an error needs to be replied with
FINGER        - Mainly used to get a users idle time
USERINFO    - A string set by the user (never client coder)
VERSION        - The version and type of the client

FINGER
Това се използва, за да се вземе локална информация от системата на потребителя за него
и също така idle времето му. Заявката в "privmsg" командата трябва да изглежда така

    �01FINGER�01

докато отговора се праща чрез "notice" и изглежда така

    �01FINGER :#�01

където # съдържа информация за за истинското име на потребителя,
логин името на клиентската машина и idle времето, и е в тип X-N-AS.

VERSION
Това се използва, за да се вземе информацията за името на клиента и
неговата версия. Молбата се праща чрез "privmsg" и е много лесна.

    �01VERSION�01

Отговорът е:

    �01VERSION #:#:#�01

Където # съдържа името на клиента, второто # съдържа версията на клиента, а третото
  1. платформата, на която е пуснат клиента.

Използваме

    X-N-CLN    ::= '�00' .. '�71' | '�73' .. '377'

Името на клиента е стринг от тип X-N-CLN казвайки неща като "Kiwi"
или "ircII", версията е нещо като "5.2" или "2.1.5c", а платформата е
нещо като "GNU Emacs 18.57.19 under SunOS 4.1.1 on Sun SLC" или
"Compiled with gcc -ansi under Ultrix 4.0 on VAX-11/730".


SOURCE
Това се използва, за да се вземе информация, от къде да се може
да се смъкне клиента. Заявката се праща чрез "privmsg" командата

    �01SOURCE�01

а отговорът е нула или няколко CTCP отговора във формата

    �01SOURCE #:#:#�01

последвано от маркировка за край

    �01SOURCE�01

където първото # е името на Интернет хоста, където клиентът
може да бъде взет чрез anonymous FTP, второто # е името на директорията,
а третото # списък, разделен с празни места, оказващ файловете на клиента
в тази директория.

Използваме

    X-N-SPC    ::= '�00' .. '�37' | '�41' .. '377'

името на FTP сайта трябва да е нещо като "cs.bu.edu" или
"funic.funet.fi".

Полето с името на файла е незадължително директория последвана от
едно или няколко имена на файлове. Ако се зададе само името на
директорията всички файлове в директорията трбва да бъдет копиране,
когато се взема сурса клиента. Ако някакви файлове са зададени, само
тези файлове в директорията трябва да бъдат копирани. Забележете, че
така определеното позволява всякакви символи, но не и празни места, това
включва разбира се и :. Примери са "pub/emacs/irc/", за да се вземат всички
файлове е директорията pub/emacs/irc/, клиентът трябва да може първо да се
логне чрез потребител "ftp" и след това да даде командата "CD pub/emacs/irc/",
последвана от командата "mget *". (Трябва да се вземе предвид и binary и да се
изпълно този промт). Друг пример е "/pub/irc Kiwi.5.2.el.Z", в който трябва
да се изпълни "CD /pub/irc" и "get Kiwi.5.2.el.Z".


USERINFO
Това се използва, за да се предаде стринг, който може да бъде сложен от
потребителя, но никога не трябва да бъде сложен от клиента. Заявката е проста

    �01USERINFO�01

с отговор

    �01USERINFO :#�01

където # е стойността на стринг, който потребителят е сложил.

CLIENTINFO
Това е за разработчиците на клиента, за да им е по-лесно за покажат на
другите хакери на клиенти, какво знае дадения клиент, когато стане въпрос
за CTCP. Отговорите трябва да бъдат сравнително verbose, обяснявайки, кои
CTCP командите са познати, какви аргументи от какъв тип са очаквани, и
какви отговори могат да бъдат очаквани от клиента.

Заявката е думата CLIENTINFO изпратен чрез "privmsg" незадължително последвана от
двоеточие и една или повече определящи думи разделени с празно място, където думата
CLIENTINFO

    �01CLIENTINFO�01

трябва да бъде отговорена със списък съдържащ заключителни данни (вижте по-горе
секцията ЗАКЛЮЧИТЕЛНИ ДАННИ).

С един аргумент, отговорът трябва да е описание, как да се използва тази заключителна
дума; с два аргумента, как да се използват тези два аргумента и т.н.


ERRMSG
Това се използва като отговор, когато се засече непозната заявка. Също така,
когато се използва като заявка, отговорът трябва да върне текста в заявката,
заедно с индикираща дума, която да каже, че не е станала никаква грешка. Трябва
да се използва следната форма на заявката

    �01ERRMSG #�01

където # е стринг, съдържат всеки символи, с отговора

    �01ERRMSG # :#�01

където първото # е същият този стринг в заявката, а второто # е
кратко съобщение, съобщаващо на потребителя, че няма грешка.

Нормален ERRMSG отговор, може да бъре пратен, когато се види грешна
заявка или някои фалшиви обширни данни, и изглежда така

    �01ERRMSG # :#�01

където първото #, е несполучилата заявка или фалшивите обширни данни, а
второто # е текст, обясняващ, какъв е проблема, като "unknown query"
или "failed decrypting text".

*******
Примери
*******


Пращайки

    PRIVMSG victim :�01FINGER�01

може да получите

    :victim NOTICE actor :�01FINGER :Please check my USERINFO
    instead :Klaus Zeuge (sojge@mizar) 1 second has passed since
    victim gave a command last.�01

(това е само една линия) или защо пък не

    :victim NOTICE actor :�01FINGER :Please check my USERINFO
    instead :Klaus Zeuge (sojge@mizar) 427 seconds (7 minutes and
    7 seconds) have passed since victim gave a command last.�01

ако Klaus Zeuge се окаже мързеливичък?

Пращайки

    PRIVMSG victim :
може да получите

    :victim NOTICE actor :     commands CLIENTINFO ERRMSG FINGER USERINFO VERSION by giving
    an argument to CLIENTINFO.<

Пращайки

    PRIVMSG victim :
може да получите

    :victim NOTICE actor :     arguments gives a list of known client query keywords. With 1
    argument, a description of the client query keyword is
    returned.<

макар че ако пратите

    PRIVMSG victim :
вероятно ще получите нещо като

    :victim NOTICE actor :     unknown<

тей като "clientinfo" не е познат.

Пращайки

    PRIVMSG victim :
може да получите

    :victim NOTICE actor :     on seeing an unknown keyword. When seeing the keyword ERRMSG,
    it works like an echo.<

Пращайки

    PRIVMSG victim :�01USERINFO�01

може да получите нещо патетично дълго

    :victim NOTICE actor :     science in Uppsala, I'm male (somehow, that seems to be an
    important matter on IRC and I speak fluent swedish, decent
    german, and some english.<

Пращайки

    PRIVMSG victim :�01VERSION�01

може да получите

    :victim NOTICE actor :�01VERSION Kiwi:5.2:GNU Emacs
    18.57.19 under SunOS 4.1.1 on Sun
    SLC:FTP.Lysator.LiU.SE:/pub/emacs Kiwi-5.2.el.Z
    Kiwi.README�01

ако клиентът е с име Kiwi и е версия 5.2 и той се използва под GNU Emacs
18.57.19 пуснат на Sun SLCwith SunOS 4.1.1. Клиентът може да бъде намерен
на FTP сървърът FTP.Lysator.LiU.SE, след като се логнете можете да дадете FTP
командата "cd /pub/emacs/". След това трябва да вземете файла Kiwi-5.2.el.Z
и Kiwi.README; предполага се, че един от тези файлове ви казва как да процедирата
при инсталирането на клиента, след като сте взели файловете.

Преведено от Светослав Генов (me) !



   


Ключови думи: ctcp протокол клиент към клиент протокол сървър


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: Inventive  
На 14 години съм и се казвам Светослав Генов. Занимавам се с PHP и MySQL предимно. Също така съм и mIRC скирптер. Имам опит и с Adobe Photoshop.
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008