網(wǎng)絡(luò)工作組       Brian Kantor (U.C. San Diego)
 Request for Comments: 977  Phil Lapsley (U.C. Berkeley)
                                               1986年2月

                       網(wǎng)絡(luò)新聞傳輸協(xié)議

                   網(wǎng)絡(luò)新聞傳輸?shù)幕緲?biāo)準(zhǔn)

備忘錄描述
NNTP定義了一個可以在ARPA網(wǎng)絡(luò)中進(jìn)行可靠的新聞傳輸?shù)幕緟f(xié)議,其中包括新聞的分發(fā),查詢新聞,獲取新聞,發(fā)布新聞等。在NNTP中,所有的新聞被存儲在一個中央數(shù)據(jù)庫中,并且允許訂閱用戶僅僅閱讀那些他們關(guān)心的新聞,此外,該協(xié)議還提供新聞的索引,前后文參照,刪除過期的文章等功能。這篇備忘錄僅僅提供了一個在ARPA網(wǎng)絡(luò)上傳輸新聞的協(xié)議草案,希望有更多的人能夠參與討論,并且提供更好的建議。本備忘錄可以被任意復(fù)制和修改。

1.  導(dǎo)言
多年以前,ARPA網(wǎng)絡(luò)就已經(jīng)支持公告,資料和數(shù)據(jù)在數(shù)以千計的網(wǎng)絡(luò)使用者中進(jìn)行及時的傳播,我們稱之為“新聞組”,它被用來及時的傳播那些共同感興趣的事物,比如軟件的錯誤,新產(chǎn)品的討論,尖端技術(shù)和關(guān)鍵設(shè)計,此外還可以討論那些專業(yè)的計算機(jī)工作者所關(guān)心的問題。“新聞組”在它的使用者中正越來越流行。

現(xiàn)在有兩種實(shí)現(xiàn)“新聞組”的技術(shù):網(wǎng)絡(luò)郵件系統(tǒng),和USENET新聞組系統(tǒng)。

1.1 網(wǎng)絡(luò)郵件系統(tǒng)

網(wǎng)絡(luò)郵件系統(tǒng)中有一個已經(jīng)訂閱了這個新聞組的所有用戶的電子郵件地址列表和回復(fù)列表。系統(tǒng)會給列表上的每一個郵箱發(fā)送一份新聞的拷貝。當(dāng)列表中有過多的地址時,這種方式是很低效的,因?yàn)榘l(fā)送給訂閱者郵件會占用大量的帶寬,CPU資源和目的主機(jī)的磁盤空間,并且系統(tǒng)自身的維護(hù)也是一個大問題如:用戶從一個主題換到其他的主題;新用戶的加入和老用戶的離開;服務(wù)器服務(wù)內(nèi)容的增加,減少。

1.2 USENET新聞組系統(tǒng)

克服網(wǎng)絡(luò)郵件系統(tǒng)耗費(fèi)資源的方法就是將新聞存放在中央數(shù)據(jù)庫而不是訂閱者的郵箱里面。USENET系統(tǒng)正是這樣做的,它將新聞存放在一個中央存儲庫中(往往是一些分門別類的目錄),提供一個程序允許訂閱者僅僅閱讀那些他們關(guān)心的新聞,此外,還提供新聞的索引,前后文參照,刪除過期的文章等功能

1.3 中央存儲庫

因?yàn)橛写罅康闹鳈C(jī)同時通過快速局域網(wǎng)(往往是以太網(wǎng))連接上存儲庫,所以它被設(shè)計成能跟好的把新聞發(fā)送到一個或多個主機(jī)上面,并且允許進(jìn)行服務(wù)器/客戶端模式的連接訪問。

1.4 中央新聞服務(wù)器

要做到這樣高效的實(shí)現(xiàn)需要一個中央計算機(jī)系統(tǒng)為局域網(wǎng)上的其他系統(tǒng)提供新聞服務(wù)。這樣的一個系統(tǒng)就是新聞服務(wù)器,它所要做的就是進(jìn)行新聞和新的索引的搜集,使網(wǎng)絡(luò)上的每個讀者都能及時的讀到新聞公告。因?yàn)榇嬖诒姸嗟姆?wù)器,這種存儲方式是很有效的。同樣,這允許工作站用較少的存儲空間參與新聞組,不存在由于下載大量的消息而對磁盤空間造成的壓力。

我們聽到了使用IBIS,分布式或者網(wǎng)絡(luò)文件系統(tǒng)作為中央服務(wù)器的傳聞。當(dāng)分布式的服務(wù)器工作在一組運(yùn)行著相同操作系統(tǒng)的配置差不多的計算機(jī)上的時候確實(shí)表現(xiàn)良好,但是不同的客戶端,特別是不同操作系統(tǒng)上的客戶端要求連接時,就不能接受了。現(xiàn)在幾乎沒有(或許有)分布或者網(wǎng)絡(luò)文件系統(tǒng)可以提供一般的TCP連接服務(wù),特別是考慮到存在很多不同硬件體系和不同操作系統(tǒng)的情況。

