WWW a Internet



HTTP


Přenos souborů z WWW-serverů je realizován velmi analogickým postupem jako je tomu u Gopheru. Na základě požadavku WWW-klienta se vytvoří přenosový kanál na WWW-server. Používaný implicitní port je zde 80 . WWW-klient pak zadá takovýto požadavek:
   GET  /cesta
Přitom  cesta  vyjadřuje cestu ( pro WWW-server ) vedoucí k požadovanému souboru včetně jeho jména. Pokud za lomítkem není uváděna žádná cesta, zašle WWW-server úvodní WWW-stránku, tak jak ji má uvedenu v konfiguračním souboru.
Konkrétně pro případ WWW-stránky, tedy HTML-souboru z předchozí kapitoly zadá WWW-klient tento požadavek:
   GET  /kizi/information/
A pak musí ( podle obsahu získaného souboru ) stejným způsobem pokračovat, aby získal i obrázky, které patří do této WWW-stránky.
   GET  /icons/blank.gif
   GET  /icons/back.gif
 .. atd.

Obdobně Gopheru je přenosový kanál i v tomto případě po předání souboru WWW-serverem uzavřen, na přenos každého obrázku se tak vždy vytváří znova. Takovýto tvar protokolu HTTP , tedy komunikace WWW-klienta s WWW-serverem, je vlastně ještě jednodušší než tomu bylo u Gopheru. Nutno ovšem říci, že dobře vyhovuje, pokud klient získává z WWW-serveru zdrojové texty HTML-stránek anebo pak soubory, o nichž předem ví, že to jsou obrázky.

Při přenosu jiných souborů již například nemusí být klientu jasné, jakým způsobem má být soubor interpretován. Situaci zpravidla odhaduje podle koncovky pojmenování souboru. ( V Gopheru byl tento problém vyřešen zavedením pole  Type .)
Další nejasnosti se mohou někdy objevit, je-li takovýmto způsobem přenášen velký textový soubor. Jeho konec pozná klient též uzavřením přenosového kanálu, což ovšem může způsobit problémy při zrušení kanálu třeba kvůli komunikačním chybám. ( Zcela analogicky přenosu binárních souborů v Gopheru. Ostatní soubory jsou v něm totiž zakončovány samotnou tečkou na řádku.)
Také pro WWW-server je o něco složitější okamžitě poznat, zda cesta končí jménem souboru či adresáře. Někdy je tak WWW-klient nucen svůj požadavek opakovat. ( Gopher kvůli tomu požadavek v poli  Path  znovu obvykle začíná stejnou hodnotou jako  Type .)  Specifikaci cesty končící v adresáři je pro WWW-server nejlepší vždy zakončit lomítkem, cestu končící konkrétním souborem nikoliv.

Končí-li cesta adresářem ( analogicky Gopheru, který pak zasílá Menu ) , WWW-server zpravidla zasílá soubor určitého jména, stanoveného při konfiguraci, nejčastěji  index.html nebo welcome.html  případně  index.htm  a podobně. Otázkou samozřejmě je, jak se WWW-server zachová, když takovýto soubor v adresáři neexistuje. WWW-server může být v takovémto případě schopen, nemá-li to případně i zakázáno v konfiguraci, vygenerovat WWW-stránku uvádějící jména všech souborů v onom adresáři - přesněji řečeno, všech souborů v systému obvykle používaných jmen. Takto také původně vznikl tvar WWW-stránky rozebírané v předchozí kapitole.

Popsané principy spolupráce klienta s WWW-serverem jsou v podstatě stejné jako spolupráce klienta s Gopher-serverem. Přitom Gopher má v poli  Path  naplněn přesně takový požadavek, který klient zasílá serveru. V zásadě je tak možné, aby onen požadavek vypadal jako:  GET /cesta . Bude-li přitom zároveň uvedeno  Port=80 , je pak z prostředí Gopheru možno spolupracovat i s WWW-servery.

Problémem samozřejmě je, zda v tomto případě klient získané soubory umí uživateli správně interpretovat, třeba jako obrázky nebo čitelné HTML-stránky. Nutno říci, že  Type=I  jako "image" v Gopheru předpokládá zpracování obrázků, anebo také  Type=g  , to mají být přímo obrázky ve formátu GIF -  viz RFC1436 [1]. Posléze se objevila i možnost specifikovat  Type=h , kdy získaný soubor ( v prostředí Gopheru ) má být interpretován hypertextově. Obvykle se tím myslí interpretace podle jazyka HTML.

Tento ( Gopheru zcela podobný ) způsob spolupráce WWW-klienta s WWW-serverem se podrobněji neobjevil v žádném RFC-dokumetu. Pouze v RFC1945 [2] je tato základní varianta protokolu http označována jako verze  0.9 . Uváděné RFC1945 se podrobně věnuje vyšší verzi protokolu, který již odstraňuje shora naznačené problémy spolupráce mezi klientem a WWW-serverem.
 

Tato vyšší verze protokolu http byla označena jako  1.0 . Nejpodstatnější změnou asi bylo, že bezprostředně před každým přenášeným souborem WWW-server posílá ještě jeho hlavičku ( header ), podle níž může WWW-klient zjistit, jak má být správně soubor interpretován či jakou má velikost. ( Tedy to, co ve srovnání s Gopherem nebylo zpočátku ve WWW úplně do detailů domyšleno. )
Takto konkrétně vypadá odpověď serveru, jenž zašle WWW-stránku z předcházející kapitoly podle vyšší verze protokolu http :

 
HTTP/1.1 200 OK
Date: Fri, 19 Feb 1999 16:00:50 GMT
Server: Apache/1.2.4
Last-Modified: Tue, 19 May 1998 16:57:43 GMT
ETag: "205fd-5be-3561ba07"
Content-Length: 1470
Accept-Ranges: bytes
Connection: close
Content-Type: text/html

<HEAD><TITLE>Index of /kizi/information </TITLE></HEAD><BODY>
<H1>Index of /kizi/information</H1>
<PRE><IMG SRC="downloader/0.gif" ALT="     "> Name                   Last ..
<HR>
<IMG SRC="downloader/1.gif" ALT="[DIR]"> <A HREF="/kizi/">Parent Directory<..
 ...
 ...
 ...
<IMG SRC="downloader/4.gif" ALT="[   ]"> <A HREF="DIR">DIR</A>          ..
</PRE></BODY>
 

Prázdný řádek ukončuje hlavičku a odděluje tak zároveň začátek vlastního souboru. Nutno snad ještě poznamenat, že všechny řádky hlavičky ( včetně prázdného ) mají být vždy ukončeny dvojicí znaků  CR LF . ( Ve vlastním HTML-souboru tomu tak ale již býti nemusí.) Nikoliv podstatně odlišnou nesrovnalostí vůči dosud uvedenému je, že WWW-server pracuje ještě ve vyšší verzi protokolu http , a to 1.1 . ( O čemž bude ještě zmínka v dalším.)
Verze protokolu byly navrženy trochu odlišné i pro způsob, jímž klient formuluje svůj požadavek pro získání souboru. Na základě toho by také server měl svou odpověď přizpůsobit úrovni klientem použitého protokolu. Umí-li klient zadat na náš soubor jen požadavek  GET /kizi/information/ , zašle mu jej přesně jen tak, jak lze soubor vidět v předchozí kapitole. Pro zde uvedený tvar odpovědi serveru musí i požadavek odpovídat vyšší verzi protokolu. Ta předpokládá možné uvedení analogických informací WWW-klientem, jaké uvádí v hlavičce i WWW-server. Obecně lze tvar požadavku vyjádřit jako

   GET  uri  HTTP/1.0
   header požadavku     ( nepovinný )
   prázdný řádek        ( =  pouze  CR LF )

uri  znamená buď cestu ( pro WWW-server ) k souboru, anebo to může být celé URL , v němž pak bude obsažena i specifikace počítače. Oproti předchozímu tvaru požadavku je zde ještě uváděno  HTTP . Podle toho WWW-server pozná, že má ještě očekávat další řádky (řádek) od klienta. Každý tento řádek končí dvojice znaků  CR LF .

Za slovem HTTP následuje lomítko a verze protokolu http, takže lze rozpoznat i požadavky dalších verzí. Pro mnohé WWW-servery však stačí uvést jen  HTTP , což implicitně chápou jako specifikaci pro protokol verze 1.0 . Požadavek pro výše zde uvedený tvar odpovědi byl konkrétně zadán takto:

   GET  /kizi/information/  HTTP
   prázdný řádek

