1.4.5 Jádro protokolu

Nyní se podívejme na ten úplný základ Protokolu, tu naprosto elementární strukturu.

Předně si definujme pojem entita. Entita je jakýkoliv prvek v Jabber síti, který můžeme adresovat, tedy má svoji unikátní adresu. Jsou to samozřejmě servery, ale i všechny jejich služby, transporty, adresáře, roboti, konference, uživatelé a v rámci uživatelů dokonce i zdroje. Kouzlo spočívá v tom, že nemusíme s každým novým uživatelem či instalovaným tranportem updatovat DNS. Jedná se o symbolický zápis, který sdělí dotyčnému serveru, kam má daný paket přeposlat. Pravidlem adresování je, že JID (Jabber ID - adresa v síti Jabber) musí obsahovat platné jméno serveru, shodné s DNS. Volitelně pak i uživatelské jméno a zdroj, podle potřeby.

Se správnou cílovou adresou se pak naváže TCP spojení a posílají se XML streamy. Pojďme se tedy podívat, jakou má taková konverzace strukturu.

Nejprve se otevře spojení, tzv. Opening tag. Typický opening tag při spojení navázaným klientem vypadá takto:

<stream:stream
    xmlns:stream="http://etherx.jabber.org/streams"
    to="jabber.org"
    xmlns="jabber:client">

Do lidštiny bychom to přeložili takto: Každý XML stream v Jabberu musí začínat tagem stream:stream jako namespace. Následuje pevně daná adresa s definicí streamu, parametr "to" deklaruje adresáta tohoto paketu. XML uzavírá parametr xmlns, který definuje typ konverzace a tedy způsob zobrazení zprávy.

Tabulka 1.2. Namespace konverzace

NamespacePopis
jabber:clientSpojení mezi klientem a serverem.
jabber:serverSpojení mezi dvěma servery. (sem náleží i dialback - mechanismus ověření hostitele.)
jabber:component:acceptPokud se k serveru přes TCP připojí externí program, použije se tento namespace k definici páru XML dokumentů vyměněných tímto spojením.
jabber:component:execPokud se k serveru přes STDIO připojí externí program, použije se tento namespace k definici páru XML dokumentů vyměněných tímto spojením.

Na takovouto XML výzvu odpoví server nějak takto:

<stream:stream
    xmlns:stream='http://etherx.jabber.org/streams'
    id='3AFD6862'
    xmlns='jabber:client'
    from='jabber.org'>

Kromě již popsaných atributů takového paketu tu máme parametr "id", což je identifikace spojení, číslo náhodně vygenerované serverem a odeslané klientovi v otevíracím tagu. Parametr "from" bývá totožný jako "to", ale v případě přesměrování je zde skutečná logická hodnota zdroje zprávy.

Samotná konverzace pak v zásadě probíhá ve třech základních XML elementech - <message/>, <presence/>, a <iq/>. Na následujícím příkladu komunikace si celou problematiku vysvětlíme. Podobně jako to zobrazují klienti v XML konzoli, pro lepší orientaci na začátku každého paketu uvedeme, je-li odesílán nebo přijímán.

SEND: <iq id='roster_0' type='get'><id="iq"/>
        <query xmlns='jabber:iq:roster'/>
      </iq>

RECV: <iq id='roster_0' type='result' from='dj@yak/Work'>
        <query xmlns='jabber:iq:roster'>
          <item jid='sabine@yak' name='sabine' subscription='both'>
            <group>Family</group>
          </item>
        </query>
      </iq>

SEND: <presence><status>Online</status></presence><id="presence"/>

      ... 

RECV: <message id='1' to='dj@yak' from='sabine@yak/winjab' type='chat'>
        <id="message"/>
        <thread>3FE7392DDCA919CB49C73A2FFCE9901D</thread>
        <body>Hello</body>
      </message>

Celý tento zápis ukazuje, jak klient zažádá o svůj seznam kontaktů (v Jabberu jak známo uchováván na serveru), server mu jej odešle, klient potom rozešle svou přítomnost, načež mu kamarádka zašle pozdrav. Pojďme se teď blíže podívat na jednotlivé elementy.

