HTTP Protocolul pe care fiecare dezvoltator Web trebuie să îl cunoască - Partea 2

În articolul meu anterior, am acoperit câteva dintre elementele de bază ale HTTP, cum ar fi schema de adrese URL, codurile de stare și antetele de solicitare / răspuns. Cu această bază, vom examina aspectele mai fine ale HTTP, cum ar fi manipularea conexiunilor, autentificarea și caching-ul HTTP. Aceste subiecte sunt destul de extinse, dar vom acoperi cei mai importanți biți.


Conexiuni HTTP

Trebuie să se stabilească o conexiune între client și server înainte de a putea comunica între ele și HTTP utilizează protocolul de transport TCP de încredere pentru a realiza această conexiune. Implicit, traficul web utilizează portul TCP 80. Un flux TCP este rupt în pachete IP și asigură că acele pachete intră întotdeauna în ordinea corectă, fără a eșua. HTTP este un protocol de strat aplicație peste TCP, care este peste IP.

HTTPS este o versiune sigură a HTTP, care introduce un strat suplimentar între HTTP și TCP numit TLS sau SSL (Transport Layer Security sau Secure Sockets Layer, respectiv). HTTPS comunica prin portul 443 în mod implicit și vom examina HTTPS mai târziu în acest articol.

O conexiune HTTP este identificată prin și . Pe un client, o aplicație HTTP este identificată prin a tuplu. Stabilirea unei conexiuni între două puncte finale este un proces în mai multe etape și implică următoarele:

  • rezolva adresa IP de la numele gazdei prin DNS
  • stabili o conexiune cu serverul
  • Trimite o cerere
  • așteptați un răspuns
  • conexiune strânsă

Serverul este responsabil pentru întotdeauna să răspundă cu antetele și răspunsurile corecte.

În HTTP / 1.0, toate conexiunile au fost închise după o singură tranzacție. Deci, dacă un client dorea să ceară trei imagini separate de la același server, a făcut trei conexiuni separate la gazda de la distanță. După cum puteți vedea din diagrama de mai sus, acest lucru poate introduce multe întârzieri în rețea, rezultând o experiență sub-optimă a utilizatorului.

Pentru a reduce întârzierea stabilirii conexiunilor, a fost introdus HTTP / 1.1 conexiuni persistente, conexiuni de lungă durată care rămân deschise până când clientul le închide. Conexiunile persistente sunt implicite în HTTP / 1.1, iar efectuarea unei singure conexiuni de tranzacție necesită setarea clientului Conexiune: aproape solicitați antetul. Acest lucru îi spune serverului să închidă conexiunea după ce a trimis răspunsul.

Pe lângă conexiunile persistente, browserele / clienții folosesc și o tehnică numită conexiuni paralele, pentru a minimiza întârzierile în rețea. Conceptul vechi de conexiuni paralele presupune crearea unei baze de conexiuni (în general, limitată la șase conexiuni). Dacă există șase bunuri pe care clientul trebuie să le descarce de pe un site web, clientul realizează șase conexiuni paralele pentru a descărca aceste active, rezultând o revenire mai rapidă. Aceasta este o imbunatatire imensa in raport cu conexiunile seriale in care clientul descarca doar un activ dupa ce a terminat descarcarea pentru un activ anterior.

Conexiunile paralele, în combinație cu conexiunile persistente, reprezintă răspunsul de astăzi la minimizarea întârzierilor în rețea și la crearea unei experiențe netede a clientului. Pentru tratamentul în profunzime a conexiunilor HTTP, consultați secțiunea Connections a spec. HTTP.

Conectarea la server de conexiune

Serverul ascultă mai ales conexiunile primite și le procesează atunci când primește o solicitare. Operațiunile implică:

  • stabilirea unui soclu pentru a începe să ascultați pe portul 80 (sau alt port)
  • primirea cererii și parsarea mesajului
  • procesarea răspunsului
  • setarea anteturilor de răspuns
  • trimiterea răspunsului către client
  • închideți conexiunea dacă a Conexiune: aproape antetul de solicitare a fost găsit

