NNTP (Network News Transfer Protocol)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 15:31, 18 июля 2016.
NNTP
Уровень (по модели OSI): Прикладной
Семейство: TCP/IP, Usenet
Порт/ID: 119/TCP
Назначение протокола: Доступ к группам новостей
Спецификация: RFC 3977
Основные реализации (клиенты): Outlook Express, Mozilla Thunderbird
Основные реализации (серверы): InterNetNews (INN)
Вступил в силу с: 1985

NNTP (англ. Network News Transfer Protocol) — это сетевой протокол, который позволяет публиковать новостные статьи на новостном сервере, распространять эти статьи на другие новостные сервера, предоставляя их для обсуждения группам одноранговых узлов по всему миру. NNTP был создан в 1985, принадлежит к семейству TCP/IP, порт 119/TCP, используется в таких решениях, как Outlook Express и Mozilla Thunderbird. Спецификация: RFC 3977. Основные расширения: RFC 2980. Принадлежит к группе протоколов прикладного уровня.

Введение

NNTP — протокол, разработанный для обмена сообщениями в телеконференциях. По строению этот протокол во многом схож с протоколом приема и передачи электронной почты SMTP.

Существует вариация протокола NNTP, называемая NNRP (Network News Readers Protocol). Она отличается только набором поддерживаемых команд, и предназначена для чтения конференций с сервера новостей клиентским ПО в режиме онлайн. Функционально NNTP ориентирован на то, что статьи отправляются подписчикам при их появлении на сервере, а NNRP — по запросу клиента. Соответственно, NNTP используется для обмена сообщениями между серверами новостей, а NNRP — для чтения сообщений с ньюссервера и создания новых сообщений.

За NNTP закреплён TCP-порт 119. При подключении к NNTP-серверу по SSL (т. н. NNTPS) используется порт 563.

NNTP предполагает, что серверы новостей имеют постоянное IP-подключение. Когда онлайн-технологии были менее распространены, серверы новостей обменивались новостями посредством uucp (Unix-to-Unix CoPy).

Протокол NNTP, как и SMTP, является текстовым, то есть все команды и ответы на них являются обычными текстовыми строками. Важной особенностью протокола NNTP является его эффективность в случае сложных графов связей между серверами новостей. Чтобы одно и то же сообщение не передавалось многократно, обычно отправляющий сервер сначала сообщает идентификатор нового сообщения, а само сообщение отправляет только после подтверждения принимающей стороны о том, что этого сообщения там ещё нет. В случае расширения stream NNTP эта концепция развивается ещё дальше: отправляющая сторона шлёт список идентификаторов новых статей, не дожидаясь ответа на каждый из них, и сами статьи, если принимающая запросила их по идентификаторам.

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

Одинаковый по своему назначению с другими протоколами прикладного уровня, NNTP также имеет последовательность кодов состояния, большинство из которых идентичны Протоколу передачи гипертекстовых файлов HTTP. Коды состояния используются для передачи данных в различных режимах обратно пользователю NNTP. Различные коды состояния сгруппированы следующим образом:

1xx – Информационное сообщение
2xx – Команда верна
3xx – Команда верна, продолжить
4xx – Команда верна, но не может быть исполнена
5xx – Команда не исполнена (обычно из-за ошибки сервера) 

Следующая цифра кода характеризует категорию отклика:

x0x Соединение, установка режима, прочие сообщения 
x1x Выбор группы новостей 
x2x Выбор статьи 
x3x Функции распределения 
x4x Отправка адресату 
x8x Нестандартное (частное применение) расширение 
x9x Отладочный вывод

Вместо того, чтобы полагаться на пакетные технологии, такие как UUCP для передачи новостных статей между машинами, NNTP позволяет обмениваться статьями через интерактивную сеть связи. NNTP это не конкретный программный пакет, а Интернет-стандарт, описанный в RFC-977. Он основа на поток-ориентированном соединении, как правило через TCP, между клиентов где-либо в сети и сервером на хосте, который содержит новости на диске хранения. Потоковое соединение позволяет клиенту и серверу в интерактивном режиме обсудить передачу статьи практически без задержек, таким образом, сводя количество повторяющихся статей к минимуму. Вместе с высокими скоростями передачи через Интернет, это позволяет превосходить первоначальные UUCP сети. Несколько лет назад, было редкостью, когда новость обходила всю сеть за 2 недели, сейчас же на это требуется менее чем 2 дня. В самом Интернете этот предел снижается до нескольких минут.

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