MESSAGE je esenciální element v Jabberu. Všechna data, kromě zpráv o přítomnosti a strukturách požadavek - odpověď, jsou odbavována právě tímto elementem. Může obsahovat následující subelementy. "Type" deklaruje typ zprávy. Jabber definuje 5 typů zpráv, které mohou klienti zpracovat svou cestou. Typ "normal" je ta klasická zpráva podobná emailu, tedy jednorázové odeslání zprávy bez očekávání odpovědi. Typ "chat" bývá částí konverzace, tedy online obousměrné komunikace. Typ "groupchat" je konverzace v rámci víceuživatelské konference, včetně zpráv o připojení nebo odchodu od samotné entity konference. Typ "headline" je specielní typ zprávy zprostředkující většinou krátké informativní zprávy, mnohdy doplněnými linkem na zdroj zprávy. Posledním je typ "error", přinášející klientovi chybovou hlášku. Subelement "from" ukazuje na původce zprávy. Definuje jej server, aby se předešlo falšování původce. "to" ukazuje na adresáta, "id" je identifikátor zpávy, užitečný pokud očekáváme odpověď, aby mohl klient pracovat s odpovědí v návaznosti na původní zprávu. Zpáva může obsahovat dále subelementy "subject" pro předměty zprávy (používá se u normální zprávy a u groupchatu - topic diskuse), "body" obsahující tělo zprávy, "error" je připojen při vzniku chyby (např. překlep v adresátovi) a obsahuje číselný kód a popis. Subelement "html" umožňuje do zpráv přidávat formátování textu XHTML, tedy různé barvy, fonty, styly apod. "thread" je používán pro spojování útržků konverzace podle patřičného vlákna (threadu). Znamená to, že se mohou řadit příspěvky s tímto threadem do separátního okna v chronologickém pořadí, aniž by se mezi ně mýchali příspěvky i od téhož korespondenta, s nesouvisejícím obsahem. Thread se generuje při první zprávě, další už jen vkládají toto číslo do svých paketů. Specielní subelement "x" umožňuje do zpráv vkládat další informace, další přídavné namespace.

PRESENCE element ukazuje dostupnost entity. Může obsahovat tyto elementy: "type" definuje typ přítomnosti. Může být available (dostupný), unavailable (nedostupný), probe (server zjišťuje dostupnost podle autorizačního mechanismu), subsribe (autorizační požadavek), unsubscribe (požadavek odmítnutí zpráv o přítomnosti), subsribed (přijetí požadavku autorizačního požadavku), unsubscribed (přijetí požadavku na zrušení autorizace, používá se též jako odmítnutí autorizačního požadavku). Element "from" je opět přidáván serverem a informuje o tom, kdo vysílá tuto zprávu. Atribut "to" je použit, pokud posíláte svou přítomnost konkrétnímu uživateli. Atribut "id" je dostupný pro všechny elementy pro účely sledování, ale jsa přítomnost jednosměrné vysílání, nebývá běžné vidět tento atribut v tomto paketu. Kromě typu available se posílá detailnější popis stavu, a to je "show". Nabývané hodnoty jsou popsány v následující tabulce:

Tabulka 1.3. Hodnoty přítomnosti

HodnotaPopis
awayUživatel je dostupný, ale dočasně není u počítače.
chatUživatel je připraven na konverzaci.
dndNevyrušovat! Uživatel je dostupný, ale nechce být právě rušen. Všechny zprávy mu však chodí, záleží na klientovi, jak je zpracuje.
normalNormální stav. Toto je bráno, pokud atribut show není vyplněn.
xaExtrémní forma away - dlouhodobá nepřítomnost

Další atribut je "status" zprostředkující ještě detailnější pohled na uživatelskou přítomnost. Nejsou tu předdefinované hodnoty, ale textový popis odůvodňující daný stav. Tyto popisy jsou sice standardizovány, ale klientská aplikace je může měnit (např. away - schovávám se před mámou abych nemusel uklidit pokoj). Posledními atributy je "priority", definující prioritu daného zdroje, a "x" pro vložení extra informací do paketu.

IQ element znamá INFO/QUERY, tedy mechanismus pro posílání a přijímání informací. Atributy jsou opět hodně podobné jako u elementu message či presence. Jabber pracuje se čtyčmi typy "type", a to get (získávání informací), set (odesílání informací k uložení), result (výsledek dotazu nebo potvrzení uložení) a error (požadovaná data nezískáná nebo uložení neproběhlo). Atribut "from" opět přidává server jako informaci o původci dotazu, "to" deklaruje, od koho je informace žádána, "id" je identifikace zprávy pro sledovací účely, "query" je zvláštní namespace pro definici dotazu, jako verze klienta, způsob autorizace, čas apod., a konečně "error" přináší chybový kód a popis, pokud byl dotaz neúspěšný.