NNTP定義了一個基于可靠連接(使用TCP)的,客戶/服務(wù)器模式的,可以發(fā)送、查詢、獲取、發(fā)布新聞組文章的協(xié)議。新聞僅需存放在一個中央數(shù)據(jù)庫中,用戶在其他的主機(jī)上通過LAN連接到新聞組服務(wù)器主機(jī)上,就可以讀取新聞消息。

NNTP的新聞文章(文本)規(guī)范模型在RFC850中定義,那描述了USENET新聞組系統(tǒng)。無論如何,NNTP在組織結(jié)構(gòu)、內(nèi)容、新聞文章的存儲方面處理滿足了一些要求。因此我們相信他能夠輕易的匹配其他的非USENET新聞組系統(tǒng)。

具有特色的是,NNTP服務(wù)器在主機(jī)上以后臺模式運(yùn)行,而且可以接受來自LAN上其他主機(jī)的連接請求。并能工作在由幾個計算機(jī)組成的小系統(tǒng)(比如工作站),以及大的中心系統(tǒng)中。

1.5 輔助新聞服務(wù)器

在有很多用戶和機(jī)器的情況下(或許是大學(xué)或者大的工業(yè)機(jī)構(gòu)),輔助新聞服務(wù)器會被使用。這種服務(wù)器,或者叫做“奴隸”(譯者注:原文如此)服務(wù)器工作在各自的計算機(jī)系統(tǒng)中,為本地用戶提供可靠的新聞組閱讀請求的中轉(zhuǎn)和提供最新的新聞組文章緩存。

具有代表性的是,當(dāng)一個客戶端要獲得新聞組服務(wù)的時候,會首先和當(dāng)?shù)氐男侣劷M服務(wù)端口建立連接,如果連接失敗則表示這個服務(wù)器有問題。這時,輔助新聞服務(wù)器會選擇是關(guān)閉新聞服務(wù),還是允許局域網(wǎng)上的主機(jī)去和主新聞服務(wù)器進(jìn)行連接。

在工作站或者其他小的系統(tǒng)上,直接連接到主服務(wù)器也許是正常的操作方式。

這份規(guī)范并不適用于輔助新聞服務(wù)器,我們僅建議在大型的局域網(wǎng)上合理的增加NNTP服務(wù)器作為從屬服務(wù)器來提高系統(tǒng)運(yùn)轉(zhuǎn)性能

1.6 新聞組的發(fā)送

NNTP使用命令行提供一個在協(xié)作的多個主機(jī)間交換信息(文章項(xiàng)目)的簡單方法。一個想得到新聞組文章的拷貝并且已經(jīng)與局域網(wǎng)或者其他高速網(wǎng)絡(luò)建立連接的主機(jī)會發(fā)現(xiàn)NNTP使用了比傳統(tǒng)的傳送方法(比如UUCP,譯者注:UNIX間的文件拷貝)更高效的新聞發(fā)送方法。

在傳統(tǒng)的新聞傳送方法中,新聞從一個主機(jī)發(fā)送給所有他知道的主機(jī),這些主機(jī)再把文章轉(zhuǎn)發(fā)給所有他知道的主機(jī),就像水流一樣。顯然,這種使已經(jīng)得到新聞的主機(jī)再次接收無用新聞的方法會浪費(fèi)時間和通信資源,但是因?yàn)檫@種傳送機(jī)制是基于單向事務(wù)而非交互式(比如UNIX世界中的UUCP),文章僅僅是單向的被發(fā)送,然后接收主機(jī)簡單的丟棄掉重復(fù)的文章,所以發(fā)送時間被減少了。這在通信協(xié)議被限制的年代確實(shí)是一個正確的選擇。

使用NNTP,主機(jī)間交換新聞組文章使用一個交互機(jī)制以決定文章是否應(yīng)該傳送。當(dāng)主機(jī)希望得到最新的消息,或者要需要發(fā)送新消息時,會使用NNTP向周圍的一個或多個主機(jī)進(jìn)行聯(lián)系。第一個動作會詢問,在對方主機(jī)上是否有新的新聞組(使用NEWGROUPS命令創(chuàng)建),如果有新的新聞組,并且是適當(dāng)?shù)幕蛐枰S本地站點(diǎn)的規(guī)定而定)的群組,那么就建立新的同樣的新聞組。

客戶端會向服務(wù)器詢問所有的或者那些它所關(guān)注的新聞組是否收到新文章,這使用NEWNEWS命令。它會收到一個從服務(wù)器發(fā)來的新文章的列表,并且客戶端可以請求服務(wù)器傳送那些客戶端選中的并且沒有的文章。

最后,客戶端告訴服務(wù)器那些它最近一次接收到的新文章,服務(wù)器會指出哪些文章它已經(jīng)有拷貝了,哪些文章需要客戶端傳輸給服務(wù)器,以增加服務(wù)器的收藏。

在這種方式中,只有那些沒有得到過副本的和希望請求得到的文章會被發(fā)送。

2.  NNTP協(xié)議規(guī)范

2.1 總論

這個新聞組說明文檔定義了使用TCP連接和類似于SMTP的指令和應(yīng)答的規(guī)范。它接受來自主機(jī)的連接,并為新聞組數(shù)據(jù)庫提供一個簡單的操作界面。

