网络工作组       Brian Kantor (U.C. San Diego)
 Request for Comments: 977  Phil Lapsley (U.C. Berkeley)
                                               1986年2月

                       网络新闻传输协议

                   网络新闻传输的基本标准

备忘录描述
NNTP定义了一个可以在ARPA网络中进行可靠的新闻传输的基本协议,其中包括新闻的分发,查询新闻,获取新闻,发布新闻等。在NNTP中,所有的新闻被存储在一个中央数据库中,并且允许订阅用户仅仅阅读那些他们关心的新闻,此外,该协议还提供新闻的索引,前后文参照,删除过期的文章等功能。这篇备忘录仅仅提供了一个在ARPA网络上传输新闻的协议草案,希望有更多的人能够参与讨论,并且提供更好的建议。本备忘录可以被任意复制和修改。

1.  导言
多年以前,ARPA网络就已经支持公告,资料和数据在数以千计的网络使用者中进行及时的传播,我们称之为“新闻组”,它被用来及时的传播那些共同感兴趣的事物,比如软件的错误,新产品的讨论,尖端技术和关键设计,此外还可以讨论那些专业的计算机工作者所关心的问题。“新闻组”在它的使用者中正越来越流行。

现在有两种实现“新闻组”的技术:网络邮件系统,和USENET新闻组系统。

1.1 网络邮件系统

网络邮件系统中有一个已经订阅了这个新闻组的所有用户的电子邮件地址列表和回复列表。系统会给列表上的每一个邮箱发送一份新闻的拷贝。当列表中有过多的地址时,这种方式是很低效的,因为发送给订阅者邮件会占用大量的带宽,CPU资源和目的主机的磁盘空间,并且系统自身的维护也是一个大问题如:用户从一个主题换到其他的主题;新用户的加入和老用户的离开;服务器服务内容的增加,减少。

1.2 USENET新闻组系统

克服网络邮件系统耗费资源的方法就是将新闻存放在中央数据库而不是订阅者的邮箱里面。USENET系统正是这样做的,它将新闻存放在一个中央存储库中(往往是一些分门别类的目录),提供一个程序允许订阅者仅仅阅读那些他们关心的新闻,此外,还提供新闻的索引,前后文参照,删除过期的文章等功能

1.3 中央存储库

因为有大量的主机同时通过快速局域网(往往是以太网)连接上存储库,所以它被设计成能跟好的把新闻发送到一个或多个主机上面,并且允许进行服务器/客户端模式的连接访问。

1.4 中央新闻服务器

要做到这样高效的实现需要一个中央计算机系统为局域网上的其他系统提供新闻服务。这样的一个系统就是新闻服务器,它所要做的就是进行新闻和新的索引的搜集,使网络上的每个读者都能及时的读到新闻公告。因为存在众多的服务器,这种存储方式是很有效的。同样,这允许工作站用较少的存储空间参与新闻组,不存在由于下载大量的消息而对磁盘空间造成的压力。

我们听到了使用IBIS,分布式或者网络文件系统作为中央服务器的传闻。当分布式的服务器工作在一组运行着相同操作系统的配置差不多的计算机上的时候确实表现良好,但是不同的客户端,特别是不同操作系统上的客户端要求连接时,就不能接受了。现在几乎没有(或许有)分布或者网络文件系统可以提供一般的TCP连接服务,特别是考虑到存在很多不同硬件体系和不同操作系统的情况。

NNTP定义了一个基于可靠连接(使用TCP)的,客户/服务器模式的,可以发送、查询、获取、发布新闻组文章的协议。新闻仅需存放在一个中央数据库中,用户在其他的主机上通过LAN连接到新闻组服务器主机上,就可以读取新闻消息。

NNTP的新闻文章(文本)规范模型在RFC850中定义,那描述了USENET新闻组系统。无论如何,NNTP在组织结构、内容、新闻文章的存储方面处理满足了一些要求。因此我们相信他能够轻易的匹配其他的非USENET新闻组系统。

具有特色的是,NNTP服务器在主机上以后台模式运行,而且可以接受来自LAN上其他主机的连接请求。并能工作在由几个计算机组成的小系统(比如工作站),以及大的中心系统中。

1.5 辅助新闻服务器

在有很多用户和机器的情况下(或许是大学或者大的工业机构),辅助新闻服务器会被使用。这种服务器,或者叫做“奴隶”(译者注:原文如此)服务器工作在各自的计算机系统中,为本地用户提供可靠的新闻组阅读请求的中转和提供最新的新闻组文章缓存。

具有代表性的是,当一个客户端要获得新闻组服务的时候,会首先和当地的新闻组服务端口建立连接,如果连接失败则表示这个服务器有问题。这时,辅助新闻服务器会选择是关闭新闻服务,还是允许局域网上的主机去和主新闻服务器进行连接。

在工作站或者其他小的系统上,直接连接到主服务器也许是正常的操作方式。

这份规范并不适用于辅助新闻服务器,我们仅建议在大型的局域网上合理的增加NNTP服务器作为从属服务器来提高系统运转性能

1.6 新闻组的发送

NNTP使用命令行提供一个在协作的多个主机间交换信息(文章项目)的简单方法。一个想得到新闻组文章的拷贝并且已经与局域网或者其他高速网络建立连接的主机会发现NNTP使用了比传统的传送方法(比如UUCP,译者注:UNIX间的文件拷贝)更高效的新闻发送方法。

在传统的新闻传送方法中,新闻从一个主机发送给所有他知道的主机,这些主机再把文章转发给所有他知道的主机,就像水流一样。显然,这种使已经得到新闻的主机再次接收无用新闻的方法会浪费时间和通信资源,但是因为这种传送机制是基于单向事务而非交互式(比如UNIX世界中的UUCP),文章仅仅是单向的被发送,然后接收主机简单的丢弃掉重复的文章,所以发送时间被减少了。这在通信协议被限制的年代确实是一个正确的选择。

使用NNTP,主机间交换新闻组文章使用一个交互机制以决定文章是否应该传送。当主机希望得到最新的消息,或者要需要发送新消息时,会使用NNTP向周围的一个或多个主机进行联系。第一个动作会询问,在对方主机上是否有新的新闻组(使用NEWGROUPS命令创建),如果有新的新闻组,并且是适当的或需要(随本地站点的规定而定)的群组,那么就建立新的同样的新闻组。

客户端会向服务器询问所有的或者那些它所关注的新闻组是否收到新文章,这使用NEWNEWS命令。它会收到一个从服务器发来的新文章的列表,并且客户端可以请求服务器传送那些客户端选中的并且没有的文章。

最后,客户端告诉服务器那些它最近一次接收到的新文章,服务器会指出哪些文章它已经有拷贝了,哪些文章需要客户端传输给服务器,以增加服务器的收藏。

在这种方式中,只有那些没有得到过副本的和希望请求得到的文章会被发送。

2.  NNTP协议规范

2.1 总论

这个新闻组说明文档定义了使用TCP连接和类似于SMTP的指令和应答的规范。它接受来自主机的连接,并为新闻组数据库提供一个简单的操作界面。

这种服务器只有程序和新闻组数据库间的一个界面,他不和任何用户进行交互,也没有用户层次的函数,这种“用户界面友好的”函数最好放在客户端中,以便对它们的工作的环境有一个更好的理解。

在通过(使用)Internet TCP协议连接时,为这个服务分配的端口是:119

2.2 字符编码

命令和应答都使用ASCII字符集,当使用8比特字节传送时,低7位正常传送数据,最高位清0。

2.3 命令

命令由一系列命令单词组成,有时候还要跟一些参数。命令参数必须由一个或多个空格或TAB键隔开。一个命令行必须包含完整包含所有必需的参数,并且只能包含一个命令。

指令和参数都不区分大小写。简单的说,就是一个指令和参数字符可以用大写,也可以用小写,或者大小写混合。

每个命令行必须以一对回车换行符(CR-LF)结束。

每个命令行长度不能超过 512个字符,包括空格、分隔符、标点符号,和回车换行符(因此命令和参数字符的长度实际上最多只有510个字符)。不接受超出长度规定的命令行。

2.4 应答

应答有两种:文本和状态。

2.4.1 文本应答

文本只有在指出后面有文本跟随的数字状态应答行被发送后发送。文本是按原文 内容按行连续发送,用回车换行符(CR-LF)结束。一个仅包含一个句点(.)的单行表示文本结束(服务器将在文本最后一行后面发送一个回车换行符。一个句点.和一个回车换行)。

如果该行文本原文的第一行是一个.号,那么会在.号前再加一个.号然后发送。因此,客户端必须检查接收的每一行的第一个字符是否是句点符号(.),以判断它是一个文本结束还是将两个(多的)句点改成一个。

文本信息一般会在客户终端上被显示,然而命令/状态应答必须在客户端程序处理后才能被按要求显示。

2.4.2 状态应答

状态应答来自服务器,是服务器对上一条指令的执行情况的反馈。

状态应答由3个足可以区别不同状态应答的数字组成,它们中的一些是后来发送的文本信息的先兆。

应答的第一个数字广泛的代表了,成功、错误,和正在执行上一条指令。

1xx - 资料消息
2xx - 指令正常
3xx - 指令至今为止正常,发送指令的其余部分
4xx - 指令正确,但由于一些原因不能完成功能
5xx - 指令不能执行、错误,或者发生了严重的程序错误