Desigur, aceasta nu este o listă exhaustivă de operațiuni. Majoritatea aplicațiilor / site-urilor web trebuie să știe cine face o solicitare pentru a crea răspunsuri mai personalizate. Acesta este tărâmul Identificare și autentificare.


Identificarea și autentificarea

HTTP este un protocol de strat aplicație peste TCP, care este peste IP.

Este aproape obligatoriu să știți cine se conectează la un server pentru a urmări utilizarea unei aplicații sau a unui site și modelele de interacțiune generală ale utilizatorilor. Premisa identificării este de a adapta răspunsul pentru a oferi o experiență personalizată; în mod firesc, serverul trebuie să știe cine este un utilizator pentru a oferi această funcționalitate.

Există câteva moduri diferite în care un server poate colecta aceste informații, iar majoritatea site-urilor Web folosesc un hibrid al acestor abordări:

  • Solicitați anteturi: Din, referer, Agent utilizator - Am văzut aceste titluri în partea 1.
  • Client-IP - adresa IP a clientului
  • Adresele URL urinare - stocarea stării utilizatorului curent prin modificarea adresei URL și redirecționarea către o altă adresă URL pentru fiecare clic; fiecare clic în esență acumulează starea.
  • fursecuri - cea mai populară și non-intruzivă abordare.

Cookie-urile permit serverului să atașeze informații arbitrare pentru răspunsurile la ieșire prin intermediul Set-Cookie răspuns antet. Un cookie este setat cu unul sau mai multe name = valoarea perechi separate prin punct și virgulă (;), ca în Set-cookie: session-id = 12345ABC; username = nettuts.

Un server poate, de asemenea, restricționa cookie-urile la un anumit domeniu și cale, și le poate face persistente cu un expiră valoare. Cookie-urile sunt trimise automat de către browser pentru fiecare cerere făcută unui server, iar browser-ul asigură că numai domeniu- și cale-cookie-uri specifice sunt trimise în cerere. Antetul cererii Cookie: nume = valoare [; name2 = valoare2] este folosit pentru a trimite aceste cookie-uri pe server.

Cea mai bună modalitate de a identifica un utilizator este să îi solicitați să se înregistreze și să se conecteze, însă implementarea acestei funcții necesită un efort din partea dezvoltatorului, precum și a utilizatorului.

Tehnicile precum OAuth simplifică acest tip de caracteristică, însă acesta necesită în continuare consimțământul utilizatorului pentru a funcționa corect. Autentificarea joacă un rol important aici și este probabil singura modalitate de a identifica și verifica utilizatorul.

Autentificare

HTTP suportă o formă rudimentară de autentificare numită Autentificare de bază, precum și cele mai sigure Digest Autentificare.

În autentificarea de bază, serverul refuză inițial cererea clientului cu un WWW-autentificaþi răspuns antet și a 401 Neautorizat codul de stare. Când vedeți acest antet, browserul afișează un dialog de conectare, solicitând un nume de utilizator și o parolă. Această informație este trimisă într-un format codificat de bază 64 în Autentificare solicitați antetul. Serverul poate valida cererea și permite accesul dacă acreditările sunt valide. Unele servere ar putea trimite, de asemenea Autentificarea-Info antetul care conține detalii suplimentare privind autentificarea.

Un corolar al autentificării de bază este Proxy Authentication. În locul unui server web, provocarea de authetare este solicitată de un proxy intermediar. Proxy-ul trimite a Proxy-autentificaþi antet cu a 407 Neautorizat codul de stare. În schimb, clientul trebuie să trimită acreditările prin Proxy-Autorizare solicitați antetul.

