InternetovΘ programovßnφ s WinSock (1)

 

Pod pojmem internetovß aplikace se rozumφ vφce odliÜn²ch v∞cφ. Typicky se jednß o serverovou aplikaci, nejΦast∞ji psanou ve skriptovacφm jazyku typu PHP nebo ASP, kterß jako svΘ u₧ivatelskΘ rozhranφ generuje WWW strßnky.á Jindy se internetovou aplikacφ rozumφ applety umφst∞nΘ na webov²ch strßnkßch a provßd∞nΘ klientsk²m poΦφtaΦem. NicmΘn∞ tou skupinou, kterß si oznaΦenφ internetovΘ aplikace zaslou₧φ asi nejvφce, jsou klientskΘ a serverovΘ programy komunikujφcφ p°es Internet pomocφ protokol∙ typu TCP/IP. Prßv∞ programovßnφm takov²ch aplikacφ v prost°edφ operaΦnφho systΘmu Windows se budeme v tomto serißlu zab²vat.

Mezi znßmΘ reprezentanty tΘto kategorie pat°φ nap°φklad webovΘ prohlφ₧eΦe, e-mailovΘ programy, klienti FTP, programy pro stahovßnφ soubor∙, offline browsery, chatovacφ programy, klienti diskuznφch skupin, p°ehrßvaΦe internetov²ch rßdiφ a jin²ch multimedißlnφch p°enos∙, programy pro sdφlenφ soubor∙, nßstroje pro vzdßlenou sprßvu poΦφtaΦ∙ a sφtφ a mnoho dalÜφch. V∞tÜina aplikacφ mß i svou serverovou stranu, tak₧e pot°ebujeme servery HTTP, FTP, mailservery, servery pro internetovΘ vysφlßnφ atd.

Aplikace nad TCP/IP tedy implementujφ nejr∙zn∞jÜφ druhy slu₧eb Internetu, zatφmco prve zmφn∞nΘ webovΘ aplikace pracujφ na vyÜÜφ ·rovni, pouze v rßmci slu₧by WWW.

NaÜφm cφlem bude seznßmit se s principy prßce internetovΘho klienta i serveru a zp∙soby jejich implementace pomocφ knihovny WinSock.

 

Co je to WinSock?

 

Windows Sockets, zkrßcen∞ WinSock, je jednou ze souΦßstφ programßtorskΘho rozhranφ Win32 API, kterß nabφzφ zßkladnφ prost°edky pro sφ¥ovou komunikaci. Je nutno hned dodat, ₧e tato knihovna nenφ zrovna jednoduchß a m∙₧e zaΦφnajφcφmu programßtorovi obΦas p°ipravit nemilß p°ekvapenφ (tedy p°esn∞ji m∙₧e zaΦφnajφcφho programßtora uΦinit konΦφcφm programßtorem). Proto se musφme na programovßnφ nad WinSock po°ßdn∞ p°ipravit.

WinSock vychßzφ z Berkeley Sockets, co₧ je internetovΘ rozhranφ p∙vodem z unixovΘho operaΦnφho systΘmu BSD. Rozhranφ Sockets se rozÜφ°ilo i na ostatnφ unixovΘ i neunixovΘ platformy a WinSock je jeho realizacφ pro systΘmy Windows. WinSock nenφ ·pln∞ kompatibilnφ se Sockets na jin²ch platformßch, mß svß rozÜφ°enφ a svΘ odliÜnosti (a svΘ chyby v implementaci). NicmΘn∞ programy b∞₧φcφ na odliÜn²ch systΘmech s odliÜn²mi knihovnami spolu mohou bez problΘm∙ komunikovat a spolupracovat.

Centrßlnφ myÜlenkou knihoven Sockets je abstrakce tzv. socketu (v p°ekladu zßsuvka nebo objφmka, ale rad∞ji budu pou₧φvat termφn socket). Socket je jak²si p°φpojn² bod, p°es kter² m∙₧e aplikace posφlat data na Internet nebo je naopak p°ijφmat. Spojenφ mezi dv∞ma aplikacemi b∞₧φcφmi na r∙zn²ch poΦφtaΦφch v sφti si tedy m∙₧eme nßzorn∞ p°edstavit jako fiktivnφ propojovacφ kabel, kter² vede z jednΘ zßsuvky do druhΘ a proudφ jφm data.