应答的第二个数字表示应答种类的具体功能

x0x - 连接、设置,和各类其他信息
x1x - 新闻组(主题)选择
x2x - 文章(条目)选择
x3x - 发送功能
x4x - 上贴
x8x - 非标准的扩展
x9x - 调试输出

精确的状态应答是由具体的命令决定的。另外,下面将要列出一些常规的,被认为在任何情况下都会收到的应答编码集合。

一些状态应答包含一些由字符或数字组成的参数,这些参数是固定的,是对应答代码的简单解释。

参数要被数字的响应码,或一个空格分隔开。所有的数字的参数都以十进制表示,而且第一位可以是零。所有的文本参数在单独的空格后面开始,并在下一个空格或一行结束的回车换行后结束(文本参数可以没有,会包含空格)。所有的文本,即使在应答中没有参数也要在上一个参数由空格分隔。同样,在一个应答数字后面的文本记录可以在不同的服务器上有不同。3 位数字代码将决定应该发送什么应答。

对任何其他种类的附加指令响应代码在这个标准中不作详细说明。那些应该选择符合 x8x 定义的规范的范围(注意:调试代码是在 x9x应答代码中有明确的规定)。在标准指令中使用非标准的响应代码是被禁止的。

如果在调试中要使用x9x响应模式。那么之后的调试输出都归为“资料消息”一类,可以认为,因此在从190到199的响应中都可以使用来作为各种调试输出。在本规范中对调试输出没有要求,但如果是对已连接的流测试,它们将用到这些代码。如果需要适当的执行细节,那么在调试时可以使用其他的x9x代码。(有一个例子,代码290将答复一个远程调试请求)

2.4.3基本应答

下面列出了由 NNTP服务器发送的常规应答代码。它们不具体的针对某一个指令,但返回一个表示连接、错误,或特殊情况的结果。

通常,1xx 代码是可以不理会和不显示的;代码 200 或 201 是在首次连接到NNTP服务器确认上贴许可时发送;代码 400 将在NNTP服务器停止服务是发送(如,操作人员要求);5xx 代码表示由于一些不寻常的原因,指令不能执行。

100 帮助文本
190 

        through (译者注:不知道什么意思,所以没翻译)
199 调试输出

200 服务器准备好 - 允许上帖
201 服务器准备好 - 不允许上帖

400 服务器停止

500 指令不可辨认
501 指令语法错误
502 访问限制或拒绝许可
503 程序错误 - 指令没有执行

3.  命令和应答的详细资料

在接下来的篇幅中会详细介绍在NNTP服务中公认的命令这些命令的应答。

每一个命令都会有一个清楚的示例,虽然示例并不能很充分的说明NNTP命令。任何参数都是小写。如果一个参数包含在一个[]中,说明这个参数是可选的,如:[GMT]说明参数GMT可能会在命令中出现,也可能不会。

在这里讨论的每一个命令都可以被所有的NNTP服务器接受。

我们不反对增加额外的附加指令;但是推荐在任何一种附加指令前加入字母“X”以避免和本规范的后续版本冲突。

程序可以提示附加指令可以不重新定义状态响应代码。但禁止对标准指令使用其他非标准响应码。

3.1 ARTICLE, BODY, HEAD, 和 STAT命令

ARTICLE有两种格式(BODY, HEAD, 和 STAT命令也一样),每一种格式用各自的方法对可以被检索到的文章进行了详细说明。当ARTICLE命令后面跟着<message-id >形式的参数时,使用的是第一种格式,当ARTICLE命令后面只跟着一个数字参数或者没有参数的时候,使用的是第二种格式。

这篇文章会以文本应答的形式返回,文章的基本描述会出现在文档的稍早处。

BODA和HEAD命令和ARTICLE是一样的,只是他们分别返回文章的的标题和正文。

STAT命令除了没有文本返回以外和ARTICLE命令是相似的。当选中一条新闻组中的消息号码时,STAT命令就会把这个消息号码对应的文章设置成“当前文章”,但是不要求服务器返回这篇文章。服务器要返回的是一个message-id。使用STAT命令选择一个message-id也是可以的,但是对于有问题的message-id,这样的选择不会改变“当前文章”。

3.1.1 ARTICLE(跟着message-id)

ARTICLE <message-id>

客户终端上显示的是:文章标题,一个空行,文章的主体。Message-id是出现在文章头部的关于这篇文章的一个序列号。它可以来自用户使用NEWNEWS命令创建的一个列表中,也可以来自其他文章,或者其他命令所返回的应答中。

请注意在内部已经确定的“当前文章”在使用这个命令时是不会被改变的。这样子做不但是为了使那些被其他文章引用的文章更容易被阅读,而且解决了为了确定可能发送给多个新闻组的文章的正确的顺序和资格所遇到的语义上的困难。