Po zaslání souboru (s hlavičkou) WWW-server i nyní opět uzavírá přenosový kanál. Klient pak analogickým způsobem po serveru žádá zaslání obrázků a dostává přitom takovéto odpovědi:

 
HTTP/1.1 200 OK
Date: Fri, 19 Feb 1999 16:01:29 GMT
Server: Apache/1.2.4
Last-Modified: Thu, 06 Nov 1997 18:20:05 GMT
ETag: "c744-94-34620a55"
Content-Length: 148
Accept-Ranges: bytes
Connection: close
Content-Type: image/gif

GIF89a. . Ą .                            ...
...

Hlavičky (headers) zavedené od verze protokolu http 1.0 jsou tvořeny podle obvyklých pravidel jako záhlaví dopisů v Internetu, přesněji řečeno pravidel pro jejich rozšířený tvar podle MIME  ( blíže viz  RFC1521 [3] ).
Někdy se tak lze setkat s formulací, že přenos podle vyšších verzí protokolu http využívá MIME . Obdobná formulace se též používá v souvislosti s přenosem E-mailu, což se ale častěji chápe jako způsob zakódování a rozkódování českého textu eventuálně vkládaných binárních souborů. WWW-klient takovéto rozkódování ale nebývá schopen zvládnout a český text se zakódovaný podle MIME mezi WWW-serverem a WWW-klientem nepřenáší.

Jaké údaje jsou v hlavičkách přenášeny ?  Ze strany klienta to nemusí být sice žádné, ale zpravidla je vždy uváděna informace (= řádek)  User-Agent:  o jménu a prostředí klienta. Někdy může klient v řádku  From:  uvádět i uživatelovu E-mailovou adresu. Zmiňované RFC1945 hovoří o tom, že by se tak nemělo dít bez souhlasu uživatele. Snad se lze ještě zmínit o položkách  Accept: , ty sice oficiálně patří až do verze protokolu  1.1 , ale řada klientů je začala používat již dříve pro informace o tom, jaké typy souborů umějí správně interpretovat. Někdy tak možná zdlouhavě zasílají serveru snad až příliš dalších informací - ve srovnání s verzí 0.9 .

Obdobně v hlavičce zasílané WWW-serverem klientu ( spolu se souborem ) se vždy objevuje jeho jméno - viz výše řádek  Server: . Z dalších položek (řádků) je zajímavá například informace  Last-Modified: uvádějící časový údaj, který je v systému přiřazen zasílanému souboru.

Především je doporučeno, aby server v hlavičce uváděl explicitně položku  Content-Length:  specifikující velikost přenášeného souboru. Díky tomu je pak klient schopen eliminovat případné problémy vyvolané nesprávným přerušením přenosového kanálu. Poslední obvykle bývá v hlavičce ( snad významově nejpodstatnější ) řádek  Content-Type:  uvádějící typ souboru, tedy informaci o způsobu, jak má být klientem tento soubor interpretován. Viz z předchozích příkladů:  text/html , image/gif . ( Na doplnění lze snad uvést, že pro obyčejný textový soubor by to bylo  text/plain .) Je sice pravda, že WWW-server tuto informaci obvykle také odvozuje z koncovky jména zasílaného souboru, ale při tvorbě WWW-stránek nebývá problémem respektovat (známá) pravidla v prostředí příslušného operačního systému.

V RFC1866 [4] popisujícím jazyk HTML verze 2.0 je v části 5.2.5 zmínka o specifikaci <META> použitelné v úvodu HTML-dokumentu, v části <HEAD> . Její tvar  <META  HTTP-EQUIV="položka" CONTENT="text">  má umožnit, aby WWW-server v hlavičce tohoto souboru (dokumentu) uváděl i řádek
  položka:  text
( pokud tak nedojde k rozporům se systémovými informacemi serveru ). Ve skutečnosti však většina WWW-serverů takovouto položku do hlaviček odpovědí ale uvést neumí. Pokud se klient touto informací řídí, převezme ji až z přeneseného zdrojového textu, z jeho "hlavičky", tj. z části <HEAD> .
Poznámka: Specifikace <META> je v podstatě jediná věc, jak souvisí HTTP-hlavička z přenosu souboru s HTML-hlavičkou zdrojového textu.

Verze 1.0  protokolu http  umožňuje používat kromě metody GET známé z původní verze také ještě HEAD a POST . Požadavek HEAD se zadává zcela shodně jako GET , WWW-server přitom ošem jako odpověď zasílá jenom úvodní hlavičku ( tedy HTTP-hlavičku ), jakou by ( v úvodu ) posílal při požadavku na tento soubor ( zadaném pomocí GET ). Naproti tomu POST umožňuje, aby i klient zasílal serveru ( za hlavičkou svého požadavku ) přímo nějaká data, nejčastěji nějaký textový soubor. A záleží potom na programovém vybavení WWW-serveru, jak s takto získanými daty nakládá a jak je dál zpracovává.
Takto vypadá konkrétní požadavek používající zmíněnou metodu. Klient zaslal požadavek WWW-serveru na  listserv.cesnet.cz [5], jenž kromě zaslání informativní WWW-stránky o přijetí požadavku zabezpečí i jeho následné zpracování Listserverem. Uživatel pak na adresu ( uváděnou v datové části ) obdrží E-mailem přehled hlavních příkazů Listserveru.

   POST  /lwgate/  HTTP/1.0
   Content-Length:  41
   prázdný řádek
   execute=info&email=jjkastl@vse.cz&ref=yes

Dodejme, že v hlavičce musí klient vždy uvést velikost souboru (dat), který takovýmto způsobem WWW-serveru zasílá.

Protokol 1.0 přispěl především k rozvoji dalších možností a variantních způsobů spolupráce WWW-klienta s WWW-serverem. Přesto obsahuje i některá slabá místa. Ve specifikaci  uri  se může objevovat adresa cílového počítače (tak jak ji zadával uživatel), čehož záhy začaly některé programy WWW-serverů využívat při odpovědích. Problémem přitom bylo, že nikoliv vždy se v komunikaci klienta ona adresa cílového počítače musí objevit.
Druhým problémem ( a to obou ) verzí protokolu je koncepční nelogičnost s vytvářením kanálu pro přenos obrázků. Vytvoření ( a následné zrušení ) přenosového kanálu pro každý obrázek principiálně vyhovuje, pokud je nějaký ( třeba odborný ) text doplněn pár obrázky. Při přenosu například úvodní WWW-stránky, do které je zakomponováno 10, 20 obrázků, je zbytečně zdlouhavé stále znovu vytvářet přenosový kanál.
 

Oba tyto problémy se snažila překonat u protokolu http verze 1.1 . Přenosový kanál nemusí být po zaslání souboru serverem rušen. Přesněji řečeno, pokud zrušen bude, má to WWW-server výslovně uvést v řádku  Connection:  v hlavičce zasílané stejným způsobem i ve verzi protokolu 1.1  před vlastním souborem. V předchozích ukázkách odpovědí serveru se vždy objevuje  Connection: close , protože WWW-server se takto snažil přizpůsobit požadavkům klienta, který s ním komunikoval podle protokolu  1.0 .  Jak vypadá požadavek na stejnou WWW-stránku podle protokolu http 1.1  ( při němž WWW-server neruší přenosový kanál ) ?

   GET  /kizi/information/  HTTP/1.1
   Host:  beta.vse.cz
   prázdný řádek

Požadavek zasílaný klientem se od předcházející verze liší pouze v tom, že nyní je již potřeba vždy uvádět za slovem HTTP verzi protokolu 1.1 , ale především nyní musí být v hlavičce požadavku (minimálně) položka  Host:  nějakým způsobem vždy naplněna.

Odpovědi serveru vypadají zcela shodně jako za předchozí situace, pouze řádek (položka)  Connection:  chybí. To zároveň znamená, že přenosový kanál WWW-serverem nebyl uzavřen a klient může hned zadat požadavek na poslání obrázku ( jako třeba ve výše uváděném příkladě na  /icons/blank.gif ).
Pokud WWW-klient nezadá v hlavičce svého posledního požadavku na obrázek položku  Connection: close , WWW-server zpravidla udržuje kanál po jistou dobu ještě otevřený. Pokud však neobdrží v této době další požadavek, sám kanál uzavře. Z tohoto pohledu tak můžeme stále hovořit o spolupráci WWW-klienta s WWW-serverem jako spíše o účelové ( nespojované ) spolupráci.

S jistým zjednodušením lze říci, že protokol http 1.1 je obdobný předchozí verzi 1.0  s přesnějším a podrobnějším popisem položek (řádků) HTTP-hlaviček - viz  RFC2068 [6]. Nejpodstatnější odlišností je udržování otevřeného přenosového kanálu mezi klientem a serverem, což však není zásadním způsobem využito k rozšíření forem jejich spolupráce.

Protokol 1.1 umožňuje sice využití ještě dalších metod spolupráce, konkrétně:  OPTIONS , GET , HEAD , POST , PUT , DELETE , TRACE . Pouze  GET a HEAD  musejí být každým serverem akceptovány. V opačném případě má server uvádět v hlavičce odpovědi, v její první řádce, buď z verze 1.0 již známé   HTTP/1.1  501  Not Implemented   nebo nově zavedené   HTTP/1.1  405  Method Not Allowed ,  pokud některá metoda není povolena v jistých souvislostech případně pro jisté klienty.
Kódy těchto zpráv jsou číslovány značně analogicky jako zprávy v protokolu SMTP  ( viz následující kapitola ), které si SMTP-programy navzájem vyměňují při přenosu E-mailu. Číslování je trojciferné, přičemž  1__ začínají informativní zprávy ( nebylo použito ve verzi 1.0 ) ,  2__ začínají "úspěšné" odpovědi,  3__ začínají odpovědi instruující klienta učinit něco jiného, dalšího.  4__ jsou "měkké" chyby, které se zpravidla týkají činnosti klienta, a  5__ "tvrdé" chyby dané možnostmi serveru.

Následující příklad jest ukázkou skutečné komunikace s WWW-serverem podle http-protokolu verze 1.1 , při první odpovědi serveru se zde objevuje zpráva s kódem  301 .  Přenosový kanál přitom zůstal celou dobu otevřený :

    HEAD /kizi/information HTTP/1.1
    Host: beta.vse.cz

 HTTP/1.1 301 Moved Permanently
 Date: Tue, 30 Mar 1999 15:51:04 GMT
 Server: Apache/1.2.4
 Location: http://beta.vse.cz/kizi/information/
 Content-Type: text/html
    HEAD /kizi/information/ HTTP/1.1
    Host: beta.vse.cz

 HTTP/1.1 200 OK
 Date: Tue, 30 Mar 1999 15:51:24 GMT
 Server: Apache/1.2.4
 Last-Modified: Tue, 19 May 1998 16:57:43 GMT
 ETag: "205fd-5be-3561ba07"
 Content-Length: 1470
 Accept-Ranges: bytes
 Content-Type: text/html
 
 ...
 Connection closed by foreign host.
 
Klient v příkladu využil metodu HEAD , v požadavku jím zadaném končí cesta ( uri ) jménem adresáře, avšak na konci nebylo uvedeno  / . WWW-server proto klientu v odpovědi specifikoval ( viz položka  Location: ), jak by měl (znovu) požadavek zadat.

Udržování ( jistou dobu ) otevřeného přenosového kanálu se asi nejpodstatnějším způsobem projevilo v možnosti "rourování" požadavků klientem - v angličtině možná lepší termín  pipelining . Klient může serveru zaslat - při otevřeném přenosovém kanálu - naráz více požadavků ( třeba na všechny obrázky úvodní WWW-stránky ), aniž by po každém požadavku vždy čekal na odpověď WWW-serveru. Protože však v hlavičkách odpovědí není uváděno něco jako "požadované uri" ( například tedy jméno žádaného obrázku ), musí WWW-server - pokud je schopen "rourování" akceptovat - zaslat odpovědi přesně v takovém pořadí, jak klient požadaky zadal. Jinak by klient samozřejmě nemohl vědět, třeba kam který z obrázků patří. RFC2068 potom rozebírá i takovou situaci, když dojde k uzavření přenosového kanálu v okamžiku nepředpokládaném klientem.
Cíl takovéhoto seskupování požadavků ( ale i odpovědí serveru ) je zřejmý, zajistit při transportu jednoho IP-datagramu co možná jeho nejlepší (největší) využití.


Problémy spolupráce WWW-klienta a WWW-serveru však nevznikají obvykle kvůli otevírání a uzavírání přenosového kanálu, ale spíše kvůli odlišnému tvaru hlaviček v různých verzích protokolu http. Chování klienta a serveru, které oba nejsou připraveny pro tutéž verzi, se obecně snaží upřesnit RFC2145 [7]. I když je zatím využitelné jen pro verze 1.0 a 1.1 .
( O vyšší verzi se RFC-dokumenty dosud nezmiňují, naopak se nedávno pro http 1.1 objevilo RFC2616 [8] "přepisující" v podstatě RFC2068.)

Přesto některé servery nerespektují doporučený tvar spolupráci s klienty (dvou) nižších verzí. Ze serverů používaných u nás se asi nejlépe chovají servery Apache. Pokud obdrží požadavek ve verzi 1.1 , odpovídají klientu podle této verze. Pokud je požadavek v 1.0 , upraví odpověď podle tohoto protokolu ( viz řádky  Connection: close  v předchozích příkladech ). Pokud se na ně klient obrátí podle protokolu 0.9, vůbec v odpovědi neuvádějí hlavičku, ale pouze požadovaný soubor. - Odtud pramení doporučení, aby při odpovědích, jako ve ( výše zmíněném ) typu 301 , se krátká informace objevovala i v datové (obsahové) části odpovědi zasílané WWW-serverem.
Naopak asi nejhůře jsou požadavkům podle nižších verzí protokolu http schopni se přizpůsobovat servery Microsoft - IIS (Internet Information Server 4.0). Uživateli potom zbývá zkusit se jedině propojovat ( jak bude v dalším ) přes vhodný  proxy-server .





Využití protokolu HTTP


Z aplikací využívajících možnosti vyšších verzí http-protokolu je nutno se zmínit o následujících třech:
  Často používané virtuální WWW-servery souvisejí s položkou  Host: , kterou většina klientů začala uvádět v hlavičkách svých požadavků ( již od vzniku verze 1.0 ). V položce bylo uváděno jméno (cílového) počítače tak, jak je explicite zadal uživatel, anebo jak se vyskytovalo v odkazu, který právě použil. To tedy mohlo být buď doménové jméno počítače anebo přímo jeho číselná IP-adresa. Pokud měl počítač ještě jiné doménové jméno ( alias-jméno ), mohlo být použito i to.

Jen připomeňme, že virtuální přenosový kanál je určován čtveřicí čísel:  IP-adresami počítačů a porty použitými na cílovém a počátečním počítači. Přenosový kanál tak vypadá pro WWW-server vždy stejně a podle takovýchto údajů bude i odpověď serveru stejná. Využije-li však WWW-server z hlavičky požadavku onu informaci ( Host: ) o zadaném jménu počítače, může pak jeho odpověď být zcela odlišná. Tedy může zasílat zcela různé HTML-stránky, včetně samozřejmě i WWW-stránky úvodní. Cesty k dalším souborům pak mohou být zcela odlišné a vůbec nemusí být ani umožněno přejít z jedné varianty WWW-stránek nějak k jiné, ledaže by uživatel zadal pouze jí odpovídající (alias-)jméno cílového počítače. Takovýto server se pak uživateli jeví jako dva nebo i více - úplně či jen částečně - odlišných serverů. A o těch právě hovoříme jako o virtuálních WWW-serverech.
Jeden z prvních virtuálních WWW-serverů u nás byl na  Karlově univerzitě [9] , kde snad stále ještě mají informaci názorně vysvětlující onu skutečnost.

I na VŠE se posléze začaly objevovat virtuální WWW-servery. Například helpdesk.vse.cz [10], jehož originální HTML-stránku bychom mohli získat třeba takovouto specifikací URL:  gopher://helpdesk.vse.cz:80/0GET /   [11] . Toto je jeden ze způsobů, jak WWW-serveru na adrese helpdesk.vse.cz zadat požadavek podle http-protokolu 0.9 . WWW-server tak z (neexistující) http-hlavičky nemůže převzít žádnou informaci o zadaném jménu cílového počítače a zašle jako odpověď implicitní HTML-stránku originálního WWW-serveru. -- To by se ovšem mohlo stát i při použití protokolu 1.0 , až teprve ve verzi 1.1  musí vždy být (nějak) předáváno WWW-serveru také ono jméno cílového počítače.