Shr≥me si nejd°φve, jak²m zp∙sobem probφhß komunikace poΦφtaΦ∙ na Internetu a co to znamenß pro programßtora.

 

Jak funguje Internet

 

┌kolem ka₧dΘ aplikace, a¥ u₧ je to WWW prohlφ₧eΦ nebo t°eba klient pro zjiÜt∞nφ p°esnΘho Φasu, je poslat urΦitß data jinΘ aplikaci na libovolnΘm poΦφtaΦi v sφti a eventußln∞ p°ijmout jinß data jako odpov∞∩. N∞kdy se komunikace odbude jedin²m dotazem a jedinou odpov∞dφ, jindy jde o delÜφ konverzaci. T°eba FTP klient se na delÜφ dobu p°ipojφ k serveru a posφlß mu p°φkazy.

Podle tzv. modelu OSI (Open Systems Interconnect) je odpov∞dnost za provoz Internetu rozd∞lena do sedmi vrstev, do nich₧ spadajφ jednotlivΘ hardwarovΘ a softwarovΘ komponenty. Ka₧dß vrstva ke svΘ prßci vyu₧φvß slu₧eb vrstev ni₧Üφch, a to p°i odesφlßnφ dat i p°i jejich p°φjmu. Zdßnliv∞ spolu v₧dy komunikujφ prvky odpovφdajφcφ vrstvy na obou stranßch, skuteΦnß komunikace ale probφhß na vrstv∞ nejni₧Üφ - fyzickΘ.

 

NejvyÜÜφ vrstvou je vrstva aplikaΦnφ. Tu reprezentujφ znßmΘ slu₧by Internetu, jak²mi jsou WWW, FTP a e-mail, tedy vÜechny aplikace, ze kter²ch mß u₧itek normßlnφ Φlov∞k. Komunikace na tΘto ·rovni probφhß ve form∞ tzv. zprßv. Zprßvy mohou b²t textovΘ (t°eba p°φkazy FTP) nebo binßrnφ (nap°. zprßvy v sφti Gnutella). Protokoly aplikaΦnφ vrstvy definujφ, jakΘ zprßvy musφ klient a server podporovat a jak na n∞ reagovat. U₧ivatel je od zprßv aplikaΦnφ vrstvy obvykle odstφn∞n grafick²m u₧ivatelsk²m rozhranφm.

 

PrezentaΦnφ vrstva se starß o zajiÜt∞nφ jednotnΘ reprezentace dat. AplikaΦnφ vrstva sice definuje syntaxi a v²znam jednotliv²ch zprßv, ale to jeÜt∞ k domluv∞ mezi r∙zn²mi poΦφtaΦi nemusφ staΦit. Je nutnΘ definovat nap°. zp∙sob k≤dovßnφ textu (ASCII, EBCDIC, UTF-8 apod.), reprezentaci konce °ßdku (znaky CR-LF nebo jen LF, p°φp. jen CR), po°adφ byt∙ ve vφcebytovΘm Φφsle, formßt k≤dovßnφ r∙zn²ch zßkladnφch typ∙ dat. Dokonce ani poΦet bit∙ v bytu nemusφ b²t samoz°ejmostφ. Na poΦφtaΦi s odliÜn²mi konvencemi je nutnΘ zajistit sprßvnou konverzi dat. Na ·rovni prezentaΦnφ vrstvy je mo₧no takΘ provßd∞t transparetnφ kompresi nebo Üifrovßnφ p°enßÜen²ch dat.

 

RelaΦnφ vrstva zajiÜ¥uje navßzßnφ a sprßvu dialogu mezi aplikacemi. Klient a server si o sob∞ vym∞nφ d∙le₧itΘ informace, a potom teprve mohou zaΦφt komunikovat pomocφ regulΘrnφch zprßv aplikaΦnφ vrstvy. Do relaΦnφ vrstvy spadß nap°. autorizace klienta FTP nebo e-mailovΘho klienta p°i p°ipojenφ k serveru. DalÜφm p°φkladem je navßzßnφ komunikace klienta se serverem pomocφ technologie ÜifrovanΘho spojenφ Secure Sockets Layer (SSL).

