Искусство программирования для Unix.

5.3.3. Учебный пример: IMAP, протокол доступа к почтовым сообщениям.

Чтобы завершить рассмотрение примеров с протоколами прикладного уровня Internet, рассмотрим протокол IMAP (Internet Message Access Protocol — протокол доступа к почтовым сообщениям в Internet). IMAP — другой почтовый протокол, спроектированный в несколько ином стиле. Как и в предыдущих примерах, строки, начинающиеся с С:, отправляются клиентом, а строки, начинающиеся с 5:, отправляются почтовым сервером. Текст, выделенный курсивом, представляет собой комментарии и не является частью реальной транзакции.

Пример 5.9. IMAP-сеанс.

С: <клиент подключается к служебному порту 143>

S: * OK example.com IMAP4rev1 V12.264 server ready.

С: А0001 USER "frobozz" "xyzzy".

S: * OK User frobozz authenticated.

C: A0002 SELECT INBOX.

S: * 1 EXISTS.

S: * 1 RECENT.

S: * FLAGS (\Answered \Flagged \Deleted \Draft \Seen).

S: * OK [UNSEEN 1] first unseen message in /var/spool/mail/esr.

S: A0002 OK [READ-WRITE] SELECT completed.

C: A0003 FETCH 1 RFC822.SIZE  получение размеров сообщений.

S: * 1 FETCH (RFC822.SIZE 2545).

S: A0003 OK FETCH completed.

C: A0004 FETCH 1 BODY[HEADER] получение заголовка первого.

                              сообщения.

S: * 1 FETCH (RFC822.HEADER {1425}.

<сервер отправляет 1425 октетов полезной нагрузки сообщения>

S: ).

S: А0004 OK FETCH completed.

С: А0005 FETCH 1 BODY[TEXT]     получение тела первого.

                                сообщения.

S: * 1 FETCH (BODY[TEXT] {1120}.

<сервер отправляет 1120 октетов полезной нагрузки сообщения>

S: ).

S: * 1 FETCH (FLAGS (\Recent \Seen)).

S: А0005 OK FETCH completed.

С: A0006 LOGOUT.

S: * BYE example.com IMAP4rev1 server terminating connection.

S: A0006 OK LOGOUT completed.

C: <клиент разрывает соединение>

В IMAP полезная нагрузка ограничивается несколько иначе. Вместо завершения блока полезной нагрузки с помощью точки перед ним отправляется его длина. Это несколько увеличивает накладные расходы на сервере (сообщения должны быть скомпонованы заранее, их невозможно просто установить в поток после того, как отправка инициирована), однако упрощает работу клиента, поскольку предоставляет возможность заранее определить объем пространства, которое необходимо выделить в целях буферизации сообщения для его обработки в целом.

Кроме того, следует заметить, что каждый ответ маркируется последовательной меткой, передаваемой в запросе. В данном примере такие метки имеют форму A000n, однако клиент может генерировать любой маркер в данном поле. Данная особенность позволяет направлять серверу поток IMAP-команд, не ожидая ответов. Конечный автомат клиента может затем просто интерпретировать ответы и блоки полезной нагрузки по мере их возвращения. Данная методика сокращает задержку.

Протокол IMAP (который был разработан для замены POP3) является превосходным образцом продуманной и мощной конструкции прикладного протокола в Internet, примером, достойным изучения и подражания.