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客户机要作两件事: