RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Web технологии. HTTP.

Eugen Kuleshov ( 02.02.1999 )
Эта статья не претендует на изложение всех особенностей протокола HTTP. Здесь рассказывается об основных принципах и концепциях. Если же вас интересуют все подробности, то в конце статьи приведены ссылки на документы в которых описан стандарт протокола. Кроме того я буду рад в меру моих сил и знаний ответить на ваши вопросы.

Hypertext Transfer Protocol (HTTP) - это протокол, который клиенты и серверы World Wide Web (WWW) используют для общения между собой. Он, по сути дела, является основой Web. Хотя HTTP в большей степени относится к сфере программирования серверов и клиентов, знание этого протокола важно для создания интерактивных Web страниц (в том числе с помощью SSI, CGI, php3, JavaServlets и т.п.).

Принципы HTTP

Все HTTP-транзакции имеют один общий формат. Каждый запрос клиента и ответ сервера состоит из трех частей: строки запроса (ответа), раздела заголовка и тела.

Клиент инициирует транзакцию следующим образом:

  1. Клиент устанавливает связь с сервером по назначенному номеру порта (по умолчанию - 80). Затем посылается запрос документа с указанием HTTP комманды (называемой методом), адреса документа и номера версии HTTP. Например:
    GET /index.html HTTP/1.0
  2. Клиент посылает необязательную информацию заголовка, чтобы сообщить серверу информацию о своей конфигурации и данные о форматах документов, которые он может принимать. Вся информация заголовка указывается построчно и каждая строка содержит пару имя-значение. Заголовок завершается пустой строкой. Например:
    User-Agent: Mozilla/2.02Gold (WinNT; I)
    Accept: image/gif, image/jpeg, */*
  3. Послав запрос и заголовки, клиент может отправить дополнительные данные (тело запроса). Эти данные используются, например, CGI-программами, применяющими метод POST.
Сервер отвечает на запрос клиента следующим образом:
  1. Первая часть ответа - строка состояния, содержащая версию протокола HTTP, код состояния и описание, которое представляет собой просто понятный для человека текст, поясняющий код состояния. Например:
    HTTP/1.0 200 OK
  2. После строки состояния сервер передает клиенту информацию заголовка ответа, содержащую данные о самом сервере и затребованном документе. Завершает заголовок пустая строка. Например:
    Date: Fri, 20 Sep 1996 08:17:58 GMT
    Server: NCSA/1.5.2
    Last-modified: Mon, 17 Jun 1996 21:53:08 GMT
    Content-type: text/html
    Content-length: 2482
  3. Если запрос клиента успешен, то сервер посылает затребованные данные. Это может быть копия файла или документ сформированный "на лету". Если запрос клиента удовлетворить нельзя, то сервер передает дополнительные данные в виде удобного для человека разъяснения причин, по которым сервер не смог выполнить запрос.

В HTTP 1.0 после передачи сервером затребованных данных следует разъединение с клиентом и транзакция завершается, если не был передан заголовок Connection: Keep Alive. В HTTP 1.1 сервер по умолчанию не разрывает соединение и клиент может посылать другие запросы. Это позволяет сэкономить время и затраты клиента, которому не приходится заново соединяться с тем же сервером. Таким образом, в HTTP 1.1 транзакция может циклически повторяться, пока клиент или сервер не закроет соединение явно.

Простой Web клиент

Для того, чтобы отбросить все сомнения и полностью разобраться в сути происходящего напишем простой Web клиент. Ниже приведен кусочек исходного текста, где формируется тело запроса, передается на сервер и читается ответ сервера:
  struct sockaddr_in server;
  struct hostent *hp;
  char req[ 8192];
  char buf[ 8192];
  struct servent *echoprot;
  int sock, len, rc;

  // Инициализация tcp сокета и коннект к серверу
  ...

  // Формирование запроса
  // метод запроса
  strcpy( req, "GET ");
  // запрашиваемый документ
  strcat( req, argv[ 2]);
  // версия протокола, используемого клиентом
  strcat( req, " HTTP/1.0\n");
  // дополнительные заголовки запроса
  strcat( req, "User-Agent: Simple Web client by Eugen Kuleshov\n");
  strcat( req, "Accept: */*\n");
  // завершение запроса
  strcat( req, "\n\n"); 

  // Посылаем запрос на сервер
  rc = send( sock, req, strlen( req), 0);
  if( rc==-1) {
    psock_errno( "send()");
    exit( 1);
  }

  // Читаем и печатаем ответ на запрос
  do {
    len = recv( sock, buf, sizeof( buf), 0);
    if( len==-1) {
      psock_errno( "recv()");
      exit( 1);
    }
    buf[ len] = '\0';
    printf( "%s", buf);
  } while( len!=0);
  printf( "\n\n");
Полный текст программы вы можете найти здесь. Я собирал ее VAC++ 3.0 для OS/2, но нет проблем собрать ее другим компилятором.

Теперь вы можете поэкспериментировать с этой програмкой и каким нибудь web сервером. Например:

webclnt euxx.uland.com /os2/ > euxxpage
Теперь можно посмотреть файлик euxxpage. Кроме этого можно поиграть с заголовками запроса и посмотреть как реагирует сервер.

Методы

Метод - это HTTP-комманда, с которой начинается первая строка запроса клиента. Метод сообщает серверу о цели запроса. Чаще всего используются методы GET, HEAD и POST (регистр имеет значение).
GET
Этим методом запрашивается информация, расположенная на сервере в указанном в запросе месте. Методом GET web браузеры обычно получают документы для визуализации. Результатом такого запроса может быть, например, файл, лежащий на сервере или же сформированный специально для этого запроса. Например:
GET / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*

HEAD
Метод HEAD аналогичен методу GET, за исключением того, что сервер не посылает тело ответа, а только информацию заголовка о запрошенном файле или ресурсе. Обычно этот метод используется для получения информации о документе не получая документ. Можно, например, затребовать следующую информацию:

Следует отметить, что большая часть посылаемой сервером информации заголовка, не является обязательной и может представляться не всеми web серверами. Например:

HEAD / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*

POST
Этот метод позволяет посылать на сервер данные в запросе клиента. Эти данные могут быть использованы сервером для динамической генерации запрашиваемого документа, например для передачи входных данных для:

Например:

POST / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 16

test=20&test2=22
Обратите внимание на атрибуты Content-type и Content-length они используются для того, чтобы указать серверу на тип кодирования тела запроса и дать информацию о длине тела. Подробнее вы можете почитать в соответствующем RFC (HTTP 1.0 - rfc1945 или HTTP 1.1 - rfc2068).
Подробнее о протоколе HTTP вы можете прочитать на сервере www.w3.org. Там вы найдете описание других методов, а так же описание заголовков запросов клиента и ответов сервера.

Что дальше?

В следующей статье мы продолжим знакомство с внутренностями web сервера и рассмотрим что же такое и как работает CGI.

Если вас заинтересовала эта статья и вам интересно продолжение, пожалуйста напишите мне.

---
Интересные ссылки:

---

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2