网络新闻传输协议 (NNTP) 提供了一种与 C News 和其他没有原生 NNTP 支持的新闻服务器截然不同的新闻交换方法。它不依赖于像 UUCP 这样的批处理技术来在机器之间传输新闻文章,而是允许通过交互式网络连接交换文章。NNTP 不是特定的软件包,而是在 RFC-977 中描述的互联网标准。它基于面向流的连接,通常通过 TCP,在网络中任何位置的客户端和主机上维护 Netnews 磁盘存储的服务器之间建立连接。流连接允许客户端和服务器交互式地协商文章传输,几乎没有周转延迟,从而保持较低的重复文章数量。加上互联网的高传输速率,这使得新闻传输远远超过了最初的 UUCP 网络。虽然几年前,一篇文章可能需要两周或更长时间才能到达 Usenet 的最后一个角落;但现在通常不到两天。在互联网本身上,甚至在几分钟之内。
各种命令允许客户端检索、发送和发布文章。发送和发布之间的区别在于,后者可能涉及标头信息不完整的文章;它通常意味着用户刚刚撰写了文章。[1] 文章检索可以被新闻传输客户端以及新闻阅读器使用。这使得 NNTP 成为在本地网络上为许多客户端提供新闻访问的绝佳工具,而无需经历使用 NFS 时必要的复杂操作。
NNTP 还提供了主动和被动两种新闻传输方式,俗称为“推送”和“拉取”。推送基本上与 C News 使用的 ihave/sendme 协议相同(在第 21 章中描述)。客户端通过 IHAVE msgid 命令向服务器提供文章,服务器返回一个响应代码,指示它是否已经拥有该文章或是否需要它。如果服务器需要该文章,客户端将发送该文章,并以单独一行上的单个点号结束。
推送新闻的唯一缺点是它给服务器系统带来了沉重的负载,因为系统必须为每篇文章搜索其历史数据库。
相反的技术是拉取新闻,其中客户端从组中请求在指定日期之后到达的所有(可用)文章的列表。此查询由 NEWNEWS 命令执行。从返回的消息 ID 列表中,客户端选择它尚未拥有的文章,然后依次对每个文章使用 ARTICLE 命令。
拉取新闻需要服务器对允许客户端请求的组和分发进行严格控制。例如,它必须确保不会将来自站点本地新闻组的机密材料发送给未经授权的客户端。
还有许多方便新闻阅读器的命令,允许他们分别检索文章标头和正文,甚至从一系列文章中检索单个标头行。这使您可以将所有新闻保存在中央主机上,所有(可能是本地)网络上的用户都使用基于 NNTP 的客户端程序进行阅读和发布。这是通过 NFS 导出新闻目录的替代方案,如第 21 章中所述。
NNTP 的一个总体问题是,它允许知识渊博的人将带有虚假发送者规范的文章插入到新闻流中。这被称为新闻伪造或欺骗。[2] NNTP 的扩展允许您要求某些命令进行用户身份验证,从而为防止人们以这种方式滥用您的新闻服务器提供一定的保护措施。
有许多 NNTP 软件包。其中一个更广为人知的是 NNTP 守护进程,也称为参考实现。最初,它是由 Stan Barber 和 Phil Lapsley 编写的,旨在说明 RFC-977 的详细信息。与当今许多优秀的软件一样,您可能会发现它已预先打包在您的 Linux 发行版中,或者您可以获取源代码并自行编译。如果您选择自行编译,您需要非常熟悉您的发行版,以确保您正确配置所有文件路径。
nntpd 软件包包含一个服务器、两个用于拉取和推送新闻的客户端以及一个 inews 替代品。它们生活在 B News 环境中,但稍作调整,它们也很乐意与 C News 一起使用。但是,如果您计划将 NNTP 用于除了向新闻阅读器提供新闻服务器访问之外的更多用途,那么参考实现并不是真正的选择。因此,我们将仅讨论 nntpd 软件包中包含的 NNTP 守护进程,而忽略客户端程序。
如果您希望运行大型新闻站点,您应该查看由 Rich Salz 编写的 InterNet News 软件包,或 INN。它同时提供基于 NNTP 和 UUCP 的新闻传输。InterNet News 的新闻传输绝对比 nntpd 更好。我们在第 23 章中详细讨论 INN。
[1] | 通过 NNTP 发布文章时,服务器始终至少添加一个标头字段,NNTP-Posting-Host。该字段包含客户端的主机名。 |
[2] | 简单邮件传输协议 (SMTP) 也存在同样的问题,尽管大多数邮件传输代理现在都提供了防止欺骗的机制。 |