3.1.2 ARTICLE(跟着数字)

ARTICLE [nnn]

客户终端上显示的是:文章标题,一个空行,文章的主体。Message-id是出现在文章头部的关于这篇文章的一个序列号。参数nnn是当前新闻组中一篇文章的序列号,并且只能在被选中的新闻组中选择,缺省的情况下默认选择当前文章。

如果有效的文章号码被指定,那么内部的“当前文章”可以由这个指令设定。

[下面的适用于所有的ARTICLE命令格式]返回的应答中包含一个当前文章号码,一个message-id串,后面跟着返回的文本。

message-id串是被包含在”<>”中的一个验证串,来自文章本身的标题。来自文章的message-id标题行[在RFC850中定义]必须包含这些信息,如果没有的话,在”<>”中用一个单独的“0“代替。

因为message-id对于每个文章来说是唯一的,所以它被新闻阅读程序用来跳过那些因为重复上传或者上传到了多个新闻组中的重复文章。

3.1.3 应答

220 n <a> article retrieved - head and body follow
           (n = 文章名称, <a> = message-id)
221 n <a> article retrieved - head follows
222 n <a> article retrieved - body follows
223 n <a> article retrieved - request text separately
412 no newsgroup has been selected
420 no current article has been selected
423 no such article number in this group
430 no such article found

3.2 GROUP命令

3.2.1 GROUP

GROUP ggg

必须的参数ggg是被选中的新闻组的号码(比如:"net.news"),一个正确的新闻组列表可以由LIST命令生成。

正确的选择应答会返回新闻组中第一篇和最后一篇文章的号码,新闻组中文章数目的一个估计。这个估计不一定是正确的,虽然它和有用;估计值必须大于,等于新闻组中实际的文章数目。(一些程序的实现会去数新闻组中实际的文章数目,还有一些知识简单的将最后一篇文章的号码减去第一篇文章的号码的值作为文章数)

当选中了一个新闻组的时候,这个组中被内部指定的”当前文章“会被设置成这个组中的第一篇文章,如果又选中了一个组,那么先前被选中的组和”当前文章“还是继续处于选中状态。如果一个空的组被选中,那么中被内部指定的”当前文章“处于不确定状态,并且不会被使用。

注意:新闻组的名称不是随意的,它必须和由LIST命令产生的列表中某个新闻组名称匹配,否则会返回错误。

3.2.2 应答

211 n f l s group selected
           (n=估计的组中的文章(帖)数量,
             f=组中第一个文章的号码,
             l=组中最后一个文章的号码
             s=组名称。)
411 no such news group(组不存在)

3.3 HELP命令

3.3.1 HELP

HELP

该命令提供了一个在新闻组服务器上可以被正确理解并执行的命令列表。帮助文档会问文本应答的方式返回。

3.3.2 应答

100 help text follows

3.4 IHAVE命令

3.4.1 IHAVE

IHAVE <messageid>

客户端使用IHAVE命令告诉服务器,它有一篇序列号为messageid的文章。如果服务器想要这篇文章的拷贝,它会返回一个应答要求客户端上传完整的文章;如果服务器不需要(比如:服务器已经存在这篇文章的拷贝了),它会返回一个应答告诉客户端不需要这篇文章。

如果文章被要求传送,客户端会把完整的文章发送给服务器,内容包括标题和主体,来自服务器的文章传输格式的详细描述(译者注:这就可能会有问题,原文in the manner specified for text transmission from the server)。服务器会返回传输是否成功的应答。

这个命令与POST命令的区别在于它是有意的在主机间进行已发布的文章传输。一般情况下它不会再个人新闻阅读程序中被使用。特别的是,这个命令会调用服务器的新闻发布程序进行一些适当的设置(如:标志,操作等等)以指出即将来临的文章来自其他的主机。

如果服务器在后来对文章的检查中发现不值得发布或传输一些文章,它会选择停止发布或者传输这些文章。这个时候,它会返回436和437错误。

造成这种拒绝的原因有很多种,如:错误的新闻组和分类,磁盘限制;文章长度限制;不清楚的标题等等类似的错误。这些限制(错误)由主机的软件所决定,而非NNTP本身。

3.4.2 应答

235 article transferred ok
335 send article to be transferred.  以 <换行><.><换行>结束
435 article not wanted - do not send it
436 transfer failed - try again later
437 article rejected - do not try again

实现时应该注意的:

因为一些新闻组发布软件无法实时的判定文章是否已经不适于发布和传送,它可能先返回一个传输成功的应答,隔了点时间后再返回一个传输失败的应答。因此允许服务器首先返回235应答,过了端时间后又返回传输失败应答。这也许不是问题满意的解决方法。一些实现希望发送一封邮件给文章的作者,以确定是否应该失败。