Digest Autentificarea este similară cu Basic și utilizează aceeași tehnică de strângere a mâinilor cu WWW-autentificaþi și Autorizare dar Digest folosește o funcție hashing mai sigură pentru a cripta numele de utilizator și parola (de obicei, cu funcții digest MD5 sau KD). Deși se presupune că Digest Authentication este mai sigur decât Basic, site-urile folosesc de obicei autentificarea de bază din cauza simplității sale. Pentru a atenua preocupările legate de securitate, Basic Auth este utilizat împreună cu SSL.

Secure HTTP

Protocolul HTTPS asigură o conexiune securizată pe web. Cea mai ușoară modalitate de a afla dacă utilizați HTTPS este să verificați bara de adrese a browserului. Componenta securizată a componentelor HTTP implică inserarea unui strat de criptare / decriptare între HTTP și TCP. Acesta este Secure Sockets Layer (SSL) sau TLS (Transport Layer Security).

SSL utilizează o formă puternică de criptare utilizând RSA și criptografia cu chei publice. Deoarece tranzacțiile sigure sunt atât de importante pe web, un efort omniprezent bazat pe standarde de infrastructură publică (PKI) este în plină desfășurare de ceva timp.

Clienții / serverele existente nu trebuie să schimbe modul în care gestionează mesajele, deoarece majoritatea muncii grele se întâmplă în stratul SSL. Astfel, puteți dezvolta aplicația dvs. Web folosind Authentication Basic și puteți profita automat de avantajele SSL prin trecerea la https: // protocol. Cu toate acestea, pentru a face ca aplicația Web să funcționeze pe HTTPS, trebuie să aveți un certificat digital de lucru implementat pe server.

Certificate

La fel cum aveți nevoie de carduri de identitate pentru a vă prezenta identitatea, un server web are nevoie de un certificat digital pentru a se identifica. Certificatele (sau "certificatele") sunt emise de o autoritate de certificare (CA) și garantează pentru identitatea dvs. pe web. AC sunt gardienii PKI. Cea mai comună formă de certificate este standardul X.509 v3, care conține informații, cum ar fi:

  • emitentul de certificate
  • algoritmul utilizat pentru certificat
  • numele sau organizația pentru care acest cert este creat
  • informațiile cheie cheie pentru subiect
  • Semnătura Autorității de Certificare, utilizând algoritmul de semnare specificat

Atunci când un client face o cerere prin HTTPS, mai întâi încearcă să găsească un certificat pe server. În cazul în care cert este găsit, ea încearcă să verfiy împotriva lista sa cunoscută de CAs. Dacă nu este una dintre CA-urile listate, ar putea afișa o fereastră de dialog cu avertismentul utilizatorului despre certficatul site-ului web.

Odată ce certificatul este verificat, strângerea de mână SSL este completă și transmisia sigură este în vigoare.


HTTP Caching

În general, este de acord că realizarea aceleiași lucrări de două ori este risipă. Acesta este principiul călăuzitor în jurul conceptului de caching HTTP, un pilon fundamental al infrastructurii rețelei HTTP. Deoarece majoritatea operațiunilor se desfășoară într-o rețea, o memorie cache contribuie la economisirea timpului, a costurilor și a lățimii de bandă, precum și la îmbunătățirea experienței pe web.

Cache-urile sunt utilizate în mai multe locuri în infrastructura de rețea, de la browser la serverul de origine. În funcție de locul în care se află, o memorie cache poate fi clasificată ca:

  • Privat: în cadrul unui browser, cache numele de utilizator, parolele, adresele URL, istoricul de navigare și conținutul web. Ele sunt, în general, mici și specifice unui utilizator.
  • Public: implementat ca proxy cache între server și client. Acestea sunt mult mai mari deoarece servesc mai mulți utilizatori. O practică obișnuită este păstrarea mai multor proxy-uri de cache între client și serverul de origine. Acest lucru ajută la difuzarea conținutului frecvent accesat, permițând în același timp o excursie la server pentru conținutul rar necesar.

Procesarea cache-urilor

Indiferent de locul în care se află o memorie cache, procesul de menținere a unei cache este destul de similar:

  • A primi solicitați mesajul.
  • Analiza adresa URL și anteturile.
  • Privește în sus o copie locală; în caz contrar, preluați și păstrați la nivel local
  • Fa a verificarea prospețimii pentru a determina vârsta conținutului din memoria cache; faceți o cerere de reîmprospătare a conținutului numai dacă este necesar.
  • Creați raspuns din corpul memorat și anteturile actualizate.
  • Trimite răspunsul la client.
  • facultativ, Buturuga tranzactia.

Desigur, serverul este responsabil pentru întotdeauna să răspundă cu antetele și răspunsurile corecte. Dacă un document nu sa schimbat, serverul ar trebui să răspundă cu un a 304 Nu a fost modificat. Dacă copia memorată în memoria cache a expirat, aceasta ar trebui să genereze un nou răspuns cu anteturile de răspuns actualizate și să se întoarcă cu un a 200 OK. Dacă resursa este ștearsă, ar trebui să revină cu ea 404 Nu a fost gasit. Aceste răspunsuri ajută la reglarea memoriei cache și asigurați-vă că conținutul vechi nu este păstrat prea mult timp.

Anteturi de control cache

Conexiunile paralele, în combinație cu conexiuni persistente, reprezintă răspunsul de astăzi la minimizarea întârzierilor în rețea.

Acum, că avem un sentiment de funcționare a unui cache, este timpul să examinăm antetele de solicitare și de răspuns care permit infrastructura de cache. Păstrarea conținutului în stare proaspătă și actualizată este una dintre responsabilitățile principale ale cache-ului. Pentru a păstra copia în memoria cache în concordanță cu serverul, HTTP oferă câteva mecanisme simple, și anume Exitarea documentului și Revalidarea serverului.

Exitarea documentului

HTTP permite unui server de origine să atașeze un server data expirării la fiecare document utilizând Cache-Control și expiră raspuns antetele. Acest lucru ajută clientul și alte servere de memorie să știe cât timp un document este valabil și proaspăt. Cache-ul poate servi copia atâta timp cât vârstă a documentului se află în data de expirare. Odată ce un document expiră, memoria cache trebuie să verifice cu serverul pentru o copie mai nouă și să actualizeze copia locală în consecință.

expiră este un antet mai vechi de răspuns HTTP / 1.0 care specifică valoarea ca dată absolută. Acest lucru este util doar dacă ceasurile serverului sunt sincronizate cu clientul, ceea ce este o presupunere teribilă de făcut. Acest antet este mai puțin util în comparație cu cel mai nou Controlul cache-ului: max-age = antet introdus în HTTP / 1.1. Aici, max-age este o vârstă relativă, specificată în câteva secunde, de la momentul creării răspunsului. Astfel, dacă un document ar trebui să expire după o zi, antetul de expirare ar trebui să fie Controlul cache-ului: max-age = 86400.

Revalidarea serverului

Odată ce un document memorat în memoria cache expiră, memoria cache trebuie revalidată cu serverul pentru a verifica dacă documentul sa modificat. Aceasta se numește revalidarea serverului și servește ca un mecanism de interogare pentru stale-ness a unui document. Doar pentru că o copie cache a expirat nu înseamnă că serverul are de fapt conținut mai nou. Revalidarea este doar un mijloc de a vă asigura că memoria cache rămâne proaspătă. Din cauza timpului de expirare (așa cum este specificat într-un răspuns anterior al serverului), cache-ul nu trebuie să verifice cu serverul pentru fiecare solicitare, economisind astfel lățimea de bandă, timpul și reducerea traficului de rețea.

Combinația dintre expirarea documentului și revalidarea serverului este un mecanism foarte eficient și permite sistemelor distribuite să păstreze copii cu o dată de expirare.