這種服務(wù)器只有程序和新聞組數(shù)據(jù)庫間的一個界面,他不和任何用戶進(jìn)行交互,也沒有用戶層次的函數(shù),這種“用戶界面友好的”函數(shù)最好放在客戶端中,以便對它們的工作的環(huán)境有一個更好的理解。

在通過(使用)Internet TCP協(xié)議連接時,為這個服務(wù)分配的端口是:119

2.2 字符編碼

命令和應(yīng)答都使用ASCII字符集,當(dāng)使用8比特字節(jié)傳送時,低7位正常傳送數(shù)據(jù),最高位清0。

2.3 命令

命令由一系列命令單詞組成,有時候還要跟一些參數(shù)。命令參數(shù)必須由一個或多個空格或TAB鍵隔開。一個命令行必須包含完整包含所有必需的參數(shù),并且只能包含一個命令。

指令和參數(shù)都不區(qū)分大小寫。簡單的說,就是一個指令和參數(shù)字符可以用大寫,也可以用小寫,或者大小寫混合。

每個命令行必須以一對回車換行符(CR-LF)結(jié)束。

每個命令行長度不能超過 512個字符,包括空格、分隔符、標(biāo)點(diǎn)符號,和回車換行符(因此命令和參數(shù)字符的長度實(shí)際上最多只有510個字符)。不接受超出長度規(guī)定的命令行。

2.4 應(yīng)答

應(yīng)答有兩種:文本和狀態(tài)。

2.4.1 文本應(yīng)答

文本只有在指出后面有文本跟隨的數(shù)字狀態(tài)應(yīng)答行被發(fā)送后發(fā)送。文本是按原文 內(nèi)容按行連續(xù)發(fā)送,用回車換行符(CR-LF)結(jié)束。一個僅包含一個句點(diǎn)(.)的單行表示文本結(jié)束(服務(wù)器將在文本最后一行后面發(fā)送一個回車換行符。一個句點(diǎn).和一個回車換行)。

如果該行文本原文的第一行是一個.號,那么會在.號前再加一個.號然后發(fā)送。因此,客戶端必須檢查接收的每一行的第一個字符是否是句點(diǎn)符號(.),以判斷它是一個文本結(jié)束還是將兩個(多的)句點(diǎn)改成一個。

文本信息一般會在客戶終端上被顯示,然而命令/狀態(tài)應(yīng)答必須在客戶端程序處理后才能被按要求顯示。

2.4.2 狀態(tài)應(yīng)答

狀態(tài)應(yīng)答來自服務(wù)器,是服務(wù)器對上一條指令的執(zhí)行情況的反饋。

狀態(tài)應(yīng)答由3個足可以區(qū)別不同狀態(tài)應(yīng)答的數(shù)字組成,它們中的一些是后來發(fā)送的文本信息的先兆。

應(yīng)答的第一個數(shù)字廣泛的代表了,成功、錯誤,和正在執(zhí)行上一條指令。

1xx - 資料消息
2xx - 指令正常
3xx - 指令至今為止正常,發(fā)送指令的其余部分
4xx - 指令正確,但由于一些原因不能完成功能
5xx - 指令不能執(zhí)行、錯誤,或者發(fā)生了嚴(yán)重的程序錯誤

應(yīng)答的第二個數(shù)字表示應(yīng)答種類的具體功能

x0x - 連接、設(shè)置,和各類其他信息
x1x - 新聞組(主題)選擇
x2x - 文章(條目)選擇
x3x - 發(fā)送功能
x4x - 上貼
x8x - 非標(biāo)準(zhǔn)的擴(kuò)展
x9x - 調(diào)試輸出

精確的狀態(tài)應(yīng)答是由具體的命令決定的。另外,下面將要列出一些常規(guī)的,被認(rèn)為在任何情況下都會收到的應(yīng)答編碼集合。

一些狀態(tài)應(yīng)答包含一些由字符或數(shù)字組成的參數(shù),這些參數(shù)是固定的,是對應(yīng)答代碼的簡單解釋。

參數(shù)要被數(shù)字的響應(yīng)碼,或一個空格分隔開。所有的數(shù)字的參數(shù)都以十進(jìn)制表示,而且第一位可以是零。所有的文本參數(shù)在單獨(dú)的空格后面開始,并在下一個空格或一行結(jié)束的回車換行后結(jié)束(文本參數(shù)可以沒有,會包含空格)。所有的文本,即使在應(yīng)答中沒有參數(shù)也要在上一個參數(shù)由空格分隔。同樣,在一個應(yīng)答數(shù)字后面的文本記錄可以在不同的服務(wù)器上有不同。3 位數(shù)字代碼將決定應(yīng)該發(fā)送什么應(yīng)答。

對任何其他種類的附加指令響應(yīng)代碼在這個標(biāo)準(zhǔn)中不作詳細(xì)說明。那些應(yīng)該選擇符合 x8x 定義的規(guī)范的范圍(注意:調(diào)試代碼是在 x9x應(yīng)答代碼中有明確的規(guī)定)。在標(biāo)準(zhǔn)指令中使用非標(biāo)準(zhǔn)的響應(yīng)代碼是被禁止的。