NNTP также обеспечивает активный и пассивный способы передачи новостей, называемые ‘pushing’ и ‘pulling’. ‘Pushing’ это такой же протокол как и ihave/sendme, используемый C-News. Клиент предлагает статью на сервер с помощью команды, а сервер возвращает код ответа, который указывает, имеет ли он статью или она ему нужна. Если сервер хочет статью, клиент отсылает статью, оканчивающуюся одной точкой на отдельной строке. Такой способ имеет единственный недостаток: он создаёт большую нагрузку на серверную систему, так как система должна выполнять поиск в своей базе данных для каждой отдельной статьи.

Противоположная техника (‘pulling’) вытягивает новости, в которых клиент запрашивает список всех (доступных) статей из группы, поступивших после указанной даты. Из возвращаемого списка ID сообщений, клиент выбирает статьи, которых у него нет. Такой способ нуждается в жёстком контроле над сервером.

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

Протокол NNTP

Рассмотрим реальные сессии NNTP, чтобы показать работу протокола. Мы будем использовать простой клиент telnet для подключения северу новостей в Virtual Brewery под названием news.vbrew.com Сервер работает под управлением минимальной конфигурации.

Подсоединение к Серверу Новостей

Подключение к серверу новостей является таким же простым, как открытие TCP соединения к NNTP порту. При подключении, вас встретят приветственным баннером. Первая из команд, которую можно попробовать это help. Ответ, который вы получите, зависит как правило от того, верит ли сервер в то, что мы удаленный NNTP сервер или читатель, так как существуют различные наборы команд, отсылающих запросы. Вы можете изменить свой режим работы с помощью команды режима:

 $ 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 команды всегда заканчивается точкой на отдельной строке. Цифры, которые вы видите в выходном листинге являются кодами ответом и используются сервером, чтобы указать на успех или неудачу выполнения команды.

Pushing Новостных Статей на Сервер

