Telnet协议详解
1. 概述
Telnet协议是TCP/IP协议族中的⼀员,是Internet远程登陆服务的标准协议。Telnet协议的⽬的是提供⼀个相对通⽤的,双向的,⾯向⼋位字节的通信⽅法,允许界⾯终端设备和⾯向终端的过程能通过⼀个标准过程进⾏互相交互。应⽤Telnet协议能够把本地⽤户所使⽤的计算机变成远程主机系统的⼀个终端。
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来说,它是⽤什么来实现控制命令的远地传送呢?
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的适应异构性对其的应⽤和发展是多么重要。 
2. 原理
Telnet协议的主体由三个部分组成:
⽹络虚拟终端(NVT,Network Virtual Terminal)的定义;
操作协商定义;
协商有限⾃动机;
2.1. ⽹络虚拟终端(NVT)
2.1.1. NVT⼯作原理
顾名思义,⽹络虚拟终端(NVT)是⼀种虚拟的终端设备,它被客户和服务器所采⽤,⽤来建⽴数据表⽰和解释的⼀致性。
2.1.2. NVT的定义
1. NVT的组成
⽹络虚拟终端NVT包括两个部分:
输出设备:输出远程数据,⼀般为显⽰器
输⼊设备:本地数据输⼊
2. 在NVT上传输的数据格式
在⽹络虚拟终端NVT上传输的数据采⽤8bit字节数据,其中最⾼位为0的字节⽤于⼀般数据,最⾼位为1的字节⽤于NVT命令
3. NVT在TELNET中的使⽤
TELNET使⽤了⼀种对称的数据表⽰,当每个客户机发送数据时,把它的本地终端的字符表⽰影射到NVT的字符表⽰上,当接收数据时,⼜把NVT的表⽰映射到本地字符集合上。
在通信开始时,通信双⽅都⽀持⼀个基本的NVT终端特性⼦集(只能区分何为数据,何为命令),以便在最低层次上通信,在这个基础上,双⽅通过NVT命令协商确定NVT的更⾼层次上的特性,实现对NVT功能的扩展。
在TELNET中存在⼤量的⼦协议⽤于协商扩展基本的⽹络虚拟终端NVT的功能,由于终端类型的多样化,使得TELNET协议族变得庞⼤起来。
2.2. 操作协商
2.2.1. 为什么要协商操作选项
当定义了⽹络虚拟终端设备后,通信的双⽅就可以在⼀个较低的层次上实现数据通信,但基本的NVT设备所具有的特性是⼗分有限的,它只能接收和显⽰7位的ASCII码,没有最基本的编辑能⼒,所以简单的NVT设备是没有实际应⽤意义的;为此TELNET协议定义了⼀族协议⽤于扩展基本NVT的功能,⽬的是使NVT能够最⼤限度地达到⽤户终端所具有的功能。
为了实现对多种终端特性的⽀持,TELNET协议规定在扩展NVT功能时采⽤协商的机制,只有通信双⽅通过协商后达成⼀致的特性才能使⽤,才能赋予NVT该项特性,这样就可以⽀持具有不同终端特性的终端设备可以互连,保证他们是⼯作在他们⾃⼰的能⼒以内。
2.2.2. 操作协商命令格式
TELNET的操作协商使⽤NVT命令,即最⾼位为1的字节流,每条NVT命令以字节IAC(0xFF)开始。原理如下:只要客户机或服务器要发送命令序列⽽不是数据流,它就在数据流中插⼊⼀个特殊的保留字符,该保留字符叫做“解释为命
令”(IAC  ,Interpret As Command)字符。当接收⽅在⼀个⼊数据流中发现IAC字符时,它就把后继的字节处理为⼀个命令序列。下⾯列出了所有的Telnet NVT命令,其中很少⽤到。
表1  TELNET 命令
名称编码说明
EOF236⽂件结束符
SUSP237挂起当前进程
SUSP237挂起当前进程
ABORT238中⽌进程
EOR239记录结束符
SE240⼦选项结束
NOP241空操作
DM242数据标记
BRK243终⽌符(break)
IP244终⽌进程
AO245终⽌输出
AYT246请求应答
EC247终⽌符
EL248擦除⼀⾏
GA249继续
SB250⼦选项开始
WILL251选项协商
WONT252选项协商
DO253选项协商
DONT254选项协商
IAC255字符0XFF
其中常⽤的TELNET选项协商如下:
WILL (option code) 251 指⽰希望开始执⾏,或者确认现在正在操作指⽰的选项。
WON'T (option code) 252 指出拒绝执⾏或继续招待所指⽰的选项。
DO (option code) 253 指出要求对⽅执⾏,或者确认希望对⽅执⾏指⽰的选项。
DON'T (option code) 254 指出要求对⽅停⽌执⾏,或者确诊要求对⽅停⽌执⾏指⽰的选项。
那么对于接收⽅和发送⽅有以下⼏种组合:
表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
表⽰服务器已经按请求同意关闭回显。
2.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的含义是“我的终端类型为”。
3. 实现
整个协议软件分为三个模块,各模块的功能如下:
1. 与本地⽤户的输⼊/输出模块:处理⽤户输⼊/输出;
2. 与远地系统的输⼊/输出模块:处理与远程系统输⼊/输出;
3. TELNET协议模块:实现TELNET协议,维护协议状态机。
telnet客户机要做两件事:
读取⽤户在键盘上键⼊的字符,并通过tcp连接把他们发送到远程服务器上telnet协议全称
读取从tcp连接上收到的字符,并显⽰在⽤户的终端上

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。