第十六章 网络新闻(Netnews)
16.1 Usenet的历史
网络新闻(network news)的观念产生于1979年,当时有两位研究生Tom Truscott和Jim El
lis考虑在UN*X用户之间使用UUCP来连接各台机器以进行信息的交换。他们在北卡罗莱纳州用
三台机器组成了一个小网。
最初,信息传输是通过很多shell脚本来处理的(后来用C语言改写),但是这些脚本从未向
外界公布过。它们很快就被“A”news替换掉了,这是第一个向外界发布的news软件版本。
“A”news只设计成处理每天每个组很少的文章。当新闻组的容量继续在增大时,该软件由M
ark Horton和Matt Glickman进行了重写,他两人称其为“B”发行版(又名Bnews)。Bnews
第一个公开发行版是1982年的2.1版。它被不断地扩充,增加了几个新特性。目前它的版本是
Bnews 2.11。现在它已慢慢地被舍弃,最后一个正式维护者也转向了INN。
另一次重写是由Geoff Collyer和Henry Spencer在1987年完成并发行的;这是版本“C”,或
称C News。在接下来的一段时间内出了许多针对C News的补丁程序,最为显著的是C News P
erformance版本。在有着大量新闻组的站点上,由于频繁地调用relaynews(该程序负责将入
站文章分发到其它站点去)而造成的系统开销是很大的。Performance版本给relaynews加了
一个选项,该选项允许它以后台模式(daemon mode)来运行,将自己置入后台。
Performance版本是目前包括在大多数Linux版中的C News版本。
一直到“C”的所有news发行版基本上都是用于UUCP网络的。尽管它们也能用于其它的环境。
在象TCP/IP、DECNet或其它相应的网络上进行有效的新闻传输要求一个新的方案。这就是为
什么在1986年引进“网络新闻传输协议”(“Network News Transfer Protocol”),NNTP
的原因了。它是基于网络连接的,并且指定了许多进行交互传送和收取文章的命令。
网上有许多基于NNTP的应用程序。其中之一就是Brian Barber和Phil Lapsley的nntpd软件包
,你可以使用这个软件以及其它软件在一个局域网内为许多主机提供新闻阅读服务。nntpd是
被设计成补足象Bnews或C News这样的news软件包的,为它们提供NNTP的特性。
另一个不同的NNTP软件包是INN,即Internet News。它不仅仅是一个前端程序,它自己就是
一个news系统。它是一个能够有效地同时维护几个并行NNTP链接的复杂的news中继后台程序
,因而许多Internet站点选择它作为news服务器。
16.2 总之,什么是Usenet?
有关Usenet最显著的事实之一是它不属于任何组织,也没有任何集中的网络管理特权。实际
上,这是Usenet学问的一部分,除了技术说明以外,你定义不了它到底是什么,你只能指出
它不是什么。如果你手头有本Brendan Kehoe的出色的“禅和Internet艺术”(网上和Prent
ice-Hall有售,见[Kehoe92]),你会找到一张有趣的有关不属于Usenet的列表。
冒着让人听上去感觉很蠢的风险,人们可以把Usenet定义为交换Usenet News的独立站点的集
合。要成为一个Usenet站点,你全部所需做的是找到另一个Usenet站点,并与它的拥有者和
维护者达成和你交换news的协议。为另一个站点提供news也称为给它喂信,这起源于另一个
Usenet哲学的公理:“Get a feed and you’re on it.”
Usenet news最基本的单元是文章。这是用户写作并“投递”到网上的。为了让news系统能够
处理,这些文章附带了管理信息,即所谓的文章标题(头)。它与符合Internet邮件标准RF
C 822的邮件的标题格式非常相似,它也是有几行文本组成,每行用一个以冒号结尾的字段名
开始,其后带有字段的值。[1]
文章被提交给一个或更多个新闻组(newsgroups)。人们可以将一个新闻组看作是有关一个
共同主题文章的论坛。所有的新闻组以层次结构组成,每个组名指出了自己在这个层次结构
中的位置。这使得一个组能够很容易地被看出是有关哪方面的。例如,从新闻组的名称上任
何人都可以看出comp.os.linux.announce是用于有关名为Linux的操作系统公告的。
然后这些文章在所有乐意从这个组中传递news的Usenet站点之间进行交换。当两个站点同意
互相交换news时,他们可以自由地交换所喜欢的任何新闻组,甚至可以加上他们自己本地ne
ws层次结构。例如,groucho.edu可能与branyard.edu(这是一个主要的news喂信机)有一个
news链接,还与几个它要喂信的小站点有链接。现在,Barnyard大学可能接收了所有的Usen
et组,而GMU却只想传送几个象sci、comp、rec等的主要的层次结构。某些下游的站点,比如
说一个称为brewhq的UUCP站点,甚至想传送更少的组,因为它们没有这种网络或硬件资源。
另一方面,brewhq可能想要从fj层次结构中接收新闻组,而这个层次结构GMU没有传送。因此
,它就与gargleblaster.com维持另一个链接,这个站点却传送了所有fj组,并将这些组喂给
brewhq。这些news的流动见图16.1中所示。
图16.1 Usenet news在Groucho Marx大学中的流动
尽管很清楚,从brewhq发出的箭头上的标签可能还是需要作些解释。默认地,它会要所有本
地产生的news被送到groucho.edu。然而,由于groucho.edu没有传送fj组,所以从这些组给
它发送任何消息中没有箭头指向。因此,从brewhq给GMU的喂信操作被标上了all,!fj,表示
除了fj下的所有组都发送给它。
16.3 Usenet是如何处理News的?
如今,Usenet已经增长到占有巨大的比例。传送整个网络新闻的站点通常每天传输六十兆字
节已不足为奇。[2] 当然这比任意摆布文件需要更多的处理。所以让我们看看大多数UN*X系
统处理Usenet news的方法。
News是通过各种传输渠道经由网络来发布的。传统的传输媒介曾经是UUCP,但是如今主要的
数据流量是由Internet站点来传送的。所用的路由选择的算法称为扩散法(flooding):每
个站点都维护着许多到其它站点的链接(news feeds)。任何由本地news系统产生的或接收
到的文章都被转发给它们,除非文章已在那个站点上,在这种情况下文章将被丢弃。通过观
察Path:标题字段,一个站点可以发现文章已经穿过的所有其它站点。这个标题含有文章已
经被其转发过的以bang path标记的所有系统的一张列表。
为了区别各篇文章和识别重复文章,Usenet文章必须要携带一个消息id(在Message-Id:标
题字段中指明),它将投递站点的名字和一个序列号组合在一起形成“”。对于所处理的每
篇文章,news系统将这个id记录进history日志文件中,据此,检查所有新到的文章。
任何两个站点之间的文章信息流动可以通过两个准则来加以限制:其一,文章被指派一个发
布信息(在Distribution:标题字段),该信息可用于将该文章归入站点内适当的组中。另
一方面,被交换的新闻组可以通过发送或接收系统两者来加以限制。允许往一个站点传送的
新闻组和分类的集合通常保存在sys文件中。
纯粹的文章数量通常要求对上述方案进行改进。在UUCP网络上,平常要做的是每隔一段时间
收集一次文章,并将收集来的文章组合成一单个文件,进行压缩并发送到远程站点去。这称
为批量处理(batching)。[3]
另外一种技术是ihave/sendme协议,这个协议在文章最初的地方就避免重复发送文章,这样
就节约了网络带宽。不是把所有的文章放入一个批处理文件中并将它们一起发送出去,而是
只将文章的消息id组合成一个巨大的“ihave”消息并发送到远程站点。远程站点读取这个消
息,与它自己的history文件比较,然后返回在“sendme”消息中想要的文章的列表。此后,
只有这些文章将被发送。
当然,ihave/sendme只有在涉及两个大站点时才显得有意义,这两个大站点各自从几个独立
的喂信者那里接收news,并且经常相互选取对方作为有效的news流动目的地。
在Internet上的站点通常依赖于基于TCP/IP,使用网络新闻传输协议NNTP的软件[4]。它在喂
信者之间传送news并且为远程主机上的单独用户提供Usenet访问。
NNTP可以用三种方法来传递news。一种是ihave/sendme的实时版,也被称为推信(pushing
news)操作。第二种技术称为拉信(pulling news)操作,在这种方法中,客户就向服务器
索取指定新闻组或层次结构中文章的列表清单,并选择那些在它的history文件中没有的文章
,这些文章是在指定日期以后到达服务器站点的。第三种方式是用于交互式新闻阅读的,允
许你或你的新闻阅读者从指定的新闻组中抽取文章,以及投递标题信息不完全的文章。
在每个站点上,news被放置在/var/spool/news下的目录结构中,每篇文章为一个文件,而每
个新闻组在一个单独的目录中。目录名由新闻组名构成,新闻组名中的每个部分构成路径部
分。因此,comp.os.linux.misc上的文章是放在/var/spool/news/comp/os/linux/misc中的
。一个新闻组中的文章被按到达的次序分配了一个号,这个号就作为文件名。当前在线文章
号的范围放置在一个称为active的文件中,这个文件同时用作你的站点所已知的新闻组的清
单。
由于磁盘空间是有限的资源,[5] 在一段时间以后,你就需要开始丢弃一些文章了。这叫做
过期操作(expiring)。通常,从一定的组和结构中来的文章在到达站点经过一固定天数以
后就过期了。投递者若在文章标题字段Expires:中指定一过期的日期,就可以覆盖固定天数
了。