nazad | soderzhanie | vpered

8 Soedineniya (Connections).

8.1 Postoyannye soedineniya (Persistent Connections).

8.1.1 Cel'.

Do postoyannyh soedinenij dlya zaprosa kazhdogo URL ustanavlivalos' otdel'noe TCP soedinenie, chto uvelichivalo nagruzku na HTTP servera i vyzyvalo zagruzku Interneta. Ispol'zovanie vstroennyh izobrazhenij i drugih svyazannyh dannyh chasto trebuet ot klienta delat' neskol'ko zaprosov k odnomu serveru za korotkij promezhutok vremeni. Issledovaniya problem effektivnosti takogo resheniya dostupny v [30][27]; analiz i rezul'taty realizacii prototipa nahodyatsya v [26].

Postoyannye HTTP soedineniya imeyut ryad preimushchestv:

HTTP realizaciyam SLEDUET realizovyvat' postoyannye soedineniya.

8.1.2 Obshchee opisanie.

Znachitel'noe otlichie HTTP/1.1 ot bolee rannih versij HTTP sostoit v tom, chto postoyannye soedineniya yavlyayutsya zadannym po umolchaniyu povedeniem lyubogo HTTP soedineniya. To est' esli ne oboznacheno inogo, klient mozhet schitat', chto server podderzhit postoyannoe soedinenie.

Postoyannye soedineniya obespechivayut mehanizm, soglasno kotoromu klient i server mogut soobshchit' o razryve TCP soedineniya. |to signaliziruetsya pri pomoshchi ispol'zovaniya polya zagolovka Connection. Pri poluchenii soobshcheniya o razryve soedineniya klient NE DOLZHEN posylat' bol'she zaprosov po etomu soedineniyu.

8.1.2.1 Obsuzhdenie (Negotiation).

HTTP/1.1 server MOZHET schitat', chto HTTP/1.1 klient ne predpolagaet podderzhivat' postoyannoe soedinenie, esli poslannyj v zaprose zagolovok Connection soderzhit leksemu soedineniya (connection-token) "close". Esli server reshaet zakryt' soedinenie nemedlenno posle posylki otveta, to emu SLEDUET poslat' zagolovok Connection, kotoryj soderzhit leksemu soedineniya (connection-token) "close".

HTTP/1.1 klient MOZHET ozhidat', chto soedinenie ostanetsya otkrytym, no dolzhen reshit' ostavlyat' li ego otkrytym na osnovanii togo, soderzhit li otvet servera zagolovok Connection s leksemoj soedineniya "close". V sluchae, esli klient ne hochet podderzhivat' soedinenie dlya posleduyushchih zaprosov, emu SLEDUET poslat' zagolovok Connection, soderzhashchij leksemu soedineniya "close".

Esli klient ili server posylaet leksemu zakrytiya soedineniya "close" v zagolovke Connection, to zapros stanovitsya poslednim v soedinenii.

Klientam i serveram NE SLEDUET schitat', chto postoyannoe soedinenie podderzhivaetsya HTTP versiyami, men'shimi chem 1.1, esli eto ne ukazano yavno. Smotrite razdel 19.7.1 s bolee podrobnoj informaciej o obratnoj sovmestimosti s HTTP/1.0 klientami.