3.5 LAST命令

3.5.1 LAST

LAST

内部指定的“当前文章”被设置为当前新闻组的上一篇文章,如果已经是这个新闻组的第一篇文章了,服务器就会返回一个错误应答,并且当前文章仍旧被选中。

这个命令可以设置内部指定的“当前文章”。

指令的应答包括当前文章的号码,message-id。但是没有文本应答返回。

3.5.2 应答

223 n a article retrieved - request text separately
           (n = 文章号码, a = 唯一的文章序列号)
412 no newsgroup selected
420 no current article has been selected
422 no previous article in this group

3.6 LIST命令

3.6.1 LIST

LIST

命令返回一个新闻组及其相关信息的列表,每个新闻组作为一行文本被发送,格式如下:

 group last first p

其中group为新闻组名称,last为当前新闻组已知的最后一篇文章的号码,first为当前新闻组已知的第一篇文章的号码,p要么是’y’,要么是’n’,分别表示允许’y’/禁止’n’发布新闻组。

first和last选项都是数字,并且可能有前置0。如果last小于等于first的话表示在当前新闻组中没有文件存在。

注意:一些新闻组会禁止向一个客户端发布新闻,即使LIST命令显示这个新闻组是允许发布新闻的。具体的要查看POST命令对禁止向客户端发布新闻的解释。发布标志存在于每个新闻组中,因为一些新闻组有特殊的限制(译者注:原文为are moderated or are digests),因此无法向这些新闻组发布新闻,为此,我们要发邮件给那些可以把新闻直接提交上去的人,让他们去发布新闻。NNTP服务器向客户端发布新闻的许可不受限制。

注意:空的列表(比如:返回的文本仅包含结束符号<.>)也可能是有效的应答,这表明当前没有有效的新闻组。

3.6.2 应答

215 list of newsgroups follows

3.7 NEWGROUPS命令

3.7.1 NEWGROUPS

NEWNEWS newsgroups date time [GMT] [<distribution>]

命令会返回一个在date time时间后被创建的新闻组列表,表达格式和LIST命令返回的链表一样。

data选项会以6位数字YYMMDD的格式被发送,YY是年份中最后的两个数字,MM是可能包含前置0的月份信息。DD是这个月中的哪一天(可能会有前置0),最近的世纪被人问是年份的一部分(如:86意味着1986,30意味着2030,99意味着1999,00是2000)

time也是以6位数字HHMMSS的格式被发送,其中HH是24小时制的时间,MM和SS都在0~59之间,当后面没有[GMT]参数的时候,以服务器本地时间为准,否则的话以格林威治时间为准。

参数distribution是被包含在<>中的一串分类的新闻组。如果要将新闻组列出显示出来中,需要先将参数中只有部分名称的分类新闻组(比如:net在net.wombat中)与服务器上已有的同种类的新闻组进行匹配,只有那些匹配成功的新的新闻组才能被列出。如果同时有多个符合条件的新闻组,需要将它们全部列出,并且以<,>隔开。

注意:空的列表(比如:返回的文本仅包含结束符号<.>)也可能是有效的应答,这表明当前没有有效的新闻组

3.7.2 应答

231 list of new newsgroups follows

3.8 NEWNEWS命令

3.8.1 NEWNEWS

NEWNEWS newsgroups date time [GMT] [<distribution>]

命令会列出在data时间后被newsgroups新闻组发布和接收的新闻的message-id。每行一个message-id,格式和它们被发送的格式一样,最后以只包含一个点号键和一个换行键的一行结束。

data和time参数的格式和NEWGROUPS命令一样

newsgroups参数表示新闻组名称,如果含有<*>串,意味着要在部分或者全部的新闻组中进行搜索。当newsgroups中部分的含有<*>时会被扩展去进行新闻组的匹配(如:net.macro*会被扩展后去匹配net.micro.wombat, net.micro.apple等等),如果只含有<*>时意味着要与所有的新闻组名称进行匹配。

(请注意:<*>会被扩展成任意的形式;但是特别的是,如net.*.unix的形式只会被扩展成如net.wombat.unix或者net.whocares.unix的形式。)

相反的,如果newsgroups中没有出现<*>号,则只会在newsgroups中指定的新闻组中查找新闻。只能在服务器返回的有效新闻组列表中选择新闻组。命令中可以含有多个新闻组名称,它们以逗号<,>隔开。如果一个新闻组名称后没有逗号跟随意味着这是命令中的最后一个新闻组了。[实现的时候要注意命令行最大长度只有512字节的限制]

感叹号<!>意味着不对某些特定的新闻组进行匹配,如” net.*,mod.*,!mod.map.*”意味着要匹配net.*和mod.*,但是不对mod.map.*的形式进行匹配。感叹号必须出现在给定的不需要进行匹配的新闻组部分或全部名称的第一个字母的前面。

参数distribution是被包含在<>中的一串分类的新闻组。如果要将新闻组列出显示出来中,需要先将参数中只有部分名称的分类新闻组(比如:net在net.wombat中)与服务器上已有的同种类的新闻组进行匹配,只有那些匹配成功的新的新闻组才能被列出。如果同时有多个符合条件的新闻组,需要将它们全部列出,并且以<,>隔开

至此使用IHAVE,NEWNEWS和NEWGROUPS命令分发新闻已经在前面的文档中讨论过了

注意:空的列表(比如:返回的文本仅包含结束符号<.>)也可能是有效的应答,这表明当前没有有效的新闻组

3.8.2 应答

230 list of new articles by message-id follows

3.9 NEXT命令

3.9.1 NEXT

NEXT

默认的”当前文章“会被更新为当前新闻组的下一篇文章。如果新闻组中已经没有更多的文章的时候会返回一个错误,但是当前文章仍旧被选中。

这个命令可以设置默认的”当前文章“

指令的应答包括当前文章的号码,message-id。但是没有文本应答返回。

3.9.2 应答

223 n a article retrieved - request text separately
           (n = 文章号码, a = 一个唯一的文章序列号)
412 no newsgroup selected
420 no current article has been selected
421 no next article in this group

3.10 POST命令

3.10.1 POST

POST

如果文章被语序发布,服务器会返回340,要求客户端传送文章。如果服务器返回的是440,则表示文章被过滤规则禁止发布了。

如果文章被允许发布,则这篇文章的格式必须符合RFC850中规定的标准,并且文章必须包含有所得头部项。当文章的头部和主体都被完全发送的时候,服务器会返回一个应答,表示发送是否成功。

客户端的文档的头部和主题的发送格式必须和服务器的发送格式一样:一个只含有单个点号<.>的行意味着文章的结束;如果文章一行的开头有点<.>号,则在这个点号<.>前再加一个点号<.>。

服务器不会尝试过滤字符,折叠或者限制文本行,或者其他的一些处理上传文章的方法。我们建议服务器仅仅是将上传的消息传送给本文没有讨论的服务器新闻发布软件。阅读RFC850可以获得更多的详细资料。

因为很多实现要求客户端新闻程序允许用户使用一些文本编辑器编辑新闻,并且当编辑完成以后再上传给服务器,所以客户端程序会关注连接刚刚建立时的命令消息,以确定客户端是否允许向该服务器发布新闻,如果不允许发布,会向用户发出警告,告诉他在该服务器上他只有读的权限。这样子,就能阻止用户花了时间去编辑新闻却发现无法发布的情况的发生。客户端和主机间如何进行发布的方法是由具体实现决定的,本文并没有任何隐瞒。

3.10.2 应答

240 article posted ok
340 send article to be posted. 以 <CR-LF><.><CR-LF>结束
440 posting not allowed
441 posting failed

(从前面可以知道,当连接刚刚建立的时候,服务器会返回下面其中之一的一个应答以确定服务器是否允许客户端发布新闻:)
200 server ready - posting allowed
201 server ready - no posting allowed)

3.11 QUIT命令

3.11.1 QUIT

QUIT

服务器接受QUIT命令并且关闭和客户端的连接。这是客户端最好的完成连接事务并且关闭和服务器连接的方法。

如果客户端只是简单的断开连接(可能是超时,或者发生其他错误),服务器会正确的关闭它和客户端的连接。

3.11.2 应答

205 closing connection - goodbye!

3.12 SLAVE命令

3.12.1 SLAVE

SLAVE

这个命令是告诉服务器这个客户端连接是一个辅助服务器而不是一个用户。

这个命令用户区分用户连接和辅助服务器连接。当服务器可能有多个客户端连接的时候,这个命令会要求服务器给予某个服务器更高的优先权。当服务器负荷太大需要释放部分连接时,这个命令会使服务器优先选择辅助服务器。实际上,这个命令的使用完全取决具体的实现,在一些没有优先权的NNTP服务器中,这个命令更本不会被接受。

3.12.2 应答

202 slave status noted

4.  样例

下面是一些可能的协议连接样例。符号C:表示这个命令是从客户端发往服务器端。符号S:表示这个是从服务器发往客户端的应答。

4.1 NEXT命令的连接

S:      (监听TCP119端口)

C:      (要求连接TCP119端口)
S:      200 wombatvax news server ready - posting ok

(客户端请求当前新闻组列表)
C:      LIST
S:      215 list of newsgroups follows
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 (选中了10110号文章,她的message-id是
        <23445@sdcsvax.ARPA>)

