Протокол передачи сетевых новостей (Network News Transfer Protocol, NNTP) предусматривает разные подходы к обмену новостей. Здесь поддерживается все: от пакетной технологии (аналог UUCP), до интерактивного обмена по сети. NNTP не просто пакет программ, это стандарт Internet, описанный в RFC-977. Он основан на поточных соединениях, обычно по TCP, между клиентами в сети и сервером новостей. Поточная схема позволяет клиентам и серверу гибко управлять передачей статей.
Различные команды позволяют клиентам принимать, посылать и отправлять по почте статьи. Различие между посылкой и отправкой в том, что последняя может включать статьи с незавершенной информацией заголовка. Поиск статьи может использоваться клиентом передачи новостей также, как программами чтения (newsreaders). Это делает NNTP превосходным средством для обеспечения доступа к новостям клиентам в локальной сети без применения NFS.
NNTP также обеспечивает активый и пассивный способы передачи новостей, которые называются "pushing" и "pulling". Выталкивание (pushing), в основном, представляет собой то же самое, что и C-News протокол ihave/sendme, который рассмотрен в главе 21). Клиент предлагает статью серверу через IHAVE msgid, а сервер возвращает код ответа, который указывает, имеет ли он уже эту статью, или она требуется. В последнем случае, клиент посылает статью, завершенную одиночной точкой в отдельной строке.
Выталкивание новостей имеет один недостаток: оно вызывает значительную загрузку сервера, так как он должен искать в базе данных хронологий каждую конкретную статью.
Противоположная методика: перемещать (pulling) новости. Клиент запрашивает список всех доступных статей группы, которые прибыли после заданной даты. Этот запрос выполняется командой NEWNEWS. Из возвращенного списка сообщений, клиент выбирает те статьи, которые он еще не имеет, используя команду ARTICLE для каждой из них.
Проблема с перемещением новостей состоит в том, что требуется хорошее управление сервером, которое позволяет клиенту запрашивать группы и распределения. Например, оно должно гарантировать, что никакой конфиденциальный материал из локальных групп не будет послан несанкционированной клиентуре.
Имеется также ряд команд для newsreaders, которые разрешают им отыскивать заголовок и тело статьи отдельно или даже находтьь коекретные строки заголовка из набора статей. Это дает возможность хранить все новости на центральной машине, используя nntp-основанные клиентские программы для чтения и регистрации. Это альтернатива экспорту каталогов новостей через NFS, который описан в главе 21.
Полная проблема NNTP состоит в том, что он позволяет хорошо осведомленному специалисту вставлять статьи в поток новостей с ложной спецификацией отправителя. Это называется news faking или spoofing. Расширение NNTP позволяет требовать установления подлинности пользователя для некоторых команд.
Имеется ряд доступных пакетов NNTP. Один из наиболее широко известных: NNTP daemon. Первоначально, он был написан Stan Barber и Phil Lapsley, чтобы проиллюстрировать подробности RFC-977. Вы можете найти его в большинстве дистрибутивов Linux, а также получить исходники и откомпилировать их.
Пакет nntpd состоит из сервера и двух клиентов для перемещения и выталкивания новостей, соответственно, и свою версию программы inews. Они живут в среде B-news, но с небольшими дополнениями, они будут работать с C-news. Однако, если Вы планируете использовать NNTP больше, чем для доступа newsreaders к серверу новостей, эта реализация недостаточна. Мы обсудим только NNTP daemon, содержащийся в пакете nntpd и не будем останавливаться на клиентских программах.
Если Вы желаете использовать большой сайт новостей, Вы должны рассмотреть пакет InterNet News (INN), который был написан Rich Salz. Этот пакет обеспечивает NNTP и UUCP-доставку новостей, что определенно лучше, чем nntpd. INN подробно рассматривается в главе 23.
Мы упомянули две команды NNTP, которые являются ключевыми при передаче статей между серверами. Теперь мы рассмотрим их в контексте фактического NNTP-сеанса, чтобы показать Вам насколько прост этот протокол. Используем простой клиент telnet, чтобы соединиться с INN-сервером новостей Virtual Brewery с именем news.vbrew.com. Чтобы сделать примеры короткими, сервер запущен в минимальной конфигурации. Мы рассмотрим как завершить конфигурацию этого сервера в главе 23. В нашем тестировании мы будем очень осторожны: все статьи будут генерироваться только в группе новостей junk, чтобы никому не мешать.
Для связи с сервером нужно просто открыть TCP-соединение с портом для NNTP. После этого будет показано приветственное приглашение сервера. Одна из первых команд, которые Вы могли бы попробовать: help. Ответ, который Вы получите, зависит от того, чем считает Вас сервер: удаленным NNTP-сервером или программой чтения новостей (newsreader), так как имеются различные наборы команд. Вы можете изменять режим доступа, используя команду mode:
$ telnet news.vbrew.com nntp Trying 172.16.1.1... Connected to localhost. Escape character is '^]'. 200 news.vbrew.com InterNetNews server INN 1.7.2 08-Dec-1997 ready help 100 Legal commands authinfo help ihave check takethis list mode xmode quit head stat xbatch xpath xreplic For more information, contact "usenet" at this machine. . |
Ответы NNTP всегда клнчаются точкой (.) в начале строки. Числа в выводе задают коды ответа (response codes) и означают результат запроса (норма или произошла какая-то ошибка). Они описаны в RFC-977; мы будем говорить о наиболее важных.
Я упомянул команду IHAVE когда говорил о выталкивании статей на сервер новостей. Давайте посмотрим, как она работает:
ihave <[email protected]> 335 From: [email protected] Subject: test message sent with ihave Newsgroups: junk Distribution: world Path: gw.vk2ktj.ampr.org Date: 26 April 1999 Message-ID: <[email protected]> Body: This is a test message sent using the NNTP IHAVE command. . 235 |
Все команды NNTP нечувствительны к регистру, так что Вы можете вводить их в любом. Команда IHAVE берет один обязательный параметр, это Message ID статьи, которая помещается на сервер. Каждая статья имеет уникальный message ID. Команда IHAVE будет выдана для каждой статьи, которую сервер желает передать. Если код ответа команды находится в диапазоне "3xx", NNTP-сервер передаст полную статью с заголовком и точкой в отдельной строке в качестве маркера конца статьи. Если код ответа был в диапазоне "4xx", принимающий сервер данную статью принять не может из-за ее наличия или какой-то технической проблемы.
Когда статья передана, принимающий сервер генерирует код сообщающий, успешно ли он принял статью.
Программы работы с новостями (Newsreaders) используют собственный набор команд при работе с сервером новостей. Чтобы активизировать эти команды, сервер должен перейти в режим читателя (reader). Большинство серверов так и делают, если IP-адрес соединяющейся машины не перечислен в списке серверов новостей (news-forwarding). В любом случае NNTP обеспечивает команду для явного переключения в режим reader:
mode reader 200 news.vbrew.com InterNetNews NNRP server INN 1.7.2 08-Dec-1997 ready/ (posting ok). help 100 Legal commands authinfo user Name|pass Password|generic <prog> <args> article [MessageID|Number] body [MessageID|Number] date group newsgroup head [MessageID|Number] help ihave last list [active|active.times|newsgroups|distributions|distrib.pats|/ overview.fmt|subscriptions] listgroup newsgroup mode reader newgroups yymmdd hhmmss ["GMT"] [<distributions>] newnews newsgroups yymmddhhmmss ["GMT"] [<distributions>] next post slave stat [MessageID|Number] xgtitle [group_pattern] xhdr header [range|MessageID] xover [range] xpat header range|MessageID pat [morepat...] xpath MessageID Report problems to <[email protected]> . |
Режим NNTP reader имеет много команд. Многие из их разработаны, чтобы облегчить работу с новостями. Я упомянул ранее, что там есть команды, которые предписывают серверу высылать заголовок и тело статьи по отдельности. Имеются также команды, которые вносят в список доступные группы и статьи, и другие, которые позволяют регистрировать альтернативные средства посылки новостей.
Команда list выводит список групп с их краткими описаниями:
list newsgroups 215 Descriptions in form "group description". control News server internal group junk News server internal group local.general General local stuff local.test Local test group . |
Команда list active показывает каждую группу и данные о ней. Два числа в каждой строке вывода задают старший и младший номера статей в каждой группе. Программы работы с новостями на основании этих чисел узнают, сколько статей сейчас в группе. Последнее поле в выводе отображает флажки контроля: разрешено ли посылать статьи в груупу, является ли она модерируемой, и хранятся ли статьи на сервере на самом деле, или только данные о них. Подробно эти флажки описаны в главе 23. Рассмотрим пример:
list active 215 Newsgroups in form "group high low flags". control 0000000000 0000000001 y junk 0000000003 0000000001 y alt.test 0000000000 0000000001 y . |
Раньше уже упоминалось различие между передачей статьи и ее посылкой. Когда Вы передаете статью, имеется неявное предположение, что статья уже существует, что она имеет идентификатор сообщения, который уникален и назначен сервером, первоначально обработавшем статью. Такая статья имеет полный заголовок. При регистрации (посылке) статья имеет лишь заголовок из заданных Вами полей (тема, группа, в которую направлена и т.п.). Сервер новостей добавит все остальные поля заголовка и создаст message ID для передачи статьи дальше.
Все это означает, что посылка статьи проще, чем передача:
post 340 Ok From: [email protected] Subject: test message number 1 Newsgroups: junk Body: This is a test message, please feel free to ignore it. . 240 Article posted |
Сгенерируйте еще парочку сообщений самостоятельно, они нам понадобятся.
После установления связи с сервером программа чтения новостей обычно запрашивает перечень новых статей, которые поступили после последнего соединения с этим сервером. Это делается командой newnews. Три обязательных параметра должны быть заданы: имя группы или групп, чтобы сделать запрос, дата и время, относительно которых вносить в список. Дата и время определены как числа с шестью цифрами в формате; yymmdd и hhmmss:
newnews junk 990101 000000 230 New news follows <[email protected]> <[email protected]> <[email protected]> . |
Когда пользователь выбирает группу для просмотра, newsreader может сообщить серверу, что некая группа была выбрана. Это упрощает взаимодействие между ними: исчезает потребность постоянно в каждой команде указывать имя группы новостей. Команда group просто берет имя выбранной группы как параметр. Многие команды используют группу, выбранную по умолчанию сервером:
group junk 211 3 1 3 junk |
Команда group возвращает сообщение с числом активных сообщений, старшим и младшим номерами и именем группы. Обратите внимание, что хотя в нашем примере число активных сообщений и старший номер статьи совпадают, такое бывает нечасто: некоторые статьи, возможно, устарели и были удалены, понижая число активных сообщений, но оставляя старший номер прежним! Здесь надо проявлять внимание.
Чтобы адресовать статьи newsreader должен знать, какие числа представляют активные статьи. Команда listgroup предлагает список активных чисел статей в текущей или явно заданной группе, если имя группы указано дополнительным параметром:
listgroup junk 211 Article list follows 1 2 3 . |
Пользователь должен иметь некоторую информацию относительно статьи прежде, чем он сможет решить желает ли он читать ее. Я упомянул ранее, что некоторые команды позволяют передавать заголовок и тело статьи отдельно. Команда head используется, чтобы запросить этот режим. Сервер передает только заголовок определенной статьи. Если пользователь не хочет читать эту статью, он не потратит впустую время и трафик.
Статьи могут быть определены, используя любой их номер (из вывода команды listgroup) или их message id:
head 2 221 2 <[email protected]> head Path: news.vbrew.com!not-for-mail From: [email protected] Newsgroups: junk Subject: test message number 2 Date: 27 Apr 1999 21:51:50 GMT Organization: The Virtual brewery Lines: 2 Message-ID: <[email protected]> NNTP-Posting-Host: localhost X-Server-Date: 27 Apr 1999 21:51:50 GMT Body: Xref: news.vbrew.com junk:2 . |
Если, с другой стороны, пользователь решает, что он хочет читать статью, newsreader нуждается в способе попросить выслать ему тело статьи. Команда body используется для этой цели. Это работает аналогично команде head, за исключением того, что будет возвращено только тело статьи:
body 2 222 2 <[email protected]> body This is another test message, please feel free to ignore it too. . |
Иногда требуется передавать статьи целиком (заголовок и тело). Часто этим пользуются разные программы кэширования NNTP, например, leafnode.
Естественно, NNTP обеспечивает средства для выполнения этого, которые работают почти аналогично команде head. Команда article принимает номер статьи или message ID как параметр, но возвращает статью целиком с заголовком:
article 1 220 1 <[email protected]> article Path: news.vbrew.com!not-for-mail From: [email protected] Newsgroups: junk Subject: test message number 1 Date: 26 Apr 1999 22:08:59 GMT Organization: The Virtual brewery Lines: 2 Message-ID: <[email protected]> NNTP-Posting-Host: localhost X-Server-Date: 26 Apr 1999 22:08:59 GMT Body: Xref: news.vbrew.com junk:1 This is a test message, please feel free to ignore it. . |
Если Вы пытаетесь получить неизвестную статью, сервер вернет сообщение об ошибке с соответствующим кодом ответа, а иногда и текстовым комментарием:
article 4 423 Bad article number |
Здесь я рассмотрел, как используются наиболее важные команды NNTP. Если Вы заинтересовались разработкой программного обеспечения, которое осуществляет работу по протоколу NNTP, обратитесь к соответствующим документам RFC: они предоставят много технических подробностей
Назад | Глобальное оглавление | Вперед |
Средства и задачи администрирования | Установка сервера NNTP |