V souvislosti s virtuálními servery je třeba se zmínit o možném problému při zkracování doménových adres, obvykle v rámci sítě určité organizace. Příkladně na VŠE je v řadě aplikací možno zadávat jako adresu jen jednoslovné jméno počítače. Pro určení IP-adresy je jméno implicitně rozšiřováno o (doménu organizace):  vse.cz  A tím je možno definovat přenosový kanál, který tato aplikace využívá. Problém při spolupráci WWW-klienta s virtuálním serverem může někdy způsobit situace, když v http-hlavičce je předáno serveru jen jednoslovné jméno počítače. ( Například, zadává-li uživatel na VŠE jen specifikaci http://helpdesk/ [12].) Jeden ze způsobů, jak toto bez problémů vždy uživatelům umožnit, je definovat dva virtuální servery. Například  kizi2.vse.cz [13] a pak druhý ( začínající ve zcela stejném adresáři ) jen pro  kizi2  [14] ( a samozřejmě využitelný těžko vně VŠE ).
 

  Podle hlaviček klientem zasílaných požadavků může WWW-server sám (automaticky) zvolit kód češtiny, ve kterém pak zašle svou odpověď zpátky WWW-klientu. Jaký kód WWW-klient preferuje, by měl uvádět v položce  Accept-Charset: , která je ovšem oficiálně uváděna až ve verzi  1.1 . ( I když ve verzi 1.0 je o ní zmínka v dodatcích, co se nad rámec tohoto protokolu již nezávazně využívá.) Naplnění této položky ale není povinné a navíc řada našich WWW-klientů je "počeštěna" tak, že v této položce správně neuvádí kód skutečně používaný k interpretaci výstupů.

A tak se (u nás) rozšířilo, že se nakonec spíše využívá položka  User-Agent: , ve které se každý klient snaží uvádět svoje jméno a také informaci o operačním prostředí. Z toho pak lze odhadnout, v jakém kódu češtiny bude tento klient nejspíše pracovat. ( A což samozřejmě nemusí být správně pro konkrétní implementaci.)  Skutečně poslaný obsah zmíněných http-hlaviček ( při této konfiguraci klienta ) lze vidět třeba zde [15].

Například pro poslední konfiguraci - na VŠE - prohlížeče Netscape lze vidět takovéto informace:

  HTTP_HOST = 146.102.64.30
  HTTP_ACCEPT_CHARSET = iso-8859-1,*,utf-8
  HTTP_ACCEPT_LANGUAGE = en
  HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
  HTTP_CONNECTION = Keep-Alive
  HTTP_USER_AGENT = Mozilla/4.05 [en] (Win16; I ;Nav)
  HTTP_REFERER = http://146.102.64.30/kizi/IKSy/kap8.iso88592.html

      toCP1250
 
Jednotlivé řádky nezačínají přesně tak, jak mají vypadat položky v http-hlavičce, ale jejich význam je jistě zřejmý. Odhlédneme-li od toho, že klient komunikoval podle protokolu 1.0 , ale přitom přenosový kanál nemusel být serverem uzavírán - viz podle  RFC1945 [2] a RFC2068 [6 "přechodná" položka  Connection: Keep-Alive ,  je především položka  Accept-Charset:  uváděna špatně, neboť onen prohlížeč neinterpretuje kód ISO-Latin1 ( tj. ISO-8859-1 ), ale  Windows-1250 . Pro správné ( nebo správnější ) rozhodnutí o volbě kódu je potřeba někdy použít až druhou z tučně uváděných položek  User-Agent: .  Jak se WWW-server rozhodne - lépe řečeno, jak se rozhoduje tento program "ladění" - je napsáno na posledním řádku. ( Což je pochopitelně přizpůsobeno konvencím následně spustitelného programu pro konverzi do jiných kódů češtiny.)

Z uvedeného příkladu je již zřejmé, že prakticky nelze ve všech případech rozhodnout úspěšně o správném kódu české diakritiky. Nešťastnou strategií jisté pseudodokonalosti používané na některých našich WWW-serverech je aplikace automatické volby kódu češtiny zasílaných HTML-stránek, aniž má uživatel možnost volbu, která mu z nějakého důvodu nevyhovuje, snadno změnit. I když bývá v nejasných případech zasílán HTML-soubor s odstraněnými diakritickými znaménky ( v kódu ASCII-1 ), nebývá bohužel pro uživatele v nezbytných případech ani tato varianta explicitně volitelná.

Konec konců pro automatickou volbu češtiny mohou být WWW-serverem využity i informace z jiných položek. ( Například i z http-položky  Cookie: )  Toto už vůbec nebývá na WWW-serveru zveřejňováno, takže kdyby uživatel i mohl změnit konfiguraci používaného WWW-klienta a ovlivnit tím obsah http-položek, jejich potřebný tvar se ani nedozví.
Možná ještě větší problém takto realizované "pseudodokonalosti" se projevuje při spolupráci s proxy-servery ( a jejich schopností poskytovat úspěšně WWW-stránky v příslušném kódu češtiny ).
 

  Co vlastně je  proxy-server ?  Dá se říci, že program, který umí pracovat jako klient i jako WWW-server. Získané stránky si určitou dobu uschovává a může je přitom sám také poskytovat jako server. Smysl používání proxy-serverů ( proxy = zástupce ) je snad okamžitě patrný. Nepřenášet až ze vzdálených WWW-serverů pokaždé tutéž (nezměněnou) WWW-stránku.

Na VŠE je proxy-server provozován na počítači, který se nyní jmenuje votrok.vse.cz . ( Symbolicky někdy také nazývaný cache [16].) Do sítě je tento počítač připojen dvěma způsoby, se dvěma adresami, a podle (svého) místa v síti by se měl WWW-klient obracet buď na cache.vse.cz nebo na httpcache.vse.cz . Pro úplnost je třeba říci, že v areálu na Jižním Městě používají (logicky) jiný proxy-server:  jmcache.vse.cz .

Požadavek na proxy-server WWW-klient zadává zcela stejně, pouze jako  uri  je nutno zadat celou URL-specifikaci, tedy   funkce://počítač/cesta
Konkrétně požadavek na WWW-stránku zmiňovaný výše by se přes proxy-server zadal takto:

   GET  http://beta.vse.cz/kizi/information/  HTTP/1.0
   prázdný řádek

Pokud klient v požadavku uvádí i položku  Host: , je při uvedení jména počítače v absolutní specifikaci uri tato položka hlavičky ignorována. Proto může klient s proxy-servery úplně stejně komunikovat také podle http-protokolu 1.1 . Je ovšem pravda, že na rozdíl od WWW-serverů pracují i v současnosti proxy-servery většinou podle protokolu 1.0 .

Pokud proxy-server už nemá požadovanou stránku někde uloženu, obrátí se jako klient na WWW-server, od něj získá příslušnou odpověď, kterou teprve pak zašle WWW-klientu. Získanou WWW-stránku si (zpravidla) sám někam ukládá, aby případný další takovýto požadavek od některého klienta mohl okamžitě uspokojit zasláním této WWW-stránky.
Situaci lze ilustrovat na výše zmiňované odpovědi WWW-serveru, při níž server vypisuje položky z http-hlavičky požadavku. Pokud se klient ( Netscape ) neobrátí přímo na WWW-server, ale na proxy-server, je pak odpověď takováto:

  HTTP_VIA = 1.0 cache.vse.cz:8080 (Squid/2.1.PATCH2)
  HTTP_HOST = 146.102.64.30
  HTTP_X_FORWARDED_FOR = 146.102.66.238
  HTTP_ACCEPT_CHARSET = iso-8859-1,*,utf-8
  HTTP_CACHE_CONTROL = max-age=259200
  HTTP_ACCEPT_LANGUAGE = en
  HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
  HTTP_CONNECTION = keep-alive
  HTTP_USER_AGENT = Mozilla/4.05 [en] (Win16; I ;Nav)
  HTTP_REFERER = http://146.102.64.30/kizi/IKSy/kap8.iso88592.html

      toCP1250
 
Asi je třeba připomenout, že zde se jedná o položky http-hlavičky, a to požadavku zadaného proxy-serverem. ( Obdobně i odpovědi proxy-serveru zasílané WWW-klientům mají http-hlavičky doplněny položkami informujícími o použití proxy-serveru.)

Při využívání proxy-serverů je pochopitelně zásadní otázkou aktuálnost stránek, které proxy-server klientům poskytl a které měl někde (u sebe) uloženy. Problém ani tak není s obvyklými WWW-stránkami, jež po nějakém čase někdo zaktualizoval, a které pak proxy-server začne správně poskytovat s jistým časovým zpožděním. To podle toho, jak má implicitně stanovenu dobu, po kterou si stránky pamatuje ( aniž by ověřil jejich aktuálnost na originálním serveru ).

Problém je ale s WWW-stránkami, které jsou (anebo mohou) být na WWW-serveru aktuálně pozměněny při požadavku klienta. Jedna ze situací již byla o něco výše zmiňována, automatická volba kódu české diakritiky na WWW-serveru. Zpravidla bývá nezbytné, aby WWW-stránky, které se mohou při požadavku klienta aktuálně měnit, byly vždy přeneseny z určeného WWW-serveru. Tedy aby proxy-server věděl, že tyto stránky nemá sám poskytovat ( a ukládat ) . Pro přenos takovýchto informací, třeba se specifikací  no-cache , byly v http-hlavičce zavedeny položky  Pragma:  ve verzi 1.0 , anebo nověji položka Cache-Control:  pro verzi protokolu 1.1 .

Ovlivnit obsah http-hlavičky vytvořené WWW-stránky je zpravidla standardními prostředky jazyka HTML neproveditelné. S problémy se ale obvykle nesetkávají ani tvůrci dynamicky se měnících WWW-stránek, u kterých rovněž nebývají uváděny v http-hlavičkách explicitně položky omezující způsob cache-ování (ukládání) těchto stránek na proxy-serveru. V konfiguracích různých WWW-serverů je nejběžnější situace, že takovéto stránky jsou vždy vytvářeny v podadresáři  cgi-bin . Mnohé proxy-servery proto odkazy s takovýmto jménem adresáře neukládají.

Pokud naopak chceme, aby některé takovéto stránky mohl proxy-server poskytovat - jako například dynamicky překódovávané stránky neměnného obsahu - anebo opačně používáme programově generované stránky i v adresářích jmen zcela normálních, musíme pak zajistit, aby WWW-server předával ještě k tomu potřebné položky do http-hlavičky.  RFC2068 [6]  popisující protokol 1.1 se rovněž zabývá spoluprací s proxy-servery a také jejich samotnou činností. Kromě položky  Cache-Control:  se zmiňuje například o položkách   Age:Expires:Vary:
Poslední z nich má příkladně instruovat proxy-server, aby při poskytnutí WWW-stránky zohlednil i shodnost některých položek z hlavičky požadavku zadaného WWW-klientem. Konkrétně   Vary:  User-Agent, Accept-Charset    lze nalézt v hlavičkách WWW-stránek automaticky překódovávaných WWW-serverem do kódu češtiny, jenž byl serverem zvolen podle obsahu zmíněných položek v hlavičce požadavku. Je-li proxy-server v tomto směru znalý verze 1.1 , uchovává si s onou stránkou i potřebné informace o tvaru hlavičky toho požadavku, kterým WWW-stránku získal. Sám pak WWW-stránku ( nebo přesněji řečeno variantu oné WWW-stránky ) klientu poskytne při shodnosti určených položek z hlavičky požadavku, kterým se klient na něj obracel.

Jak bylo dříve řečeno, proxy-server umí pracovat jako klient i jako server. Většina WWW-klientů, jak jistě známo, ovšem umí spolupracovat nejen s WWW-servery, ale též s Gopher-servery, s anonymními FTP-servery, případně zná i další internetovské funkce. A tak převážná většina proxy-serverů se umí rovněž obracet na Gopher-servery a anonymní FTP-servery. Obecně může požadavek na proxy-server od WWW-klienta obsahovat v  uri  také jiné funkce než jen http .
Například lze po proxy-serveru takto požadovat Gopher-Menu rozebírané v minulé kapitole:

GET  gopher://alfa.vse.cz/11/kizi/iksy/BEZ/ZAJIMAVE_PRIKLADY  HTTP/1.0
prázdný řádek

Pokud proxy-server tuto funkci akceptuje, postupuje tak, že sám získá toto menu Gopheru  a WWW-stránku, kterou by jako WWW-klient z obdrženého souboru vygeneroval, kdyby toto menu zprostředkovával uživateli, zašle potom pomocí http-protokolu onomu klientu. Následující požadavek (jiného) klienta na toto menu již může uspokojit tak, že okamžitě zašle uložené vygenerované menu, aniž by se obracel znovu na Gopher-server.
To zároveň vysvětluje, proč při použití stejného WWW-klienta může stejné Gopher-Menu vypadat někdy jinak. Podle toho, zda WWW-klient menu sám interpretoval uživateli, anebo tak za něj učinil ( trochu odlišně ) proxy-server.

Ke zcela analogické situaci může dojít i třeba pro adresáře na FTP-serverech podle toho, zda se WWW-klient obracel na proxy-server či nikoliv. A to může ( na první pohled paradoxně ) záviset na tom, zda uživatel zadal doménové jméno počítače anebo jeho IP-adresu. Například na VŠE mívají klienti ve standardní konfiguraci stanoveno, pro která (doménová) jména, například pro všechna jména končící  vse.cz , se nemají obracet na proxy-server. Pro všechny počítače jiných tvarů jmen - včetně tedy IP-adres, a to i v rámci VŠE - se naopak na proxy-server obracejí. ( Toho je konečně možno i někdy vhodně využívat, pokud se u použitého klienta objevují problémy ve spolupráci s nějakým WWW-serverem.)

WWW-klient se na proxy-server obrací jako na odlišný ( předem určený ) server, tedy na program pracující na určitém počítači a určitém portu. Porty výše zmiňovaných serverů jsou  { votrok.vse.cz 8080 } , { jmcache.vse.cz 3128 } .  Implicitně určený port pro proxy-servery není, i když uvedené dva porty jsou používány asi nejčastěji.

Proxy-server může pracovat i na portu  80 , také ale poněkud odlišným způsobem. Mohou na něj být IP-routerem ( spíše tedy firewallem ) směrovány všechny datagramy určené pro WWW-servery v rámci určité sítě, pro zvolené WWW-servery, pro všechny servery některé organizace a podobně. Takovýto proxy-server pak může mít zabudovány i jisté ochrany, které mu dovolují poskytovat WWW-stránky jenom z určitých míst takto chráněné sítě.
Hlavním důvodem používání takovýchto proxy-serverů bývá ovšem snaha snížit nároky na přenosové kapacity, a to nezávisle na tom, zda si uživatelé explicitně stanovili proxy-server používat či nepoužívat. WWW-klient v tomto případě ani neví, zda se svým požadavkem obrací na WWW-server nebo na proxy-server. I to je jeden z důvodů, proč v http 1.1 byla k požadavku klienta přidána položka  Host:  ( která vždy snadno umožňuje odvodit absolutní  uri ).

Například v síti TEN34-CZ se svého času objevil takovýto "tajný" proxy-server, především pro snížení přenosových nároků vně této sítě.
c-engine1.ten34.ces.net , ( c-engine2.ten34.ces.net , ..?.) byla adresa onoho proxy-serveru. Pokud by z nějakého důvodu bylo toto místo sítě mimo provoz, je pak obtížné se dostat k jakékoliv informaci na WWW-serveru vně TEN34-CZ . Jedině lze asi hledat vhodný proxy-server mimo TEN34-CZ , který ovšem z našeho počítače neodmítne požadavek, a využitím jiného portu tak "tajný" proxy-server obejít.

Zároveň je patrné, že proxy-servery toho typu s sebou nesou i jisté nebezpečí v záměrné dezinformaci. Třebaže žádnou stránku na konkrétním WWW-serveru nikdo nepřepsal ani jinak nezměnil, může být v některých místech sítě Internet klientům poskytována stránka úmyslně změněná, protože někdo cíleně ovlivnil činnost takovéhoto proxy-serveru.

Převážně ale proxy-servery přinášejí spíše výhody v rychlosti získání informací. Jedině je za škodlivé pokládají provozovatelé WWW-serverů, kteří si vydělávají vystavováním reklam na svých WWW-stránkách. Ne že by si uživatelé reklamu pomaleji stahovali a četli, to naopak, ale svým objednavatelům nemohou z logu WWW-serveru prokázat, jak obrovský počet počítačů již ovlivnili.
 

  Rozšířit anebo měnit položky v http-hlavičkách serverem zasílaných stránek (souborů) může jejich tvůrce obvykle jen pomocí některých programových prostředků. Ty zdaleka nebývají všude povoleny k používání při odpovědích WWW-serveru. Základní princip tvorby takovýchto stránek spočívá v tom, že se vytvoří vlastně program, který WWW-server aktivuje vždy, když obdrží požadavek od klienta. Výsledkem činnosti tohoto programu je zpravidla zdrojový text WWW-stránky zasílaný jako odpověď klientu. O takovýchto WWW-stránkách, možná přesněji o programech, které tyto stránky dynamicky tvoří, se hovoří jako o cgi-scriptech . ( Zkratka cgi znamená "common gateway interface", rozhraní z pohledu WWW-serveru, díky kterému může WWW-server aktivovat programy v operačním prostředí systému.)

Může přitom jít o několik příkazů pro vhodný interpreter, ale také třeba o aktivaci textového prohlížeče ( WWW-klienta ), jehož (upravený) výstup pak WWW-server odesílá. Takovéto WWW-stránky někdy mívají právě koncovku .cgi , ale mohou býti i úplně bez koncovky - to zpravidla bývá jen v určitém (význačném) adresáři, jméno kterého bývá často  cgi-bin , anebo může WWW-server onu stránku zprostředkovat pro odkaz končící jménem adresáře - přitom tvůrce ale musel vytvořit podle konvencí WWW-serveru v tomto adresáři soubor určitého jména, například index.cgi .

V operačním systému Unix, typickém pro provoz WWW-serverů, se často cgi-scripty píší v jazyce Perl. Proto se lze setkat u těchto stránek i se suffixem .pl .  V Perlu byl také napsán script ladeni [17 použitý zde pro výpis položek uváděných v hlavičce požadavku od klienta. Program je určen pro doladění automatické volby české diakritiky především pro prostředí konkrétní (místní) sítě. Alespoň v té by měl být schopen pro instalované WWW-klienty vždy rozhodnout správně. Variantu své volby pak vypisuje na posledním řádku.

Při tvorbě takovéhoto programu musí tvůrce kromě výstupu zdrojového textu WWW-stránky uvést nejprve i některé ( všechny či jen vybrané ) řádky http-hlavičky ( podle pravidel instalovaného WWW-serveru). A jeden prázdný řádek navíc, za kterým poté následuje zdrojový text stránky. Takto lze také vytvořit hlavičku pro odpověď serveru s kódem  301 anebo 302  Moved ...  směrující klienta na jiné místo.
( Právě tak je například z "ladění" odvozen program "auto" pro volbu české diakritiky.)

Je-li to v systému povoleno, lze si popsaným způsobem "inteligentně" ( myšleno jen za určitých podmínek ) přesměrovat vlastní home-stránku z jednoho počítače na jiný počítač. Ale použití cgi-scriptů nebývá na uživatelských home-stránkách zpravidla povolováno - a když, tak jen po kontrole správcem serveru. Důvodem bývá nejen obava před nevhodným využíváním výpočetní kapacity počítače, ale i možnost volně tím pro kohokoliv zpřístupnit některé neveřejné informace na onom počítači. Dokonce je známo, při jakých (úmyslných) chybách volně šiřitelných scriptů lze třeba v Unixu k takovýmto informacím proniknout.

Ještě ale existuje jeden důvod, který nesouvisí s mezerami v ochranách systému. Bohužel si ho někdy neuvědomují ani profesionální tvůrci programů. Pokud se například WWW-server při každém požadavku rozhoduje (znovu) o volbě kódu české diakritiky, může zpět WWW-klientu vybraný kód sdělovat opět v hlavičce odpovědi. WWW-klient ale podle toho může opravit své vlastní nastavení kódové tabulky, a pokud si z jakkoliv nevhodného (algoritmického) důvodu vyžaduje stránku pro interpretaci od serveru znovu, nemusí již být naplnění položek v tomto jeho požadavku stejné. ( Třeba proto, že původně vybraný kód neznal.) A teď WWW-server vybere pro změnu jiný kód, což může způsobit, že WWW-klient se přepne do svého původního stavu, a takto pak můžeme pokračovat stále dál. ( Zvláště když ještě někteří tvůrci WWW-stránek k tomu ponechají rozpornou informaci o původním kódu dokumentu ve specifikaci <META>.)

Obdobně jako pro Java-scripty existují v Internetu i knihovny připravených cgi-scriptů [18]. ( Jako třeba pro textové vyhledávání [19] v Hytelnetu.)





URL


URL , neboli Uniform Resource Locator se používá ke specifikaci umístění (informačního) zdroje v síti Internet. Pojem URL rychle zdomácněl v souvislosti s rozvojem WWW a funkčními schopnostmi klientů. Jeho vznik se odvíjí od URI , viz  RFC1630 [20]Universal Resource Identifier , což jsou odkazy, které se uvádějí ve (stanovených) specifikacích jazyka HTML . Takovéto odkazy se buď odvíjejí od WWW-stránky, na níž jsou umístěny, nebo mohou být zcela universální, plně popisující funkci, počítač a cestu a jméno souboru. A takovéto úplné (a universální) popsání přístupu k souboru se časem ukázalo natolik vhodné a jednotné, že se tyto URL-odkazy začaly používat i mimo WWW ( i když se nyní zase zpětně objevuje trend umožnit aktivaci WWW-klienta proto z jakéhokoliv prostředí ).

Syntaxi URL popisuje často citované ( například též Standardy Státního informačního systému ) RFC1738 [21], k němuž se pak objevilo několik doplňků rozšiřujících okruh využitelných funkcí. Snaha po jednotnosti pravidel pro vytváření úplných i relativních odkazů vedla až k RFC2396 [22], kde se obecně hovoří o URI chápaném zde jako Uniform Resource Identifier. V tomto duchu je pak zcela správně obecný tvar požadavku WWW-klienta, ve kterém se uvádí  uri .

Syntaxi (úplného) URL-odkazu můžeme zhruba vyjádřit následujícím schématem:
     funkce://uživatel:heslo@počítač:port/cesta_k_souboru

Pro odkazy na WWW-serverech se jako funkce uvede  http . Většina WWW-klientů zná rovněž funkce gopher a ftp , neboli umí spolupracovat také s Gopher-servery a rovněž získávat soubory pomocí FTP . Pro některé z konkrétních funkcí, kterých je v RFC1738 uváděno asi 10 , se tato obecně přijatá syntaxe může drobně lišit. Pro pět nejtypičtějších funkcí Internetu ( v RFC1738 označovaných slovem "scheme" ) se URL-odkazy mají psát takto:

ftp://uživatel:heslo@počítač:port/adr1/adr2/../soubor;type={a,i,d}

  Vždy je nutno specifikovat  počítač , pomocí doménového jména nebo IP-adresou. Nemusí být uváděn  uživatel , ten se pak implicitně rozumí  anonymous , a rovněž  heslo  není nutno uvádět. Místo něj má WWW-klient použít E-mailovou adresu toho, kdo klienta aktivoval. Pokud však byl specifikován  uživatel , klient si chybějící heslo v případě potřeby sám vyžádá.
Není-li uveden  port , předpokládá se standardně 21 .

adr1/adr2/../soubor   má znamenat cestu k souboru, tak jak se postupuje přes adresář adr1 , adr2 , .. a tak postupně, až se dostaneme nakonec k souboru, jehož jméno je uváděno jako poslední. Za ním následující výraz  ;type=  se (zatím) příliš nepoužívá, a dokonce pak někteří WWW-klienti ani nemusí být schopni celé specifikaci rozumět.
WWW-klient totiž pracuje stejně, jako by člověk pracoval s FTP přesně podle tohoto protokolu. Pro přechod do podadresáře zadává příkaz  cd , pro získání souboru pak příkaz  get . Skončí-li přitom v adresáři, většinou si příkazem  dir  nechá zobrazit jeho obsah. A stejně také celá cesta v této URL-specifikaci nemusí končit jménem souboru, WWW-klient potom zobrazí obsah onoho adresáře. Samozřejmě se nedá podle struktury koncového jména vyvozovat, zda jde o soubor či adresář. ( I když bývá zvykem, že jména obsahující tečky se dávají souborům, a jména adresářů většinou tečku neobsahují.)  A právě tuto situaci má jednoznačně řešit doplnění type=d , jako directory , vztahující se k poslednímu jménu cesty.

Při přenosu souboru podle protokolu FTP má být všude zaručeno, že uživatel do svého systému správně získá textový soubor, v němž jsou do jeho prostředí správně převedeny znaky z první poloviny ASCII-tabulky. ( V souboru jsou rovněž převáděny konce řádků do formy standardní v příslušném systému.) Tímto režimem práce se buď implicitně začíná, anebo jej uživatel zadává příkazem  ascii .
Netextové soubory ( jako programy, obrázky, nějakými prostředky komprimované soubory apod. ) takto není možno přenášet, protože by se v nich mohly vyskytovat takové kombinace bitů, které by vedly ( v tomto případě ) k nevhodným konverzím. ( Jako je například konverze konce řádků '0D 0A' mezi MS-DOSem a Unixem '0A' .) Pro přenos těchto souborů je třeba používat režim  binary , který zajistí přenesení souboru s přesně takovou bitovou posloupností po sobě následujících znaků (bytů), jako byla na originálním počítači. Samozřejmě je pak věcí uživatele, aby takovýto obrázek, soubor uměl ve svém (jiném) prostředí zobrazit, byl schopen ho dekomprimovat atd.

Zrovna tak se musí i WWW-klient rozhodnout, zda soubor přenášet v režimu  ascii nebo binary.  Zpravidla se rozhoduje podle koncovky jména souboru ( a mnohdy se podle toho také snaží odpovídajícím způsobem soubor uživateli přímo zobrazit ). A to opět nemusí učinit vždycky správně, pokud ovšem tak není explicite specifikováno pomocí  type=a , odpovídající ascii-režimu, anebo  type=i  pro režim  binary.

Popisovaná funkce ftp je uživatelsky dosti podobná funkci gopher. Někteří WWW-klienti dokonce používají i shodné grafické prostředky při zprostředkování adresáře koncovému uživateli a při interpretaci Gopher-Menu. Jako u WWW je vlastně vždy hlavní činností přenos souboru. Při použití protokolu FTP je však jedna podstatná odlišnost, klient musí využívat spolupráci spojovanou.  URL-specifikace popisuje jen místo, kde lze informaci nalézt, a nikoliv činnost klienta při jejím získávání. Tedy nehovoří například o tom, jak a kdy má klient zrušit své připojení k FTP-serveru. ( Kdy klient vydá příkaz quit .) Někteří klienti tak mohou učinit okamžitě po získání souboru, jiní, pokud jsou stále aktivováni, až při jiném funkčním požadavku, nebo dokonce až při FTP-požadavku na odlišný počítač. Jsou tak sice schopni případný další požadavek na původní FTP-server zpracovat rychleji, ale zase tím může být ( v podstatě bezdůvodně ) snadno někdy vyčerpán počet povolených připojení na určitém anonymním FTP-serveru. V tomto směru je mnohem flexibilnější spolupráce s Gopher-servery.

gopher://počítač:port/TypePathTspecifikace

  Cesta v této specifikaci vznikne spojením údaje Type a (celého) požadavku, který má klient zaslat Gopher-serveru. Ten je zde vyjádřen jako:  PathTspecifikace  
Path přitom představuje údaj uváděný v menu Gopheru  ( viz:  kap7...  [23] )  a jen výjimečně může být k němu ještě připojena určitá specifikace, řetězec znaků zadaný uživatelem například pro  Type=7 . Symbol T zde představuje tabulátor ( '09' ) , kterým musí klient v požadavku předávaném Gopher-serveru oba údaje oddělit, ovšem v zápisu URL-specifikace je třeba namísto tohoto symbolu konkrétně uvést  %09 .
Pro získání úvodního menu Gopheru ( na počítači ) může být veškerá cesta vynechána. Neuvedený port se předpokládá vždy standardně 70 .

Neboť pro většinu Gopher-serverů pole  Path  obsahuje na začátku rovněž informací o Typu , lze snadno pochopit, proč celá cesta v URL-specifikaci začíná nejčastěji buď znaky  00/ ( pro soubor )  nebo  11/ ( pro menu ). Za nimi pak již následuje obvyklá struktura adresářů, jak je známá třeba z využívání FTP . V zásadě se dá říci, že podle prvního znaku celé cesty volí WWW-klient ( pro funkci gopher ) způsob interpretace získaného souboru.  Pro  1  obvykle nějak vygeneruje HTML-stránku, kterou pak zobrazuje uživateli jako menu.  Naopak pro  0  soubor jako textový uživateli jenom zobrazí. Teoreticky tedy můžeme WWW-klientu měnit tento první znak, aniž tím jakkoliv ovlivníme činnost Gopher-serveru.

Například tedy   gopher://počítač/01/  zobrazí (textově) úvodní menu tak, jak vypadá při přenosu ze serveru.
Vzhledem k podobnosti spolupráce klienta s Gopher-serverem a protokolu http 0.9  je možno WWW-klientu zadat i takovouto specifikaci   gopher://počítač:80/0GET /   ( již zmíněnou v souvislosti s virtuálními servery ). Klient v tomto případě zašle na port 80 , na němž pracuje standardně WWW-server, jako svůj požadavek znakový řetězec, který následuje za Typem , a to je   GET /   ( ale mohlo by takto být i zadáno  GET /cesta  ).  Neboli, klient při takovéto URL-specifikaci komunikuje s WWW-serverem přesně podle protokolu 0.9 , získaný (textový) soubor pak klient uživateli zobrazí ve zdrojovém tvaru. Neboť požadavek byl bez jakýchkoliv http-hlaviček, je tak možno vidět třeba na virtuálním serveru originální WWW-stránku ( viz výše ) anebo získat stránku vhodněji (univerzálněji) překódovanou.
Problémy se přitom mohou vyskytnout na dvou místech. Jednak WWW-server nemusí být ochoten akceptovat protokol 0.9  a jednak může klientu vadit mezera v zadání URL-specifikace. Tu by sice bylo možno zapsat jako  %20 , ale klient ji WWW-serveru  ( v tomto případě ) musí zasílat skutečně jako mezeru.

Někteří klienti, jak již výše zmiňováno, při používání funkce gopher rozumějí také (neoficiálnímu) typu  h , který znamená, že soubor má být "hypertextově interpretován". Potom je možno, aby WWW-stránku poskytoval i Gopher-server, anebo je možno, aby třeba tímto zadáním v Gopher-Menu  WWW-klient přešel na spolupráci s WWW-serverem:
   Name=Prechod na WWW
   Type=h
   Path=GET /~jjkastl/W-L/
   Host=alfa.vse.cz
   Port=80
 

http://počítač:port/cesta?specifikace#fragment

  Takto lze vyjádřit syntaxi pro funkci http , tedy pro odkazy na WWW-serverech. Uváděná cesta vypadá stejně jako pro ftp, přičemž může končit jak adresářem tak jménem souboru. ( O správné poskytnutí odpovědi se nyní postará WWW-server.)  WWW-klient zasílá WWW-serveru ( jako uri ) údaje    /cesta?specifikace  . Otazníkem oddělovaná specifikace má stejný význam jako pro Gopher, specifikuje další informace, které WWW-server potřebuje pro (programově) vytvářenou odpověď v onom místě cesty. V popisované syntaxi pochopitelně může být tato část ( i s otazníkem ) vynechána.
Poslední část   #fragment   slouží klientu až po získání WWW-stránky k nalezení její příslušné části, tedy by snad šlo i říci k nastavení na její určitý fragment. Ani tato část se v syntaxi nemusí objevovat, jako konec konců i cesta. ( Potom se vše vztahuje k úvodní WWW-stránce.)
V případech , kdy není uváděn port , předpokládá se standardně 80 .

Pomocí oné části URL-odkazu, která následuje za ? , se často řešívá spolupráce s nějakým informačním systém. Příslušná specifikace obvykle obsahuje jednak parametry pro nastavení správného prostředí a jednak ( nebo hlavně ) určitý způsob lokalizace oné informace ve využívaném informačním systému ( v nejdokonalejších aplikacích třeba i pomocí dotazovacího jazyka ). Tak se samozřejmě nevyhneme situacím, že je potřeba někde uvést i znak s českou diakritikou. Syntaxe URL ale takové znaky nepřipouští.

Velmi stručně lze říci, že v URL-specifikacích můžeme bez problémů využívat (jen) znaky ASCII-1 alfanumerické. Některé zvláštní znaky jako   /  :  @  ;  ?  #  %   musí mít ze syntaktického hlediska, jak je zřejmé již z předešlého, nějak vyhrazené použití, aby se totiž daly jednotlivé části vždy bez problémů rozlišit. Další zvláštní znaky jako   +  =  &  ,  $   mezera   mohou ovlivňovat syntaxi podrobnějších pravidel ( třeba při spojování jednotlivých parametrů do zmíněné specifikace předávané informačnímu systému ) anebo mohou některému klientu působit problémy při konstrukci požadavku zasílaného WWW-serveru, kdy se právě mezerou odděluje uri . Všechny nepatřičné znaky je nutno ve všech (zadatelných) částech URL-specifikací uvádět (kódovat) jako  %xy , kde xy je hexadecimální hodnota takového znaku.

Na rozdíl od jiných funkcí, kde transformaci do správného 8-bitového tvaru takovéhoto znaku musí vždy provádět klient, pro funkci http by takovouto konverzi ( alespoň v cestě ) měl být schopen provést i WWW-server. A tak je relativně bezproblémové, když jsou takto zakódovány i znaky povolené, anebo když přímo v požadavku na WWW-stránku zakódujeme takto znak, který nemůžeme snadno napsat na klávesnici. ( Viz známý problém se znakem ~ na české klávesnici, místo kterého lze psát  %7E .)

Pro české znaky s diakritikou, které jsou takto zapsány v nějakém URL-odkazu, je nevýhodné to, že jednoznačně nelze říci, o jaký znak vlastně jde, protože explicitně není uvedeno jméno kódu české diakritiky.  WWW  sice v obecnosti předpokládá, že všechny znaky z druhé poloviny ASCII-tabulky se vztahují k (západoevropskému) kódu ISO-Latin1, ale takto bychom nikdy nerozkódovali třeba české znaky s háčkem. Pro spolupráci s WWW-serverem problém až tak podstatný ovšem není, neboť stejně jako jména adresářů v cestě k určitému (známému) souboru závisí na konkrétní konfiguraci WWW-serveru, tak i použitá tabulka kódu je odvislá od způsobu konkrétní implementace na straně WWW-serveru.
Je třeba zdůraznit, že může býti jedině nezbytné při spolupráci s WWW-serverem, aby se české znaky s diakritikou mohly vyskytovat ve specifikační části za otazníkem. Je krajně nevhodné pojmenovávat v české diakritice třeba soubory zasílané WWW-serverem. Zvláště "oblíbené" znaky  ž, š, ť  v kódu Windows-1250, kde jsou umístěny ve sloupcích  8 a 9 , mohou způsobit některým klientům nepřekonatelné potíže. Tabulka ISO-Latin1 v těchto sloupcích neobsahuje žádné textově interpretovatelné znaky, a tak je klient může v nezakódovaném tvaru pokládat za rozšíření znaků řídících.
 

telnet://uživatel:heslo@počítač:port/
  Pouze toto lze specifikovat pro funkci telnet . Obdobně jako pro získání souboru pomocí FTP nemusí být vůbec uváděno  uživatel:heslo@  anebo lze jen vynechat :heslo . Implicitně pak není žádné uživatelské jméno ani heslo použito.
Není-li  port  uveden, předpokládá se standardně 23 .

TELNET  na rozdíl od Gopheru a WWW  předpokládá spojovanou spolupráci s cílovým počítačem. ( Zde se pak použije jméno  uživatel  a uvedené  heslo .) Toto je zcela analogické FTP , jež je ovšem zaměřeno především na přenos jednotlivých souborů. Proto FTP-přenos obvykle umí zajistit i ( souborově orientovaný ) WWW-klient, ale funkci telnet sám obvykle neřeší. Zpravidla se obrací na tuto nainstalovanou funkci v systému, ve kterém pracuje. Bohužel pak takto na cílový počítač už nezajistí předání žádného textového řetězce, i uživatelské jméno a heslo z URL-odkazu je nutno napsat ručně. Při kliknutí na nějaký takovýto odkaz WWW-klient vlastně jen umožní aktivaci TELNETu, v lepším případě k tomu ještě zobrazuje, jaké uživatelské jméno a heslo se má při tom použít.

Syntaxe pro tuto funkci ani nepočítá se situacemi, že by zadáním nějakého (jednořádkového) příkazu šlo lokalizovat určitou informaci. Tím je tato URL-specifikace využitelná více méně jen k navigaci na informační zdroj, a to zcela obdobně jako funkce následující.

mailto:uživatel@počítač
  Zde se, pozor, nepíší lomítka. Tato URL-specifikace vlastně uvádí jen internetovou E-mailovou adresu, na kterou lze poslat dopis ( obsahu nikterak blíže nespecifikovaného ). Na rozdíl od TELNETu ovšem řada klientů ( při kliknutí na tento odkaz ) nejen zabezpečí editaci dopisu, ale umí také zabezpečit jeho transport, a to třeba přímo podle protokolu SMTP.
Pro zajímavost se snad lze ještě zmínit, že znak % v nějaké adrese by se v duchu předchozího musel nahradit svou hexadecimální hodnotou     mailto:uživatel%25jiná-síť@gateway
 

RFC1738  kromě těchto nejpoužívanějších funkcí popisuje ještě další, jako třeba news a nntp pro spolupráci s on-line diskusními skupinami. O některých funkcích pak předpokládá, že budou zavedeny v budoucnu. Jako třeba tn3270 ( což se ovšem nestalo ) nebo z39.50 ( což učinilo RFC2056 [24] ).
Naopak funkci pop  ( Post Office Protocol - Version 3 [25] )  sloužící k přenášení pošty na lokální počítač byli někteří WWW-klienti schopni realizovat, ale URL-specifikace k tomu chyběla. Až posléze se objevila v RFC2384 [26].

Ještě jednu zvláštní URL-specifikaci lze někdy s výhodou využít při práci s WWW-klientem -- zvláště při ladění WWW-stránek. A tou je ( systémově závislá ) funkce  file , jež má ( prostřednictvím WWW-klienta ) umožnit přístup k souborům v prostředí vlastního operačního systému. Způsob jejich interpretace pak klient odvozuje ze struktury jmen. URL-specifikace mají obecně vypadat takto:

file://systém/cesta_k_souboru

  Jak  cesta_k_souboru  tak i  systém  jsou odvislé od konvencí daného operačního prostředí. Někdy lze i oba údaje vynechat. Pokud tedy klient akceptuje  file:///  při uživatelově zadání, může být někdy využíván i jako  manager souborů.
 

Při vytváření WWW-stránek se většina odkazů tímto způsobem ale nepíše. WWW-klient si totiž pamatuje jakou funkcí a z jakého počítače WWW-stránku získával a jaká přitom k ní vedla cesta, přesněji z jakého adresáře si stránku vyžádal. V tomto duchu je tak možno URL-odkazy v jednotlivých HTML-specifikacích zkracovat. O těchto odkazech pak hovoříme jako o relativních URI ( na rozdíl od dosud popisovaných absolutních URL ).

Pravidlo "relativnosti" odkazu se dá naformulovat asi takto. Začíná-li odkaz dvěma lomítky  // , doplňuje si WWW-klient funkci ( kterou onu stránku získal ). Začíná-li odkaz jedním lomítkem  / , doplní si klient funkci a počítač, přesněji řečeno všechny údaje až k začátku cesty. ( Ta teď bude uvedena znovu celá.)  Pakliže odkaz žádným lomítkem nezačíná, vztahuje se cesta ( nejčastěji tedy jen jméno souboru ) k adresáři, ze kterého byla stránka s tímto odkazem získána.

RFC2396 [22 se podrobněji šíří například též o použití teček v cestách. V odkazech třeba připouští uvádět  ../  pro cesty z nadřazeného adresáře. Pro nejednoznačnost případně rozporuplnost se ale negativně staví k používání zkrácených doménových jmen počítačů při HTML-odkazech, anebo odvození funkce z tvaru doménové adresy, což ovšem mnozí klienti umožňují při přímém zadání URL-odkazu uživatelem.

Při převodu WWW-stránek na jiný server, při jejich opravách, při přechodu z jiných funkcí do WWW je někdy potřebné, aby klient zapomněl informace o tom, jak stránku získal, a použil jiné. K tomu lze v HTML-hlavičce využít specifikaci  <BASE HREF=odkaz>  obsahující absolutní URL-odkaz. Klient je tak instruován, aby předpokládal, že se ke stránce dostal přes určený  odkaz , a od něj pak také odvozuje všechny relativní URI.

Opravovaná stránka pak může být zpřístupněna třeba funkcí  file . Aniž je třeba přenést na vhodné místo obrázky a soubory anebo změnit odkazy na absolutní, lze WWW-stránku zcela "zprovoznit" přidáním specifikace <BASE> , která bude odkazovat na původně zvolené místo svého uložení.
Takto (klient) Lynx sám v úvodu vždy doplní  <BASE> , pokud stránku "tiskne" ve zdrojovém tvaru.

Stejným způsobem je pomocí <BASE> nutno klientu změnit předpokládanou funkci ( pro úspěšné zakomponování obrázků ) na funkci  http , byl-li na tuto stránku navigován výše zmíněnou možností přechodu z Gopheru.




Odkazy
 
[1]  ftp://pub.vse.cz/pub/docs/rfc/rfc1436.txt
[2]  ftp://pub.vse.cz/pub/docs/rfc/rfc1945.txt
[3]  ftp://pub.vse.cz/pub/docs/rfc/rfc1521.txt
[4]  ftp://pub.vse.cz/pub/docs/rfc/rfc1866.txt
[5]  http://listserv.cesnet.cz/
[6]  ftp://pub.vse.cz/pub/docs/rfc/rfc2068.txt
[7]  ftp://pub.vse.cz/pub/docs/rfc/rfc2145.txt
[8]  ftp://pub.vse.cz/pub/docs/rfc/rfc2616.txt
[9]  http://dec59.ruk.cuni.cz/
[10http://helpdesk.vse.cz/
[11gopher://helpdesk.vse.cz:80/0GET%20/
[12http://helpdesk/
[13http://kizi2.vse.cz/
[14http://kizi2/
[15http://146.102.64.30/%7Eqkastl/%2Eladeni/
[16http://nb.vse.cz/sit/strukt/schemata/ikov0000.gif
[17ftp://146.102.64.30/pub/SaCzech/
[18http://www.worldwidemart.com/scripts/
[19http://146.102.64.30/%7Eqkastl/Hytelnet_search/
[20ftp://pub.vse.cz/pub/docs/rfc/rfc1630.txt
[21ftp://pub.vse.cz/pub/docs/rfc/rfc1738.txt
[22ftp://pub.vse.cz/pub/docs/rfc/rfc2396.txt
[23kap7.htm#Gopher
[24ftp://pub.vse.cz/pub/docs/rfc/rfc2056.txt
[25ftp://pub.vse.cz/pub/docs/rfc/rfc1939.txt
[26ftp://pub.vse.cz/pub/docs/rfc/rfc2384.txt