(客户端检查标题)
C:      HEAD
S:      221 10110 <23445@sdcsvax.ARPA> article retrieved - head
        follows (文章标题)
S:      .

(客户端向查看文章主题)
C:      BODY
S:      222 10110 <23445@sdcsvax.ARPA> article retrieved - body
        follows (文章主体)
S:      .

(客户端选中了下一篇文章)
C:      NEXT
S:      223 10113 <21495@nudebch.uucp> article retrieved – statistics only (号码为10113 的文章是下一篇文章)

(客户端完成会话)
C:      QUIT
S:      205 goodbye.

4.2 ARTICLE命令

S:      (监听TCP119端口)

C:      (要求连接TCP119端口)
S:      201 UCB-VAX netnews server ready -- no posting allowed

C:      GROUP msgs
S:      211 103 402 504 msgs Your new group is msgs
        (有103篇文章, 从402到504)

C:      ARTICLE 401
S:      423 No such article in this newsgroup

C:      ARTICLE 402
S:      220 402 <4105@ucbvax.ARPA> Article retrieved, text follows
S:      (文章头部和主体)
S:      .

C:      HEAD 403
S:      221 403 <3108@mcvax.UUCP> Article retrieved, header follows
S:      (文章头部)
S:      .

C:      QUIT
S:      205 UCB-VAX news server closing connection.  Goodbye.

4.3 NEWSGROUPS命令

S:      (监听TCP119端口)

C:      (要求连接TCP119端口)
S:      200 Imaginary Institute News Server ready (允许发布)

(客户端 要求1985年4月3号以后建立的新闻组)
C:      NEWGROUPS 850403 020000

S:      231 New newsgroups since 03/04/85 02:00:00 follow
S:      net.music.gdead
S:      net.games.sources
S:      .

C:      GROUP net.music.gdead
S:      211 0 1 1 net.music.gdead Newsgroup selected
        (在新闻组中没有文章,first和last无需理睬)

C:      QUIT
S:      205 Imaginary Institute news server ceasing service.  Bye!

4.4 上传一篇新文章

S:      (监听TCP119端口)

C:      (要求连接TCP119端口)
S:      200 BANZAIVAX news server ready, posting allowed.

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.


4.5 因为操作请求中断

S:      (监听TCP119端口)

C:      (要求连接TCP119端口)
S:      201 genericvax news server ready, no posting allowed.

        (假设是一般的会话,并且新闻组已经被选定)

C:      NEXT
S:      223 1013 <5734@mcvax.UUCP> Article retrieved; text separate.

C:      HEAD
C:      221 1013 <5734@mcvax.UUCP> Article retrieved; head follows.

S:      (传送文章头部的过程因为一个操作请求被中断了。接下来的操作无需客户端的干涉)

S:      (一个只包含两个<CR-LF>的行做为传输的结束)
S:      .
S:      400 Connection closed by operator.  Goodbye.
S:      (closes connection)

4.6 使用新闻服务器在系统间传输数据

S:      (监听TCP119端口)

C:      (要求连接TCP119端口)
S:      201 Foobar NNTP server ready (拒绝发布)

(客户端需要1985年5月15号2点以后创建的新闻组)
C:      NEWGROUPS 850515 020000
S:      235 New newsgroups since 850515 follow
S:      net.fluff
S:      net.lint
S:      .

(客户端需要1985年5月15号2点以后所有新闻组发布的新闻)
C:      NEWNEWS * 850515 020000
S:      230 New news since 850515 020000 follows
S:      <1772@foo.UUCP>
S:      <87623@baz.UUCP>
S:      <17872@GOLD.CSNET>
S:      .

(客户端要查看文章<1772@foo.UUCP>)
C:      ARTICLE <1772@foo.UUCP>
S:      220 <1772@foo.UUCP> All of article follows
S:      (发送全部的信息)
S:      .