Команда IHAVE используется для отправки списка статей, которые уже имеет клиент. Рассмотрим, как работает данная команда:

 ihave <123456@gw.vk2ktj.ampr.org>
 335
 From: terry@gw.vk2ktj.ampr.org
 Subject: test message sent with ihave
 Newsgroups: junk
 Distribution: world
 Path: gw.vk2ktj.ampr.org
 Date: 26 April 1999'''
 Message-ID: <123456@gw.vk2ktj.ampr.org>
 Body: 
 
 This is a test message sent using the NNTP IHAVE command.
 
 .
 235

Все команды нечувствительны к регистру, поэтому вы можете ввести их любой регистре. Команда IHAVE принимает один обязательный аргумент, ID сообщения статьи. Каждой новостной статье присваивается уникальный идентификатор сообщения при его создании. Команда IHAVE обеспечивает способ сервера NNTP сказать, какие статьи у него есть, чтобы отправить из на другой сервер. Отправляющий сервер будет выдавать команду для каждой статьи. Если код команды ответа, генерирующийся принимающим NNTP сервером, находится в диапазоне “3xx”, отправляющий сервер NNTP будет передавать полную статью, включая его полный заголовок. Если код ответа был в диапазоне “4xx”, принимающий сервер решил не принимать эту статью, либо потому что она уже у него есть, либо из-за каких-либо проблем.

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

Переход в режим чтения NNRP

Читатели новостей используют свой собственный набор команд при разговоре с сервером новостей. Чтобы активировать эти команды, сервер новостей должен работать в режиме чтения. Большинство серверов новостей по умолчанию находятся в режиме чтения. NNTP обеспечивает команду для явного переключения в режим чтения:

 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|/
      loverview.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 <usenet@vlager.vbrew.com>
 .

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

Листинг доступных групп

Команда листинга перечисляет множество различных типов информации; в частности, группы поддерживаемых серверов:

 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
 215 Newsgroups in form "group high low flags".
 control 0000000000 0000000001 y
 junk 0000000003 0000000001 y
 alt.test 0000000000 0000000001 y
 .

Размещение статьи

Когда вы используете ‘pushing’ для размещения статьи, есть неявное предположение о том, что статья уже существует, что она имеет идентификатор сообщения, который уже был присвоен ей сервером, в котором он был первоначально размещён, и что она имеет полным набор заголовков. При публикации статьи, вы создаёте статьи в первый раз и поставляете те заголовки, которые являются значимыми только для вас, такие как Subject и Группа новостей. Сервер новостей добавляет остальные заголовки и создаёт идентификатор.

Это означает, что размещение статьи даже проще, чем ‘pushing’.

 post
 340 Ok
 From: terry@richard.geek.org.au
 Subject: test message number 1
 Newsgroups: junk
 Body: 
 
 This is a test message, please feel free to ignore it.
 
 .
 240 Article posted

Листинг новых статей

Когда читатель подключается к новому серверу и пользователь выбирает новостную группу, читатель получает список новых статей, которые были размещены и пересланы с момента последнего входа в систему. С этой целью используется команда newnews. С ней передаются 3 обязательных аргумента: название группы или групп запроса, дата начала и время начала списка. Дата и время каждый раз задаются шестизначным числом: YYMMDD и HHMMSS:

 newnews junk 990101 000000
 230 New news follows
 <7g2o5r$aa$6@news.vbrew.com>
 <7g5bhm$8f$2@news.vbrew.com>
 <7g5bk5$8f$3@news.vbrew.com>
 .

Выбор группы для выполнения операции

Когда пользователь выбирает новостную группу для просмотра, читатель может указать, какой сервер был выбран группой. Это упрощает взаимодействие между сервером и читателем; он устраняет необходимость постоянно посылать имя группы новостей с каждой командой. Команда просто берёт имя выбранной группы в качестве аргумента. Многие следующие команды используют группу, выбранную по умолчанию, если другая группа новостей явно не указана:

 group junk
 211 3 1 3 junk

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

Листинг статей в группе

Для решения новостных групп статей, читатель должен знать, какие номера статей представляют активные статьи. Команда предлагает список активных номеров статей в текущей группе или в явно указанной группе:

 listgroup junk
 211 Article list follows
 1
 2
 3
 .

Получение только заголовка статьи

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

Статьи можно получать, используя их номер или идентификатор сообщения:

 head 2
 221 2 <7g5bhm$8f$2@news.vbrew.com> head
 Path: news.vbrew.com!not-for-mail
 From: terry@richard.geek.org.au
 Newsgroups: junk
 Subject: test message number 2
 Date: 27 Apr 1999 21:51:50 GMT
 Organization: The Virtual brewery
 Lines: 2
 Message-ID: <7g5bhm$8f$2@news.vbrew.com>
 NNTP-Posting-Host: localhost
 X-Server-Date: 27 Apr 1999 21:51:50 GMT
 Body: 
 Xref: news.vbrew.com junk:2
 .

Получение только тела статьи

Если же, с другой стороны, пользователь решает, что он хочет прочитать статью, читатель должен иметь возможность запросить тело сообщения. Команда body используется с этой целью.

 body 2
 222 2 <7g5bhm$8f$2@news.vbrew.com> body
 This is another test message, please feel free to ignore it too.
 
 .

Чтение статей из группы

Хотя, как правило, наиболее эффективно передавать отдельно заголовки и тела выбранных статей, случается, что нам лучше передать полную статью.

Естественно, NNTP обеспечивает возможность сделать это. Команда принимает номер статьи или идентификатор сообщения в качестве аргумента, возвращая статью:

 article 1
 220 1 <7g2o5r$aa$6@news.vbrew.com> article
 Path: news.vbrew.com!not-for-mail
 From: terry@richard.geek.org.au
 Newsgroups: junk
 Subject: test message number 1
 Date: 26 Apr 1999 22:08:59 GMT
 Organization: The Virtual brewery
 Lines: 2
 Message-ID: <7g2o5r$aa$6@news.vbrew.com>
 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-сессии

Букве C: соответствует клиент, а букве S: - сервер. Пример - рассылка новых статей:

S: прослушивает порт 119 TCP 
C: запрашивает соединения к порту 119 TCP 
S: 200 BANZAIVAX news server ready, рассылка разрешена. 
C: POST 
S: 340 Continue posting; Period on a line by itself to end 
C: Передает статью в формате RFC850 
C: . 
S: 240 Article posted successfully. 
C: QUIT 
S: 205 BANZAIVAX closing connection. Goodbye.

Пример - относительный доступ с помощью команды NEXT:

S: прослушивает порт 119 TCP 
C: запрашивает соединения к порту 119 TCP 
S: 200 wombatvax news server ready - posting ok 
(Клиент запрашивает список текущих новостей) 
C: LIST 
S: 215 далее следует список групп новостей 
S: net.wombats 00543 00501 y 
S: net.unix-wizards 10125 10011 y 
(какая-то еще информация) 
S: net.idiots 00100 00001 n 
S: . 
(Клиент выбирает группу новостей) 
C: GROUP net.unix-wizards 
S: 211 104 10011 10125 net.unix-wizards group selected 
(В файле 104 статьи с 10011 по 10125) 
(Клиент выбирает статью для чтения) 
C: STAT 10110 
S: 223 10110 <23445@sdcsvax.ARPA> article retrieved - statistics 
only (article 10110 selected, its message-id is <23445@sdcsvax.ARPA>) 
(Клиент просматривает заголовок) 
C: HEAD 
S: 221 10110 <23445@sdcsvax.ARPA> article retrieved - далее следует заголовок 
S: . 
(Клиент хочет просмотреть текст статьи) 
C: BODY 
S: 222 10110 <23445@sdcsvax.ARPA> article retrieved - далее следует текст статьи 
S: . 
(Клиент хочет просмотреть следующую статью данной группы) 
C: NEXT 
S: 223 10113 <21495@nudebch.uucp> article retrieved - statistics only (статья 10113 является следующей в группе) 
(Клиент завершает сессию) 
C: QUIT 
S: 205 goodbye.

Большой список примеров по ссылке.

Установка сервера NNTP

Сервер NNTP (nntpd) может быть скомпилирован двумя способами, в зависимости от ожидаемой нагрузки на систему. Не существует никаких скомпилированных версий из-за некоторых специфических значений по умолчанию, которые зашиты в исполняемый файл. Вся настройка осуществляется с помощью макросов, определённых в common/conf.h

Nntpd может быть сконфигурирован как автономный сервер, который запускается во время загрузки системы из файла rc или демона, управляемого inetd. В последнем случае, вы должны иметь следующую запись в /etc/inted.conf:

 nntp    stream  tcp nowait      news    /usr/etc/in.nntpd    nntpd

Если настраивать nntpd как автономный сервер, необходимо убедиться, что любая строка в вышеуказанном файле закомментирована. В любо случае, вы должны убедиться, что следующая строка имеется в /etc/services:

 nntp    119/tcp   readnews untp    # Network News Transfer Protocol

Для того, чтобы временно хранить любые входящие статьи, nntpd нуждается в .tmp каталоге. Вы должны создать его с помощью следующих команд:

 # mkdir /var/spool/news/.tmp
 # chown news.news /var/spool/news/.tmp

Ограничение доступа NNTP

Доступ к NNTP ресурсам регулируется файлом nntp_access в /etc/news. Строки в этом файле описывает права доступа, предоставленные сторонним хостам. Каждая строка имеет формат:

 site   read|xfer|both|no    post|no      [!exceptgroups]

Если клиент подключается к порту NNTP, nntpd пытается получить полное доменное имя хоста по его IP-адресу с помощью обратного поиска. Имя хоста и IP-адрес клиента проверяются сайтом в том порядке, в котором они появляются в файле. Совпадения могут быть частичные или полные. Если запись соответствует точно, она применяется, если совпадение частичное, тона применяется только если нет других совпадения.

Hostname

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

IP address

Если IP-адрес клиента соответствует, запись применяется, все последующие записи игнорируются.

Domain name

Доменное имя, определяется как *.domain. Если имя хоста клиента совпадает с именем домена, запись совпадает.

Network name

Имя сети. Указано в /etc/networks. Если номер сети клиентского IP-адреса совпадает с номером, связанным с именем сети, запись совпадает.

Default

Строка по умолчанию соответствует любому клиенту.

Второе и третье поля описывают права доступа, предоставляемые клиенту. Второе поле детализирует разрешения для получения новостей посредством ‘pulling’ (чтения) и передачи новостей посредством ‘pushing’. Значение обоих позволяет оба; если нет, то отказывает в целом в доступе. Третье поле предоставляет клиенту право размещать статьи, то есть доставлять статьи с неполной информацией заголовков, которая завершается с помощью программного обеспечения новостей. Если второе поле ничего не содержит, третье поле игнорируется.

Четвёртое поле необязательно, содержит разделённые запятыми списки групп, к котором клиенту запрещён доступ. Пример файла nntp_access:

 #
 # by default, anyone may transfer news, but not read or post
 default                 xfer            no
 #
 # public.vbrew.com offers public access via modem. We allow
 # them to read and post to any but the local.* groups
 public.vbrew.com        read            post    !local
 #
 # all other hosts at the brewery may read and post
 *.vbrew.com             read            post

Авторизация NNTP

Демон nntpd обеспечивает простую схему авторизации. Если воспользоваться любым маркером доступа в файле nntp_access, nntpd требует авторизации от клиента для соответствующей операции.

Процедура авторизации осуществляется с помощью команды AUTHINFO. С помощью этой команды, клиент передаёт имя пользователя и пароль к серверу NNTP. Nntpd сверяет их с /etc/passwd базой данных и проверяет, принадлежит ли пользователь группе NNTP.

Текущая реализация NNTP авторизации экспериментальна и не слишком переносима.

Клиенты групп новостей и серверы групп новостей

Иногда говорят «клиент групп новостей» вместо «NNTP-клиент». Следует понимать, что NNTP-клиенты поддерживают протокол NNTP не в полной мере, а лишь его вариацию NNRP. На сегодняшний день доступны следующие клиентские программы:

Название Операционные системы Интерфейс Примечание
Microsoft Windows Unix-подобная ОС Mac OS X ГПИ ТПИ
Claws Mail да да да да нет Форк Sylpheed. Работает также на Maemo.
Forté Agent да нет нет да нет
Gnus да да да да да Расширение для Emacs.
Wanderlust да да да да да Расширение для Emacs.
KNode неизвестно да да да нет Входит в состав KDE.
Mozilla Thunderbird да да да да нет Есть сторонняя сборка под OS/2.
SeaMonkey да да да да нет
MyGate да нет нет да нет Расширение для The Bat!.
Opera Mail да да да да нет Входит в состав Opera.
Outlook Express да нет нет да нет Есть версия под Mac OS 9.
Pan неизвестно да да да нет Входит в состав GNOME.
slrn да да да нет да Работает также на иных платформах (BeOS, OS/2, OpenVMS).
Sylpheed да да да да нет
tin да да да нет да Работает также под OpenVMS.

Из серверного программного обеспечения известно:

Название Операционные системы Примечание
Microsoft Windows Unix-подобная OC Mac OS X
Apache James да да да Написан на Java.
InterNetNews(INN) нет да нет Самый известный сервер, разрабатываемый Internet Systems Consortium (ISC).
Leafnode нет да нет Прокси-сервер.

Другие реализации можно попытаться найти в Open Directory Project (ODP).

Группы новостей

Большинство групп новостей, распространяемых при помощи NNTP, принадлежит сети Usenet. В Интернете существуют однако и другие группы новостей: предоставляемые шлюзами других сетей, частные и т. п.

Ссылки