á

Transportnφ vrstva, pro programßtora aplikacφ ta nejd∙le₧it∞jÜφ, provßdφ samotn² p°enos dat po sφti. Nejd∙le₧it∞jÜφmi protokoly transportnφ vrstvy jsou TCP a UDP. Protokoly tΘto ·rovn∞ podporujφ adresovßnφ pomocφ port∙. Zatφmco adresa IP (viz nφ₧e) slou₧φ k identifikaci jednotliv²ch poΦφtaΦ∙ a jin²ch za°φzenφ v sφti, porty umo₧≥ujφ rozliÜenφ r∙zn²ch slu₧eb na jednom poΦφtaΦi. Ob∞ma protokoly se budeme zab²vat podrobn∞ji za chvφli.

 

Sφ¥ovß vrstva je tvo°ena p°edevÜφm protokolem IP. Ten se starß o adresovßnφ poΦφtaΦ∙ pomocφ logick²ch adres - adres IP. Logickß adresa je nezßvislß na konkrΘtnφ sφ¥ovΘ infrastruktu°e, m∙₧e b²t p°i°azena za°φzenφ p°ipojenΘmu p°es sφ¥ Ethernet stejn∞ jako p°es modem. Protokol IP dßle zajiÜ¥uje sm∞rovßnφ datov²ch paket∙ (tzv. datagram∙ IP) po sφti sm∞rem k cφlovΘ adrese. Protokolu IP se budeme takΘ jeÜt∞ v∞novat. Sφ¥ovou vrstvu dopl≥ujφ jeÜt∞ dalÜφ pomocnΘ protokoly jako ICMP a IGMP, starajφcφ se o provoz sm∞rovaΦ∙, testovßnφ apod.

 

Sφ¥ov² hardware a jeho ovladaΦe spadajφ do nejni₧Üφch dvou vrstev modelu - vrstvy spojovΘ a fyzickΘ. Na tΘto ·rovni jsou data p°enßÜena ve form∞ paket∙ v∞tÜinou pevnΘ velikosti, tzv. rßmc∙ (frames). K adresovßnφ se pou₧φvajφ fyzickΘ adresy (MAC - Media Access Control), kterΘ jsou pevn∞ p°i°azeny sφ¥ovΘmu hardwaru.

 

Podφvejme se te∩ na vrstvy modelu OSI z naÜeho programßtorskΘho pohledu:

            Vrstva aplikaΦnφ, prezentaΦnφ a relaΦnφ jsou tφm, co mßme v ·myslu sami implementovat.

            Funkce vrstvy transportnφ a sφ¥ovΘ jsou implementovßny v operaΦnφm systΘmu a budeme je vyu₧φvat prost°ednictvφm knihovny WinSock.

            Vrstva spojovß a fyzickß jsou naÜemu pohledu prakticky ·pln∞ skryty.

Protokoly sφ¥ovΘ a transportnφ vrstvy v prost°edφ Internetu se obvykle oznaΦujφ jako protokoly TCP/IP. ╪ekneme-li TCP/IP, nemßme na mysli pouze protokol TCP a protokol IP, ale vÜechny souvisejφcφ protokoly vΦetn∞ UDP, ICMP atd.

 

Protokol IP

 

IP (Internet Protocol) by bylo mo₧nΘ nazvat zßkladnφm stavebnφm kamenem Internetu. Tento protokol umo₧≥uje propojenφ za°φzenφ a sφtφ r∙zn²ch standard∙ do sφt∞ jedinΘ a umo₧≥uje p°enos dat mezi nimi.

JednotlivΘ poΦφtaΦe majφ p°i°azeny logickΘ adresy IP, kterΘ je jednoznaΦn∞ identifikujφ. Adresa m∙₧e b²t p°i°azena trvale nebo dynamicky (p°i ka₧dΘm p°ipojenφ m∙₧e b²t jinß, co₧ je p°φpad modem∙). Adresa IP je 32bitovß, z toho n∞kterΘ hodnoty majφ zvlßÜtnφ v²znam. Pro Φiteln² zßpis adresy se pou₧φvß dekadickß teΦkovß notace, Φty°i Φφsla od 0 do 255 odd∞lenß teΦkami, nap°. 192.91.16.1. P°i skuteΦnΘm pou₧itφ v protokolu IP je adresa intern∞ reprezentovßna 32bitov²m Φφslem.