(客户端需要文章<87623@baz.UUCP>
C:      ARTICLE <87623@baz.UUCP>
S:      220 <87623@baz.UUCP> All of article follows
S:      (发送全部的信息)
S:      .

(客户端需要文章<17872@GOLD.CSNET>
C:      ARTICLE <17872@GOLD.CSNET>
S:      220 <17872@GOLD.CSNET> All of article follows
S:      (发送全部的信息)
S:      .

(客户端向服务器说明最近收到的文章)
C:      IHAVE <4105@ucbvax.ARPA>
S:      435 Already seen that one, where you been?

(客户端向服务器说明最近收到的文章)
C:      IHAVE <4106@ucbvax.ARPA>
S:      335 News to me!  <CRLF.CRLF> to end.
C:      (发送文章)
C:      .
S:      235 Article transferred successfully.  Thanks.

(或者)

S:      436 Transfer failed.

(客户端断开连接)
C:      QUIT
S:      205 Foobar NNTP server bids you farewell.

4.7 命令和应答摘要

接下来是被NNTP服务器认证的命令及服务器返回的应答

4.7.1 命令

ARTICLE
BODY
GROUP
HEAD
HELP
IHAVE
LAST
LIST
NEWGROUPS
NEWNEWS
NEXT
POST
QUIT
SLAVE
STAT

4.7.2 应答

100 help text follows
199 debug output

200 server ready - posting allowed
201 server ready - no posting allowed
202 slave status noted
205 closing connection - goodbye!
211 n f l s group selected
215 list of newsgroups follows
220 n <a> article retrieved - head and body follow 221 n <a> articleretrieved - head follows
222 n <a> article retrieved - body follows
223 n <a> article retrieved - request text separately 230 list of new articles by message-id follows
231 list of new newsgroups follows
235 article transferred ok
240 article posted ok

335 send article to be transferred.  以 <CR-LF><.><CR-LF>结束
340 send article to be posted. 以 <CR-LF><.><CR-LF>结束

400 service discontinued
411 no such news group
412 no newsgroup has been selected
420 no current article has been selected
421 no next article in this group
422 no previous article in this group
423 no such article number in this group
430 no such article found
435 article not wanted - do not send it
436 transfer failed - try again later
437 article rejected - do not try again.
440 posting not allowed
441 posting failed

500 command not recognized
501 command syntax error
502 access restriction or permission denied
503 program fault - command not performed

4.8 一份关于USENET新闻系统的文字摘要

在UNIX世界中,传统上的网络连接被建立在1200波特率的电话线上,USENET新闻系统被发展成能处理中央存储,索引,取回,和分发新闻。做为一个和UUCP根本上不一样的传输机制,USENET是一个能为使用UNIX及其他不同系统的用户提供新闻和公告服务的系统。USENET新闻系统已经在RFC850中被详细讨论过了。它适用于几乎全部的UNIX系统和很多其他操作系统,并且可以被任意发布。

USNET文件系统使用UNIX主机的一个SPOOLING(译者注:一种虚拟打印机算法)存储池来存放新闻文章,每篇文章一个文件。每篇文章都有一个文章头部,包含着文章发送者的签名和他的组织关系,日期,回复电邮地址,主题,新闻组(按主题分类)等等。下面有一篇完整的文章的副本。请按靠RFC850以获得更多的信息。

Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; sitesdcsvax.UUCP
Posting-Version: version B 2.10.1 6/24/83 SMI; site unitek.uucp
Path:sdcsvax!sdcrdcf!hplabs!qantel!ihnp4!alberta!ubc-vision!unitek!honman
From: honman@unitek.uucp (Man Wong)
Newsgroups: net.unix-wizards
Subject: foreground -> background ?
Message-ID: <167@unitek.uucp>
Date: 25 Sep 85 23:51:52 GMT
Date-Received: 29 Sep 85 09:54:48 GMT
Reply-To: honman@unitek.UUCP (Hon-Man Wong)
Distribution: net.all
Organization: Unitek Technologies Corporation
Lines: 12

I have a process (C program) which generates a child and waits for
it to return.  What I would like to do is to be able to run the
child process interactively for a while before kicking itself into
the background so I can return to the parent process (while the
child process is RUNNING in the background).  Can it be done?  And
if it can, how?

Please reply by E-mail.  Thanks in advance.

Hon-Man Wong

5.  参考文献

[1]  Crocker, D., "Standard for the Format of ARPA Internet Text
     Messages", RFC-822, Department of Electrical Engineering,
     University of Delaware, August, 1982.

[2]  Horton, M., "Standard for Interchange of USENET Messages",
     RFC-850, USENET Project, June, 1983.

[3]  Postel, J., "Transmission Control Protocol- DARPA Internet
     Program Protocol Specification", RFC-793, USC/Information
     Sciences Institute, September, 1981.

[4]  Postel, J., "Simple Mail Transfer Protocol", RFC-821,
     USC/Information Sciences Institute, August, 1982.

6.  感谢

作者在这里要衷心感谢那些为本文提供意见和建议的人,特别是Erik Fair 和 Chuq von Rospach,没有这些人的工作就不会有这篇文章。

7.  说明

UNIX是贝尔实验室的注册商标。

注:这是我翻译的第一篇RFC文档,计算机网络在中国越来越变的热门。但是因为关键的技术文档全是英文的,使很大一部分程序工程师不能进入其中。本人翻译RFC文章不仅是因为工作需要,也是想使更多的人了解计算机网络技术,任何人都可以转载或者发布这篇文章,因为是第一次翻译,如有错误,请通知我,我的邮箱是:ghbxx2004@yahoo.com.cn