Dacă se știe că conținutul se schimbă frecvent, timpul de expirare poate fi redus - permițând sistemelor să se sincronizeze mai frecvent.

Etapa de revalidare poate fi realizată cu două tipuri de anteturi de cerere: If-Modified-Since și Dacă-Fără-Match. Primul este pentru validarea bazată pe date, în timp ce acesta din urmă utilizează Entity-Tags (ETags), un hash al conținutului. Aceste anteturi utilizează date sau valori ETag obținute dintr-un răspuns anterior al serverului. In caz de If-Modified-Since, Modificat ultima dată este folosit un antet de răspuns; pentru Dacă-Fără-Match, este ETag răspuns antet.

Controlul Cachabilității

Perioada de valabilitate a unui document trebuie definită de serverul care generează documentul. Dacă este un site de ziare, pagina de pornire ar trebui să expire după o zi (sau uneori chiar la fiecare oră!). HTTP oferă Cache-Control și expiră pentru a stabili expirarea documentelor. Ca menționat mai devreme, expiră se bazează pe datele absolute și nu o soluție fiabilă pentru controlul memoriei cache.

Cache-Control antetul este mult mai util și are câteva valori diferite pentru a limita modul în care clienții ar trebui să fie cache răspunsul:

  • Cache-Control: nu-cache: clientului i se permite să stocheze documentul; cu toate acestea, trebuie să revalidați cu serverul la fiecare solicitare. Există un antet de compatibilitate HTTP / 1.0 numit Pragma: nu-cache, care funcționează în același mod.
  • Cache-Control: fără depozitare: aceasta este o directivă mai puternică pentru client să nu stocheze deloc documentul.
  • Cache-Control: trebuie să revalidați: aceasta îi spune clientului să-și depășească calculul prospețimii și să revalideze întotdeauna cu serverul. Nu este permisă difuzarea răspunsului memorat în cache în cazul în care serverul nu este disponibil.
  • Controlul cache-ului: vârsta maximă: acesta stabilește un timp de expirare relativ (în secunde) de la momentul generării răspunsului.

Ca o parte, dacă serverul nu trimite niciunul Cache-Control headers, clientul este liber să utilizeze propriul algoritm de expirare euristică pentru a determina prospețimea.

Constrângerea proaspătului de la client

Cachabilitatea nu se limitează numai la server. De asemenea, poate fi specificat de la client. Acest lucru permite clientului să impună constrângeri asupra a ceea ce este dispus să accepte. Acest lucru este posibil prin intermediul aceluiași lucru Cache-Control antet, deși cu câteva valori diferite:

  • Controlul cache-ului: min-fresh =: documentul trebuie să fie proaspăt cel puțin secunde.
  • Controlul cache-ului: max-stale sau Controlul cache-ului: max-stale =: documentul nu poate fi difuzat din memoria cache dacă acesta a rămas mai lung decât secunde.
  • Controlul cache-ului: max-age =: memoria cache nu poate returna un document care a fost stocat mai mult timp în cache secunde.
  • Cache-Control: nu-cache sau Pragma: nu-cache: clientul nu va accepta o resursă cache dacă nu a fost revalidată.

Caching-ul HTTP este de fapt un subiect foarte interesant și există algoritmi foarte sofisticați pentru gestionarea conținutului stocat în cache. Pentru o privire mai aprofundată asupra acestui subiect, consultați secțiunea Caching din specificația HTTP.


rezumat

Turul HTTP a început cu crearea schemelor URL, a codurilor de stare și a antetelor de solicitare / răspuns. Bazându-ne pe aceste concepte, ne-am uitat la unele dintre zonele mai fine ale HTTP, cum ar fi manipularea conexiunilor, identificarea și autentificarea și cache-ul. Sunt convins că acest turneu ți-a dat un gust bun pentru lățimea HTTP și indicii suficienți pentru a explora în continuare acest protocol.

Referințe

  • RFC 2616, specificație HTTP
  • HTTP ghidul definitiv
Cod