P°enßÜenß data jsou balena do datagram∙ IP. Datagram se sklßdß z hlaviΦky IP nßsledovanΘ u₧iteΦn²mi daty. HlaviΦka mß minimßln∞ 20 byt∙ a obsahuje krom∞ zdrojovΘ a cφlovΘ IP adresy mnoho systΘmov²ch informacφ nutn²ch pro doruΦenφ. P°i pou₧itφ protokolu TCP nebo UDP nßsleduje jeho hlaviΦka za hlaviΦkou IP.

Datagramy cestujφ p°es sm∞rovaΦe, kterΘ Φtou cφlovou adresu a podle sv²ch sm∞rovacφch tabulek je p°eposφlajφ dßle sm∞rem k cφli. Datagram m∙₧e b²t podle pot°eby po cest∞ rozd∞len - fragmentovßn. Ka₧d² fragment dostane svou vlastnφ hlaviΦku IP, nesoucφ i informace nutnΘ k pozd∞jÜφmu posklßdßnφ p∙vodnφho datagramu. JednotlivΘ datagramy nebo i fragmenty jednoho datagramu mohou cestovat sφtφ po odliÜn²ch trasßch.

Protokol IP nezaruΦuje doruΦenφ datagram∙ ve stejnΘm po°adφ, jako byly odeslßny. Dßle n∞kterΘ datagramy mohou b²t po cest∞ ztraceny a jinΘ mohou dorazit vφcekrßt. Jestli₧e se ztratφ jedinß Φßst fragmentovanΘho datagramu, je cel² datagram zahozen. Navφc sprßvnost dat krom∞ hlaviΦky nenφ kontrolovßna, obsah datagram∙ m∙₧e b²t poÜkozen. Pro tyto vlastnosti je p°enos dat pomocφ IP oznaΦovßn jako nespolehliv². O zajiÜt∞nφ spolehlivosti se musφ postarat protokoly vyÜÜφch vrstev nap°. kontrolou a opakovan²m vysφlßnφm ztracen²ch a poÜkozen²ch datagram∙.

Pro ·plnost se zmφnφm o verzφch protokolu IP. Dnes se pou₧φvß verze 4 (IPv4), novß verze mß Φφslo 6 (IPv6). V novΘ verzi bude adresa IP 128bitovß, co₧ zajistφ prakticky nevyΦerpateln² poΦet dostupn²ch unikßtnφch adres. HlaviΦka IPv6 bude mφt dΘlku 40 byt∙ mφsto souΦasn²ch 20. P°echod na verzi 6 je zatφm velmi pomal², nap°ed bude nutnß podpora v∞tÜiny softwaru.

 

Protokol TCP

 

Protokol TCP (Transmission Control Protocol) zajiÜ¥uje spolehliv² p°enos dat mezi aplikacemi. K p°enosu se sice vyu₧φvß protokol IP, narozdφl od n∞ho je ale zajiÜt∞no, ₧e vÜechna zaslanß data budou doruΦena. P°ijφmajφcφ strana musφ potvrzovat p°φchozφ pakety. Jestli₧e se n∞kter² paket po cest∞ ztratφ nebo poÜkodφ a potvrzenφ o jeho p°φjmu nep°ijde, je vyslßn opakovan∞. Protokol se dßle starß o odstran∞nφ p°φpadn²ch duplikovan²ch paket∙ a o sestavenφ vÜech p°ijφman²ch dat v po°adφ, ve kterΘm byla odeslßna.

TCP je tzv. spojovan² protokol. P°ed zaΦßtkem komunikace je nutno ustavit TCP spojenφ a po skonΦenφ jej zase korektnφm zp∙sobem zruÜit. Navßzßnφm spojenφ se vytvo°φ komunikaΦnφ kanßl, kter² je pln∞ duplexnφ, tj. umo₧≥uje zasφlßnφ a p°φjem dat ob∞ma stranami nezßvisle na sob∞.

