天天看點

Telnet 協定詳解

作者:運維法拉令

一、概述

Telnet 協定是 TCP/IP 協定族中應用最廣泛的協定。

它允許使用者(Telnet 用戶端)通過一個協商過程來與一個遠端裝置進行通信。

Telnet 協定是基于網絡虛拟終端 NVT(Network Virtual Termina1)的實作,NVT 是虛拟裝置,連接配接雙方(客戶機和伺服器)都必須把它們的實體終端和 NVT 進行互相轉換。

Telnet 協定具有如下的特點:

(1) 适應異構

為了使多個作業系統間的 Telnet 互動操作成為可能,就必須詳細了解異構計算機和作業系統。

比如,一些作業系統需要每行文本用 ASCII 回車控制符(CR)結束,另一些系統則需要使用 ASCII 換行符(LF),還有一些系統需要用兩個字元的序列回車-換行(CR-LF);

再比如,大多數作業系統為使用者提供了一個中斷程式運作的快捷鍵,但這個快捷鍵在各個系統中有可能不同(一些系統使用 CTRL+C,而另一些系統使用 ESCAPE。

如果不考慮系統間的異構性,那麼在本地發出的字元或指令,傳送到遠地并被遠地系統解釋後很可能會不準确或者出現錯誤。是以,Telnet 協定必須解決這個問題。

為了适應異構環境,Telnet 協定定義了資料和指令在 Internet 上的傳輸方式,此定義被稱作網絡虛拟終端 NVT(Net Virtual Terminal)。它的應用過程如下:

  • 對于發送的資料:客戶機軟體把來自使用者終端的按鍵和指令序列轉換為 NVT 格式,并發送到伺服器,伺服器軟體将收到的資料和指令,從 NVT 格式轉換為遠地系統需要的格式;
  • 對于傳回的資料:遠地伺服器将資料從遠地機器的格式轉換為 NVT 格式,而本地客戶機将将接收到的 NVT 格式資料再轉換為本地的格式。

(2) 傳送遠地指令

我們知道絕大多數作業系統都提供各種快捷鍵來實作相應的控制指令,當使用者在本地終端鍵入這些快捷鍵的時候,本地系統将執行相應的控制指令,而不把這些快捷鍵作為輸入。

那麼對于 Telnet 來說,它是用什麼來實作控制指令的遠地傳送呢?

同樣使用 NVT 來定義如何從客戶機将控制功能傳送到伺服器。我們知道USASCII 字元集包括 95 個可列印字元和 33 個控制碼。

當使用者從本地鍵入普通字元時,NVT 将按照其原始含義傳送;當使用者鍵入快捷鍵(組合鍵)時,NVT 将把它轉化為特殊的 ASCII 字元在網絡上傳送,并在其到達遠地機器後轉化為相應的控制指令。将正常 ASCII 字元集與控制指令區分主要有兩個原因:

  • 這種區分意味着 Telnet 具有更大的靈活性:它可在客戶機與伺服器間傳送所有可能的 ASCII 字元以及所有控制功能;
  • 這種區分使得客戶機可以無二義性的指定信令,而不會産生控制功能與普通字元的混亂。  

(3) 資料流向

将 Telnet 設計為應用級軟體有一個缺點,那就是:效率不高。這是為什麼呢?下面給出 Telnet 中的資料流向:

資料資訊被使用者從本地鍵盤鍵入并通過作業系統傳到客戶機程式,客戶機程式将其處理後傳回作業系統,并由作業系統經過網絡傳送到遠地機器,遠地作業系統将所接收資料傳給伺服器程式,并經伺服器程式再次處理後傳回到作業系統上的僞終端入口點。

最後,遠地作業系統将資料傳送到使用者正在運作的應用程式,這便是一次完整的輸入過程;輸出将按照同一通路從伺服器傳送到客戶機。

因為每一次的輸入和輸出,計算機将切換程序環境好幾次,這個開銷是很昂貴的。還好使用者的鍵入速率并不算高,這個缺點我們仍然能夠接受。  

(4) 強制指令

我們應該考慮到這樣一種情況:假設本地使用者運作了遠地機器的一個無休止循環的錯誤指令或程式,且此指令或程式已經停止讀取輸入,那麼作業系統的緩沖區可能是以而被占滿。

如果這樣,遠地伺服器也無法再将資料寫入僞終端,并且最終導緻停止從 TCP 連接配接讀取資料,TCP 連接配接的緩沖區最終也會被占滿,進而導緻阻止資料流流入此連接配接。如果以上事情真的發生了,那麼本地使用者将失去對遠地機器的控制。

為了解決此問題,Telnet 協定必須使用外帶信令以便強制伺服器讀取一個控制指令。

我們知道 TCP 用緊急資料機制實作外帶資料信令,那麼 Telnet 隻要再附加一個被稱為資料标記(date mark)的保留八位組,并通過讓 TCP 發送已設定緊急資料比特的封包段通知伺服器便可以了,攜帶緊急資料的封包段将繞過流量控制直接到達伺服器。

作為對緊急信令的相應,伺服器将讀取并抛棄所有資料,直到找到了一個資料标記。伺服器在遇到了資料标記後将傳回正常的處理過程。

(5) 選項協商  

由于 Telnet 兩端的機器和作業系統的異構性,使得 Telnet 不可能也不應該嚴格規定每一個 telnet 連接配接的詳細配置,否則将大大影響 Telnet 的适應異構性。是以,Telnet 采用選項協商機制來解決這一問題。

Telnet 選項的範圍很廣:一些選項擴充了大方向的功能,而一些選項制涉及一些微小細節。例如:有一個選項可以控制 Telnet 是在半雙工還是全雙工模式下工作(大方向);還有一個選項允許遠地機器上的伺服器決定使用者終端類型(小細節)。

Telnet 選項的協商方式也很有意思,它對于每個選項的處理都是對稱的,即任何一端都可以發出協商申請;任何一端都可以接受或拒絕這個申請。另外,如果一端試圖協商另一端不了解的選項,接受請求的一端可簡單的拒絕協商。

是以,有可能将更新,更複雜的 Telnet 客戶機伺服器版本與較老的,不太複雜的版本進行互動操作。

如果客戶機和伺服器都了解新的選項,可能會對互動有所改善。否則,它們将一起轉到效率較低但可工作的方式下運作。所有的這些設計,都是為了增強适應異構性,可見 Telnet 的适應異構性對其的應用和發展是多麼重要。 

二、原理

1.Telnet 協定的主體由三個部分組成:

  • 網絡虛拟終端(NVT,Network Virtual Terminal)的定義;
  • 操作協商定義;
  • 協商有限自動機;

2. 網絡虛拟終端(NVT)

(1)NVT 工作原理

顧名思義,網絡虛拟終端(NVT)是一種虛拟的終端裝置,它被客戶和伺服器所采用,用來建立資料表示和解釋的一緻性。

(2) NVT 的組成

網絡虛拟終端 NVT 包括兩個部分:

  • 輸出裝置:輸出遠端資料,一般為顯示器
  • 輸入裝置:本地資料輸入

(3) 在 NVT 上傳輸的資料格式

在網絡虛拟終端 NVT 上傳輸的資料采用 8bit 位元組資料,其中 最高位為 0 的位元組用于一般資料,最高位為 1 的位元組用于 NVT 指令。

(4) NVT 在 TELNET 中的使用

TELNET 使用了一種對稱的資料表示,當每個客戶機發送資料時,把它的本地終端的字元表示影射到 NVT 的字元表示上,當接收資料時,又把 NVT 的表示映射到本地字元集合上。

在通信開始時,通信雙方都支援一個基本的 NVT 終端特性子集(隻能區分何為資料,何為指令),以便在最低層次上通信,在這個基礎上,雙方通過 NVT 指令協商确定NVT的更高層次上的特性,實作對 NVT 功能的擴充。

在 TELNET 中存在大量的子協定用于協商擴充基本的網絡虛拟終端 NVT 的功能,由于終端類型的多樣化,使得 TELNET 協定族變得龐大起來。

三、操作協商

1.為什麼要協商操作選項

當定義了網絡虛拟終端裝置後,通信的雙方就可以在一個較低的層次上實作資料通信,但基本的 NVT 裝置所具有的特性是十分有限的,它隻能接收和顯示 7 位的 ASCII 碼,沒有最基本的編輯能力。

是以簡單的 NVT 裝置是沒有實際應用意義的;為此 TELNET 協定定義了一族協定用于擴充基本 NVT 的功能,目的是使 NVT 能夠最大限度地達到使用者終端所具有的功能。

為了實作對多種終端特性的支援,TELNET協定規定在擴充NVT功能時采用協商的機制,隻有通信雙方通過協商後達成一緻的特性才能使用,才能賦予NVT該項特性,這樣就可以支援具有不同終端特性的終端裝置可以互連,保證他們是工作在他們自己的能力以内。

2.操作協商指令格式

TELNET 的操作協商使用 NVT 指令,即最高位為 1 的位元組流,每條 NVT 指令以位元組 IAC(0xFF)開始。原理如下:

隻要客戶機或伺服器要發送指令序列而不是資料流,它就在資料流中插入一個特殊的保留字元,該保留字元叫做“解釋為指令”(IAC ,Interpret As Command) 字元。當接收方在一個入資料流中發現 IAC 字元時,它就把後繼的位元組處理為一個指令序列。

其中常用的TELNET選項協商如下:

(1)WILL (option code) 251 訓示希望開始執行,或者确認現在正在操作訓示的選項。

(2)WON'T (option code) 252 指出拒絕執行或繼續招待所訓示的選項。

(3)DO (option code) 253 指出要求對方執行,或者确認希望對方執行訓示的選項。

(4)DON'T (option code) 254 指出要求對方停止執行,或者确診要求對方停止執行訓示的選項。

通常情況下,客戶機向伺服器發送字元而伺服器将其回顯到使用者的終端上,但是,如果網絡的時延回引起回顯速度太慢,使用者可能更願意讓本地系統回顯字元。在客戶機允許本地系統回顯前,它要向伺服器發送以下序列:

IAC DONT ECHO           

伺服器收到請求後,發出 3 個字元的響應:

IAC WONT ECHO           

表示伺服器已經按請求同意關閉回顯。

3.子選項協商

除了“打開”或“關閉”以外,有些選項還需要更多的資訊,例如對于指明終端類型來說,客戶必須發送一個字元串來辨別終端類型,是以要定義子選項協商。

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.整個協定軟體分為三個子產品,各子產品的功能如下:

(1)與本地使用者的輸入/輸出子產品:處理使用者輸入/輸出;

(2)與遠地系統的輸入/輸出子產品:處理與遠端系統輸入/輸出;

(3)TELNET 協定子產品:實作 TELNET 協定,維護協定狀态機。

2.telnet 客戶機要做兩件事:

讀取使用者在鍵盤上鍵入的字元,并通過 tcp 連接配接把他們發送到遠端伺服器上讀取從 tcp 連接配接上收到的字元,并顯示在使用者的終端上。

繼續閱讀