HTTP | |
---|---|
Nume | Protocolul de transfer hipertext |
Nivel (conform modelului OSI ) | Aplicat |
Familie | TCP/IP |
Creat în | 1992 |
Port/ID | 80/ TCP |
Specificație | RFC 124 , RFC 1945 , RFC 2616 , RFC 2617 , RFC 6266 , RFC 7230 , RFC 7240 , RFC 8446 . |
Principalele implementări (clienți) | Browsere web , de exemplu, Internet Explorer , Mozilla Firefox , Opera , Google Chrome , Yandex Browser , Microsoft Edge etc. |
Implementări de bază ( servere ) | Apache , IIS , nginx , Google Web Server etc. |
Fișiere media la Wikimedia Commons |
HTTP ( HyperText Transfer Protocol - „ protocol de transfer hipertext ”) este un protocol de transfer de date la nivel de aplicație , inițial sub formă de documente hipertext în format HTML , este utilizat în prezent pentru a transfera date arbitrare.
Baza HTTP este tehnologia „client-server” , adică existența:
HTTP este acum omniprezent pe World Wide Web pentru a prelua informații de pe site-uri web . În 2006, traficul HTTP din America de Nord l-a depășit pe cel al rețelelor P2P cu 46%, din care aproape jumătate era streaming video și audio [1] .
HTTP este folosit și ca „transport” pentru alte protocoale de nivel de aplicație, cum ar fi SOAP , XML-RPC , WebDAV .
Obiectul principal de manipulare în HTTP este resursa indicată de un URI (Uniform Resource Identifier) într-o solicitare a clientului. De obicei, aceste resurse sunt fișiere stocate pe server , dar pot fi obiecte logice sau ceva abstract. O caracteristică a protocolului HTTP este capacitatea de a specifica în cerere și răspuns modul în care aceeași resursă este reprezentată de diferiți parametri: format , codificare , limbă etc. (în special, antetul HTTP este folosit pentru aceasta ). Datorită capacității de a specifica modul în care este codificat mesajul, clientul și serverul pot face schimb de date binare , deși acest protocol este text.
HTTP este un protocol de nivel de aplicație ; omologii săi sunt FTP și SMTP . Mesajele sunt schimbate conform schemei obișnuite „cerere-răspuns”. HTTP utilizează URI globale pentru a identifica resursele . Spre deosebire de multe alte protocoale, HTTP este apatrid. Aceasta înseamnă că nu este stocată nicio stare intermediară între perechile cerere-răspuns. Componentele care utilizează HTTP pot stoca în mod independent informații de stare legate de solicitările și răspunsurile recente (de exemplu, „ cookie -uri ” pe partea clientului, „sesiuni” pe partea serverului). Browserul care trimite solicitările poate urmări întârzierile de răspuns. Serverul poate stoca adresele IP și poate solicita antetele clienților recent. Cu toate acestea, protocolul în sine nu este la curent cu solicitările și răspunsurile anterioare, nu oferă suport intern de stat, nu are astfel de cerințe.
Majoritatea protocoalelor prevăd stabilirea unei sesiuni TCP în timpul căreia autorizarea are loc o singură dată, iar acțiunile ulterioare sunt efectuate în contextul acestei autorizari. HTTP stabilește o sesiune TCP separată pentru fiecare cerere; versiunile ulterioare de HTTP au permis efectuarea de cereri multiple într-o singură sesiune TCP, dar browserele de obicei solicită doar pagina și obiectele incluse în ea (imagini, stiluri în cascadă, etc.) și apoi încheie imediat sesiunea TCP. HTTP utilizează cookie -uri pentru a sprijini accesul autorizat (non-anonim) ; Mai mult, această metodă de autorizare vă permite să salvați sesiunea chiar și după ce clientul și serverul sunt reporniți.
La accesarea datelor prin FTP sau protocoale de fișiere, tipul fișierului (mai precis, tipul de date conținute în acesta) este determinat de extensia numelui fișierului, ceea ce nu este întotdeauna convenabil. HTTP, înainte de a transmite datele în sine, transmite antetul Content-Type: tip / subtip, care permite clientului să determine fără ambiguitate modul de procesare a datelor trimise. Acest lucru este deosebit de important atunci când lucrați cu scripturi CGI , când extensia numelui fișierului indică nu tipul de date trimise către client, ci necesitatea de a rula acest fișier pe server și de a trimite rezultatele programului scris în acest fișier către client. (în acest caz, același fișier în funcție de argumentele cererii și de propriile considerații, poate genera răspunsuri de diferite tipuri - în cel mai simplu caz, imagini în formate diferite).
În plus, HTTP permite clientului să trimită parametri către server, care vor fi transmise scriptului CGI care se execută. Pentru aceasta , formularele au fost introduse în HTML .
Aceste caracteristici ale HTTP au făcut posibilă crearea motoarelor de căutare (dintre care primul a fost AltaVista , creat de DEC ), forumuri și magazine de internet. Aceasta a comercializat Internetul, au apărut firme, al căror domeniu principal de activitate a fost furnizarea de acces la Internet (furnizori) și crearea de site-uri web.
Toate programele pentru lucrul cu protocolul HTTP sunt împărțite în trei categorii mari:
Pentru a distinge serverele finale de proxy , documentația oficială folosește termenul server de origine . Unul și același produs software poate îndeplini simultan funcțiile unui client, server sau intermediar, în funcție de sarcini. Specificațiile protocolului HTTP detaliază comportamentul pentru fiecare dintre aceste roluri.
Protocolul HTTP a fost conceput inițial pentru a accesa documente hipertext de pe World Wide Web. Prin urmare, principalele implementări ale clientului sunt browserele (agenți utilizator). Pentru a vizualiza conținutul salvat al site-urilor pe un computer fără conexiune la internet, au fost inventate browsere offline . Când conexiunea este instabilă, managerii de descărcare sunt utilizați pentru a descărca fișiere mari ; acestea vă permit să descărcați fișierele specificate în orice moment după ce conexiunea la serverul web este pierdută. Unele atlase virtuale (cum ar fi Google Earth și NASA World Wind ) folosesc și HTTP.
Adesea, protocolul HTTP este folosit de programe pentru a descărca actualizări.
O întreagă gamă de programe robotizate este utilizată în motoarele de căutare de pe Internet . Printre aceștia se numără păianjenii web ( crawler -uri) care traversează hyperlinkuri, alcătuiesc o bază de date cu resurse de server și stochează conținutul acestora pentru analize ulterioare.
Principalele implementări: Apache , Internet Information Services (IIS), nginx , LiteSpeed Web Server (LSWS), Google Web Server , lighttpd .
Principalele implementări: Squid , UserGate , Multiproxy , Naviscope , nginx .
Fiecare mesaj HTTP este format din trei părți, care sunt trimise în ordinea enumerată:
Corpul mesajului poate fi omis, dar linia de început și antetul sunt elemente obligatorii. Excepția este versiunea 0.9 a protocolului, unde mesajul de solicitare conține doar linia de început, iar mesajul de răspuns conține doar corpul mesajului.
Pentru versiunea de protocol 1.1, mesajul de solicitare trebuie să conțină antetul gazdă .
Șirurile de început sunt diferite pentru cerere și răspuns. Șirul de interogare arată astfel:
GET URI — pentru versiunea de protocol 0.9; Метод URI HTTP/Версия - pentru alte versiuni.Aici:
Pentru a solicita o pagină pentru acest articol, clientul trebuie să treacă șirul (doar un antet dat):
GET /wiki/HTTP HTTP/1.0 Gazdă: en.wikipedia.orgLinia de început a răspunsului serverului are următorul format: HTTP/Версия КодСостояния Пояснение, unde:
De exemplu, linia de început a răspunsului serverului la o solicitare anterioară ar putea arăta astfel:
HTTP/1.0 200 OKMetoda HTTP ( English HTTP Method ) - o secvență de orice caractere, cu excepția controlului și a delimitatorilor, care indică operația principală pe resursă. De obicei, metoda este un cuvânt scurt englezesc scris cu majuscule. Rețineți că numele metodei face distincție între majuscule și minuscule.
Serverul poate folosi orice metodă, nu există metode obligatorii pentru server sau client. Dacă serverul nu recunoaște metoda specificată de client, atunci ar trebui să returneze starea 501(Neimplementat). Dacă metoda este cunoscută de server, dar nu este aplicabilă unei anumite resurse, atunci 405este returnat un mesaj cu un cod (Metoda nu este permisă). În ambele cazuri, serverul TREBUIE să includă un antet Allowcu o listă de metode acceptate în mesajul de răspuns.
În plus față de metodele GETși HEAD, metoda este adesea folosită POST.
OPȚIUNIFolosit pentru a determina capabilitățile serverului web sau opțiunile de conectare pentru o anumită resursă. Ca răspuns, serverul TREBUIE să includă un antet Allowcu o listă de metode acceptate. Antetul răspunsului poate include și informații despre extensiile acceptate.
Se presupune că cererea clientului poate conține un corp de mesaj care să indice informațiile care îl interesează. Formatul corpului și ordinea de lucru cu acesta nu sunt definite în prezent; serverul ar trebui să-l ignore deocamdată. Situația este similară cu corpul în răspunsul serverului.
Pentru a afla capabilitățile întregului server, clientul trebuie să specifice un asterisc - " *" - în URI. Solicitările „ OPTIONS * HTTP/1.1” pot fi, de asemenea, utilizate pentru a verifica starea de sănătate a serverului (similar cu „ ping ”) și pentru a testa dacă serverul acceptă protocolul HTTP versiunea 1.1.
Rezultatul executării acestei metode nu este stocat în cache .
GETFolosit pentru a interoga conținutul resursei specificate. GETDe asemenea, puteți începe un proces folosind o metodă . În acest caz, informațiile despre progresul procesului ar trebui incluse în corpul mesajului de răspuns.
Clientul poate trece parametrii de execuție a cererii în URI-ul resursei țintă după caracterul „ ?”:
GET /path/resource?param1=value1¶m2=value2 HTTP/1.1
Conform standardului HTTP, cererile de tip GETsunt considerate idempotente [2]
Pe lângă metoda obișnuită GET, există și
Ordinea de executare a unor astfel de cereri este definită separat de standarde.
CAPSimilar cu metoda GET, cu excepția faptului că nu există niciun corp în răspunsul serverului. Interogarea HEADeste de obicei utilizată pentru a prelua metadate , pentru a verifica existența unei resurse ( validare URL ) și pentru a vedea dacă aceasta s-a modificat de la ultima accesare.
Anteturile de răspuns pot fi stocate în cache. Dacă metadatele resursei nu se potrivesc cu informațiile corespunzătoare din cache, copia resursei este marcată ca învechită.
POSTFolosit pentru a transmite date utilizator către o anumită resursă. De exemplu, în bloguri , vizitatorii își pot introduce, de obicei, comentariile la postări într-un formular HTML, după care sunt trimiși la server prin metoda POST și îi pune pe pagină. În acest caz, datele transmise (în exemplul blogului, textul comentariului) sunt incluse în corpul solicitării. În mod similar, folosind metoda POST, fișierele sunt de obicei încărcate pe server.
Spre deosebire de metoda GET, metoda POSTnu este considerată idempotentă [2] , adică repetarea repetată a acelorași interogări POSTpoate returna rezultate diferite (de exemplu, după trimiterea fiecărui comentariu, va apărea o altă copie a acestui comentariu).
Dacă rezultatul execuției este 200(Ok), corpul răspunsului ar trebui să includă un mesaj despre rezultatul solicitării. Dacă o resursă a fost creată, serverul TREBUIE să returneze un răspuns 201(Creat) cu URI -ul noii resurse în Location.
Mesajul de răspuns al serverului de execuție a metodei POSTnu este stocat în cache.
PUTSFolosit pentru a descărca conținutul solicitării în URI-ul specificat în cerere. Dacă o resursă nu există pentru URI-ul dat, atunci serverul o creează și returnează starea 201(Creat). Dacă resursa a fost schimbată, atunci serverul revine 200(Ok) sau 204(Fără conținut). Serverul NU TREBUIE să ignore anteturile nevalide Content-*trimise de client împreună cu mesajul. Dacă oricare dintre aceste anteturi nu poate fi recunoscut sau este invalid în condițiile actuale, atunci 501trebuie returnat un cod de eroare (NeImplementat).
Diferența fundamentală dintre metode POSTconstă PUTîn înțelegerea intenției URI-urilor de resurse. Metoda POSTpresupune că conținutul transmis de client va fi procesat la URI-ul specificat. Folosind PUT, clientul presupune că conținutul încărcat se potrivește cu resursa la URI-ul dat.
Mesajele de răspuns ale serverului la o metodă PUTnu sunt stocate în cache.
PATCHSimilar cu PUT, dar se aplică numai unui fragment de resursă.
ȘTERGEȘterge resursa specificată.
TRACEReturnează solicitarea primită, astfel încât clientul să poată vedea ce informații adaugă sau modifică serverele intermediare în cerere.
CONECTAȚIConvertește conexiunea de solicitare într-un tunel TCP/IP transparent , de obicei pentru a facilita stabilirea unei conexiuni SSL securizate printr-un proxy necriptat .
Codul de stare face parte din prima linie a răspunsului serverului. Este un întreg de trei cifre [3] . Prima cifră indică clasa de stare. Codul de răspuns este de obicei urmat de o frază explicativă, separată de spațiu, în limba engleză, care explică persoanei motivul unui astfel de răspuns. Exemple:
201 Pagina web creată 403 Accesul permis numai utilizatorilor înregistrați 507 Depozitare insuficientăClientul învață din codul de răspuns despre rezultatele solicitării sale și stabilește ce acțiuni să întreprindă în continuare. Setul de coduri de stare este un standard și sunt descrise în documentele RFC relevante . Introducerea noilor coduri ar trebui făcută numai după consultarea cu IETF . Este posibil ca clientul să nu cunoască toate codurile de stare, dar trebuie să răspundă în funcție de clasa de cod.
În prezent, există cinci clase de coduri de stare
Codul | Clasă | Scop |
---|---|---|
1xx | Informațional
(ing. informativ ) |
Informații despre procesul de transfer.
În HTTP/1.0, mesajele cu astfel de coduri ar trebui ignorate. În HTTP/1.1, clientul trebuie să fie pregătit să accepte această clasă de mesaje ca răspuns normal, dar nimic nu trebuie trimis la server. Mesajele de la server în sine conțin doar linia de început a răspunsului și, dacă este necesar, câteva câmpuri de antet specifice răspunsului. Serverele proxy ar trebui să trimită astfel de mesaje mai departe de la server către client. |
2xx | Succes
( Succes în engleză ) |
Informarea cu privire la cazurile de acceptare și procesare cu succes a cererii clientului. În funcție de stare, serverul poate trimite în continuare anteturile și corpul mesajului. |
3xx | redirecţiona
(ing. Redirecționare ) |
Informează clientul că trebuie făcută o altă solicitare (de obicei printr-un URI diferit) pentru a finaliza cu succes operația. Din această clasă, cinci coduri 301, 302, 303, 305și 307se referă direct la redirecționări (redirecționare). Adresa la care clientul ar trebui să facă o cerere este indicată de server în fișierul Location. Acest lucru permite utilizarea fragmentelor în URI-ul țintă. |
4xx | Eroare client
( Eroare client engleză ) |
Indicarea erorilor din partea clientului. Când utilizați toate metodele, cu excepția HEAD, serverul trebuie să returneze o explicație hipertext pentru utilizator în corpul mesajului. |
5xx | Eroare de server
( Eroare server engleză ) |
Informarea cu privire la cazurile de funcționare nereușită din vina serverului. Pentru toate situațiile, altele decât utilizarea metodei HEAD, serverul TREBUIE să includă o explicație în corpul mesajului pe care clientul o va afișa utilizatorului. |
Antetele HTTP sunt șiruri dintr-un mesaj HTTP care conțin o pereche parametru-valoare, separată de două puncte . Formatul antetelor urmează formatul general al antetelor mesajelor de rețea text ARPA (vezi RFC 822 ). Anteturile trebuie separate de corpul mesajului prin cel puțin o linie goală.
Exemple de antet:
Server: Apache/2.2.11 (Win32) PHP/5.3.0 Ultima modificare: sâmbătă, 16 ianuarie 2010 21:16:42 GMT Tip de conținut: text/plan simplu; set de caractere=windows-1251 Limbă de conținut: enÎn exemplul de mai sus, fiecare linie reprezintă un antet. În acest caz, ceea ce este înainte de două puncte se numește nume (nume englezesc ) , iar ceea ce este după el se numește valoare ( valoare engleză ).
Toate titlurile sunt împărțite în patru grupuri principale:
Aceasta este ordinea în care se recomandă trimiterea antetelor către destinatar.
Toate anteturile necesare pentru ca HTTP să funcționeze sunt descrise în RFC -urile de bază . Dacă nu există suficiente, atunci le puteți introduce pe ale dvs. În mod tradițional, numele acestor anteturi suplimentare sunt prefixate cu „ X-” pentru a evita conflictele de nume cu cele posibile existente. De exemplu, ca în anteturi X-Powered-Bysau X-Cache. Unii dezvoltatori folosesc propriile prefixe personalizate. Exemple de astfel de anteturi sunt cele Ms-Echo-Requestintroduse Ms-Echo-Replyde Microsoft pentru extensia WebDAV .
Corpul mesajului HTTP ( message-body), dacă este prezent, este utilizat pentru a transmite corpul obiectului asociat cu cererea sau răspunsul. Corpul mesajului diferă de corpul obiectului ( entity-body) numai atunci când se aplică o codificare de transmisie, așa cum este indicat de câmpul antet Transfer-Encoding.
mesaj-corp = entitate-corp | <corp-entitate codificat conform transfer-codare>Câmpul Transfer-Encodingtrebuie utilizat pentru a indica orice codificare de transmisie aplicată de aplicație pentru a se asigura că mesajul este transmis în siguranță și corect. Un câmp Transfer-Encoding este o proprietate a unui mesaj, nu un obiect, și astfel poate fi adăugat sau eliminat de orice aplicație din lanțul de cereri/răspuns.
Regulile care guvernează validitatea unui corp de mesaj într-un mesaj sunt diferite pentru cereri și răspunsuri.
Prezența unui corp de mesaj într-o cerere este indicată prin adăugarea unui câmp de antet Content-Lengthsau la anteturile cererii Transfer-Encoding. Un corp de mesaj poate fi adăugat la o solicitare numai atunci când metoda de solicitare permite un corp de obiect.
Dacă corpul mesajului este sau nu inclus în mesajul de răspuns depinde atât de metoda de solicitare, cât și de codul de stare a răspunsului. Toate răspunsurile la o cerere cu o metodă HEADnu trebuie să includă un corp de mesaj, chiar dacă entity-headersunt prezente câmpuri de antet obiect ( ) pentru a face să pară că obiectul este prezent. Niciun răspuns cu coduri de stare 1xx(Informațional), 204(Fără conținut) și 304(Nemodificat) trebuie să conțină un corp de mesaj. Toate celelalte răspunsuri conțin un corp de mesaj, chiar dacă este de lungime zero.
Solicitarea clientului:
GET /wiki/ HTTP/1.1 pagina Gazdă: en.wikipedia.org Agent utilizator: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Accept: text/html Conexiune: aproape (linie goală)Răspunsul serverului:
HTTP/1.1 200 OK Data: miercuri, 11 februarie 2009 11:20:59 GMT Server: Apache X-Powered-By: PHP/5.2.4-2ubuntu5wm1 Ultima modificare: miercuri, 11 februarie 2009 11:20:59 GMT Limbă de conținut: en Tip de conținut: text/html; set de caractere=utf-8 Lungimea conținutului: 1234 Conexiune: aproape (șir gol) (pagina solicitată în HTML )Răspunsul arată la fel 203. Ceea ce este important - datele solicitate direct sunt separate de antetele HTTP folosind CR , LF , CR, LF.
RedirecționăriSă presupunem că compania fictive „Example Corp”. există un site principal la „http://example.com” și un domeniu alias „example.org” . Clientul trimite o solicitare pentru pagina „Despre” către domeniul secundar (unele anteturi au fost omise):
GET /about.html HTTP/1.1 Gazdă: example.org Agent utilizator: MyLonelyBrowser/5.0Deoarece domeniul „example.org” nu este un domeniu principal și compania nu intenționează să-l folosească în alte scopuri în viitor, serverul său va returna un cod pentru o redirecționare permanentă, indicând Locationadresa URL țintă în antet:
HTTP/1.x 301 mutat definitiv Locație: http://example.com/about.html#contacts Data: joi, 19 februarie 2009 11:08:01 GMT Server: Apache/2.2.4 Tip de conținut: text/html; set de caractere=windows-1251 Lungimea conținutului: 110 (linie goală) <html><body><a href="http://example.com/about.html#contacts">Faceți clic aici</a></body></html>În titlu Location, puteți specifica fragmente ca în acest exemplu. Browserul nu a specificat un fragment în cerere deoarece este interesat de întregul document. Dar va derula automat pagina la fragmentul „contacte” imediat ce o încarcă. Un scurt document HTML a fost plasat, de asemenea, în corpul răspunsului, cu un link care ar duce vizitatorul la pagina de destinație dacă browserul nu a navigat automat la aceasta. Titlul Content-Typeconține caracteristicile acelei explicații HTML specifice, nu ale documentului găsit la URI-ul țintă.
Să presupunem că aceeași companie „Example Corp”. are mai multe birouri regionale în întreaga lume. Și pentru fiecare agenție au un site web cu un ccTLD corespunzător . Solicitarea paginii de pornire pentru site-ul principal „example.com” ar putea arăta astfel:
GET /HTTP/1.1 gazdă: example.com Agent utilizator: MyLonelyBrowser/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,en-us;q=0.7,en;q=0.3 Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7Serverul a luat în considerare antetul Accept-Languageși a format un răspuns cu o redirecționare temporară către serverul rus „example.ru” , indicând adresa sa în antet Location:
HTTP/1.x 302 găsit Locație: http://example.ru/ Cache-Control: privat Data: joi, 19 februarie 2009 11:08:01 GMT Server: Apache/2.2.6 Tip de conținut: text/html; set de caractere=windows-1251 Lungimea conținutului: 82 (linie goală) <html><body><a href="http://example.ru">Example Corp.</a></body></html>Fiți atenți la antet Cache-Control: valoarea „privată” le spune restului serverelor (în primul rând proxy-urilor) că răspunsul poate fi stocat în cache doar pe partea clientului. În caz contrar, este posibil ca următorii vizitatori din alte țări să meargă întotdeauna la o altă reprezentanță.
303Codurile de răspuns (Vezi Altele) și 307(Redirecționare temporară) sunt, de asemenea, folosite pentru redirecționare .
Reluați și descărcați fragmenteSă presupunem că o organizație fictivă oferă să descarce un videoclip al conferinței anterioare de pe site-ul web la: „http://example.org/conf-2009.avi” - aproximativ 160 MB în dimensiune . Să luăm în considerare modul în care acest fișier este reluat în caz de eșec și modul în care managerul de descărcări ar organiza descărcarea cu mai multe fire a mai multor fragmente.
În ambele cazuri, clienții vor face prima cerere astfel:
GET /conf-2009.avi HTTP/1.0 Gazdă: example.org Accept: */* Agent utilizator: Mozilla/4.0 (compatibil; MSIE 5.0; Windows 98) Referer: http://example.org/Titlul Refererindică faptul că fișierul a fost solicitat de pe pagina principală a site-ului. De obicei, managerii de descărcare îl specifică și pentru a emula tranziția de la pagina site-ului. Fără acesta, serverul poate răspunde 403(Acces interzis) dacă solicitările de la alte site-uri nu sunt permise. În cazul nostru, serverul a returnat un răspuns de succes:
HTTP/1.1 200 OK Data: joi, 19 februarie 2009 12:27:04 GMT Server: Apache/2.2.3 Ultima modificare: miercuri, 18 iunie 2003 16:05:58 GMT Etichetă: „56d-9989200-1132c580” Tip de conținut: video/x-msvideo Lungimea conținutului: 160993792 Accept-Range: octeți Conexiune: aproape (șir gol) (conținut binar al întregului fișier)Antetul Accept-Rangesinformează clientul că poate solicita fragmente de la server prin specificarea decalajelor acestora de la începutul fișierului în octeți. Dacă acest antet lipsește, atunci clientul POATE avertiza utilizatorul că cel mai probabil fișierul nu va putea descărca.
Pe baza valorii antetului Content-Length, managerul de descărcare va împărți întregul volum în fragmente egale și le va solicita separat, organizând mai multe fluxuri. Dacă serverul nu specifică o dimensiune, atunci clientul nu va putea implementa descărcări paralele, dar va putea în continuare să descarce fișierul până când serverul răspunde 416(Interval solicitat nu este satisfăcător).
Să presupunem că la al 84-lea megaoctet conexiunea la internet a fost întreruptă și procesul de descărcare s-a oprit. Când conexiunea la internet a fost restabilită, managerul de descărcare a trimis automat o nouă solicitare către server, dar cu o instrucțiune de a returna conținutul de la al 84-lea megaoctet:
GET /conf-2009.avi HTTP/1.0 Gazdă: example.org Accept: */* Agent utilizator: Mozilla/4.0 (compatibil; MSIE 5.0; Windows 98) Interval: octeți=88080384- Referer: http://example.org/Serverul nu este obligat să-și amintească ce și de la cine au fost făcute cereri înainte și, prin urmare, clientul a inserat din nou antetul Referer, ca și cum ar fi prima sa cerere. Valoarea antetului specificată Rangeîi spune serverului: „Dați conținutul de la octetul 88080384 până la capăt”. În acest sens, serverul va returna un răspuns:
HTTP/1.1 206 Conținut parțial Data: joi, 19 februarie 2009 12:27:08 GMT Server: Apache/2.2.3 Ultima modificare: miercuri, 18 iunie 2003 16:05:58 GMT Etichetă: „56d-9989200-1132c580” Accept-Range: octeți Interval de conținut: octeți 88080384-160993791/160993792 Lungimea conținutului: 72913408 Conexiune: aproape Tip de conținut: video/x-msvideo (șir gol) (conținut binar de la al 84-lea megaoctet)Antetul Accept-Rangesnu mai este necesar aici, deoarece clientul este deja conștient de această capacitate de server. Faptul că un fragment este transmis este cunoscut clientului prin cod 206(Partial Content). Antetul Content-Rangeconține informații despre acest fragment: numerele octetului de început și de sfârșit, iar după bară oblică, dimensiunea totală a întregului fișier în octeți. Atenție la antet Content-Length - indică dimensiunea corpului mesajului, adică fragmentul transmis. Dacă serverul returnează mai multe fragmente, acesta Content-Lengthva conține volumul total al acestora.
Acum reveniți la managerul de descărcare. Cunoscând dimensiunea totală a fișierului „conf-2009.avi” , programul l-a împărțit în 10 secțiuni egale.
Managerul inițial se va încărca chiar la prima solicitare, întrerupând conexiunea imediat ce ajunge la începutul celei de-a doua. Restul se va solicita separat. De exemplu, a patra secțiune ar fi solicitată cu următoarele antete (unele antete au fost omise - vezi exemplul complet de mai sus):
GET /conf-2009.avi HTTP/1.0 Interval: octeți=64397516-80496894Răspunsul serverului în acest caz va fi următorul (o parte din anteturi sunt omise - vezi exemplul complet de mai sus):
HTTP/1.1 206 Conținut parțial Accept-Range: octeți Interval de conținut: octeți 64397516-80496894/160993792 Lungimea conținutului: 16099379 (șir gol) (partea a patra conținut binar)Dacă o astfel de solicitare este trimisă către un server care nu acceptă fragmente, atunci va returna un răspuns standard 200(OK) așa cum se arată la început, dar fără antetul Accept-Ranges.
Vezi, de asemenea , GET parțial , intervale de octeți , răspunsul 206 , răspunsul 416 .HTTP vă permite să solicitați nu tot conținutul resursei simultan, ci doar fragmentul specificat. Astfel de cereri se numesc parțiale GET; capacitatea de a le executa este opțională (dar de dorit) pentru servere. Parțialele sunt GETutilizate în principal pentru reluarea fișierelor și descărcări paralele rapide în mai multe fire. Unele programe descarcă antetul arhivei, afișează utilizatorului structura internă și apoi solicită fragmente cu elementele de arhivă specificate.
Pentru a primi un fragment, clientul trimite o cerere către server cu un antet Rangecare specifică intervalele de octeți solicitate în acesta . Dacă serverul nu înțelege cererile parțiale (ignoră antetul Range), atunci va returna tot conținutul cu starea 200, la fel ca în cazul unui GET. În cazul finalizării cu succes, serverul returnează un 200răspuns cu stare 206(Conținut parțial) în loc de cod, inclusiv antetul din răspuns Content-Range. Fragmentele în sine pot fi transmise în două moduri:
Metoda GETse schimbă în „condițional GET” dacă mesajul de solicitare include un câmp de antet If-Modified-Since. Ca răspuns la „condițional GET”, corpul resursei solicitate este trimis numai dacă s-a schimbat de la data specificată în antet If-Modified-Since. Algoritmul pentru determinarea acestui lucru include următoarele cazuri:
Utilizarea metodei „GET condiționat” are ca scop descărcarea rețelei, deoarece permite să nu se transmită informații redundante prin rețea.
Negocierea conținutului este un mecanism pentru determinarea automată a resursei necesare în prezența mai multor versiuni diferite ale unui document. Subiectele de negociere pot fi nu numai resurse de server, ci și pagini returnate cu mesaje de eroare ( 403 , 404 , etc.).
Există două tipuri principale de acorduri:
Ambele tipuri pot fi utilizate în același timp sau fiecare dintre ele separat.
Specificația principală a protocolului ( RFC 2616 ) evidențiază, de asemenea, așa-numita negociere transparentă ca combinație preferată a ambelor tipuri . Cel din urmă mecanism nu trebuie confundat cu tehnologia independentă Transparent Content Negotiation (TCN) , care nu face parte din protocolul HTTP, dar poate fi utilizată împreună cu acesta. Ambele au o diferență semnificativă în principiul de funcționare și în însuși sensul cuvântului „transparent” (transparent). În specificația HTTP, transparența înseamnă că procesul este invizibil pentru client și server, iar în tehnologia TCN, transparența înseamnă disponibilitatea unei liste complete de opțiuni de resurse pentru toți participanții la procesul de livrare a datelor.
Administrat de serverDacă există mai multe versiuni ale unei resurse, serverul poate analiza anteturile cererii clientului pentru a returna ceea ce crede că este cel mai bun. Titlurile Accept, Accept-Charset, Accept-Encoding, Accept-Languagesși sunt în principal analizate User-Agent. Este de dorit ca serverul să includă un antet în răspuns Varycare indică parametrii prin care se distinge conținutul prin URI-ul solicitat.
Locația geografică a clientului poate fi determinată de la adresa IP de la distanță . Acest lucru este posibil datorită faptului că adresele IP, cum ar fi numele de domenii , sunt înregistrate la o anumită persoană sau organizație. La înregistrare, specificați regiunea în care va fi utilizat spațiul de adresă dorit. Aceste date sunt disponibile publicului, iar pe Internet puteți găsi bazele de date corespunzătoare distribuite gratuit și module software gata făcute pentru a lucra cu acestea (ar trebui să vă concentrați pe cuvintele cheie „Geo IP”).
Trebuie amintit că această metodă este capabilă să determine locația cu o acuratețe maximă a orașului (de aici se determină țara). În acest caz, informațiile sunt relevante doar în momentul înregistrării spațiului de adresă. De exemplu, dacă un furnizor din Moscova înregistrează o serie de adrese care indică Moscova și începe să ofere acces clienților din cele mai apropiate suburbii, atunci abonații săi pot observa pe unele site-uri că sunt din Moscova și nu din Krasnogorsk sau Dzerzhinsky .
Negocierea gestionată de server are mai multe dezavantaje:
În acest caz, tipul de conținut este determinat doar de partea clientului. Pentru a face acest lucru, serverul returnează într-un răspuns cu un cod de stare 300(Alegeri multiple) sau 406(Neacceptat) o listă de opțiuni, dintre care utilizatorul o selectează pe cea potrivită. Negocierea gestionată de client funcționează bine atunci când conținutul diferă în cele mai obișnuite moduri (cum ar fi limba și codificarea) și se utilizează un cache public.
Principalul dezavantaj este supraîncărcarea, deoarece trebuie să faceți o cerere suplimentară pentru a obține conținutul dorit.
Negociere transparentăAceastă negociere este complet transparentă pentru client și server. În acest caz, se folosește un cache partajat, care conține o listă de opțiuni, ca pentru o negociere gestionată de client. Dacă memoria cache înțelege toate aceste opțiuni, atunci face alegerea în sine, ca într-o negociere administrată de server. Acest lucru reduce sarcina pe serverul de origine și elimină cererea suplimentară de la client.
Specificația de bază HTTP nu descrie mecanismul transparent de negociere în detaliu.
Protocolul HTTP acceptă transferul mai multor entități într-un singur mesaj. Mai mult, entitățile pot fi transferate nu numai ca o secvență cu un singur nivel, ci și ca o ierarhie cu elemente imbricate unele în altele. Tipurile media sunt folosite pentru a desemna mai multe conținuturi multipart/*. Lucrul cu astfel de tipuri se realizează conform regulilor generale descrise în RFC 2046 (dacă nu este definit altfel de un anumit tip de media). Dacă receptorul nu știe cum să lucreze cu tipul, atunci îl tratează în același mod ca multipart/mixed.
Parametrul limită înseamnă separatorul dintre diferitele tipuri de mesaje trimise. De exemplu, parametrul DestAddress transmis din formular transmite valoarea adresei de e-mail, iar elementul AttachedFile1 care îl urmează trimite conținutul binar al imaginii .jpg
Pe partea de server, mesajele cu conținut multiplu pot fi trimise ca răspuns la mesaje parțialeGET atunci când sunt solicitate mai multe fragmente de resurse. În acest caz, se utilizează tipul media multipart/byteranges.
Pe partea clientului, atunci când trimiteți un formular HTML , POST. Un exemplu tipic sunt paginile de trimitere prin e-mail cu fișiere atașate. La trimiterea unei astfel de scrisori, browserul generează un mesaj de tipul multipart/form-data, integrând în el ca părți separate introduse de utilizator, subiectul scrisorii, adresa destinatarului, textul în sine și fișierele atașate:
POST /send-message.html HTTP/1.1 Gazdă: mail.example.com Referer: http://mail.example.com/send-message.html Agent utilizator: BrowserForDummies/4.67b Tip de conținut: date multiple/form-date; boundary="Asrf456BGe4h" Lungimea conținutului: (lungimea totală, inclusiv antetele copiilor) Conexiune: păstrați-vă în viață Păstrați-vă în viață: 300 (șir gol) (preambul lipsește) --Asrf456BGe4h Conținut-Dispoziție: formular-date; name="DestAddress" (linie goală) brutal-vasya@example.com --Asrf456BGe4h Conținut-Dispoziție: formular-date; name="MessageTitle" (linie goală) Am retrimis --Asrf456BGe4h Conținut-Dispoziție: formular-date; name="MessageText" (linie goală) Salut Vasily! Leul tău de companie pe care l-ai lăsat în urmă Eu săptămâna trecută, mi-am rupt toată canapea. Vă rugăm să-l ridicați în curând! Atașez două poze cu consecințele. --Asrf456BGe4h Conținut-Dispoziție: formular-date; name="AttachedFile1"; filename="horror-photo-1.jpg" Tip de conținut: imagine/jpeg (șir gol) (conținutul binar al primei fotografii) --Asrf456BGe4h Conținut-Dispoziție: formular-date; name="AttachedFile2"; filename="horror-photo-2.jpg" Tip de conținut: imagine/jpeg (șir gol) (conținutul binar al celei de-a doua fotografii) --Asrf456BGe4h-- (lipsește epilog)În exemplul din anteturi , Content-Dispositionparametrul namese potrivește cu atributul namedin etichetele HTML <INPUT>și <TEXTAREA>. Parametrul filenameeste egal cu numele fișierului original de pe computerul utilizatorului. Consultați RFC 1867 pentru mai multe informații despre generarea formularelor HTML și atașarea fișierelor .
URI | scheme|
---|---|
Oficial | |
neoficial |
TCP /IP pe straturi ale modelului OSI | Protocoale de bază|
---|---|
Fizic | |
canalizat | |
reţea | |
Transport | |
sesiune | |
Reprezentare | |
Aplicat | |
Altele aplicate | |
Lista de porturi TCP și UDP |
Web și site-uri web | |
---|---|
la nivel global | |
La nivel local | |
Tipuri de site-uri și servicii |
|
Creare si intretinere | |
Tipuri de machete, pagini, site-uri | |
Tehnic | |
Marketing | |
Societate și cultură |
web semantic | |
---|---|
Bazele | |
Subsecțiuni |
|
Aplicații |
|
subiecte asemănătoare | |
Standarde |
|
HTTP | |
---|---|
Concepte generale |
|
Metode | |
Titluri |
|
Codurile de stare |