如果在調(diào)試中要使用x9x響應(yīng)模式。那么之后的調(diào)試輸出都?xì)w為“資料消息”一類,可以認(rèn)為,因此在從190到199的響應(yīng)中都可以使用來作為各種調(diào)試輸出。在本規(guī)范中對調(diào)試輸出沒有要求,但如果是對已連接的流測試,它們將用到這些代碼。如果需要適當(dāng)?shù)膱?zhí)行細(xì)節(jié),那么在調(diào)試時可以使用其他的x9x代碼。(有一個例子,代碼290將答復(fù)一個遠(yuǎn)程調(diào)試請求)

2.4.3基本應(yīng)答

下面列出了由 NNTP服務(wù)器發(fā)送的常規(guī)應(yīng)答代碼。它們不具體的針對某一個指令,但返回一個表示連接、錯誤,或特殊情況的結(jié)果。

通常,1xx 代碼是可以不理會和不顯示的;代碼 200 或 201 是在首次連接到NNTP服務(wù)器確認(rèn)上貼許可時發(fā)送;代碼 400 將在NNTP服務(wù)器停止服務(wù)是發(fā)送(如,操作人員要求);5xx 代碼表示由于一些不尋常的原因,指令不能執(zhí)行。

100 幫助文本
190 

        through (譯者注:不知道什么意思,所以沒翻譯)
199 調(diào)試輸出

200 服務(wù)器準(zhǔn)備好 - 允許上帖
201 服務(wù)器準(zhǔn)備好 - 不允許上帖

400 服務(wù)器停止

500 指令不可辨認(rèn)
501 指令語法錯誤
502 訪問限制或拒絕許可
503 程序錯誤 - 指令沒有執(zhí)行

3.  命令和應(yīng)答的詳細(xì)資料

在接下來的篇幅中會詳細(xì)介紹在NNTP服務(wù)中公認(rèn)的命令這些命令的應(yīng)答。

每一個命令都會有一個清楚的示例,雖然示例并不能很充分的說明NNTP命令。任何參數(shù)都是小寫。如果一個參數(shù)包含在一個[]中,說明這個參數(shù)是可選的,如:[GMT]說明參數(shù)GMT可能會在命令中出現(xiàn),也可能不會。

在這里討論的每一個命令都可以被所有的NNTP服務(wù)器接受。

我們不反對增加額外的附加指令;但是推薦在任何一種附加指令前加入字母“X”以避免和本規(guī)范的后續(xù)版本沖突。

程序可以提示附加指令可以不重新定義狀態(tài)響應(yīng)代碼。但禁止對標(biāo)準(zhǔn)指令使用其他非標(biāo)準(zhǔn)響應(yīng)碼。

3.1 ARTICLE, BODY, HEAD, 和 STAT命令

ARTICLE有兩種格式(BODY, HEAD, 和 STAT命令也一樣),每一種格式用各自的方法對可以被檢索到的文章進(jìn)行了詳細(xì)說明。當(dāng)ARTICLE命令后面跟著<message-id >形式的參數(shù)時,使用的是第一種格式,當(dāng)ARTICLE命令后面只跟著一個數(shù)字參數(shù)或者沒有參數(shù)的時候,使用的是第二種格式。

這篇文章會以文本應(yīng)答的形式返回,文章的基本描述會出現(xiàn)在文檔的稍早處。

BODA和HEAD命令和ARTICLE是一樣的,只是他們分別返回文章的的標(biāo)題和正文。

STAT命令除了沒有文本返回以外和ARTICLE命令是相似的。當(dāng)選中一條新聞組中的消息號碼時,STAT命令就會把這個消息號碼對應(yīng)的文章設(shè)置成“當(dāng)前文章”,但是不要求服務(wù)器返回這篇文章。服務(wù)器要返回的是一個message-id。使用STAT命令選擇一個message-id也是可以的,但是對于有問題的message-id,這樣的選擇不會改變“當(dāng)前文章”。

3.1.1 ARTICLE(跟著message-id)

ARTICLE <message-id>

客戶終端上顯示的是:文章標(biāo)題,一個空行,文章的主體。Message-id是出現(xiàn)在文章頭部的關(guān)于這篇文章的一個序列號。它可以來自用戶使用NEWNEWS命令創(chuàng)建的一個列表中,也可以來自其他文章,或者其他命令所返回的應(yīng)答中。

請注意在內(nèi)部已經(jīng)確定的“當(dāng)前文章”在使用這個命令時是不會被改變的。這樣子做不但是為了使那些被其他文章引用的文章更容易被閱讀,而且解決了為了確定可能發(fā)送給多個新聞組的文章的正確的順序和資格所遇到的語義上的困難。

3.1.2 ARTICLE(跟著數(shù)字)

ARTICLE [nnn]

客戶終端上顯示的是:文章標(biāo)題,一個空行,文章的主體。Message-id是出現(xiàn)在文章頭部的關(guān)于這篇文章的一個序列號。參數(shù)nnn是當(dāng)前新聞組中一篇文章的序列號,并且只能在被選中的新聞組中選擇,缺省的情況下默認(rèn)選擇當(dāng)前文章。

如果有效的文章號碼被指定,那么內(nèi)部的“當(dāng)前文章”可以由這個指令設(shè)定。

