Справочник по сетевым протоколам

       

Протокол NNTP, описание команд


Сервер новостей UseNet использует протокол NNTP для взаимодействия с другими серверами. Механизм работы протокола NNTP во многом похож на механизм работы по протоколу SMTP. Протокол поддерживает канал обмена новостями и простейший интерфейс работы с распределенной базой данных новостей. При использовании в качестве транспортного протокола TCP, протокол NNTP, как правило, работает с портом 119.

Команды и ответы протокола состоят из ASCII-символов. Если соединение позволяет передавать 8-битные данные, восьмой (старший) бит устанавливается в ноль. Команды могут содержать параметры, которые отделяются пробелами или символами табуляции. Каждая строка может содержать только одну команду (с параметрами или без), должна заканчиваться парой <CRLF> и быть длиной не более 512 байт.

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

Ответы бывают двух видов: текстовые и статус-ответы. Текстовые ответы следуют только после строки цифрового статус-ответа, который указывает на то, какого рода текстовый ответ будет за ним следовать. Текстовый ответ представляет собой последовательность строк текстового содержания, каждая из которых заканчивается комбинацией <CRLF>. Отдельная строка, содержащая только символ (.), а точнее комбинацию символов <CRLF>.<CRLF>,

передается для обозначения конца текста. В случае, если исходный текст содержит в качестве первого символа строки символ (.), то при передаче он будет продублирован. На приемной стороне пользователь отбросит этот символ.

Предполагается, что текстовые сообщения должны быть отображены на экране пользовательского терминала в отличие от статус-ответов, которые интерпретируются программой-клиентом пользователя.

Статус-ответы являются сообщениями о статусе от сервера и индицируют ответ на последнюю команду, принятую от клиента.


Строка статус-ответа начинается с 3- х цифрового кода, достаточного для различения всех возможных ответов. Некоторые из них предваряют передачу текста.

Ниже приводится список основных кодов ответов, которые могут быть посланы NNTP-сервером. Они не являются строго привязанными к конкретным командам и могут быть возвращены как результат установления соединения, ошибки или других необычных ситуаций.

Обычно коды ответов типа 1хх могут быть проигнорированы или отображены по желанию; коды 200

или 201 посылаются после установления соединения с NNTP-сервером в зависимости от того, разрешена публикация или нет; код 400

будет послан тогда, когда NNTP-сервер прекратит обслуживание (например, по запросу оператора); и коды 5хх указывают на то, что команда не может быть выполнена по каким-либо причинам.



100
Текст с инструкциями.





190 – 199
Отладка выхода.



200
Сервер готов - публикация разрешена.



201
Сервер готов - публикация не разрешена.



400
Прекращение обслуживания.



500
Команда не опознана.



501
Ошибка в синтаксисе команды.



502
Ограничение доступа или отказ в разрешении.



503
Ошибка программы - команда не выполнима.



Примечание



Числовые коды ответов сервера новостей составляют определенную иерархию и обозначают состояние сервера после выполнения команды. Описание кодов возврата выходит за рамки данной книги. Подробное описание структуры системы кодов вы можете найти, например, в RFC-977.

Итак, после того как клиент установил TCP-соединение с сервером новостей, сервер отвечает приглашением к работе по протоколу NNTP (далее символом "S" будем обозначать сервер новостей, а символом "С" — клиента). Например:





S: 200 newsvax news server ready — posting ok





Код 200 означает, что данный сервер позволяет клиенту передавать ему новые статьи. Если код ответа — 201, сервер не позволяет клиенту передавать на него новые статьи:





S: 201 badvax netnews server ready -- no posting allowed





Теперь клиент может начать работу. Далее будут описаны наиболее употребительные в ежедневной работе команды NNTP.







Команда LIST возвращает список групп сервера новостей и сопутствующую информацию. Например:






С: LIST

S: 215 list of newsgroups follows

S: net.wizards 10125 10011 у

S: net.idiots 00100 00001 n

S: ...

S: <groupname> <last> <first> p



где <groupname> — имя группы новостей, <last> и <first> — номера последней и первой статьи в группах, р — флаг, показывающий, может ли клиент отправлять свои статьи в эти группы ('n' — не может, 'у' — может).

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







Для того чтобы получить статьи из конкретной группы, пользователь должен к ней подсоединиться. Это делается с помощью команды GROUP. В качестве параметра этой команды задается название группы новостей. Если пользователь не знает названия группы, может взять его из списка, возвращаемого командой LIST. Например:






С: GROUP net.deneg

S: 211 104 10011 10125 net.deneg group selected

(there are 104 articles on file, from 10011 to 10125)





где 211 — код успешного открытия группы (если код =411, такой группы нет), число 104 — количество статей в группе, 10011 — номер первой статьи группы, 10125 — номер последней статьи. После выполнения этой команды создается указатель на текущую статью, который по умолчанию будет указывать на первую статью в группе.





