網絡工作組 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