網(wǎng)絡工作組 Brian Kantor (U.C. San Diego)
Request for Comments: 977 Phil Lapsley (U.C. Berkeley)
1986年2月
網(wǎng)絡新聞傳輸協(xié)議
網(wǎng)絡新聞傳輸?shù)幕緲藴?o:p>
備忘錄描述
NNTP定義了一個可以在ARPA網(wǎng)絡中進行可靠的新聞傳輸?shù)幕緟f(xié)議,其中包括新聞的分發(fā),查詢新聞,獲取新聞,發(fā)布新聞等。在NNTP中,所有的新聞被存儲在一個中央數(shù)據(jù)庫中,并且允許訂閱用戶僅僅閱讀那些他們關心的新聞,此外,該協(xié)議還提供新聞的索引,前后文參照,刪除過期的文章等功能。這篇備忘錄僅僅提供了一個在ARPA網(wǎng)絡上傳輸新聞的協(xié)議草案,希望有更多的人能夠參與討論,并且提供更好的建議。本備忘錄可以被任意復制和修改。
1. 導言
多年以前,ARPA網(wǎng)絡就已經(jīng)支持公告,資料和數(shù)據(jù)在數(shù)以千計的網(wǎng)絡使用者中進行及時的傳播,我們稱之為“新聞組”,它被用來及時的傳播那些共同感興趣的事物,比如軟件的錯誤,新產(chǎn)品的討論,尖端技術和關鍵設計,此外還可以討論那些專業(yè)的計算機工作者所關心的問題。“新聞組”在它的使用者中正越來越流行。
現(xiàn)在有兩種實現(xiàn)“新聞組”的技術:網(wǎng)絡郵件系統(tǒng),和USENET新聞組系統(tǒng)。
1.1 網(wǎng)絡郵件系統(tǒng)
網(wǎng)絡郵件系統(tǒng)中有一個已經(jīng)訂閱了這個新聞組的所有用戶的電子郵件地址列表和回復列表。系統(tǒng)會給列表上的每一個郵箱發(fā)送一份新聞的拷貝。當列表中有過多的地址時,這種方式是很低效的,因為發(fā)送給訂閱者郵件會占用大量的帶寬,CPU資源和目的主機的磁盤空間,并且系統(tǒng)自身的維護也是一個大問題如:用戶從一個主題換到其他的主題;新用戶的加入和老用戶的離開;服務器服務內(nèi)容的增加,減少。
1.2 USENET新聞組系統(tǒng)
克服網(wǎng)絡郵件系統(tǒng)耗費資源的方法就是將新聞存放在中央數(shù)據(jù)庫而不是訂閱者的郵箱里面。USENET系統(tǒng)正是這樣做的,它將新聞存放在一個中央存儲庫中(往往是一些分門別類的目錄),提供一個程序允許訂閱者僅僅閱讀那些他們關心的新聞,此外,還提供新聞的索引,前后文參照,刪除過期的文章等功能
1.3 中央存儲庫
因為有大量的主機同時通過快速局域網(wǎng)(往往是以太網(wǎng))連接上存儲庫,所以它被設計成能跟好的把新聞發(fā)送到一個或多個主機上面,并且允許進行服務器/客戶端模式的連接訪問。
1.4 中央新聞服務器
要做到這樣高效的實現(xiàn)需要一個中央計算機系統(tǒng)為局域網(wǎng)上的其他系統(tǒng)提供新聞服務。這樣的一個系統(tǒng)就是新聞服務器,它所要做的就是進行新聞和新的索引的搜集,使網(wǎng)絡上的每個讀者都能及時的讀到新聞公告。因為存在眾多的服務器,這種存儲方式是很有效的。同樣,這允許工作站用較少的存儲空間參與新聞組,不存在由于下載大量的消息而對磁盤空間造成的壓力。
我們聽到了使用IBIS,分布式或者網(wǎng)絡文件系統(tǒng)作為中央服務器的傳聞。當分布式的服務器工作在一組運行著相同操作系統(tǒng)的配置差不多的計算機上的時候確實表現(xiàn)良好,但是不同的客戶端,特別是不同操作系統(tǒng)上的客戶端要求連接時,就不能接受了。現(xiàn)在幾乎沒有(或許有)分布或者網(wǎng)絡文件系統(tǒng)可以提供一般的TCP連接服務,特別是考慮到存在很多不同硬件體系和不同操作系統(tǒng)的情況。
NNTP定義了一個基于可靠連接(使用TCP)的,客戶/服務器模式的,可以發(fā)送、查詢、獲取、發(fā)布新聞組文章的協(xié)議。新聞僅需存放在一個中央數(shù)據(jù)庫中,用戶在其他的主機上通過LAN連接到新聞組服務器主機上,就可以讀取新聞消息。
NNTP的新聞文章(文本)規(guī)范模型在RFC850中定義,那描述了USENET新聞組系統(tǒng)。無論如何,NNTP在組織結構、內(nèi)容、新聞文章的存儲方面處理滿足了一些要求。因此我們相信他能夠輕易的匹配其他的非USENET新聞組系統(tǒng)。
具有特色的是,NNTP服務器在主機上以后臺模式運行,而且可以接受來自LAN上其他主機的連接請求。并能工作在由幾個計算機組成的小系統(tǒng)(比如工作站),以及大的中心系統(tǒng)中。
1.5 輔助新聞服務器
在有很多用戶和機器的情況下(或許是大學或者大的工業(yè)機構),輔助新聞服務器會被使用。這種服務器,或者叫做“奴隸”(譯者注:原文如此)服務器工作在各自的計算機系統(tǒng)中,為本地用戶提供可靠的新聞組閱讀請求的中轉和提供最新的新聞組文章緩存。
具有代表性的是,當一個客戶端要獲得新聞組服務的時候,會首先和當?shù)氐男侣劷M服務端口建立連接,如果連接失敗則表示這個服務器有問題。這時,輔助新聞服務器會選擇是關閉新聞服務,還是允許局域網(wǎng)上的主機去和主新聞服務器進行連接。
在工作站或者其他小的系統(tǒng)上,直接連接到主服務器也許是正常的操作方式。
這份規(guī)范并不適用于輔助新聞服務器,我們僅建議在大型的局域網(wǎng)上合理的增加NNTP服務器作為從屬服務器來提高系統(tǒng)運轉性能
1.6 新聞組的發(fā)送
NNTP使用命令行提供一個在協(xié)作的多個主機間交換信息(文章項目)的簡單方法。一個想得到新聞組文章的拷貝并且已經(jīng)與局域網(wǎng)或者其他高速網(wǎng)絡建立連接的主機會發(fā)現(xiàn)NNTP使用了比傳統(tǒng)的傳送方法(比如UUCP,譯者注:UNIX間的文件拷貝)更高效的新聞發(fā)送方法。
在傳統(tǒng)的新聞傳送方法中,新聞從一個主機發(fā)送給所有他知道的主機,這些主機再把文章轉發(fā)給所有他知道的主機,就像水流一樣。顯然,這種使已經(jīng)得到新聞的主機再次接收無用新聞的方法會浪費時間和通信資源,但是因為這種傳送機制是基于單向事務而非交互式(比如UNIX世界中的UUCP),文章僅僅是單向的被發(fā)送,然后接收主機簡單的丟棄掉重復的文章,所以發(fā)送時間被減少了。這在通信協(xié)議被限制的年代確實是一個正確的選擇。
使用NNTP,主機間交換新聞組文章使用一個交互機制以決定文章是否應該傳送。當主機希望得到最新的消息,或者要需要發(fā)送新消息時,會使用NNTP向周圍的一個或多個主機進行聯(lián)系。第一個動作會詢問,在對方主機上是否有新的新聞組(使用NEWGROUPS命令創(chuàng)建),如果有新的新聞組,并且是適當?shù)幕蛐枰S本地站點的規(guī)定而定)的群組,那么就建立新的同樣的新聞組。
客戶端會向服務器詢問所有的或者那些它所關注的新聞組是否收到新文章,這使用NEWNEWS命令。它會收到一個從服務器發(fā)來的新文章的列表,并且客戶端可以請求服務器傳送那些客戶端選中的并且沒有的文章。
最后,客戶端告訴服務器那些它最近一次接收到的新文章,服務器會指出哪些文章它已經(jīng)有拷貝了,哪些文章需要客戶端傳輸給服務器,以增加服務器的收藏。
在這種方式中,只有那些沒有得到過副本的和希望請求得到的文章會被發(fā)送。
2. NNTP協(xié)議規(guī)范
2.1 總論
這個新聞組說明文檔定義了使用TCP連接和類似于SMTP的指令和應答的規(guī)范。它接受來自主機的連接,并為新聞組數(shù)據(jù)庫提供一個簡單的操作界面。
這種服務器只有程序和新聞組數(shù)據(jù)庫間的一個界面,他不和任何用戶進行交互,也沒有用戶層次的函數(shù),這種“用戶界面友好的”函數(shù)最好放在客戶端中,以便對它們的工作的環(huán)境有一個更好的理解。
在通過(使用)Internet TCP協(xié)議連接時,為這個服務分配的端口是:119
2.2 字符編碼
命令和應答都使用ASCII字符集,當使用8比特字節(jié)傳送時,低7位正常傳送數(shù)據(jù),最高位清0。
2.3 命令
命令由一系列命令單詞組成,有時候還要跟一些參數(shù)。命令參數(shù)必須由一個或多個空格或TAB鍵隔開。一個命令行必須包含完整包含所有必需的參數(shù),并且只能包含一個命令。
指令和參數(shù)都不區(qū)分大小寫。簡單的說,就是一個指令和參數(shù)字符可以用大寫,也可以用小寫,或者大小寫混合。
每個命令行必須以一對回車換行符(CR-LF)結束。
每個命令行長度不能超過 512個字符,包括空格、分隔符、標點符號,和回車換行符(因此命令和參數(shù)字符的長度實際上最多只有510個字符)。不接受超出長度規(guī)定的命令行。
2.4 應答
應答有兩種:文本和狀態(tài)。
2.4.1 文本應答
文本只有在指出后面有文本跟隨的數(shù)字狀態(tài)應答行被發(fā)送后發(fā)送。文本是按原文 內(nèi)容按行連續(xù)發(fā)送,用回車換行符(CR-LF)結束。一個僅包含一個句點(.)的單行表示文本結束(服務器將在文本最后一行后面發(fā)送一個回車換行符。一個句點.和一個回車換行)。
如果該行文本原文的第一行是一個.號,那么會在.號前再加一個.號然后發(fā)送。因此,客戶端必須檢查接收的每一行的第一個字符是否是句點符號(.),以判斷它是一個文本結束還是將兩個(多的)句點改成一個。
文本信息一般會在客戶終端上被顯示,然而命令/狀態(tài)應答必須在客戶端程序處理后才能被按要求顯示。
2.4.2 狀態(tài)應答
狀態(tài)應答來自服務器,是服務器對上一條指令的執(zhí)行情況的反饋。
狀態(tài)應答由3個足可以區(qū)別不同狀態(tài)應答的數(shù)字組成,它們中的一些是后來發(fā)送的文本信息的先兆。
應答的第一個數(shù)字廣泛的代表了,成功、錯誤,和正在執(zhí)行上一條指令。
1xx - 資料消息
2xx - 指令正常
3xx - 指令至今為止正常,發(fā)送指令的其余部分
4xx - 指令正確,但由于一些原因不能完成功能
5xx - 指令不能執(zhí)行、錯誤,或者發(fā)生了嚴重的程序錯誤
應答的第二個數(shù)字表示應答種類的具體功能
x0x - 連接、設置,和各類其他信息
x1x - 新聞組(主題)選擇
x2x - 文章(條目)選擇
x3x - 發(fā)送功能
x4x - 上貼
x8x - 非標準的擴展
x9x - 調(diào)試輸出
精確的狀態(tài)應答是由具體的命令決定的。另外,下面將要列出一些常規(guī)的,被認為在任何情況下都會收到的應答編碼集合。
一些狀態(tài)應答包含一些由字符或數(shù)字組成的參數(shù),這些參數(shù)是固定的,是對應答代碼的簡單解釋。
參數(shù)要被數(shù)字的響應碼,或一個空格分隔開。所有的數(shù)字的參數(shù)都以十進制表示,而且第一位可以是零。所有的文本參數(shù)在單獨的空格后面開始,并在下一個空格或一行結束的回車換行后結束(文本參數(shù)可以沒有,會包含空格)。所有的文本,即使在應答中沒有參數(shù)也要在上一個參數(shù)由空格分隔。同樣,在一個應答數(shù)字后面的文本記錄可以在不同的服務器上有不同。3 位數(shù)字代碼將決定應該發(fā)送什么應答。
對任何其他種類的附加指令響應代碼在這個標準中不作詳細說明。那些應該選擇符合 x8x 定義的規(guī)范的范圍(注意:調(diào)試代碼是在 x9x應答代碼中有明確的規(guī)定)。在標準指令中使用非標準的響應代碼是被禁止的。
如果在調(diào)試中要使用x9x響應模式。那么之后的調(diào)試輸出都歸為“資料消息”一類,可以認為,因此在從190到199的響應中都可以使用來作為各種調(diào)試輸出。在本規(guī)范中對調(diào)試輸出沒有要求,但如果是對已連接的流測試,它們將用到這些代碼。如果需要適當?shù)膱?zhí)行細節(jié),那么在調(diào)試時可以使用其他的x9x代碼。(有一個例子,代碼290將答復一個遠程調(diào)試請求)
2.4.3基本應答
下面列出了由 NNTP服務器發(fā)送的常規(guī)應答代碼。它們不具體的針對某一個指令,但返回一個表示連接、錯誤,或特殊情況的結果。
通常,1xx 代碼是可以不理會和不顯示的;代碼 200 或 201 是在首次連接到NNTP服務器確認上貼許可時發(fā)送;代碼 400 將在NNTP服務器停止服務是發(fā)送(如,操作人員要求);5xx 代碼表示由于一些不尋常的原因,指令不能執(zhí)行。
100 幫助文本
190
through (譯者注:不知道什么意思,所以沒翻譯)
199 調(diào)試輸出
200 服務器準備好 - 允許上帖
201 服務器準備好 - 不允許上帖
400 服務器停止
500 指令不可辨認
501 指令語法錯誤
502 訪問限制或拒絕許可
503 程序錯誤 - 指令沒有執(zhí)行
3. 命令和應答的詳細資料
在接下來的篇幅中會詳細介紹在NNTP服務中公認的命令這些命令的應答。
每一個命令都會有一個清楚的示例,雖然示例并不能很充分的說明NNTP命令。任何參數(shù)都是小寫。如果一個參數(shù)包含在一個[]中,說明這個參數(shù)是可選的,如:[GMT]說明參數(shù)GMT可能會在命令中出現(xiàn),也可能不會。
在這里討論的每一個命令都可以被所有的NNTP服務器接受。
我們不反對增加額外的附加指令;但是推薦在任何一種附加指令前加入字母“X”以避免和本規(guī)范的后續(xù)版本沖突。
程序可以提示附加指令可以不重新定義狀態(tài)響應代碼。但禁止對標準指令使用其他非標準響應碼。
3.1 ARTICLE, BODY, HEAD, 和 STAT命令
ARTICLE有兩種格式(BODY, HEAD, 和 STAT命令也一樣),每一種格式用各自的方法對可以被檢索到的文章進行了詳細說明。當ARTICLE命令后面跟著<message-id >形式的參數(shù)時,使用的是第一種格式,當ARTICLE命令后面只跟著一個數(shù)字參數(shù)或者沒有參數(shù)的時候,使用的是第二種格式。
這篇文章會以文本應答的形式返回,文章的基本描述會出現(xiàn)在文檔的稍早處。
BODA和HEAD命令和ARTICLE是一樣的,只是他們分別返回文章的的標題和正文。
STAT命令除了沒有文本返回以外和ARTICLE命令是相似的。當選中一條新聞組中的消息號碼時,STAT命令就會把這個消息號碼對應的文章設置成“當前文章”,但是不要求服務器返回這篇文章。服務器要返回的是一個message-id。使用STAT命令選擇一個message-id也是可以的,但是對于有問題的message-id,這樣的選擇不會改變“當前文章”。
3.1.1 ARTICLE(跟著message-id)
ARTICLE <message-id>
客戶終端上顯示的是:文章標題,一個空行,文章的主體。Message-id是出現(xiàn)在文章頭部的關于這篇文章的一個序列號。它可以來自用戶使用NEWNEWS命令創(chuàng)建的一個列表中,也可以來自其他文章,或者其他命令所返回的應答中。
請注意在內(nèi)部已經(jīng)確定的“當前文章”在使用這個命令時是不會被改變的。這樣子做不但是為了使那些被其他文章引用的文章更容易被閱讀,而且解決了為了確定可能發(fā)送給多個新聞組的文章的正確的順序和資格所遇到的語義上的困難。
3.1.2 ARTICLE(跟著數(shù)字)
ARTICLE [nnn]
客戶終端上顯示的是:文章標題,一個空行,文章的主體。Message-id是出現(xiàn)在文章頭部的關于這篇文章的一個序列號。參數(shù)nnn是當前新聞組中一篇文章的序列號,并且只能在被選中的新聞組中選擇,缺省的情況下默認選擇當前文章。
如果有效的文章號碼被指定,那么內(nèi)部的“當前文章”可以由這個指令設定。
[下面的適用于所有的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
必須的參數(shù)ggg是被選中的新聞組的號碼(比如:"net.news"),一個正確的新聞組列表可以由LIST命令生成。
正確的選擇應答會返回新聞組中第一篇和最后一篇文章的號碼,新聞組中文章數(shù)目的一個估計。這個估計不一定是正確的,雖然它和有用;估計值必須大于,等于新聞組中實際的文章數(shù)目。(一些程序的實現(xiàn)會去數(shù)新聞組中實際的文章數(shù)目,還有一些知識簡單的將最后一篇文章的號碼減去第一篇文章的號碼的值作為文章數(shù))
當選中了一個新聞組的時候,這個組中被內(nèi)部指定的”當前文章“會被設置成這個組中的第一篇文章,如果又選中了一個組,那么先前被選中的組和”當前文章“還是繼續(xù)處于選中狀態(tài)。如果一個空的組被選中,那么中被內(nèi)部指定的”當前文章“處于不確定狀態(tài),并且不會被使用。
注意:新聞組的名稱不是隨意的,它必須和由LIST命令產(chǎn)生的列表中某個新聞組名稱匹配,否則會返回錯誤。
3.2.2 應答
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
該命令提供了一個在新聞組服務器上可以被正確理解并執(zhí)行的命令列表。幫助文檔會問文本應答的方式返回。
3.3.2 應答
100 help text follows
3.4 IHAVE命令
3.4.1 IHAVE
IHAVE <messageid>
客戶端使用IHAVE命令告訴服務器,它有一篇序列號為messageid的文章。如果服務器想要這篇文章的拷貝,它會返回一個應答要求客戶端上傳完整的文章;如果服務器不需要(比如:服務器已經(jīng)存在這篇文章的拷貝了),它會返回一個應答告訴客戶端不需要這篇文章。
如果文章被要求傳送,客戶端會把完整的文章發(fā)送給服務器,內(nèi)容包括標題和主體,來自服務器的文章傳輸格式的詳細描述(譯者注:這就可能會有問題,原文in the manner specified for text transmission from the server)。服務器會返回傳輸是否成功的應答。
這個命令與POST命令的區(qū)別在于它是有意的在主機間進行已發(fā)布的文章傳輸。一般情況下它不會再個人新聞閱讀程序中被使用。特別的是,這個命令會調(diào)用服務器的新聞發(fā)布程序進行一些適當?shù)脑O置(如:標志,操作等等)以指出即將來臨的文章來自其他的主機。
如果服務器在后來對文章的檢查中發(fā)現(xiàn)不值得發(fā)布或傳輸一些文章,它會選擇停止發(fā)布或者傳輸這些文章。這個時候,它會返回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
實現(xiàn)時應該注意的:
因為一些新聞組發(fā)布軟件無法實時的判定文章是否已經(jīng)不適于發(fā)布和傳送,它可能先返回一個傳輸成功的應答,隔了點時間后再返回一個傳輸失敗的應答。因此允許服務器首先返回235應答,過了端時間后又返回傳輸失敗應答。這也許不是問題滿意的解決方法。一些實現(xiàn)希望發(fā)送一封郵件給文章的作者,以確定是否應該失敗。
3.5 LAST命令
3.5.1 LAST
LAST
內(nèi)部指定的“當前文章”被設置為當前新聞組的上一篇文章,如果已經(jīng)是這個新聞組的第一篇文章了,服務器就會返回一個錯誤應答,并且當前文章仍舊被選中。
這個命令可以設置內(nèi)部指定的“當前文章”。
指令的應答包括當前文章的號碼,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
命令返回一個新聞組及其相關信息的列表,每個新聞組作為一行文本被發(fā)送,格式如下:
group last first p
其中group為新聞組名稱,last為當前新聞組已知的最后一篇文章的號碼,first為當前新聞組已知的第一篇文章的號碼,p要么是’y’,要么是’n’,分別表示允許’y’/禁止’n’發(fā)布新聞組。
first和last選項都是數(shù)字,并且可能有前置0。如果last小于等于first的話表示在當前新聞組中沒有文件存在。
注意:一些新聞組會禁止向一個客戶端發(fā)布新聞,即使LIST命令顯示這個新聞組是允許發(fā)布新聞的。具體的要查看POST命令對禁止向客戶端發(fā)布新聞的解釋。發(fā)布標志存在于每個新聞組中,因為一些新聞組有特殊的限制(譯者注:原文為are moderated or are digests),因此無法向這些新聞組發(fā)布新聞,為此,我們要發(fā)郵件給那些可以把新聞直接提交上去的人,讓他們?nèi)グl(fā)布新聞。NNTP服務器向客戶端發(fā)布新聞的許可不受限制。
注意:空的列表(比如:返回的文本僅包含結束符號<.>)也可能是有效的應答,這表明當前沒有有效的新聞組。
3.6.2 應答
215 list of newsgroups follows
3.7 NEWGROUPS命令
3.7.1 NEWGROUPS
NEWNEWS newsgroups date time [GMT] [<distribution>]
命令會返回一個在date time時間后被創(chuàng)建的新聞組列表,表達格式和LIST命令返回的鏈表一樣。
data選項會以6位數(shù)字YYMMDD的格式被發(fā)送,YY是年份中最后的兩個數(shù)字,MM是可能包含前置0的月份信息。DD是這個月中的哪一天(可能會有前置0),最近的世紀被人問是年份的一部分(如:86意味著1986,30意味著2030,99意味著1999,00是2000)
time也是以6位數(shù)字HHMMSS的格式被發(fā)送,其中HH是24小時制的時間,MM和SS都在0~59之間,當后面沒有[GMT]參數(shù)的時候,以服務器本地時間為準,否則的話以格林威治時間為準。
參數(shù)distribution是被包含在<>中的一串分類的新聞組。如果要將新聞組列出顯示出來中,需要先將參數(shù)中只有部分名稱的分類新聞組(比如:net在net.wombat中)與服務器上已有的同種類的新聞組進行匹配,只有那些匹配成功的新的新聞組才能被列出。如果同時有多個符合條件的新聞組,需要將它們?nèi)苛谐觯⑶乙?lt;,>隔開。
注意:空的列表(比如:返回的文本僅包含結束符號<.>)也可能是有效的應答,這表明當前沒有有效的新聞組
3.7.2 應答
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ā)送的格式一樣,最后以只包含一個點號鍵和一個換行鍵的一行結束。
data和time參數(shù)的格式和NEWGROUPS命令一樣
newsgroups參數(shù)表示新聞組名稱,如果含有<*>串,意味著要在部分或者全部的新聞組中進行搜索。當newsgroups中部分的含有<*>時會被擴展去進行新聞組的匹配(如:net.macro*會被擴展后去匹配net.micro.wombat, net.micro.apple等等),如果只含有<*>時意味著要與所有的新聞組名稱進行匹配。
(請注意:<*>會被擴展成任意的形式;但是特別的是,如net.*.unix的形式只會被擴展成如net.wombat.unix或者net.whocares.unix的形式。)
相反的,如果newsgroups中沒有出現(xiàn)<*>號,則只會在newsgroups中指定的新聞組中查找新聞。只能在服務器返回的有效新聞組列表中選擇新聞組。命令中可以含有多個新聞組名稱,它們以逗號<,>隔開。如果一個新聞組名稱后沒有逗號跟隨意味著這是命令中的最后一個新聞組了。[實現(xiàn)的時候要注意命令行最大長度只有512字節(jié)的限制]
感嘆號<!>意味著不對某些特定的新聞組進行匹配,如” net.*,mod.*,!mod.map.*”意味著要匹配net.*和mod.*,但是不對mod.map.*的形式進行匹配。感嘆號必須出現(xiàn)在給定的不需要進行匹配的新聞組部分或全部名稱的第一個字母的前面。
參數(shù)distribution是被包含在<>中的一串分類的新聞組。如果要將新聞組列出顯示出來中,需要先將參數(shù)中只有部分名稱的分類新聞組(比如:net在net.wombat中)與服務器上已有的同種類的新聞組進行匹配,只有那些匹配成功的新的新聞組才能被列出。如果同時有多個符合條件的新聞組,需要將它們?nèi)苛谐觯⑶乙?lt;,>隔開
至此使用IHAVE,NEWNEWS和NEWGROUPS命令分發(fā)新聞已經(jīng)在前面的文檔中討論過了
注意:空的列表(比如:返回的文本僅包含結束符號<.>)也可能是有效的應答,這表明當前沒有有效的新聞組
3.8.2 應答
230 list of new articles by message-id follows
3.9 NEXT命令
3.9.1 NEXT
NEXT
默認的”當前文章“會被更新為當前新聞組的下一篇文章。如果新聞組中已經(jīng)沒有更多的文章的時候會返回一個錯誤,但是當前文章仍舊被選中。
這個命令可以設置默認的”當前文章“
指令的應答包括當前文章的號碼,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
如果文章被語序發(fā)布,服務器會返回340,要求客戶端傳送文章。如果服務器返回的是440,則表示文章被過濾規(guī)則禁止發(fā)布了。
如果文章被允許發(fā)布,則這篇文章的格式必須符合RFC850中規(guī)定的標準,并且文章必須包含有所得頭部項。當文章的頭部和主體都被完全發(fā)送的時候,服務器會返回一個應答,表示發(fā)送是否成功。
客戶端的文檔的頭部和主題的發(fā)送格式必須和服務器的發(fā)送格式一樣:一個只含有單個點號<.>的行意味著文章的結束;如果文章一行的開頭有點<.>號,則在這個點號<.>前再加一個點號<.>。
服務器不會嘗試過濾字符,折疊或者限制文本行,或者其他的一些處理上傳文章的方法。我們建議服務器僅僅是將上傳的消息傳送給本文沒有討論的服務器新聞發(fā)布軟件。閱讀RFC850可以獲得更多的詳細資料。
因為很多實現(xiàn)要求客戶端新聞程序允許用戶使用一些文本編輯器編輯新聞,并且當編輯完成以后再上傳給服務器,所以客戶端程序會關注連接剛剛建立時的命令消息,以確定客戶端是否允許向該服務器發(fā)布新聞,如果不允許發(fā)布,會向用戶發(fā)出警告,告訴他在該服務器上他只有讀的權限。這樣子,就能阻止用戶花了時間去編輯新聞卻發(fā)現(xiàn)無法發(fā)布的情況的發(fā)生。客戶端和主機間如何進行發(fā)布的方法是由具體實現(xiàn)決定的,本文并沒有任何隱瞞。
3.10.2 應答
240 article posted ok
340 send article to be posted. 以 <CR-LF><.><CR-LF>結束
440 posting not allowed
441 posting failed
(從前面可以知道,當連接剛剛建立的時候,服務器會返回下面其中之一的一個應答以確定服務器是否允許客戶端發(fā)布新聞:)
200 server ready - posting allowed
201 server ready - no posting allowed)
3.11 QUIT命令
3.11.1 QUIT
QUIT
服務器接受QUIT命令并且關閉和客戶端的連接。這是客戶端最好的完成連接事務并且關閉和服務器連接的方法。
如果客戶端只是簡單的斷開連接(可能是超時,或者發(fā)生其他錯誤),服務器會正確的關閉它和客戶端的連接。
3.11.2 應答
205 closing connection - goodbye!
3.12 SLAVE命令
3.12.1 SLAVE
SLAVE
這個命令是告訴服務器這個客戶端連接是一個輔助服務器而不是一個用戶。
這個命令用戶區(qū)分用戶連接和輔助服務器連接。當服務器可能有多個客戶端連接的時候,這個命令會要求服務器給予某個服務器更高的優(yōu)先權。當服務器負荷太大需要釋放部分連接時,這個命令會使服務器優(yōu)先選擇輔助服務器。實際上,這個命令的使用完全取決具體的實現(xiàn),在一些沒有優(yōu)先權的NNTP服務器中,這個命令更本不會被接受。
3.12.2 應答
202 slave status noted
4. 樣例
下面是一些可能的協(xié)議連接樣例。符號C:表示這個命令是從客戶端發(fā)往服務器端。符號S:表示這個是從服務器發(fā)往客戶端的應答。
4.1 NEXT命令的連接
S: (監(jiān)聽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: (監(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 因為操作請求中斷
S: (監(jiān)聽TCP119端口)
C: (要求連接TCP119端口)
S: 201 genericvax news server ready, no posting allowed.
(假設是一般的會話,并且新聞組已經(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: (傳送文章頭部的過程因為一個操作請求被中斷了。接下來的操作無需客戶端的干涉)
S: (一個只包含兩個<CR-LF>的行做為傳輸?shù)慕Y束)
S: .
S: 400 Connection closed by operator. Goodbye.
S: (closes connection)
4.6 使用新聞服務器在系統(tǒng)間傳輸數(shù)據(jù)
S: (監(jiān)聽TCP119端口)
C: (要求連接TCP119端口)
S: 201 Foobar NNTP server ready (拒絕發(fā)布)
(客戶端需要1985年5月15號2點以后創(chuàng)建的新聞組)
C: NEWGROUPS 850515 020000
S: 235 New newsgroups since 850515 follow
S: net.fluff
S: net.lint
S: .
(客戶端需要1985年5月15號2點以后所有新聞組發(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: .
(客戶端向服務器說明最近收到的文章)
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: (發(fā)送文章)
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新聞系統(tǒng)的文字摘要
在UNIX世界中,傳統(tǒng)上的網(wǎng)絡連接被建立在1200波特率的電話線上,USENET新聞系統(tǒng)被發(fā)展成能處理中央存儲,索引,取回,和分發(fā)新聞。做為一個和UUCP根本上不一樣的傳輸機制,USENET是一個能為使用UNIX及其他不同系統(tǒng)的用戶提供新聞和公告服務的系統(tǒng)。USENET新聞系統(tǒng)已經(jīng)在RFC850中被詳細討論過了。它適用于幾乎全部的UNIX系統(tǒng)和很多其他操作系統(tǒng),并且可以被任意發(fā)布。
USNET文件系統(tǒng)使用UNIX主機的一個SPOOLING(譯者注:一種虛擬打印機算法)存儲池來存放新聞文章,每篇文章一個文件。每篇文章都有一個文章頭部,包含著文章發(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. 參考文獻
[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文檔,計算機網(wǎng)絡在中國越來越變的熱門。但是因為關鍵的技術文檔全是英文的,使很大一部分程序工程師不能進入其中。本人翻譯RFC文章不僅是因為工作需要,也是想使更多的人了解計算機網(wǎng)絡技術,任何人都可以轉載或者發(fā)布這篇文章,因為是第一次翻譯,如有錯誤,請通知我,我的郵箱是:ghbxx2004@yahoo.com.cn