После того как выбрана группа новостей, пользователь может прочитать статью из этой группы. Для этого можно использовать команды: ARTICLE, BODY, HEAD. В качестве аргументов команды используют либо номер статьи, либо ее уникальный идентификатор (Message-ID). Последний может использоваться, например, для предотвращения повторного чтения одной и той же статьи. Разница между этими командами заключается в том, что ARTICLE возвращает как заголовок, так и тело статьи, HEAD возвращает только заголовок, a BODY — только тело сообщения. Например:
<



/p>





С: ARTICLE <87623@baz.net>

S: 220 <87623@baz.net> All of article follows

S: ... text ...

C: BODY 402

S: 220 402 <4105@ucbvax.arpa> Article retrieved, body follows

S: ... text ...

C: HEAD 404

S: 220 404 <mik@vax.net> Article retrieved, head follows

S: ... text ...









Сообщения в группе можно читать последовательно, не обращаясь к номеру статьи. Для этого требуется установить указатель на текущую статью. Это делает команда STAT. Аргументом команды является или номер статьи в группе, или уникальный идентификатор сообщения (Message-ID). После того как указатель установлен, вы можете читать текст статей, например, командой BODY, не указывая номера. Для того чтобы передвинуть указатель на следующую статью, следует подать команду NEXT без аргументов, соответственно, на предыдущую — команду LAST. Например:






С: STAT 110

S: 223 110 <23445@svax.com> article retrieved — statistics

C: BODY

S: 222 110 <23445@svax.com> article retrieved - body follows

S: ... text ...

C: NEXT

S: 223 113 <21495@nuke.uucp> article retrieved - statistics









Пользователь может получить от сервера новостей список групп, которые были созданы позднее заданной даты. Этот сервис предоставляется командой NEWGROLJPS. Аргументами команды NEWGROUPS являются дата и время в формате "YYMMDD HHMMSS", флаг отсчета времени (локальное или по GMT), маска имен групп. Например, запрос списка групп, созданных на данном сервере с 15 мая 1995 года по GMT и имеющих в своем названии строку "net" выглядит следующим образом:






С: NEWGROUPS 950515 000000 GMT <net>

S: 235 New newsgroups since 950515 follow

S: net.fluff

S: ...









Пользователь может получить от сервера новостей список уникальных идентификаторов статей которые были созданы в указанной группе позднее заданной даты. Этот сервис предоставляется командой NEW-NEWS. Аргументами команды являются дата и время в формате "YYMMDD HHMMSS", флаг отсчета времени (локальное или по GMT), маска имени группы новостей. Маска имени в данной команде позволяет использовать символ джокеры ("*") и символ отрицания ("!"). Например, запрос списка статей, полученных всеми группами новостей данного сервера после 16 июня 1997 года выглядит следующим образом:
<



/p>

С: NEWNEWS * 970616 000000

S: 230 New news since 970616 000000 follows

S: <1772@foo.UUCP>

S: ...

Команда IHAVE информирует сервер, что пользователь имеет статью с идентификатором <Message-ID>, который указывается в качестве аргумента данной команды. Например:
С: IHAVE <4105@vax.com>

S: 435 Already seen that one, where you been?

С: IHAVE <4109@vax.com>

S: 335 News to me! <CRLF.CRLF> to end.

С: (sends article)

С : .

S: 235 Article transferred successfully. Thanks.

Если сервер уже имеет данную статью, он ответит, что копия статьи у него уже есть. Если указанной статьи нет, сервер попросит ее отправить, и пользователь может отправить статью. При отправке клиент должен передать всю статью целиком, включая заголовок и тело сообщения в том же формате, в каком он получает статьи от данного сервера. Передача сообщения завершается строчкой, содержащей символ "." (т. е. последовательностью "<CRLF>.<CRLF>").

Ситуация, когда сервер новостей не имеет сообщения, в то время как оно находится у его клиента, может возникнуть, например, если клиент работает с несколькими серверами, которые еще не успели или не могут по каким-либо причинам обменяться данными сообщениями.

Для того чтобы отправить в конференцию новую статью, пользователь должен сначала убедиться, что данная конференция доступна для записи новых статей и дать команду POST. Сервер должен ответить кодом готовности принять сообщение (340). После этого пользователь может отправить статью, включая заголовок и тело сообщения в том же формате, в каком он получает статьи от данного сервера. Передача сообщения завершается последовательностью "<CRLF>.<CRLF>". Например:
С: POST

S: 340 Continue posting; Period on a line by itself to end

C: ...

C: .

S: 240 Article posted successfully.

Завершает сессию обмена команда QUIT:
С: QUIT

S: 205 VAX closing connection. Goodbye.

 

Содержание раздела