Typickou vlastnostφ protokolu TCP je p°enos dat ve form∞ proudu. Data jsou sice vysφlßna v podob∞ datagram∙ IP, nicmΘn∞ hranice t∞chto datagram∙ jsou komunikujφcφm aplikacφm skryty. Jestli₧e tedy jedna strana vyÜle stokrßt Φty°bytovΘ Φφslo nebo jednou 400bytov² blok, nem∙₧e poΦφtat s tφm, ₧e prot∞jÜek obdr₧φ data ve stejn²ch kouscφch. Data mohou b²t podle pot°eby libovoln∞ spojovßna do v∞tÜφch blok∙ nebo naopak d∞lena, a to jak implementacφ TCP na odesφlajφcφm poΦφtaΦi, tak i na stran∞ p°φjemce. Aplikace tedy musφ chßpat p°enßÜenß data jako souvisl² proud. K rozpoznßvßnφ zaΦßtk∙ a konc∙ zprßv v datovΘm proudu se pou₧φvajφ bu∩ zvlßÜtnφ odd∞lovacφ znaky (t°eba konce °ßdk∙), nebo ka₧dß zprßva obsahuje informace o svΘ dΘlce v bytech, p°φpadn∞ je dΘlka zprßvy jinak odvoditelnß z jejφho obsahu.

Blok dat, kter² je zabalen do jednoho datagramu IP a odeslßn na sφ¥, se naz²vß segmentem TCP. Segment TCP mß svou vlastnφ hlaviΦku o minimßlnφ velikosti 20 byt∙, spolu s hlaviΦkou IP Φinφ tedy re₧ie protokol∙ 40 byt∙ na jeden datagram. HlaviΦka TCP obsahuje p°edevÜφm Φφsla port∙ odesφlajφcφ i cφlovΘ aplikace. Dßle je tu uvedena pozice prvnφho bytu u₧iteΦn²ch dat segmentu v rßmci p°enßÜenΘho proudu. Tak je mo₧nΘ zajistit rekonstrukci proudu na stran∞ p°φjemce ve sprßvnΘm po°adφ. K dalÜφm polφm hlaviΦky TCP se vrßtφme, a₧ se budeme vφce v∞novat praktickΘmu pou₧itφ protokolu.

Knihovna WinSock nabφzφ pro p°enos dat pomocφ TCP tzv. proudovΘ sockety (stream sockets).

 

Protokol UDP

 

Protokol UDP (User Datagram Protocol) je alternativou protokolu TCP pro p°enos dat s tΘm∞° diametrßln∞ odliÜn²mi vlastnostmi.

Stejn∞ jako v p°pad∞ protokolu IP je p°enos dat nespolehliv². Jedin²m vylepÜenφm proti IP je kontrola sprßvnosti obsahu celΘho datagramu. Jestli₧e jsou data poÜkozena, je datagram zahozen a nenφ p°edßn cφlovΘ aplikaci. Aplikace musφ poΦφtat se ztracen²mi a duplikovan²mi datagramy a s nep°edvφdateln²m po°adφm jejich p°φjmu.

Na druhΘ stran∞ UDP narozdφl od TCP zaruΦuje zachovßnφ hranic datagram∙ a jejich p°edßnφ aplikaci ve stejnΘ podob∞, jako byly odeslßny. Nedochßzφ tedy ke sklßdßnφ datagram∙ do proudu.

UDP je tzv. nespojovan² protokol. Datagram UDP je mo₧nΘ okam₧it∞ poslat na libovolnou adresu, ani₧ by bylo nutnΘ navazovat s touto adresou spojenφ. Navφc UDP podporuje tzv. broadcasting, co₧ je hromadnΘ odeslßnφ datagramu na vÜechny adresy v danΘ sφti. V∞tÜinou je toto mo₧nΘ jen v rßmci uzav°enΘ lokßlnφ sφt∞, sm∞rovaΦe na Internetu pokus o broadcasting do cizφ sφt∞ nedovolφ.

Ka₧d² datagram UDP je balen do jednoho datagramu IP. Datagram UDP mß 8bytovou hlaviΦku UDP, obsahujφcφ jen zdrojov² a cφlov² port, velikost datagramu a kontrolnφ souΦet. Po zabalenφ do paketu IP tedy tvo°φ data obou hlaviΦek jen 28 byt∙ na ka₧d² datagram.