[下面的適用于所有的ARTICLE命令格式]返回的應(yīng)答中包含一個當(dāng)前文章號碼,一個message-id串,后面跟著返回的文本。

message-id串是被包含在”<>”中的一個驗(yàn)證串,來自文章本身的標(biāo)題。來自文章的message-id標(biāo)題行[在RFC850中定義]必須包含這些信息,如果沒有的話,在”<>”中用一個單獨(dú)的“0“代替。

因?yàn)閙essage-id對于每個文章來說是唯一的,所以它被新聞閱讀程序用來跳過那些因?yàn)橹貜?fù)上傳或者上傳到了多個新聞組中的重復(fù)文章。

3.1.3 應(yīng)答

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

必須的參數(shù)ggg是被選中的新聞組的號碼(比如:"net.news"),一個正確的新聞組列表可以由LIST命令生成。

正確的選擇應(yīng)答會返回新聞組中第一篇和最后一篇文章的號碼,新聞組中文章數(shù)目的一個估計。這個估計不一定是正確的,雖然它和有用;估計值必須大于,等于新聞組中實(shí)際的文章數(shù)目。(一些程序的實(shí)現(xiàn)會去數(shù)新聞組中實(shí)際的文章數(shù)目,還有一些知識簡單的將最后一篇文章的號碼減去第一篇文章的號碼的值作為文章數(shù))

當(dāng)選中了一個新聞組的時候,這個組中被內(nèi)部指定的”當(dāng)前文章“會被設(shè)置成這個組中的第一篇文章,如果又選中了一個組,那么先前被選中的組和”當(dāng)前文章“還是繼續(xù)處于選中狀態(tài)。如果一個空的組被選中,那么中被內(nèi)部指定的”當(dāng)前文章“處于不確定狀態(tài),并且不會被使用。

注意:新聞組的名稱不是隨意的,它必須和由LIST命令產(chǎn)生的列表中某個新聞組名稱匹配,否則會返回錯誤。

3.2.2 應(yīng)答

211 n f l s group selected
           (n=估計的組中的文章(帖)數(shù)量,
             f=組中第一個文章的號碼,
             l=組中最后一個文章的號碼
             s=組名稱。)
411 no such news group(組不存在)

3.3 HELP命令

3.3.1 HELP

HELP

該命令提供了一個在新聞組服務(wù)器上可以被正確理解并執(zhí)行的命令列表。幫助文檔會問文本應(yīng)答的方式返回。

3.3.2 應(yīng)答

100 help text follows

3.4 IHAVE命令

3.4.1 IHAVE

IHAVE <messageid>

客戶端使用IHAVE命令告訴服務(wù)器,它有一篇序列號為messageid的文章。如果服務(wù)器想要這篇文章的拷貝,它會返回一個應(yīng)答要求客戶端上傳完整的文章;如果服務(wù)器不需要(比如:服務(wù)器已經(jīng)存在這篇文章的拷貝了),它會返回一個應(yīng)答告訴客戶端不需要這篇文章。

如果文章被要求傳送,客戶端會把完整的文章發(fā)送給服務(wù)器,內(nèi)容包括標(biāo)題和主體,來自服務(wù)器的文章傳輸格式的詳細(xì)描述(譯者注:這就可能會有問題,原文in the manner specified for text transmission from the server)。服務(wù)器會返回傳輸是否成功的應(yīng)答。

這個命令與POST命令的區(qū)別在于它是有意的在主機(jī)間進(jìn)行已發(fā)布的文章傳輸。一般情況下它不會再個人新聞閱讀程序中被使用。特別的是,這個命令會調(diào)用服務(wù)器的新聞發(fā)布程序進(jìn)行一些適當(dāng)?shù)脑O(shè)置(如:標(biāo)志,操作等等)以指出即將來臨的文章來自其他的主機(jī)。

如果服務(wù)器在后來對文章的檢查中發(fā)現(xiàn)不值得發(fā)布或傳輸一些文章,它會選擇停止發(fā)布或者傳輸這些文章。這個時候,它會返回436和437錯誤。

造成這種拒絕的原因有很多種,如:錯誤的新聞組和分類,磁盤限制;文章長度限制;不清楚的標(biāo)題等等類似的錯誤。這些限制(錯誤)由主機(jī)的軟件所決定,而非NNTP本身。

3.4.2 應(yīng)答

235 article transferred ok
335 send article to be transferred.  以 <換行><.><換行>結(jié)束
435 article not wanted - do not send it
436 transfer failed - try again later
437 article rejected - do not try again

實(shí)現(xiàn)時應(yīng)該注意的:

因?yàn)橐恍┬侣劷M發(fā)布軟件無法實(shí)時的判定文章是否已經(jīng)不適于發(fā)布和傳送,它可能先返回一個傳輸成功的應(yīng)答,隔了點(diǎn)時間后再返回一個傳輸失敗的應(yīng)答。因此允許服務(wù)器首先返回235應(yīng)答,過了端時間后又返回傳輸失敗應(yīng)答。這也許不是問題滿意的解決方法。一些實(shí)現(xiàn)希望發(fā)送一封郵件給文章的作者,以確定是否應(yīng)該失敗。

3.5 LAST命令

3.5.1 LAST

LAST

