Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標準協議。Telnet協議的目的是提供一個相對通用的,雙向的,面向八位字節的通訊方法,容許界面終端設備和麪向終端的過程能經過一個標準過程進行互相交互。應用Telnet協議可以把本地用戶所使用的計算機變成遠程主機系統的一個終端。服務器
Telnet協議具備以下的特色:網絡
1. 適應異構 併發
爲了使多個操做系統間的Telnet交互操做成爲可能,就必須詳細瞭解異構計算機和操做系統。好比,一些操做系統須要每行文本用ASCII回車控制符(CR)結束,另外一些系統則須要使用ASCII換行符(LF),還有一些系統須要用兩個字符的序列回車-換行(CR-LF);再好比,大多數操做系統爲用戶提供了一箇中斷程序運行的快捷鍵,但這個快捷鍵在各個系統中有可能不一樣(一些系統使用CTRL+C,而另外一些系統使用ESCAPE)。若是不考慮系統間的異構性,那麼在本地發出的字符或命令,傳送到遠地並被遠地系統解釋後極可能會不許確或者出現錯誤。所以,Telnet協議必須解決這個問題。tcp
爲了適應異構環境,Telnet協議定義了數據和命令在Internet上的傳輸方式,此定義被稱做網絡虛擬終端NVT(Net Virtual Terminal)。它的應用過程以下:編碼
2. 傳送遠地命令 spa
咱們知道絕大多數操做系統都提供各類快捷鍵來實現相應的控制命令,當用戶在本地終端鍵入這些快捷鍵的時候,本地系統將執行相應的控制命令,而不把這些快捷鍵做爲輸入。那麼對於Telnet來講,它是用什麼來實現控制命令的遠地傳送呢?操作系統
Telnet一樣使用NVT來定義如何從客戶機將控制功能傳送到服務器。咱們知道USASCII字符集包括95個可打印字符和33個控制碼。當用戶從本地鍵入普通字符時,NVT將按照其原始含義傳送;當用戶鍵入快捷鍵(組合鍵)時,NVT將把它轉化爲特殊的ASCII字符在網絡上傳送,並在其到達遠地機器後轉化爲相應的控制命令。將正常ASCII字符集與控制命令區分主要有兩個緣由:設計
3. 數據流向 code
將Telnet設計爲應用級軟件有一個缺點,那就是:效率不高。這是爲何呢?下面給出Telnet中的數據流向:進程
數據信息被用戶從本地鍵盤鍵入並經過操做系統傳到客戶機程序,客戶機程序將其處理後返回操做系統,並由操做系統通過網絡傳送到遠地機器,遠地操做系統將所接收數據傳給服務器程序,並經服務器程序再次處理後返回到操做系統上的僞終端入口點,最後,遠地操做系統將數據傳送到用戶正在運行的應用程序,這即是一次完整的輸入過程;輸出將按照同一通路從服務器傳送到客戶機。
由於每一次的輸入和輸出,計算機將切換進程環境好幾回,這個開銷是很昂貴的。還好用戶的鍵入速率並不算高,這個缺點咱們仍然可以接受。
4. 強制命令
咱們應該考慮到這樣一種狀況:假設本地用戶運行了遠地機器的一個無休止循環的錯誤命令或程序,且此命令或程序已經中止讀取輸入,那麼操做系統的緩衝區可能所以而被佔滿,若是這樣,遠地服務器也沒法再將數據寫入僞終端,而且最終致使中止從TCP鏈接讀取數據,TCP鏈接的緩衝區最終也會被佔滿,從而致使阻止數據流流入此鏈接。若是以上事情真的發生了,那麼本地用戶將失去對遠地機器的控制。
爲了解決此問題,Telnet協議必須使用外帶信令以便強制服務器讀取一個控制命令。咱們知道TCP用緊急數據機制實現外帶數據信令,那麼Telnet只要再附加一個被稱爲數據標記(date mark)的保留八位組,並經過讓TCP發送已設置緊急數據比特的報文段通知服務器即可以了,攜帶緊急數據的報文段將繞過流量控制直接到達服務器。做爲對緊急信令的相應,服務器將讀取並拋棄全部數據,直到找到了一個數據標記。服務器在遇到了數據標記後將返回正常的處理過程。
5. 選項協商
因爲Telnet兩端的機器和操做系統的異構性,使得Telnet不可能也不該該嚴格規定每個telnet鏈接的詳細配置,不然將大大影響Telnet的適應異構性。所以,Telnet採用選項協商機制來解決這一問題。
Telnet選項的範圍很廣:一些選項擴充了大方向的功能,而一些選項制涉及一些微小細節。例如:有一個選項能夠控制Telnet是在半雙工仍是全雙工模式下工做(大方向);還有一個選項容許遠地機器上的服務器決定用戶終端類型(小細節)。
Telnet選項的協商方式也頗有意思,它對於每一個選項的處理都是對稱的,即任何一端均可以發出協商申請;任何一端均可以接受或拒絕這個申請。另外,若是一端試圖協商另外一端不瞭解的選項,接受請求的一端可簡單的拒絕協商。所以,有可能將更新,更復雜的Telnet客戶機服務器版本與較老的,不太複雜的版本進行交互操做。若是客戶機和服務器都理解新的選項,可能會對交互有所改善。不然,它們將一塊兒轉到效率較低但可工做的方式下運行。全部的這些設計,都是爲了加強適應異構性,可見Telnet的適應異構性對其的應用和發展是多麼重要。
Telnet協議的主體由三個部分組成:
顧名思義,網絡虛擬終端(NVT)是一種虛擬的終端設備,它被客戶和服務器所採用,用來創建數據表示和解釋的一致性。
1. NVT的組成
網絡虛擬終端NVT包括兩個部分:
2. 在NVT上傳輸的數據格式
在網絡虛擬終端NVT上傳輸的數據採用8bit字節數據,其中最高位爲0的字節用於通常數據,最高位爲1的字節用於NVT命令
3. NVT在TELNET中的使用
TELNET使用了一種對稱的數據表示,當每一個客戶機發送數據時,把它的本地終端的字符表示影射到NVT的字符表示上,當接收數據時,又把NVT的表示映射到本地字符集合上。
在通訊開始時,通訊雙方都支持一個基本的NVT終端特性子集(只能區分何爲數據,何爲命令),以便在最低層次上通訊,在這個基礎上,雙方經過NVT命令協商肯定NVT的更高層次上的特性,實現對NVT功能的擴展。
在TELNET中存在大量的子協議用於協商擴展基本的網絡虛擬終端NVT的功能,因爲終端類型的多樣化,使得TELNET協議族變得龐大起來。
當定義了網絡虛擬終端設備後,通訊的雙方就能夠在一個較低的層次上實現數據通訊,但基本的NVT設備所具備的特性是十分有限的,它只能接收和顯示7位的ASCII碼,沒有最基本的編輯能力,因此簡單的NVT設備是沒有實際應用意義的;爲此TELNET協議定義了一族協議用於擴展基本NVT的功能,目的是使NVT可以最大限度地達到用戶終端所具備的功能。
爲了實現對多種終端特性的支持,TELNET協議規定在擴展NVT功能時採用協商的機制,只有通訊雙方經過協商後達成一致的特性才能使用,才能賦予NVT該項特性,這樣就能夠支持具備不一樣終端特性的終端設備能夠互連,保證他們是工做在他們本身的能力之內。
TELNET的操做協商使用NVT命令,即最高位爲1的字節流,每條NVT命令以字節IAC(0xFF)開始。原理以下:
只要客戶機或服務器要發送命令序列而不是數據流,它就在數據流中插入一個特殊的保留字符,該保留字符叫作「解釋爲命令」(IAC ,Interpret As Command) 字符。當接收方在一個入數據流中發現IAC字符時,它就把後繼的字節處理爲一個命令序列。下面列出了全部的Telnet NVT命令,其中不多用到。
表1 TELNET 命令
名稱 |
編碼 |
說明 |
EOF |
236 |
文件結束符 |
SUSP |
237 |
掛起當前進程 |
ABORT |
238 |
停止進程 |
EOR |
239 |
記錄結束符 |
SE |
240 |
子選項結束 |
NOP |
241 |
空操做 |
DM |
242 |
數據標記 |
BRK |
243 |
終止符(break) |
IP |
244 |
終止進程 |
AO |
245 |
終止輸出 |
AYT |
246 |
請求應答 |
EC |
247 |
終止符 |
EL |
248 |
擦除一行 |
GA |
249 |
繼續 |
SB |
250 |
子選項開始 |
WILL |
251 |
選項協商 |
WONT |
252 |
選項協商 |
DO |
253 |
選項協商 |
DONT |
254 |
選項協商 |
IAC |
255 |
字符0XFF |
其中經常使用的TELNET選項協商以下:
那麼對於接收方和發送方有如下幾種組合:
表2 TELNET 選項協商的六種狀況
發送者 |
接收者 |
說明 |
WILL |
DO |
發送者想激活某選項,接受者接收該選項請求 |
WILL |
DONT |
發送者想激活某選項,接受者拒絕該選項請求 |
DO |
WILL |
發送者但願接收者激活某選項,接受者接受該請求 |
DO |
DONT |
發送者但願接收6者激活某選項,接受者拒絕該請求 |
WONT |
DONT |
發送者但願使某選項無效,接受者必須接受該請求 |
DONT |
WONT |
發送者但願對方使某選項無效,接受者必須接受該請求 |
選項協商須要3個字節:IAC,而後是WILL、DO、WONT或DONT;最後一個標識字節用來指明操做的選項。經常使用的選項代碼以下:
表3 TELNET 選項代碼
選項標識 |
名稱 |
RFC |
1 |
迴應(echo) |
857 |
3 |
禁止繼續 |
858 |
5 |
狀態 |
859 |
6 |
時鐘標識 |
860 |
24 |
終端類型 |
1,091 |
31 |
窗口大小 |
1,073 |
32 |
終端速率 |
1,079 |
33 |
遠端流量控制 |
1,372 |
34 |
行模式 |
1,184 |
36 |
環境變量 |
1,408 |
一般狀況下,客戶機向服務器發送字符而服務器將其回顯到用戶的終端上,可是,若是網絡的時延回引發回顯速度太慢,用戶可能更願意讓本地系統回顯字符。在客戶機容許本地系統回顯前,它要向服務器發送如下序列:
IAC DONT ECHO
服務器收到請求後,發出3個字符的響應:
IAC WONT ECHO
表示服務器已經按請求贊成關閉回顯。
除了「打開」或「關閉」之外,有些選項還須要更多的信息,例如對於指明終端類型來講,客戶必須發送一個字符串來標識終端類型,因此要定義子選項協商。
RFC 1091定義了終端類型的子選項協商。舉個例子:
客戶發送字節序列來請求打開選項:
< IAC,WILL,24>
24是終端類型的選項標識符。若是服務器贊成該請求,響應爲:
< IAC,DO,24 >
接着服務器發送
< IAC,SB,24,1,IAC,SE>請求客戶給出其終端類型。
SB是子選項開始命令,下一個字節24表示該子選項爲終端類型選項。下一個字節1表示:發送你的終端類型。客戶的響應爲:
< IAC,SB,24,0,'I','B','M','P','C', IAC,SE>
第四個字節0的含義是「個人終端類型爲」。
整個協議軟件分爲三個模塊,各模塊的功能以下:
1. 與本地用戶的輸入/輸出模塊:處理用戶輸入/輸出;
2. 與遠地系統的輸入/輸出模塊:處理與遠程系統輸入/輸出;
3. TELNET協議模塊:實現TELNET協議,維護協議狀態機。
telnet客戶機要作兩件事: