HyperText Transfer Protocol

Александр Колосов

Пример ручного взаимодействия с браузером по протоколу HTTP

  1. С помощью команды nc на сервере webarch.cs.prv создаем слушающий сокет на заданном порту. Данные для отправки клиенту принимаются со стандартного ввода:

    $ nc -l <port>
    
  2. Из браузера подключаемся к созданному соединению по URI http://webarch.cs.prv:<port>.
  1. Команда nc выводит HTTP-запрос, отправленный браузером:

    GET / HTTP/1.1
    Host: webarch.cs.prv:8072
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    
  2. Введите (скопируйте) в стандартный ввод команды nc HTTP-ответ, содержащий простой HTML-документ.

    HTTP/1.1 200 OK
    Server: Humankind
    Content-Type: text/html
    
    <h1>Attention please!</h1><p>This page was dictated to the user agent by the humankind.</p>
    
  3. Нажмите Ctrl-D, чтобы завершить ввод.
  4. Соединение завершается, браузер отображает HTML-документ.

HTTP-сессия с сохранением соединения

  1. По аналогии с предыдущим примером создадим слушающий сокет.
  2. В ответ на первый запрос от браузера отдадим HTML-документ, содержащий ссылку на таблицу стилей:

    HTTP/1.1 200 OK
    Server: Humankind
    Content-Type: text/html
    Content-Length: 100
    Connection: keep-alive
    
    <link rel="stylesheet" type="text/css" href="test.css">
    <p>This is a document with a stylesheet.</p>
    

    В заголовке HTTP-ответа указываем длину ответа (заголовок Content-Length) и сообщаем, что соединение не будет прервано после отдачи содержимого (заголовок Connection).

  1. В ответ на запрос таблицы стиля отдадим CSS-файл:

    HTTP/1.1 200 OK
    Server: Humankind
    Content-Type: text/css
    Content-Length: 23
    Connection: close
    
    body {background: red;}
    

    С помощью заголовка Connection сообщаем клиенту, что больше в рамках этого соединения ничего передаваться не будет.