內(nèi)部指定的“當(dāng)前文章”被設(shè)置為當(dāng)前新聞組的上一篇文章,如果已經(jīng)是這個新聞組的第一篇文章了,服務(wù)器就會返回一個錯誤應(yīng)答,并且當(dāng)前文章仍舊被選中。

這個命令可以設(shè)置內(nèi)部指定的“當(dāng)前文章”。

指令的應(yīng)答包括當(dāng)前文章的號碼,message-id。但是沒有文本應(yīng)答返回。

3.5.2 應(yīng)答

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

命令返回一個新聞組及其相關(guān)信息的列表,每個新聞組作為一行文本被發(fā)送,格式如下:

 group last first p

其中g(shù)roup為新聞組名稱,last為當(dāng)前新聞組已知的最后一篇文章的號碼,first為當(dāng)前新聞組已知的第一篇文章的號碼,p要么是’y’,要么是’n’,分別表示允許’y’/禁止’n’發(fā)布新聞組。

first和last選項(xiàng)都是數(shù)字,并且可能有前置0。如果last小于等于first的話表示在當(dāng)前新聞組中沒有文件存在。

注意:一些新聞組會禁止向一個客戶端發(fā)布新聞,即使LIST命令顯示這個新聞組是允許發(fā)布新聞的。具體的要查看POST命令對禁止向客戶端發(fā)布新聞的解釋。發(fā)布標(biāo)志存在于每個新聞組中,因?yàn)橐恍┬侣劷M有特殊的限制(譯者注:原文為are moderated or are digests),因此無法向這些新聞組發(fā)布新聞,為此,我們要發(fā)郵件給那些可以把新聞直接提交上去的人,讓他們?nèi)グl(fā)布新聞。NNTP服務(wù)器向客戶端發(fā)布新聞的許可不受限制。

注意:空的列表(比如:返回的文本僅包含結(jié)束符號<.>)也可能是有效的應(yīng)答,這表明當(dāng)前沒有有效的新聞組。

3.6.2 應(yīng)答

215 list of newsgroups follows

3.7 NEWGROUPS命令

3.7.1 NEWGROUPS

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

命令會返回一個在date time時間后被創(chuàng)建的新聞組列表,表達(dá)格式和LIST命令返回的鏈表一樣。

data選項(xiàng)會以6位數(shù)字YYMMDD的格式被發(fā)送,YY是年份中最后的兩個數(shù)字,MM是可能包含前置0的月份信息。DD是這個月中的哪一天(可能會有前置0),最近的世紀(jì)被人問是年份的一部分(如:86意味著1986,30意味著2030,99意味著1999,00是2000)

time也是以6位數(shù)字HHMMSS的格式被發(fā)送,其中HH是24小時制的時間,MM和SS都在0~59之間,當(dāng)后面沒有[GMT]參數(shù)的時候,以服務(wù)器本地時間為準(zhǔn),否則的話以格林威治時間為準(zhǔn)。

參數(shù)distribution是被包含在<>中的一串分類的新聞組。如果要將新聞組列出顯示出來中,需要先將參數(shù)中只有部分名稱的分類新聞組(比如:net在net.wombat中)與服務(wù)器上已有的同種類的新聞組進(jìn)行匹配,只有那些匹配成功的新的新聞組才能被列出。如果同時有多個符合條件的新聞組,需要將它們?nèi)苛谐觯⑶乙?lt;,>隔開。

注意:空的列表(比如:返回的文本僅包含結(jié)束符號<.>)也可能是有效的應(yīng)答,這表明當(dāng)前沒有有效的新聞組

3.7.2 應(yīng)答

231 list of new newsgroups follows

3.8 NEWNEWS命令

3.8.1 NEWNEWS

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

命令會列出在data時間后被newsgroups新聞組發(fā)布和接收的新聞的message-id。每行一個message-id,格式和它們被發(fā)送的格式一樣,最后以只包含一個點(diǎn)號鍵和一個換行鍵的一行結(jié)束。

data和time參數(shù)的格式和NEWGROUPS命令一樣

newsgroups參數(shù)表示新聞組名稱,如果含有<*>串,意味著要在部分或者全部的新聞組中進(jìn)行搜索。當(dāng)newsgroups中部分的含有<*>時會被擴(kuò)展去進(jìn)行新聞組的匹配(如:net.macro*會被擴(kuò)展后去匹配net.micro.wombat, net.micro.apple等等),如果只含有<*>時意味著要與所有的新聞組名稱進(jìn)行匹配。

(請注意:<*>會被擴(kuò)展成任意的形式;但是特別的是,如net.*.unix的形式只會被擴(kuò)展成如net.wombat.unix或者net.whocares.unix的形式。)

相反的,如果newsgroups中沒有出現(xiàn)<*>號,則只會在newsgroups中指定的新聞組中查找新聞。只能在服務(wù)器返回的有效新聞組列表中選擇新聞組。命令中可以含有多個新聞組名稱,它們以逗號<,>隔開。如果一個新聞組名稱后沒有逗號跟隨意味著這是命令中的最后一個新聞組了。[實(shí)現(xiàn)的時候要注意命令行最大長度只有512字節(jié)的限制]

感嘆號<!>意味著不對某些特定的新聞組進(jìn)行匹配,如” net.*,mod.*,!mod.map.*”意味著要匹配net.*和mod.*,但是不對mod.map.*的形式進(jìn)行匹配。感嘆號必須出現(xiàn)在給定的不需要進(jìn)行匹配的新聞組部分或全部名稱的第一個字母的前面。

參數(shù)distribution是被包含在<>中的一串分類的新聞組。如果要將新聞組列出顯示出來中,需要先將參數(shù)中只有部分名稱的分類新聞組(比如:net在net.wombat中)與服務(wù)器上已有的同種類的新聞組進(jìn)行匹配,只有那些匹配成功的新的新聞組才能被列出。如果同時有多個符合條件的新聞組,需要將它們?nèi)苛谐觯⑶乙?lt;,>隔開

至此使用IHAVE,NEWNEWS和NEWGROUPS命令分發(fā)新聞已經(jīng)在前面的文檔中討論過了

注意:空的列表(比如:返回的文本僅包含結(jié)束符號<.>)也可能是有效的應(yīng)答,這表明當(dāng)前沒有有效的新聞組

3.8.2 應(yīng)答

230 list of new articles by message-id follows

3.9 NEXT命令

3.9.1 NEXT

NEXT

默認(rèn)的”當(dāng)前文章“會被更新為當(dāng)前新聞組的下一篇文章。如果新聞組中已經(jīng)沒有更多的文章的時候會返回一個錯誤,但是當(dāng)前文章仍舊被選中。

這個命令可以設(shè)置默認(rèn)的”當(dāng)前文章“

指令的應(yīng)答包括當(dāng)前文章的號碼,message-id。但是沒有文本應(yīng)答返回。

3.9.2 應(yīng)答

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

如果文章被語序發(fā)布,服務(wù)器會返回340,要求客戶端傳送文章。如果服務(wù)器返回的是440,則表示文章被過濾規(guī)則禁止發(fā)布了。

如果文章被允許發(fā)布,則這篇文章的格式必須符合RFC850中規(guī)定的標(biāo)準(zhǔn),并且文章必須包含有所得頭部項(xiàng)。當(dāng)文章的頭部和主體都被完全發(fā)送的時候,服務(wù)器會返回一個應(yīng)答,表示發(fā)送是否成功。

客戶端的文檔的頭部和主題的發(fā)送格式必須和服務(wù)器的發(fā)送格式一樣:一個只含有單個點(diǎn)號<.>的行意味著文章的結(jié)束;如果文章一行的開頭有點(diǎn)<.>號,則在這個點(diǎn)號<.>前再加一個點(diǎn)號<.>。

服務(wù)器不會嘗試過濾字符,折疊或者限制文本行,或者其他的一些處理上傳文章的方法。我們建議服務(wù)器僅僅是將上傳的消息傳送給本文沒有討論的服務(wù)器新聞發(fā)布軟件。閱讀RFC850可以獲得更多的詳細(xì)資料。

因?yàn)楹芏鄬?shí)現(xiàn)要求客戶端新聞程序允許用戶使用一些文本編輯器編輯新聞,并且當(dāng)編輯完成以后再上傳給服務(wù)器,所以客戶端程序會關(guān)注連接剛剛建立時的命令消息,以確定客戶端是否允許向該服務(wù)器發(fā)布新聞,如果不允許發(fā)布,會向用戶發(fā)出警告,告訴他在該服務(wù)器上他只有讀的權(quán)限。這樣子,就能阻止用戶花了時間去編輯新聞卻發(fā)現(xiàn)無法發(fā)布的情況的發(fā)生。客戶端和主機(jī)間如何進(jìn)行發(fā)布的方法是由具體實(shí)現(xiàn)決定的,本文并沒有任何隱瞞。

3.10.2 應(yīng)答

240 article posted ok
340 send article to be posted. 以 <CR-LF><.><CR-LF>結(jié)束
440 posting not allowed
441 posting failed

(從前面可以知道,當(dāng)連接剛剛建立的時候,服務(wù)器會返回下面其中之一的一個應(yīng)答以確定服務(wù)器是否允許客戶端發(fā)布新聞:)
200 server ready - posting allowed
201 server ready - no posting allowed)

3.11 QUIT命令

3.11.1 QUIT

QUIT

服務(wù)器接受QUIT命令并且關(guān)閉和客戶端的連接。這是客戶端最好的完成連接事務(wù)并且關(guān)閉和服務(wù)器連接的方法。

如果客戶端只是簡單的斷開連接(可能是超時,或者發(fā)生其他錯誤),服務(wù)器會正確的關(guān)閉它和客戶端的連接。

3.11.2 應(yīng)答

205 closing connection - goodbye!

3.12 SLAVE命令

3.12.1 SLAVE

SLAVE

這個命令是告訴服務(wù)器這個客戶端連接是一個輔助服務(wù)器而不是一個用戶。