V knihovn∞ WinSock jsou k dispozici tzv. datagramovΘ sockety implementujφcφ protokol UDP.

 

TCP nebo UDP?

 

To je otßzka, na kterou si musφme odpov∞d∞t, ne₧ se dßme do v²voje. Oba protokoly majφ svΘ v²hody pro konkrΘtnφ druhy aplikacφ.

V²hody TCP jsou nßsledujφcφ:

            P°enos dat je spolehliv², o vÜechny kontroly a opravy se starß samotn² protokol, aplikace se m∙₧e v∞novat sv²m problΘm∙m.

            Protokol sßm optimalizuje vyu₧itφ komunikaΦnφho kanßlu a dosahuje lepÜφho vyu₧itφ kapacity p°enosovΘ linky.

Protokol UDP mß tyto p°ednosti:

            Protokol je jednoduÜÜφ, jeho datagramy obsahujφ mΘn∞ pomocn²ch dat.

            Nenφ nutno navazovat spojenφ, souΦasnß komunikace s velk²m poΦtem poΦφtaΦ∙ je protoá efektivn∞jÜφ. Je podporovßn broadcasting.

            Implementace klienta i serveru je jednoduÜÜφ.

            Protokol doruΦuje samostatnΘ datagramy, aplikace se proto nemusφ starat o rozeznßvßnφáá jednotliv²ch zprßv v proudu.á

V p°φpad∞, ₧e programujeme klienta nebo server n∞kterΘho zavedenΘho protokolu, musφme se dr₧et transportnφho protokolu, kter² je p°edepsßn. V∞tÜina protokol∙ p°enßÜejφcφch souvislΘ bloky dat je zalo₧ena na TCP. Pat°φ mezi n∞ HTTP, FTP, SMTP (p°enos e-mailu), POP3 (stahovßnφ e-mailu), IRC (chat). UDP pou₧φvajφ nejΦast∞ji jednoduÜÜφ slu₧by, pracujφcφ zp∙sobem dotaz-odpov∞∩, nap°. zjiÜt∞nφ p°esnΘho Φasu nebo p°eklad domΘnovΘho jmΘna na adresu IP (DNS). Protokoly vyu₧φvajφcφ UDP n∞kdy voliteln∞ podporujφ i TCP jako alternativnφ transportnφ protokol.

Jestli₧e budeme vyvφjet vlastnφ slu₧bu, rozhodneme se pro protokol TCP, jestli₧e aplikace bude p°enßÜet v∞tÜφ objemy dat mezi dv∞ma poΦφtaΦi. UDP zvolφme v p°φpad∞, ₧e objem p°enesen²ch dat mezi ka₧d²mi dv∞ma poΦφtaΦi je mal², p°itom spolu m∙₧e komunikovat i v∞tÜφ poΦet ·Φastnφk∙ najednou. Kandidßtem na vyu₧itφ UDP jsou r∙znΘ informaΦnφ a vyhledßvacφ slu₧by.

P°enos dat ve form∞ datagram∙ m∙₧e lßkat programßtora k pou₧itφ UDP v ka₧dΘ aplikaci komunikujφcφ pomocφ r∙zn²ch krßtk²ch zprßv a odpov∞dφ. To ale nenφ sprßvnß cesta v p°φpad∞, ₧e p°enesen²ch zprßv je velkΘ mno₧stvφ a ka₧dß zprßva putuje ve vlastnφm datagramu. Protokol TCP by v takovΘm p°φpad∞ spojoval vφce zprßv do jednoho segmentu a p°enos by byl mnohem efektivn∞jÜφ.

 

Zßv∞r

 

To byla tedy ·vodnφ pr∙prava do problematiky aplikacφ nad TCP/IP. N∞kterΘ dalÜφ technologickΘ podrobnosti si p°iblφ₧φme, a₧ se budeme v∞novat konkrΘtnφm problΘm∙m a jejich implementaci. V p°φÜtφm dφlu tohoto cyklu se zaΦneme uΦit pou₧φvat knihovnu WinSock a n∞kt erΘ jejφ zßkladnφ funkce v praxi.