CHtoby soedinenie ostavalos' postoyannym, vse soobshcheniya, peredavaemye po nemu dolzhny imet' samoopredelennuyu (self-defined) dlinu soobshcheniya (to est', ne opredelyaemuyu zakrytiem soedineniya), kak opisano v razdele 4.4.

8.1.2.2 Konvejernaya obrabotka (Pipelining).

Klient, kotoryj podderzhivaet postoyannye soedineniya MOZHET "proizvesti konvejernuyu obrabotku" zaprosov (to est', posylat' neskol'ko zaprosov ne ozhidaya otveta na kazhdyj). Server DOLZHEN poslat' otvety na eti zaprosy v tom zhe samom poryadke, v kakom byli polucheny zaprosy.

Klienty, kotorye podderzhivayut postoyannye soedineniya i proizvodyat konvejernuyu obrabotku nemedlenno posle ustanovleniya soedineniya, DOLZHNY byt' gotovy povtorit' soedinenie, esli pervaya popytka konvejernoj obrabotki dala sboj. Esli klient delaet takoj povtor, on NE DOLZHEN proizvodit' konvejernuyu obrabotku prezhde, chem uznaet, chto soedinenie postoyannoe. Klienty DOLZHNY takzhe byt' gotovy snova poslat' zaprosy, esli server zakryvaet soedinenie pered posylkoj vseh sootvetstvuyushchih otvetov.

8.1.3 Proksi-servera (Proxy Servers).

Ochen' vazhno, chtoby proksi-servera pravil'no vypolnyali svojstva polej zagolovka Connection, kak opredeleno v 14.2.1.

Proksi-server DOLZHEN soobshchat' o postoyannyh soedineniyah otdel'no svoim klientam i otdel'no pervonachal'nym serveram (ili drugim proksi-serveram), kotorye s nim soedineny. Kazhdoe postoyannoe soedinenie primenyaetsya tol'ko k odnoj transportnoj svyazi.

Proksi-server NE DOLZHEN ustanavlivat' postoyannoe soedinenie s HTTP/1.0 klientom.

8.1.4 Prakticheskie coglasheniya (Practical Considerations).

Servera obychno imeyut nekotoroe znachenie vremeni ozhidaniya, posle kotorogo oni ne podderzhivayut neaktivnoe soedinenie. Proksi-servera mogut delat' eto znachenie bolee vysokim, tak kak, veroyatno, klient sdelaet bol'shee kolichestvo soedinenij cherez etot zhe server. Ispol'zovanie postoyannyh soedinenij ne vvodit nikakih ogranichenij na prodolzhitel'nost' etogo vremeni ozhidaniya kak dlya klienta, tak i dlya servera.

Kogda u klienta ili servera isteklo vremya ozhidaniya, emu SLEDUET proizvesti izyashchnoe zakrytie transportnogo soedineniya. Kak klientam, tak i serveram SLEDUET postoyanno nablyudat' za drugoj storonoj na predmet zakrytiya soedineniya, i sootvetstvenno otvechat'. Esli klient ili server ne obnaruzhivaet zakrytiya soedineniya drugoj storonoj srazu, to eto vyzyvaet ne opravdannuyu tratu resursov seti.

Klient, server, ili proksi-server MOGUT zakryt' transportnoe soedinenie v lyuboe vremya. Naprimer, klient MOZHET nachat' posylat' novyj zapros v to vremya, kogda server reshaet zakryt' "bezdejstvuyushchee" soedinenie. S tochki zreniya servera, soedinenie zakryvaetsya, v to vremya kak ono bylo neaktivno, no s tochki zreniya klienta, zapros proizoshel.

|to oznachaet, chto klienty, servery, i proksi-servery DOLZHNY byt' v sostoyanii obrabatyvat' asinhronnye sobytiya zakrytiya. Programmnomu obespecheniyu klienta SLEDUET vnov' otkryt' transportnoe soedinenie i povtorno peredat' prervannyj zapros bez vzaimodejstviya s pol'zovatelem, poskol'ku metod zaprosa idempotent (smotrite razdel 9.1.2); drugie metody NE DOLZHNY byt' povtoreny avtomaticheski, hotya agenty pol'zovatelya MOGUT predlozhit' operatoru vybor povtoryat' zapros, ili net.

Odnako eto avtomaticheskoe povtorenie NE SLEDUET proizvodit', esli sboj proishodit uzhe vo vtorom zaprose.

Serveram vsegda SLEDUET otvechat' na po krajnej mere na odin zapros v soedinenii, esli eto vozmozhno. Serveram NE SLEDUET razryvat' soedinenie v seredine peredachi otveta, esli ne predpolagaetsya setevoj ili klientskij otkaz.

Klientam, ispol'zuyushchim postoyannye soedineniya, SLEDUET ogranichit' chislo odnovremennyh soedinenij, kotorye oni ustanavlivayut s dannym serverom. Odnopol'zovatel'skomu klientu SLEDUET ustanavlivat' maksimum 2 soedineniya s lyubym serverom ili proksi-serverom. Proksi-serveru SLEDUET ogranichit'sya 2*N soedinenimi s drugimi serverami ili proksi-serverami, gde N - chislo odnovremenno aktivnyh pol'zovatelej. |ti rukovodyashchie principy prednaznacheny dlya umen'sheniya vremeni HTTP otveta i izbezhaniya chrezmernoj zagruzki Interneta ili drugih setej.

8.2 Trebovaniya k peredache soobshchenij.

Obshchie trebovaniya:

Posle polucheniya metoda, podchinennogo etim trebovaniyam, ot HTTP/1.1 (ili bolee pozdnego) klienta, HTTP/1.1 (ili bolee pozdnij) server DOLZHEN libo otvetit' kodom sostoyaniya 100 (Prodolzhat', Continue) i prodolzhat' chtenie vhodnogo potoka, libo otvetit' oshibochnym kodom sostoyaniya. Esli server otvetil oshibochnym kodom sostoyaniya, to on MOZHET libo zakryt' transportnoe soedinenie (TCP), libo prodolzhat' chitat' i otbrasyvat' ostavshuyusya chast' zaprosa. On NE DOLZHEN vypolnyat' zaproshennyj metod, esli vozvratil kod sostoyaniya oshibki.

Klientam SLEDUET pomnit' nomer versii HTTP, ispol'zuemoj serverom po krajnej mere v poslednij raz; esli HTTP/1.1 klient vstrechal HTTP/1.1 ili bolee pozdnij otvet ot servera, i vidit zakrytie soedineniya pered polucheniem kakogo-libo koda sostoyaniya ot servera, klientu SLEDUET povtorit' zapros bez vzaimodejstviya s pol'zovatelem, poskol'ku metod zaprosa idempotent (smotrite razdel 9.1.2); drugie metody NE DOLZHNY byt' povtoreny avtomaticheski, hotya agenty pol'zovatelya MOGUT predlozhit' operatoru vybor povtoryat' zapros, ili net. Esli klient povtoryaet zapros, to on

Esli HTTP/1.1 klient ne vstrechal otveta servera versii HTTP/1.1 ili bolee pozdnej, to emu sleduet schitat', chto server realizuet HTTP/1.0 ili bolee staryj protokol i ne ispol'zovat' otvety s kodom sostoyaniya 100 (Prodolzhat', Continue). Esli v takoj situacii klient vidit zakrytie soedineniya pered polucheniem kakogo-libo otveta s kodom sostoyaniya ot servera, to emu SLEDUET povtorit' zapros. Esli klient povtoryaet zapros k etomu HTTP/1.0 serveru, to on dolzhen ispol'zovat' sleduyushchij "binary exponential backoff" algoritm, chtoby byt' uverennym v poluchenii nadezhnogo otveta:

  1. Inicializirovat' novoe soedinenie s serverom.
  2. Peredat' zagolovki zaprosa (request-headers).
  3. Inicializirovat' peremennuyu R primernym vremenem peredachi informacii na server i obratno (naprimer na osnovanii vremeni ustanovleniya soedineniya), ili postoyannym znachenie v 5 sekund, esli vremya peredachi ne dostupno.
  4. Vychislit' T = R * (2**N), gde N - chislo predydushchih povtorov etogo zaprosa.
  5. Libo dozhdat'sya ot servera otveta s kodom oshibki, libo prosto vyzhdat' T sekund (smotrya chto proizojdet ran'she).
  6. Esli otveta s kodom oshibki ne polucheno, posle T sekund peredat' telo zaprosa.
  7. Esli klient obnaruzhivaet, chto soedinenie bylo zakryto prezhdevremenno, to emu nuzhno povtoryat' nachinaya s shaga 1, poka zapros ne budet prinyat, libo poka ne budet poluchen oshibochnyj otvet, libo poka u pol'zovatelya ne konchitsya terpenie i on ne zavershit process povtoreniya.

Nezavisimo ot togo, kakaya versiya HTTP realizovana serverom, esli klient poluchaet oshibochnyj kod sostoyaniya, to on

HTTP/1.1 (ili bolee pozdnemu) klientu, kotoryj obnaruzhivaet zakrytie soedineniya posle polucheniya otveta s kodom sostoyaniya 100 (Prodolzhat', Continue), no do polucheniya otveta s drugim kodom sostoyaniya, SLEDUET povtorit' zapros, no uzhe ne ozhidat' otveta s kodom sostoyaniya 100 (Prodolzhat', Continue) (no on MOZHET sdelat' tak, esli eto uproshchaet realizaciyu).


Copyright  ©  1998 Alex Simonoff (http://www.omsk.com/Leshik/), All Rights Reserved.


nazad | soderzhanie | vpered