Do żądania dokumentów z serwerów WWW przeglądarki używają protokołu HTTP. Możesz znać tę nazwę z paska adresu (może być teraz ukryty, ale kiedy klikniesz pasek adresu, skopiuj adres URL i wklej go w edytorze tekstów, zobaczysz http://
na początku). HTTP to prosty protokół tekstowy. Działa to tak:
Po pierwsze, przeglądarka łączy się z serwerem witryny i wysyła adres URL dokumentu, który chce pobrać (strony internetowe też są dokumentami) oraz niektóre szczegóły dotyczące samej przeglądarki ( User-Agent itp.). Na przykład, aby załadować stronę główną na stronie SuperUser http://superuser.com/
, moja przeglądarka wysyła żądanie, które wygląda następująco:
GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
Pierwszy wiersz określa, który dokument powinien zwrócić serwer. Pozostałe linie nazywane są nagłówkami; wyglądają tak:
Header name: Header value
Linie te wysyłają dodatkowe informacje, które pomagają serwerowi zdecydować, co robić.
Jeśli wszystko będzie w porządku, serwer odpowie, wysyłając żądany dokument. Odpowiedź zaczyna się od komunikatu o stanie, po którym następuje kilka nagłówków (ze szczegółami na temat dokumentu) i na koniec, jeśli wszystko jest w porządku, treść dokumentu. Tak wygląda odpowiedź serwera SuperUser na moje żądanie:
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672
<!DOCTYPE html>
<html>
[...snip...]
</html>
Po ostatniej linii serwer SuperUser zamyka połączenie.
Pierwszy wiersz ( HTTP/1.1 200 OK
) zawiera kod odpowiedzi , w tym przypadku jest to 200 OK
. Oznacza to, że serwer zdecydował, że może zwrócić dokument zgodnie z żądaniem, i obiecuje, że następująca zawartość będzie takim dokumentem. Jeśli tak nie jest, kod będzie czymś innym i dostarczy pewnej wskazówki, dlaczego serwer nie tylko zwraca dokument jako odpowiedź: na przykład, jeśli nie może znaleźć żądanego dokumentu, powinien zwrócić 404 Not Found
, a jeśli nie masz dostępu do danej treści, powinna ona powrócić 403 Forbidden
.
Po tej pierwszej linii statusu następują nagłówki odpowiedzi; dostarczają więcej informacji na temat zwracanej treści, na przykład jej Content-type
.
Dalej jest pusta linia. Sygnalizuje to, że nie będzie już żadnych nagłówków odpowiedzi. Wszystko poza tym wierszem stanowi treść żądanego dokumentu. Tak więc w powyższym przykładzie <!DOCTYPE html>
jest pierwszy wiersz strony głównej SuperUser (dokument HTML). Gdybym prosił o dokument do pobrania, prawdopodobnie byłyby to bełkotliwe znaki, ponieważ większość formatów dokumentów jest nieczytelna bez wcześniejszego przetworzenia.
Powrót do nagłówków. Najbardziej interesująca jest dla nas ostatni, Content-Length
. Informuje przeglądarkę, ile bajtów danych powinno oczekiwać po pustym wierszu, więc w zasadzie jest to rozmiar dokumentu wyrażony w bajtach. Ten nagłówek nie jest obowiązkowy i może zostać pominięty przez serwer. Czasami nie można przewidzieć rozmiaru dokumentu (na przykład, gdy dokument jest generowany w locie), czasami leniwi programiści go nie uwzględniają (dość powszechne w witrynach pobierania sterowników), czasami strony internetowe są tworzone przez początkujących, którzy nie wiedzą takiego nagłówka.
W każdym razie, bez względu na przyczynę, może brakować nagłówka. W takim przypadku przeglądarka nie wie, ile danych ma wysłać serwer, a zatem wyświetla rozmiar dokumentu jako nieznany , czekając na zakończenie połączenia przez serwer. I to jest powód nieznanych rozmiarów dokumentów.