這個命令用戶區(qū)分用戶連接和輔助服務(wù)器連接。當(dāng)服務(wù)器可能有多個客戶端連接的時候,這個命令會要求服務(wù)器給予某個服務(wù)器更高的優(yōu)先權(quán)。當(dāng)服務(wù)器負(fù)荷太大需要釋放部分連接時,這個命令會使服務(wù)器優(yōu)先選擇輔助服務(wù)器。實(shí)際上,這個命令的使用完全取決具體的實(shí)現(xiàn),在一些沒有優(yōu)先權(quán)的NNTP服務(wù)器中,這個命令更本不會被接受。

3.12.2 應(yīng)答

202 slave status noted

4.  樣例

下面是一些可能的協(xié)議連接樣例。符號C:表示這個命令是從客戶端發(fā)往服務(wù)器端。符號S:表示這個是從服務(wù)器發(fā)往客戶端的應(yīng)答。

4.1 NEXT命令的連接

S:      (監(jiān)聽TCP119端口)

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

(客戶端請求當(dāng)前新聞組列表)
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>)

(客戶端檢查標(biāo)題)
C:      HEAD
S:      221 10110 <23445@sdcsvax.ARPA> article retrieved - head
        follows (文章標(biāo)題)
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:      (監(jiān)聽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:      (監(jiān)聽TCP119端口)

C:      (要求連接TCP119端口)
S:      200 Imaginary Institute News Server ready (允許發(fā)布)

(客戶端 要求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:      (監(jiān)聽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 因?yàn)椴僮髡埱笾袛?o:p>

S:      (監(jiān)聽TCP119端口)

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

        (假設(shè)是一般的會話,并且新聞組已經(jīng)被選定)

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:      (傳送文章頭部的過程因?yàn)橐粋€操作請求被中斷了。接下來的操作無需客戶端的干涉)

S:      (一個只包含兩個<CR-LF>的行做為傳輸?shù)慕Y(jié)束)
S:      .
S:      400 Connection closed by operator.  Goodbye.
S:      (closes connection)

4.6 使用新聞服務(wù)器在系統(tǒng)間傳輸數(shù)據(jù)

S:      (監(jiān)聽TCP119端口)

C:      (要求連接TCP119端口)
S:      201 Foobar NNTP server ready (拒絕發(fā)布)

(客戶端需要1985年5月15號2點(diǎn)以后創(chuàng)建的新聞組)
C:      NEWGROUPS 850515 020000
S:      235 New newsgroups since 850515 follow
S:      net.fluff
S:      net.lint
S:      .

(客戶端需要1985年5月15號2點(diǎn)以后所有新聞組發(fā)布的新聞)
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:      (發(fā)送全部的信息)
S:      .

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

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

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

(客戶端向服務(wù)器說明最近收到的文章)
C:      IHAVE <4106@ucbvax.ARPA>
S:      335 News to me!  <CRLF.CRLF> to end.
C:      (發(fā)送文章)
C:      .
S:      235 Article transferred successfully.  Thanks.

(或者)

S:      436 Transfer failed.

(客戶端斷開連接)
C:      QUIT
S:      205 Foobar NNTP server bids you farewell.

4.7 命令和應(yīng)答摘要

接下來是被NNTP服務(wù)器認(rèn)證的命令及服務(wù)器返回的應(yīng)答

4.7.1 命令

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

4.7.2 應(yīng)答

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>結(jié)束
340 send article to be posted. 以 <CR-LF><.><CR-LF>結(jié)束

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 一份關(guān)于USENET新聞系統(tǒng)的文字摘要

在UNIX世界中,傳統(tǒng)上的網(wǎng)絡(luò)連接被建立在1200波特率的電話線上,USENET新聞系統(tǒng)被發(fā)展成能處理中央存儲,索引,取回,和分發(fā)新聞。做為一個和UUCP根本上不一樣的傳輸機(jī)制,USENET是一個能為使用UNIX及其他不同系統(tǒng)的用戶提供新聞和公告服務(wù)的系統(tǒng)。USENET新聞系統(tǒng)已經(jīng)在RFC850中被詳細(xì)討論過了。它適用于幾乎全部的UNIX系統(tǒng)和很多其他操作系統(tǒng),并且可以被任意發(fā)布。

USNET文件系統(tǒng)使用UNIX主機(jī)的一個SPOOLING(譯者注:一種虛擬打印機(jī)算法)存儲池來存放新聞文章,每篇文章一個文件。每篇文章都有一個文章頭部,包含著文章發(fā)送者的簽名和他的組織關(guān)系,日期,回復(fù)電郵地址,主題,新聞組(按主題分類)等等。下面有一篇完整的文章的副本。請按靠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.  參考文獻(xiàn)

[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是貝爾實(shí)驗(yàn)室的注冊商標(biāo)。

注:這是我翻譯的第一篇RFC文檔,計算機(jī)網(wǎng)絡(luò)在中國越來越變的熱門。但是因?yàn)殛P(guān)鍵的技術(shù)文檔全是英文的,使很大一部分程序工程師不能進(jìn)入其中。本人翻譯RFC文章不僅是因?yàn)楣ぷ餍枰彩窍胧垢嗟娜肆私庥嬎銠C(jī)網(wǎng)絡(luò)技術(shù),任何人都可以轉(zhuǎn)載或者發(fā)布這篇文章,因?yàn)槭堑谝淮畏g,如有錯誤,請通知我,我的郵箱是:ghbxx2004@yahoo.com.cn