一 摘要
Telnet的应用不仅方便了我们进行远程登录,也给hacker们提供了又一种入侵手段和后门,但无论如何,在你尽情享受Telnet所带给你的便捷的同时,你是否真正的了解Telnet呢?
二 远程登录
Telnet服务虽然也属于客户机/服务器模型的服务,但它更大的意义在于实现了基于Telnet协议的远程登录(远程交互式计算),那么就让我们来认识一下远程登录。
1 远程登陆的基本概念
先来看看什么叫登录:分时系统允许多个用户同时使用一台计算机,为了保证系统的安全和记帐方便,系统要求每个用户有单独的帐号作为登录标识,系统还为每个用户指定了一个口令。用户在使用该系统之前要输入标识和口令,这个过程被称为'登录'。
远程登陆是指用户使用Telnet命令,使自己的计算机暂时成为远程主机的一个仿真终端的过程。仿真终端等效于一个非智能的机器,它只负责把用户输入的每个字符传递给主机,再将主机输出的每个信息回显在屏幕上。
2 远程登陆的产生及发展
我们可以先构想一个提供远程文字编辑的服务,这个服务的实现需要一个接受编辑文件请求和数据的服务器以及一个发送此请求的客户机。客户机将建立一个从本地机到服务器的TCP连接,当然这需要服务器的应答,然后向服务器发送键入的信息(文件编辑信息),并读取从服务器返回的输出。以上便是一个标准而普通的客户机/服务器模型的服务。
似乎有了客户机/服务器模型的服务,一切远程问题都可以解决了。然而实际并非你想象的那样简单,如果我们仅需要远程编辑文件,那么刚才所构想的服务完全可以胜任,但假如我们的要求并不是这么简单,我们还想实现远程用户管理,远程数据录入,远程系统维护,想实现一切可以在远程主机上实现的操作,那么我们将需要大量专用的服务器程序并为每一个可计算服务都使用一个服务器进程,随之而来的问题是:远程机器会很快对服务器进程应接不暇,并淹没在进程的海洋里(我们在这里排除最专业化的远程机器)。
那么有没有办法解决呢?当然有,我们可以用远程登录来解决这一切。我们允许用户在远地机器上建立一个登录会话,然后通过执行命令来实现更一般的服务,就像在本地操作一样。这样,我们便可以访问远地系统上所有可用的命令,并且系统设计员不需提供多个专用地服务器程序。
问题发展到这里好像前途一片光明了,用远程登录总应该解决问题了吧,但要实现远程登陆并不简单。不考虑网络设计的计算机系统期望用户只从直接相连的键盘和显示器上登录,在这种机器上增加远程登陆功能需要修改机器的操作系统,这是极其艰巨也是我们尽量避免的。因此我们应该集中力量构造远程登陆服务器软件,虽然这样也是比较困难的。为什么说这样做也比较困难呢?
举个例子来说:一般,操作系统会为一些特殊按键分配特殊的含义,比如本地系统将 'Ctrl+C'解释为:'终止当前运行的命令进程'。但假设我们已经运行了远程登陆服务器软件,'Ctrl+C'也有可能无法被传送到远地机器,如果客户机真的将'Ctrl+C'传到了远地机器,那么'Ctrl+C' 这个命令有可能不能终止本地的进程,也就是说在这里很可能会产生混乱。而且这仅仅是遇到的难题之一。
但尽管有技术上的困难,系统编程人员还是设法构造了能够应用于大多数操作系统的远程登陆服务器软件,并构造了充当客户机的应用软件。通常,客户机软件取消了除一个键以外的所有键的本地解释,并将这些本地解释相应的转换成远地解释,这就使得客户机软件与远地机器的交互,就如同坐在远程主机面前一样,从而避免了上述所提到的混乱。而那个唯一例外的键,可以使用户回到本地环境。
将远程登陆服务器设计为应用级软件,还有另一个要求,那就是需要操作系统提供对伪终端(pseudo terminal)的支持。我们用伪终端描述操作系统的入口点,它允许像Telnet服务器一样的程序向操作系统传送字符,并且使得字符像是来自本地键盘一样。只有使用这样的操作系统,才能将远程登陆服务器设计为应用级软件(比如Telnet服务器软件),否则,本地操作系统和远地系统传送将不能识别从对方传送过来的信息(因为它们仅能识别从本地键盘所键入的信息),远程登陆将宣告失败。
将远程登陆服务器设计为应用级软件虽然有其显著的优点:比将代码嵌入操作系统更易修改和控制服务器。但其也有效率不高的缺点(后面的内容将会给予解释),好在用户键入信息的速率不高,这种设计还是可以接受的。
3 远程登录的工作过程
使用Telnet协议进行远程登陆时需要满足以下条件:在本的计算机上必须装有包含Telnet协议的客户程序;必须知道远程主机的Ip地址或域名;必须知道登录标识与口令。
Telnet远程登录服务分为以下4个过程:
1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的Ip地址或域名;
2)将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据报;
3)将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;
4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。
上面的内容只是讨论了远程登陆最基本的东西,其中的复杂和编程人员的艰辛是我们难以想象的,不知道你在舒服的使用Telnet的同时,是否想到了这些!
三 Telnet协议
我们知道Telnet服务器软件是我们最常用的远程登录服务器软件,是一种典型的客户机/服务器模型的服务,它应用Telnet协议来工作。那么,什么是Telnet协议?它都具备哪些特点呢?
1 基本内容
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务:
1)Telnet定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的程序;
2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项;
3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。
2 适应异构
为了使多个操作系统间的Telnet交互操作成为可能,就必须详细了解异构计算机和操作系统。比如,一些操作系统需要每行文本用ASCII回车控制符(CR)结束,另一些系统则需要使用ASCII换行符(LF),还有一些系统需要用两个字符的序列回车-换行(CR-LF);再比如,大多数操作系统为用户提供了一个中断程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。如果不考虑系统间的异构性,那么在本地发出的字符或命令,传送到远地并被远地系统解释后很可能会不准确或者出现错误。因此,Telnet协议必须解决这个问题。
为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络虚拟终端NVT(Net Virtual Terminal)。它的应用过程如下:
对于发送的数据:客户机软件把来自用户终端的按键和命令序列转换为NVT格式,并发送到服务器,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式;
对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将将接收到的NVT格式数据再转换为本地的格式。
对于NVT格式的详细定义,有兴趣的朋友可以去查找相关资料。
3 传送远地命令
我们知道绝大多数操作系统都提供各种快捷键来实现相应的控制命令,当用户在本地终端键入这些快捷键的时候,本地系统将执行相应的控制命令,而不把这些快捷键作为输入。那么对于Telnet来说,它是用什么来实现控制命令的远地传送呢?
Telnet 同样使用NVT来定义如何从客户机将控制功能传送到服务器。我们知道USASCII字符集包括95个可打印字符和33个控制码。当用户从本地键入普通字符时,NVT将按照其原始含义传送;当用户键入快捷键(组合键)时,NVT将把它转化为特殊的ASCII字符在网络上传送,并在其到达远地机器后转化为相应的控制命令。将正常ASCII字符集与控制命令区分主要有两个原因:
1)这种区分意味着Telnet具有更大的灵活性:它可在客户机与服务器间传送所有可能的ASCII字符以及所有控制功能;
2)这种区分使得客户机可以无二义性的指定信令,而不会产生控制功能与普通字符的混乱。
4 数据流向
上面我们提到过将Telnet设计为应用级软件有一个缺点,那就是:效率不高。这是为什么呢?下面给出Telnet中的数据流向:

数据信息被用户从本地键盘键入并通过操作系统传到客户机程序,客户机程序将其处理后返回操作系统,并由操作系统经过网络传送到远地机器,远地操作系统将所接收数据传给服务器程序,并经服务器程序再次处理后返回到操作系统上的伪终端入口点,最后,远地操作系统将数据传送到用户正在运行的应用程序,这便是一次完整的输入过程;输出将按照同一通路从服务器传送到客户机。

因为每一次的输入和输出,计算机将切换进程环境好几次,这个开销是很昂贵的。还好用户的键入速率并不算高,这个缺点我们仍然能够接受。
5 强制命令

我们应该考虑到这样一种情况:假设本地用户运行了远地机器的一个无休止循环的错误命令或程序,且此命令或程序已经停止读取输入,那么操作系统的缓冲区可能因此而被占满,如果这样,远地服务器也无法再将数据写入伪终端,并且最终导致停止从TCP连接读取数据,TCP连接的缓冲区最终也会被占满,从而导致阻止数据流流入此连接。如果以上事情真的发生了,那么本地用户将失去对远地机器的控制。

为了解决此问题,Telnet协议必须使用外带信令以便强制服务器读取一个控制命令。我们知道TCP用紧急数据机制实现外带数据信令,那么 Telnet只要再附加一个被称为数据标记(date mark)的保留八位组,并通过让TCP发送已设置紧急数据比特的报文段通知服务器便可以了,携带紧急数据的报文段将绕过流量控制直接到达服务器。作为对紧急信令的相应,服务器将读取并抛弃所有数据,直到找到了一个数据标记。服务器在遇到了数据标记后将返回正常的处理过程。
6 选项协商

由于Telnet两端的机器和操作系统的异构性,使得Telnet不可能也不应该严格规定每一个telnet连接的详细配置,否则将大大影响Telnet的适应异构性。因此,Telnet采用选项协商机制来解决这一问题。
Telnet选项的范围很广:一些选项扩充了大方向的功能,而一些选项制涉及一些微小细节。例如:有一个选项可以控制Telnet是在半双工还是全双工模式下工作(大方向);还有一个选项允许远地机器上的服务器决定用户终端类型(小细节)。
Telnet 选项的协商方式也很有意思,它对于每个选项的处理都是对称的,即任何一端都可以发出协商申请;任何一端都可以接受或拒绝这个申请。另外,如果一端试图协商另一端不了解的选项,接受请求的一端可简单的拒绝协商。因此,有可能将更新,更复杂的Telnet客户机服务器版本与较老的,不太复杂的版本进行交互操作。如果客户机和服务器都理解新的选项,可能会对交互有所改善。否则,它们将一起转到效率较低但可工作的方式下运行。所有的这些设计,都是为了增强适应异构性,可见Telnet的适应异构性对其的应用和发展是多么重要。
上面讨论了一些原理方面的东西,虽然我们在Telnet的使用过程中很难接触到这一层面,但我认为了解这些是有意义的,它会给我们带来许多启示。下面让我们来看看Win2000的Telnet服务。
(本系列教程不定期更新,欲获得最新版本,请登陆官方网站:菜菜鸟社区 http://ccbirds.yeah.net)
四 Win2000的Telnet服务
其实从应用层面上,Win2000的Telnet服务并没有什么可说的,绝大部分内容你都可以从HELP文件中得到,我在此只是把它稍微整理一下而已。
1 基本配置
Win2000为我们提供了Telnet客户机和服务器程序:Telnet.exe是客户机程序(Client),tlntsvr.exe是服务器程序(server),同时它还为我们提供了Telnet服务器管理程序tlntadmn.exe。
Windows 2000 默认安装了 Telnet 服务,但是并没有默认启动。下面给出HELP文件中 Telnet 服务的一部分默认设置:
AllowTrustedDomain:是否允许域用户访问。默认值是1,允许信任域用户访问。可以改为0: 不允许域用户访问(只允许本地用户)。
DefaultDomain:可以对与该计算机具有信任关系的任何域设置。默认值是"."。
DefaultShell:显示 shell 安装的路径位置。默认值是: %systemroot%/System32/Cmd.exe /q /k
MaxFailedLogins:在连接终止之前显示尝试登录失败的最大次数。默认是3。
LoginScript:显示 Telnet 服务器登录脚本的路径位置。默认的位置就是“%systemroot%/System32/login.cmd”,你可以更改脚本内容,这样登录进Telnet的欢迎屏幕就不一样了。
NTLM:NTLM身份验证选项。默认是2。可以有下面这些值:
0: 不使用 NTLM 身份验证。
1: 先尝试 NTLM 身份验证,如果失败,再使用用户名和密码。
2: 只使用 NTLM 身份验证。
TelnetPort:显示 telnet 服务器侦听 telnet 请求的端口。默认是:23。你也可以更改为其他端口。
以上各项设置你可以使用tlntadmn.exe(Telnet服务器管理程序)来进行非常方便的配置,配置后需要重新启动Telnet服务。如图1
2 NTLM
提到了telnet就不能不提NTLM,我想这也是让入侵者最为头痛的一件事,哪怕你获得了管理员帐号和密码,想简单通过NTLM也并非易事,况且 win2000中的telnet默认仅以NTLM方式验证身份,这就让我们不得不关注NTLM这个东东,那么什么是NTLM呢?
早期的 SMB协议在网络上明文传输口令,后来出现了"LAN Manager Challenge/Response"验证机制,简称LM,它十分简单以至很容易被破解,微软随后提出了WindowsNT挑战/响应验证机制,即 NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。NTLM工作流程是这样的:
1、客户端首先在本地加密当前用户的密码成为密码散列
2、客户端向服务器发送自己的帐号,这个帐号是没有经过加密的,明文直接传输
3、服务器产生一个16位的随机数字发送给客户端,作为一个 challenge(挑战)
4、客户端再用加密后的密码散列来加密这个 challenge ,然后把这个返回给服务器。作为 response(响应)
5、服务器把用户名、给客户端的challenge 、客户端返回的 response 这三个东西,发送域控制器
6、域控制器用这个用户名在 SAM密码管理库中找到这个用户的密码散列,然后使用这个密码散列来加密 challenge。
7、域控制器比较两次加密的 challenge ,如果一样,那么认证成功。
从上面的过程我们可以看出,NTLM是以当前用户的身份向Telnet服务器发送登录请求的,而不是用你扫到的对方管理员的帐户和密码登录,显然,你的登录将会失败。举个例子来说,你家的机器名为A(本地机器),你入侵的机器名为B(远地机器),你在A上的帐户是xinxin,密码是1234,你扫到B的管理员帐号是Administrator,密码是5678,当你想Telnet到B时,NTLM将自动以当前用户的帐号和密码作为登录的凭据来进行上面的7 项操作,即用xinxin和1234,而并非用你扫到的Administrator和5678,且这些都是自动完成的,根本不给你插手的机会,因此你的登录操作将失败。
由于Telnet服务器对NTLM的使用有3个选项,所以当你Telnet远地机器时,会显示下面情况中的一种:
1)身份验证选项=0时
=====================================
Microsoft (R) Windows (TM) Version 5.00 (Build 2195)
Welcome to Microsoft Telnet Service
Telnet Server Build 5.00.99201.1
login:
password:

//为0时不使用NTML身份验证,直接输入用户名和密码,比如你可以输入扫到的Administrator和5678

2)身份验证选项=1时
=====================================
NTLM Authentication failed due to insufficient credentials. Please login withclear text username and password
Microsoft (R) Windows (TM) Version 5.00 (Build 2195)
Welcome to Microsoft Telnet Service
Telnet Server Build 5.00.99201.1
login:
password:

//先尝试 NTLM 身份验证,如果失败,再使用用户名和密码,其实这种方式对于我们来说,与上一种方式没什么区别

3)身份验证选项=2时
=====================================
NTLM Authentication failed due to insufficient credentials. Please login withclear text username and password
Server allows NTLM authentication only
Server has closed connection
遗失对主机的连接。
C:/>

//仔细看看上面的显示,根本没有给你输入用户名和密码的机会,直接断开连接,扫到了密码也是白扫

所以对于入侵者来说,NTLM是横在我们面前的一座大山,必须要除掉它,一般我们有如下几种方法:

1通过修改远程注册表更改telnet服务器配置,将验证方式从2改为1或0;
2使用NTLM.exe,上传后直接运行,可将telnet服务器验证方式从2改为1;
3在本地建立扫描到的用户,以此用户身份开启telnet客户机并进行远程登录;
4使用软件,比如opentelnet.exe(需要管理员权限且开启IPC管道)
5使用脚本,如RTCS,(需要管理员权限但不依赖IPC管道)

基本上是以上的5种,其中后两种是我们比较常用的开telnet的手法,而且使用方法十分简单,命令如下:

OpenTelnet.exe //server username password NTLMAuthor telnetport
OpenTelnet.exe //服务器地址 管理员用户名 密码 验证方式(填0或1) telnet端口

cscript RTCS.vbe targetIP username password NTLMAuthor telnetport
cscript RTCS.vbe <目标IP> <管理员用户名> <密码> <验证方式>

五 在telnet中该做什么

本来写到上面就想结束了,不过许多朋友都说telnet上去后不知道该做什么了,既然这样,那我就抛砖引玉吧,这次不讲具体做法,只是说说思路,什么?为什么不讲具体做法?篇幅不够嘛,以后我会一一解释的。
1 查看系统信息
呵呵,其实就是随处看看,看看他的系统配置和版本(用type c:/boot.ini来知道pro版或server版),看看都装了什么服务或软件(从目录名就可以知道了),看看有什么重要或有趣的文件啦(唉,要是国外的机器,看也看不懂),看看他的用户情况,总之就是尽可能多的了解系统,为一会装后门摸底。
2 使用tftp传送文件
想必大家都遇到过在telnet中传输文件的问题,因为我们习惯了在ipc管道中的文件传输,所以有些朋友喜欢用net share ipc$ 来打开管道,进而利用copy来传输文件。不过这样反而麻烦,既然我们已经得到了shell,我们可以用TFPT命令来完成这一切,什么是TFTP呢?
用TFTP(Trivial File Transfer Protocol)来实现文件的传送是一种基于UDP连接的文件传输,一般是使用Windows自带的tftp.exe和一个TFTP服务器端软件构成一个完整的传输结构。它是这样使用的: 首先运行本地的TFTP Server(比如tftpd32.exe)软件并保证始终开启直至传输全部完成,然后在telnet中(当然你也可以在其他shell中)运行下面的命令:
C:/>tftp

TELNET协议规范

ARPA Internet上的主机被要求采用并实现此标准。

介绍

TELNET Protocol的目的是提供一个相对通用的,双向的,面向八位字节的通信方法。它主要的目标是允许接口终端设备的标准方法和面向终端的相互作用。可以预见到,此协议也可被用于终端到终端的通信和处理到处理的通信(分布式计算)。

一般考虑

一个TELNET连接是一个用于传输控制协议的传送数据的。TELNET 协议是建立在以下三个想法上的:首先是网络虚拟终端的概念;其次是对话选项的方法;最后是终端和处理的协调。

1,当一个TELNET连接被初次建立时,每一端都被假设使用了网络虚拟终端,也就是NVT。NVT是一个想象中的标准设备通用设备的代表。这就消除了“服务器”和“用户”机要了解对方机器终端的特点,而终端可以直接处理对话。所有的主机,用户端的和服务器端的,它们自己本地的设备特点因此在网络上可以作为一种NVT处理,任何一个都可以认为对方使用的是相同特点的设备。NVT倾向于不过多地限制(提供了一个相应比较丰富的映射到本地设备的字符集),也不是包括一切的(它要求用户使用适当的终端)。注意:用户机通常是与处理终端连接的主机,服务器机通常是提供某种服务的机器。从另一点看,在终端到终端或进程到进程的通信上,用户机是发起通信的机器。

2,规定选项的原理将以下事实考虑在内,许多机器希望在现在的NVT上提供另外的服务,多数用户有比较复杂的终端,它们也就希望一种比较完整的而不是最小的服务。独立的,但是存在于 TELNET 协议的不同选项支持这些需求,它们使用"DO, DON'T, WILL, WON'T" 结构允许用户机和服务器建立建立一种更加精巧的TELNET会话连接。这种选项包括改变字符集,响应模式等等。设置选项的基本策略是任一方(或者两者)初始化要求一个选项生效的请求。另一方可以接受也可以拒绝这一请求。如果接受请求,此选项立刻生效;如果被拒绝,连接仍然保持基本的NVT的连接属性。很明显,一方可以拒绝另一方关于启用某一选项的请求,但是不能拒绝另一方关于使一选项失效的请求,因为双方必须准备支持NVT。对话选项语法的建立使在双方都发出请求某一选项生效的请求时,另一方可以直接认为收到对方的确认信息。

3,这种对称式的对话语法潜在地引起了一个不可终止的确认环--任何一方都将收到的确认信息看作是请求,而不是一个确认信息。为了防止这种循环的出现,有下面的规则:

4,任何一方仅可以要求对选项状态的变化:例如,一方不可以发出请求,仅仅说明它在什么样的选项状态下。

A,如果一方接收到好象是请求的信息,请求进入一个已经进入的状态,此信息将被看作是一个确认消息。这种非响应从本质上防止了不可终止的对话的循环。如果要求发送一个要求改变状态的请求,即使状态并未改变。

B,无论何时,一方发送选项命令到另一方,无论作为一个请求或者是一个确认消息,选项的使用将对发送的数据处理有影响,这样命令应该被插入到希望发生作用的数据流中的数据点之前。(应该注意,传送请求和收到确认消息之间有一定的时间间隔,这是被动方式的。因此,一个主机希望在要求一个选项后缓存数据,直到它知道它的请求是否被接受,这样就可以使这段不不确定时间对用户不可见。)选项的请求可以在建立TELNET连接时十分频繁地来往交换,因为每一方都希望从对方得到更好的服务。

除此以外,选项也可以在连接持续过程中动态改变来适应本地机器条件的变化。例如,NVT(它将以后被详细解释)对于许多“一次一行”的应用程序,如BASIC是十分适用的,而对于如NLS的“一次一字”的应用程序却不怎么好用。服务器可能被选择作为“一次一字”法则来适应在其上运行的本地进程,它将发起对话以达到合适的选项状态。然而,相对于永久地负责这种多余的处理负担;它可以通过会话,在不需要这样的选项状态下回到NVT状态。由一个进程发起的请求可以导致一个不可终止的请求循环,如果此进程对一个拒绝请求的响应是再次要求此选项。为了防止这样循环的发生,被拒绝的请求在其它事情发生变化之前不能被重复请求。这可能意味着,进程运行另外一个程序,或者用户发送另外的命令,或者用户对于环境或选项的改变。

比较好的方法是,预请求应该作为由另一端发送信息的结果而发生,或者由于人为介入而发生。选项的设计者不应该因为对于选项会话的种种限制而感觉到伸不开手脚。一般语法的目的是更容易地拥有选项--因为表示对它们的忽视也是容易的。

如果特定的选项需要除"DO, DON'T, WILL, WON'T"以外的更丰富的结构,正确的方针是使用"DO, DON'T, WILL, WON'T"来建立连接解释这种新结构,当这一解释工作完成时,就可以自由地使用这一新结构了。例如,一方可能发送请求改变(或建立)每行的长度。如果接受了这些,对于对话的不同行长度可以使用不同的语法来表示--“子对话”可以包括一个域表示最大允许的,最小允许的和希望的长度。重要概念是这样的扩充的会话应该直到双方建立了标准的会话并且能够解释这种扩充的语法之后再进行。总的来说,WILL XXX发送时说明一方希望执行选项XXX,DO XXX 和 DON'T XXX作为确定的不确定的响应;同样,DO XXX被作为一种请求发送给另一方来启动选项XXX,WILL XXX 和WON'T将被作为确定和不确定的响应。因为NVT是没有任何选项时的结果, DON'T和WON'T响应将保证使连接最终保持于这种没有任何选项的状态。因此,所有主机可以不支持不理解的选项,它仅仅需要返回这种选项的请求即可。

尽可能的,TELNET协议被用作服务器-用户的对称,这样,它就可以更容易而自然地处理用户-用户和服务器-服务器的情况。用选项来扩展这一功能是被希望实现的,但不是必要的。在任何情况下,对称是一个运行的准则而不是固定的准则多次被明确提出。一个比较文档,“TELNET选项说明”,可以被用于对建立新选项过程信息的参考。

网络虚拟终端网络虚拟终端(NVT)是一个双向字符设备。NVT有一个显示设备和一个键盘。显示设备响应到达的数据,键盘负责通过TELNET连接发送数据,如果需要回显,也应该在NVT的显示设备上显示。对于网络上的回显并不要求(虽然确实存在这个“远程”回显选项,但是主机必不是必须实现此选项)。字符集是由七位ASCII码组成的,而保存在八位的域中。任何字符的转换和计时方面的考虑都是本地的问题,这不影响NVT的工作。

数据传送方面,虽然TELNET连接是全双工的,NVT却是在线缓冲状态下的半双工设备。传送数据虽然TELNET连接是全双工的,在线缓冲模式下,NVT却被当作半双工的设备。此信号可以由进程或者用户产生。对于一些主机处理网络输入中断,或与默认的不进行远程回显的NVT说明的主机来说,此规则的代价是高昂的。因此,在源点缓存一些数据是有理由的。一些系统在每个输入行未采用一些操作(即使是行打印机或打卡机也经常采用这种方法),这样可以在每行未开始发送。在另一方面,用户或者进程可以有时发觉提供在行未不中断的数据是有用的而且是必须的;因此,也应该在实现在本地能够识别这种信号并把这些数据立刻发送的方法和机制。当一个进程已经完成将数据发送到对方的显示设备而且也没有缓存的输入数据时时,进程必须发送TELNET Go Ahead (GA)命令。

这个规则并不是要求 TELNET GA命令必须由双方终端发送,因为服务器主机通常不要求特定的信号来继续进程。但是,此命令的设计可以帮助用户的本地主机操作一个物理上半双工的终端,它如果IBM2741一样拥有可锁定的键盘。对此种类型终端的描述有助于解释GA命令的正确使用。终端和计算机的连接总是在计算机或用户的控制之下。任何一方都不能够隐式地从另一方获得控制权;控制权必须显式地从一方转移到另一方。

在终端一方,设置硬件在每一行结束时放弃控制权(例如,当用户按下回车键时)。当这种情况发生时,本地计算机处理输入数据,决定是否输出,如果不需要,将控制权回送给终端。如果需要产生输出,计算机将保有控制权直到输出数据发送完毕。在网络上使用这种终端的困难是显而易见的。“本地”计算机不知道在读到行未符号时是否应该继续保持控制权;这个问题的决定权在远地处理此数据的计算机。因此,TELNET GA命令提供了一种机制让远程计算机能够通知本地计算机,让它将控制权转交给用户终端。在用户需要控制权时,此信号应该也只能在此时发送。注意:过早地发送GA命令会使输出数据阻塞,因为用户可以假定传送系统暂停,因此不能将一行结束。当然,前述内容不能够用于用户到服务器方面的通信方面。在这个方面,GA命令可以在任何时候发送,可以根本不用发送。同样,如果TELNET连接被用于进程到进程的通信,也不需要发送GA命令。

最后,对于终端到终端的通信,可以在两端都需要GA命令,也可以在一端,也可以两端都需要。如果主机希望支持终端到终端的通信主机应该提供一种让用户自由发送GA命令的方法;然而,对于一个TELNET进程而言,这并不是必须的。注意:TELNET模式的对称性要求在概念上,两端中的一端至少是一个NVT。控制函数的标准表示如要本文的介绍中所说的,TELNET协议的目的是提供一种网络上面向终端进程和终端设备的标准接口。

这种类型互连的先前的经验告诉我们,在许多主机上已经实现了类似的功能,但它们的实现方法却差别很大。对于接触这些系统的用户而言,这些差别将是令人头痛的。因此,TELNET定义了以下功能的五种标准表示。这种标准表示有一定的标准的意义,但这也不是必须的(例外是中断处理函功能要其它使用TELNET的协议执行);这也就是说,系统不提供给本地用户的功能也不可以不提供给远程用户,它可以将标准表示作为非操作的功能。

在另一方面,给本地用户提供此功能的系统必须也向传送此功能标准表示的远程用户提供此功能。

中断处理(IP)一些系统提供可以暂停,中断,放弃或终止用户进程操作的功能。当用户确定它的进程处于不可结束的循环中,或不经意地激活了一个进程时经常使用此功能。IP是使用此功能的标准表示。实现者应该注意的是:使用TELNET的其它协议可能也需要IP,因此,如果需要支持其它协议就应该实现IP。放弃输出 (AO) 许多系统提供此功能,它允许产生输出的进程到达类似操作结束的点,而不将输出发送到用户的终端。更深一层的,此功能通常清除已产生的所有输出,而不显示到用户的终端上。AO是使用此功能的标准表示。

例如,一些子系统可能通常接受用户命令,发送长文本串到用户终端,最后发送一个提示用户允许接收下一命令的提示符到用户终端。如果在传送文本串的过程中接收到AO命令,将会不再发送剩余的字符串,而直接显示提示符告知用户可以输入下一命令。(这与接收到IP之后的操作可能有所不同;IP会放弃发送剩余的字符串而且退出子系统。)应该注意到,使用提供此功能的服务器系统时外部缓冲区(在网络和用户本地主机上)也被清除;完成的正确方法是向用户系统发送“Synch”信号。

你在此吗 (AYT) 许多系统提供用户这样的功能,让用户知道是否正在运行。此功能在系统由于不可预知长度运算,或系统负载重的情况下长时间不响应时由用户发起。AYT是使用此功能的标准表示。

删除字符(EC) 许多系统提供此功能用于删除最近相邻的不可删除字符或用户提供数据流的最近相邻的“显示位置”。此功能通常用于编辑键盘错误的输入。EC是使用此功能的标准表示。注意:“显示位置”可能包括多于一个的字符,它们是过多键入的结果或者如下格式的字符串:<char1> BS <char2>...

删除行(EL) 许多系统提供此功能用于删除当前输入行中的所有数据。此功能通常被用于是编辑键盘输入。EL是使用此功能的标准表示。

TELNET的"Synch"信号 大部分时分系统提供一种允许终端用户重新获得失控进程的机制;上述的IP和AO功能就是此机制的一个例子。这些系统,当被用于本地时,访问由用户提供的所有信号,无论此信号是一般字符还是不可显示的字符如电传中的“BREAK”或IBM 2741中的“ATTN”键。当系统通过网络连接时这种情况不一定就是准确的;网络流量控制机制可能导致一个信号被缓存于网络中某处,例如在用户的主机中。为了克服这个问题,引入了TELNET的“Synch”机制。一个Synch信号包括一个TCP 紧急信号和TELNET命令 DATA MARK。

紧急信号,它不受限于限制TELNET的流量控制,它可以在接收到进程引发特定的数据处理。

在这种模式中,此数据流立即被看作是“有重大意义的”,而抛弃其它数据。

TELNET命令DATA MARK (DM)是数据流中的同步标志,它指示任何特定的信号已经发生过了,接收可以返回到正常处理其它数据的状态中了。Synch通过TCP发送操作完成,它和紧急标志及在最后的DM标志一起发送。当一些Synch信号被连续快速发送时紧急信号可能被淹没。不可能对紧急信号记数,因为这一数字有可能小于也可能等于已经发送的数目。当处于通常模式下,DM不是一个操作;当处于紧急模型下,它指示紧急处理的结束。如果TCP指示紧急数据结束前发现DM,TELNET应该继续操作数据流直到遇到DM为止。如果TCP在DM之后指示又有一些紧急数据,那只能是因为是一串Synch。TELNET应该继续操作数据流直到遇到DM。

“有意义的”信号被定义为:IP,AO和AYT(但不是EC或EL)的TELNET标准定义;如果有的话,本地对这些标准定义的模拟;所有其它TELNET命令;其它站点定义的不需要拖后数据流的信号。因为SYNCH命令的另一个作用是抛弃所有在接收者和发送者之间随了TELNET命令之外的字符,如果需要时,此机制被指定为标准方法来清理数据路径。例如,如果一个在终端的用户传送一个AO命令,收到此命令的服务器(如果此服务器提供此功能)应该返回一个SYNCH给用户。

最后,正如需要TCP紧急信号作为供他们使用的命令一样,其它使用TELNET协议的协议也需要类似的命令。这通过使用[IP,SYNCH]就可以达到。例如,假设其它一些使用TELNET的协议定义了类型于AO命令的停止字符串。试想此协议的用户希望服务器来处理停止字符串,但连接因为服务器正在处理别的命令而被阻塞。用户应该使它的系统做以上工作:

1.                                                             发送TELNET IP字符;

2.                                                             发送TELNET SYNC串,这就是说:发送DM作为在TCP紧急模式发送操作下的唯一字符串。

3.                                                             发送字符串STOP,并且

4.                                                             发送其它协议的类型于TELNET DM的命令。

用户(或者进程)必须象步2一样重新发送TELNET SYNCH序列来确保TELNET IP到达服务器的TELNET解释器。“紧急”将唤醒TELNET进程;IP应该唤醒更高级的进程。NVT显示和键盘 NVT显示有一个未指定的行宽和页面大小,并且可以产生代表ASCII码的字符。

对于33个控制字符和另外128个没有使用的字符,将指定给显示:

NULL (NUL) 0 无操作;

Line Feed (LF) 10 将显示移动到下一行的同一垂直位置。

Carriage Return (CR) 13 将显示移至当前行的左边界处。

另外,还应该定义如下字符(但这不是必须的),它们对显示也有作用。TELNET的任何一方都不会假定另一方会在接收或传送时采取以下行动:

BELL (BEL) 7 响铃或者给出一个可视的信号(这并不移动显示位置)。

Back Space (BS) 8将显示向左移一个位置。

Horizontal Tab (HT) 9 将显示移至下一个制表位。现在还未指定任何一方如何决定制表位的位置究竟在什么地方。

Horizontal Tab (HT) 9 将显示移至下一个垂直制表位。现在还未指定任何一方如何决定制表位的位置究竟在什么地方。

Form Feed (FF) 12 将显示移动到下页起始位置,并保持相同的水平位置。所有现在的代码都不使NVT显示作任何操作。

CR LF序列将使显示定位于下一显示行的左边界处。然而,许多系统和终端并不将这两个字符分开处理而不得不作一些工作模拟它们的作用。(例如,一些终端没有独立于LF的CR,但在这些终端上可以通过后退键模拟CR的功能。)因此,CR LF序列必将作为新行标记使用它们的复合功能;CR NUL必须在希望仅输入一个回车时使用;在其它情况下应该避免单独使用CR。这个法则使必须决定是否进行一个“新行”操作功能或多个回退的系统能够保证包括由一个字符在CR后面的TELNET流的操作,并作出正确的决定。注意:CR LF或者CR NUL对双方都是要求的,这就保证了NVT的对称性。即使在一些情况下可以知道字符未被送到实际的终端,然而,出于一致性的考虑,协议要求在CR后面如果没有LF就必须插入一个NUL。反过来说,在CR后面接收到一个NUL后,应该把它从数据流中抛弃,而不应该将它用于NVT的字符映射。

在NVT上有键盘,组合键或键序列来产生这全部128个字符。注意:虽然其中的一些对NVT显示没有作用,NVT也有能力产生它们。除了这些以外,NVT键盘还应该能够产生如下有意义,但不要求的的字符。对这些字符的实际代码指派在TELNET命令一节中,因为它们被作为普通的应该被提供的,即使在数据流被解释为一些其它字符集的情况下。

Synch 此键允许用户清除到另一方的数据通道。此键的激活导致DM的发送,而且还导致同时发送TCP的紧急信号。DM-紧急信号对有如前面定义的意义。

Break (BRK) 它的提供是因为它不是ASCII字符集内的一员。它指示Break键和Attention键被按下。然而,请注意:它是作为第129个代码,而不是IP标准定义。

Interrupt Process (IP) 暂停,中断,放弃或终止NVT连接的进程的执行。同样的,它也是使用TELNET协议的协议要使用的信号。

Abort Output (AO) 允许当前进程运行至终止,但不将结果送给用户。同样,发送SYNCH给用户。

Are You There (AYT) 回送给NVT一些可见的字符。

Erase Character (EC) 接收方应该删除紧后一个未删除的字符或从数据流中删除一个“显示位置”。

Erase Line (EL) 接收方应该将数据流中的字符从当前位置开始一直删除到最近的“CR LF”为止。

这些“额外”键的功能和一些显示格式功能键是它们应该代表一个对从NVT到本地机映射的扩充。如同NVT数据字节68应该被映射为大写D一样,一个EC字符应该被映射为一个“删除行”的功能键。另外,如果映射124在一些情况下是武断的一样,EL字符的映射有时候也是武断的。对于格式字符也是一样的:如果终端实际上拥有“垂直制表位”,那么映射到NVT是显然的,如果终端不提供此功能,那么结果将是不可预料的。TELNET命令结构 所有TELNET命令结构至少包括一个两个字节的序列:由一个IAC后跟一个命令。关于选项会话的命令是由三个字节的序列构成的,第三个字节是关于选项参考的。选择这种结构,这样随着完全使用数据空格数据与命令值之间的冲突就会减少,所有这些冲突导致了不一致和没有效率和数据的丢失。根据目前的设置,只有与IAC冲突的数据需要被发送两次,其它255个代码都可以直接发送。下面是定义了的TELNET命令。注意:只有当代码和代码序列前面是IAC时它才是命令。

SE 240 结束子会话参数。

NOP 241 无操作。

Data Mark 242 Synch的数据流部分。这应该总和TCP紧急标志一起发送。

Break 243 NVT 字符 BRK。

Interrupt Process 244 IP功能。

Abort output 245 AO功能。

Are You There 246 AYT功能。

Erase character 247 EC功能。

Erase character 247 EL功能。

Go ahead 249 The GA 信号。

SB 250 指出所跟随的是指示选项的子对话。

WILL (option code) 251 指示希望开始执行,或者确认现在正在操作指示的选项。

WON'T (option code) 252 指出拒绝执行或继续招待所指示的选项。

DO (option code) 253 指出要求对方执行,或者确认希望对方执行指示的选项。

DON'T (option code) 254 指出要求对方停止执行,或者确诊要求对方停止执行指示的选项。

IAC 255 数据字节 255。

建立连接

TELNET TCP连接在用户端口U和服务器端口L之间建立。服务器在这个公认的端口上等待连接。因为TCP连接是一个全双工的,由双方端口共同确认,服务器可以同时在L端口同时处理许多来自不同U端口的连接。端口的指定 当用于远程用户访问服务主机,此协议指定端口23(也就是八进制的27)。那是 L = 23。

 
 
组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者: 
译文发布时间:2001-10-20
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。
Network Working Group                                          J. Postel
Request for Comments: 854                                    J. Reynolds
                                                                     ISI
Obsoletes: NIC 18639                                            May 1983
TELNET协议规范
(RFC874——TELNET PROTOCOL SPECIFICATION)
 
本RFC指定了一个ARPA互联网社区的标准。在ARPA互联网上的主机应该采纳与实
现该标准。
目录
简介                 1
一般性的考虑         1
网络虚终端           4
数据的传输           4
控制功能的标准表示   5
TELNET中的“同步(SYNCH)"信号        7
NVT打印机和键盘     8
TELNET命令结构      11
 
简介
TELNET协议的目的是提供一个相对通用的,双向的,面向八位字节的通信机制。它的主要
目标是允许界面终端设备和面向终端的过程能通过一个标准过程进行互相交互。另外,可以
预想,该协议可以应用到终端到终端通信(“连接”)和过程到过程通信(分布计算)中。
一般性的考虑
一个TELNET连接就是一个用来传输带有TELNET控制信息数据的传输控制协议(TCP)的
连接。
 
TELNET协议的建立基于这样三个主要想法:一,网络虚终端的概念;二,可谈判的选项的原理;三,对终端和过程进行均衡看待的观点。
1.一旦一个TELNET连接建立后,通信的两端被假设为在一个”网络虚拟终端”,或者NVT上开始和终止操作。一个NVT可以被想象为一个能提供标准的,网络范围的规范终端的中间代表者。这消除了”服务者”和”用户”之间需要保存对方终端和终端处理协定的信息的必要。所有的主机,包括用户和服务器,把他们本地的设备属性和协定映射为就象一
个在网络上的NVT,而且每一方都可以假设对方也有一个类似的映射。NVT有意地使过度受限(没有提供给主机足够的词汇来映射到他们的本地字符集)和过度包含(使用适当的终止来处罚用户)达到了平衡。
    注意:”用户”机通常指那些进行连接的物理终端,”服务器”提出指的是那些能够提供一些服务的机器。从终端到终端或过程到过程的可应用的平等性来看,”用户”指的是初始化通信连接的机器。
2.可谈判的选项的观点基于这样一个事实:许多主机都希望能够在NVT之上提供更多的服务,而许多用户将会拥有一个更复杂的终端,并且希望能够得到一流的,而不是极少的一点服务。尽管相互独立,但建立在TELNET协议中的是许许多多的”选项”,这些选项将被用来认可及同”DO,DON’T,WILL,WON’T”结构(下面将会讨论)一起使用去允许用户
和服务器同意在他们的TELNET连接上使用更精致的(或者可能是完全不同的)协议集合。这些选项包括改变字符集,回显,等等。  
建立选项使用的基本策略,是让每一方(或双方)初始化一个使一些选项有效的请求,另一方可以接受或拒绝该请求。如果该请求被接受了,选项立即生效;如果该请求被拒绝,连接的另一端仍然保留NVT的特性。很显然,一方经常可以通过拒绝来使能,而从来不能通过拒绝来取消一些选项,因为这些选项是双方为了支持NVT而准备的。
我们已经建立了一套谈判选项的规则,使得双方在同时请求一个相同选项的时候,每一方都可以把对方的请求当作对自己的请求的肯定回应。
3.谈判句法的对称性可能会导致无穷尽的应答循环--每一方都把对方发送过来的命令当作必须回答的请求而不是对方的应答。为防止这种循环,可以应用下面这些规则:
a.一方只能请求改变选项的状态。也就是一方不能只发送宣布它所使用的模式的请求。
b.如果一方所接收到的请求是要求它进入当前它所在的状态,那么该请求将不会被应
答。这种不应答对防止无穷尽的循环是非常重要的。对于那些改变模式的请求,都需要一个应答--尽管该模式不一定改变。
C.无论何时,只要一方向第二方发送一个选项命令,不管该命令是请求还是应答,而且使用该选项将会对从第一方发送到第二方的数据进行处理时生产影响,那么必须把该命令插到数据流中它希望开始起作用的点上。(要注意到在传送请求和接收到可能是否定的应答的过程需要一些时间。因此,一台主机可能在发出请求一个选项的请求后希望缓冲要发送的
数据,直到它知道该请求是被接受还是被拒绝,来隐藏这段对用户来说是"不确定"的时间。)选项请求在TELENT连接刚刚建立起的时候要在在连接的两端来来回回传送许多次,每一方都试图从对方获取尽可能好的服务。然而,在另一方面,选项可以用来动态地改变连接的特性,使它与对本地状态的改变相一致。例如,NVT(后面将要解释)使用的传输方式比
较适合一个用BASIC语言编的应用,这类应用在传输数据时是每次一行,而对那些每次传输一个字符的应用(比如NLS)就不是很适合。当对本地的处理来说是合适的,一个服务器可能会忍受这种“临时的特征”所需的巨大的处理器开销,并且会谈判一个合适的选项。然而,当不再需要详尽的控制时,处理开销可以(通过谈判)切换回NVT下的状态。
如果一个过程在收到一个拒绝回应后,仅仅是重新请求该选项,那么由一个过程发起的请求将会导致不停的请求循环。 为了防止出现这样的循环,不能重复被拒绝的请求,除非已经改变了某些选项。在运行中,这可能意味着该过程运行一个不同的程序,或者用户已经发出了另外的命令,或者出现了其他所有可以影响一个过程及其选项的上下文的东西。根据
经验,重新请求只能是一个连接的另外一端在后来又提交了某些信息,或者本地用户的交互的需要。
选项的设计者不应该拘泥于选项谈判中有限的一些语法。使用简单的语法的本意是希望使得选项易于使用 – 因为要忽略它们是很容易的。如果有一些特殊的选项需要一个比“DO,DON’T,WILL,WON’T”更完整的谈判结构,一个比较好的方法是用"DO, DON'T, WILL, WON'T"使双方都能理解该选项,一旦这个过程已经完成,就可以自由地使用一个更为特别的语法。比如,一方可以发送一个请求来通知(建立)一行的长度。如果这个请求被另一方所接受,那么可以用另外一个不同的语法来进行实际的对一行的长度的谈判 – 如一个”子谈判“可能包括可以允许的最小值,可以允许的最大值,以及最合适的行的长度等字段。一个较为重要的原理是,这样的扩展谈判只有在前面的一些(标准)谈判已经建立,并
且双方都可以解释这些扩展语法的情况下才能开始。
总之,WILL XXX由双方发送出去,表示该方希望(提出)开始对选项XXX进行处理。DO XXX和DON'T XXX表示它的肯定和否定回应;类似地,DO XXX发送出去指示(请求)对方(也即DO的接收者)开始对选项XXX进行处理,WILL XXX和WON'T XXX表示肯定和否定回应。
由于在没有使用任何的选项的情况下,NVT通过使用DON'T和WON'T回应来保证连接在连接的双方都可以处理的状态中。因此,所有主机都应该这样实现它们的TELNET进程:在完全不知道一个不支持的选项的情况下,只需要简单地拒绝任何无法了解的该选项请求。
TELNET协议尽可能地使服务器和用户之间是对称的,以便比较容易和自然地包含用户到用户(连接)和服务器到服务器(协作处理)这两种情况。尽管不是完全需要,但我们也希望选项能够加强这个目的。在任何情况下,我们更倾向于明确承认对称性是一个操作上的原则,而不是一个不变的标准。请参考相关文档“TELNET选项规范”来得到关于如何建立新的选项的信息。
网络虚终端
网络虚终端(NVT)是一个双向的字符设备。NVT有一个打印机和一个键盘。打印机负责进来的数据,而键盘负责产生通过TELNET连接发送出去的数据,并且在需要"回显“时,同时在NVT的打印机上回显这些数据。”回显“并不要求数据一定要经过网络(尽管有一个选项可以控制该操作的”远程“模式,但并不要求主机实现该选项)。
除了在这里说明的外,所有的编码集合都是有八位的,但只使用其中的七位的USASCII码。所有的代码转换和时区方面的问题都是本地的事情,而不影响NVT。
数据的传输
尽管一个通过网络连接的TELNET连接本质上是全双工的,但通常把NVT看作在线性缓冲模式下的半双工设备。也就是说,除非已经和对方谈判好,以下情形 对应于通过
TELNET连接进行数据传输。
1) 在本地缓冲空间允许的可用范围内,可以在产生数据的机器上汇集数据,直到完整的一行数据已经准备好传输,或者某些在局部定义的信号明确地要求传输数据。这些信号既可以有进程产生,也可以有用户发出。
定义这个规则的动机是,对于一些主机,处理网络输入中断的代价是很高的,另外,缺省的NVT规范指定“回显”操作的数据不经过网络的传输。因此,有理由在产生数据的源上缓冲一些数据。许多系统都会在输入一行结束后进行一些动作(行式打印机或者卡片打孔机经常都是这样子的),因此数据传输可以在一行数据结束时触发。另外,有时候一个用户或者进程会发现有必要或者应该提供一些不在一行的结尾结束的数据;因此实现者要注意,提供的局部信号机制要确保所有的缓冲数据都能够被立即发送出去。
 2) 当一个过程已完成向一个NVT打印机发送数据,并且输入队列中也没有来自NVT键盘,需要进一步进行处理的数据(就是说,当一个在TELNET连接的一端的过程无法在另一端没有数据输入的情况下进行处理),该过程必须传输TELNET 的继续(Go Ahead,GA)命令。
这个规则并不要求在一个连接的两端上的终端都发送TELNET GA命令,因为服务器开始进行处理时,一般情况下都不需要一个特别的信号(以及断开连接信号和其他在本地定义的特性)。况且,TELNET GA被设计来帮助一个具有“可锁定”键盘的本地计算机(如IBM2741)建立一个物理上的半双工终端。这种终端的一个说明可能对解释GA命令的正确
用法有帮助。
终端到计算机的连接总是在用户或者计算机的控制之下。任何一方都不能单方面地夺取另一方的控制;而且取得控制的一方必须明确地放弃它地控制。在终端这一方,硬件上就支持在每次一个“连接”终止的时候(也就是在用户按下“新连接”的键时),它就放弃控制。 
当这种情况发生时,连接的(本地)计算机处理输入的数据,决定是否要产生输出,如果不需要的话,就把控制返回给终端。如果要产生输出,计算机维持控制,直到所有的输出都被传输完毕。 通过网络使用这种类型的终端,困难是显而易见的。“本地”计算机在看到一个结束连
线信号后,无法决定是否要保持控制,这个决定只能由处理这些数据的“远程”计算机作出。因此,TELNET中的GA命令提供了一个机制,使“远程”计算机(服务器)如何给“本地”计算机(用户)发送信号,告诉对方现在是给用户终端传递控制的时间。当用户需要获得对终端的控制时,它应该并且只能在这段时间传递。  注意,过早地传递GA命令将导致输出阻塞,由此用户可能会认为传输系统已经被暂停,因此将导致用户手工转向连接时失败。
当然,前面所说的这种情况不会在通讯过程中用户到服务器这个方向上出现。在这个方向上,尽管没有必要,但在任何时候都可能发送出GA。同样,如果TELNET连接被应用在过程到过程的通讯中,在两个方向上都不需要发送GA。最后,对于终端到终端的通讯,在两个方向上可能都需要GA。如果一个主机打算支持终端到终端的通讯,建议主机在需要通
过TELNET连接发送GA的时候,提供一个手工发信号给用户的方法。然而,在实现TELNET过程中,这一点并不是必需的。
注意:由于TELNET模型的对称性,从理论上来说,在一个TELNET连接的每一端,都必须有一个NVT。
控制功能的标准表示
就象我们在本文档的简介中所说,TELENT协议的主要目标是在通过网络连接的终端设备和面向终端的过程之间提供一个标准的接口。早期具有这种互联性质的实验表明,大部分的服务器都实现了某些功能,但调用这些功能的方式却差别很大。对于一个要与多个服务器系统交互的用户来说,这些差别是一个非常大的障碍。因此,TELNET协议定义了这些
功能中的下面5种的标准表示。这些标准表示包括标准,含义 --- 尽管不是必需的(除了中断进程(IP)功能,使用TELENT协议的其他协议可能需要该功能)。因此,一个没有给本地用户提供某种功能的系统也没有必要给网络上的其他用户提供该功能,并且可以把该功能的标准表示当作No操作。在另一方面,如果一个系统已经给本地用户提供了该功能,那
么它必须给网络上那些传该功能的标准表示的用户提供同样的功能。
中断进程 – Interrupted Process(IP)
许多系统提供挂起,中断,中止,终止用户进程的操作的功能。当用户确信他的进程已经进入了无穷尽的循环,或者不小心激活了一个并不希望激活的进程时,就要经常使用该功能。IP就是调用该功能的标准表示。该功能的实现者需要注意,其他使用TELNET协议的协议可能要使用IP,因此实现时要支持这些协议。
 中断输出 -- Abort Output (AO)
   许多系统提供了允许一个产生输出的进程在不向用户的终端发送输出的情况下完成运行(或者达到在完成运行的过程中将会达到的某一个停止点)的功能。 另外,该功能一般还清除那些已经生成但还没有实际打印(或者显示)到用户的终端上的输出。AO是调用该功能的标准表示。 比如,许多子系统通常会接受一个用户的命令,然后以一个发送到用户终端的长的字符串作为回应,最后,给用户的终端发送一个“提示”字符(前面跟着<CR><LF>)来表示准备接受下一个命令。如果是在传输字符串的过程中接收到AO,一个合理的实现应该停止继续传输字符串,而转向发送提示符和跟在前面的
<CR><LF>。(这可能同接收到IP所进行的动作有一些差别。在接收到IP时,将导致停止字符串的传输并且从子系统中退出。
同时还需要注意到,对那些提供这种功能的服务器,可能还需要清除那些存在于系统外的缓冲机制(在网络中或者在用户的本地机器上)中的内容。完成这个过程的一个合适的方法是给用户的系统发送“同步”信号(将在下面描述)。
你在那里吗? --  Are You There (AYT)
许多系统提供了给用户提供系统仍然在运行的一些可见的(如可打印的)迹象。这个功能可以在系统在一个想象不到的很长一段时间里都没有动静时(可能是由于用户没有想象到的计算时间,或者不正常的巨大系统负荷等导致。)由用户调用。 AYT是调用该功能的标准表示.
消除一个字符 - - Erase Character (EC)
许多系统提供了删除在未删除字符前面或者用户提供的数据流中的“打印位置” 最后面的一个字符的功能。该功能通常在键盘输入时输入了错误的字符时使用。EC是调用该功能的标准表示。
*注意 :一个“打印位置”可能包含相互覆盖的几个字符,或者象下面的字符系列:
<char1> BS <char2>...
消除一行 -- Erase Line (EL)     
许多系统提供了删除输出设备上的当前一行的全部数据的功能。该功能经常在用键盘进行输入编辑时使用。EL是调用该功能的标准表示。
TELNET中的“同步(SYNCH)"信号
许多系统提供了一种机制,可以允许一个终端的用户对一个“失控“的进程重新获得控制权。上面描述的IP和AO功能就是这种机制的例子。当在本地使用时,这样的系统可以访问由用户提供的所有信号,而不管这些信号是一些普通字符或者是由电传打字机中的"BREAK"键或IBM 2741中的"ATTN"键发送的”带外“信号。然而当通过网络把系统联结
起来时,这可能是不正确的。网络的流程控制机制可能导致把这些信号缓冲到其他地方,比如用户的机器中。
为了解决这个问题,提出了TELNET中的"同步" 机制。
一个同步信号包含一个同TELNET命令DATA MARK结合在一起的TCP紧急通知。该紧急通知与TELNET连接中的流程控制没有关系,接收它的进程用它来调用数据流的特殊处理过程。在这种模式中,立即对数据流进行扫描,查找下面定义的一些“有趣“的信号,而把那些干涉的数据丢弃。
TELNET命令DATA MARK (DM)是数据流中的同步标记,表示所有特殊的信号都已经产生,接受者可以继续对数据流进行一般的处理。
同步信号通过TCP中的发送操作发送,在发送过程中需要把紧急标志设为“真“,并且把DM作为最后(或者唯一的)一个字节。
当许多同步信号快速地连续不断地发送时,可以合并紧急通知。不可能去计算紧急通知的次数,因为接收到的紧急通知的次数可能等于或者少于发送次数。在普通模式中,一个DM是没有任何操作的,但在紧急模式中,它表示紧急处理过程的结束。
 
如果在发现DM之前,TCP已经指示紧急数据的结束,TELNET应该继续对数据流进行特殊的处理,直到发现DM。
如果在发现DM之后,TCP指示有更多的紧急数据,它只能是另外同步信号。TELNET应该继续对数据流进行特殊的处理,直到发现另外一个DM。
定义的“有趣的“信号为:TELNET中的IP, AO, 和 AYT (没有EC 或EL)的标准表示;与这些标准表示类似的本地表示(如果有的话);所有的其他TELNET命令;其他在不延迟数据流的扫描并且能够起作用的自定义信号。
由于SYNCH机制的一个影响是丢弃本来在发送者和接收者之间要传输的所有字符(除了TELNET命令),如果需要,这个机制可以作为清除数据路径的一种标准方式。例如,在一个终端上的用户需要传输一个AO,接收到该AO的服务器应该给该用户返回一个同步信号(如果它提供该功能的话)。
最后,就象在TELNET层,需要把一个TCP紧急通知当作一个带外信号,因此其他使用TELNET的协议可能需要从不同层次来看可以当作带外信号的TELNET命令。
通过约定系列[IP, Synch] 可以把它作为这样的信号。例如,假设有一个使用TELNET协议的其他协议定义了一个类似于TELNET命令AO的字符串STOP。想象用户使用该协议的目的是希望服务器处理STOP字符串,但由于服务器在处理其他的命令,
导致连接被阻塞。用户应该引导他的系统:
a发送出TELNET IP字符;
b)发送出TELNET SYNC系列,也就是:在一个紧急模式的TCP发送操作中把Data Mark (DM)作为唯一的字符发送出去。
c)发送出字符串STOP;接着
d如果有的话,把其他协议中类似于TELNET DM的命令发送出去。
用户(或者代表该用户的进程)必须传输上面步骤2中的TELNET SYNCH 系列,以确保
TELNET IP已经到达服务器的TELNET 解释器。
紧急通知将激活TELNET进程,而IP将激活随后级别较高的进程。
NVT打印机和键盘
NVT打印机有一个没有指定宽度的走纸器,并且每一页的长度也没有指定。NVT打印机可以产生所有95个USASCII编码的图形表示(从32到126的编码)。在33个USASCII编码(0到31及127)和未包含的其他128个编码(128到255)中,下面几个编码对NVT打印机有确定意义:
         名称                  编码         意义
 
         NULL (NUL)             0         没有操作
         Line Feed (LF)         10         打印头移到下一个打印行,但不改变打印头的水平位置。
         Carriage Return (CR)    13         把打印头移到当前行的左边 。
另外,在NVT打印机上,尽管不是必需的,同时应该定义下面这些编码。TELNET连
接的双方,都不会假设另一方在接收到或传输下面这些编码时将会,或者已经实施某种特殊
动作:
         BELL (BEL)              7      产生一个可以看到或可以听到的信号(而不
移动打印头。)
         Back Space (BS)         8      向左移动打印头一个字符位置。
         Horizontal Tab (HT)     9      把打印头移到下一个水平制表符停止的位置。
它仍然没有指定每一方如何检测或者设定如
何定位这样的制表符的停止位置。
         Vertical Tab (VT)       11     把打印头移到下一个垂直制表符停止的位置。它
仍然没有指定每一方如何检测或者设定如何
定位这样的制表符的停止位置。
         Form Feed (FF)          12     把打印头移到下一页的顶部,保持打印头在
相同的水平位置上。
剩下的其他编码都不会导致NVT打印实施任何动作。
在定义中,系列"CR LF"将导致NVT打印头移动到下一行的左边(与系列 "LF CR"的效果是一样的)。然而,许多系统和终端并不独立处理CR和LF,为了模拟它们的效果,需要进行一些处理。 (比如,许多终端没有独立于LF的CR,但是在这样的终端上可以用退格键来模拟一个CR。)因此,必须把系列CR LF"当作一个单独的“新行”字符看待,并且
在需要把它们结合在一起的时候使用它们。必须在只需要一个单独的回车键时使用系列"CR NUL";在其他的场境中必须避免使用CR字符。这个规则可以确保系统在发现一个TELNET流中有一个字符的后面跟有CR的情况下,可以作出合理的选择:是进行“换行”功能还是进行多次的退格操作。
    注意,在两个方向上(在缺省的ASCII模式下)都需要"CR LF"或者"CR NUL",以确保NVT模式的对称性。
尽管在某种情况下(如当远程回显和禁止超前选项同时起作用时),可以认为字符并不被发送到一个实际的打印机上,然而,为了保证一致,在一个数据流中,如果一个CR的后面没有跟着一个LF,该协议要求把一个NUL插到CR的后面。
相反,在接收方,如果从数据流中接收到一个跟在CR的后面的NUL(在没有用谈判选项显式指定其他选择的情况下),在把NVT转换成本地字符集之前,应该把NUL去掉。
    NVT键盘有键或者键的组合,或者键系列来产生所有128格USAACII编码。要注意尽管一些在NVT打印机上没有什么用处,NVT键盘还是可以生成。
    除了这些编码,NVT键盘还可以生成下面这些附加的编码,除注明外,还定义了这些编码的意义(尽管不是必需的)。
对这些“字符”的实际代码分配在TELNET命令这一节,因为从某种意义上来讲,我们可以认为这些编码是固有的,甚至在把数据流中的数据都解释为属于另外的一个字符集的时候,都可以使用这些编码。
Synch
这个键允许一个用户清空到另一方的数据通道。激活该键将导致发送一个带有TCP紧急通知的DM(参看命令这一节)。一对DM-紧急通知具有在前面定义的一些意义。
Break (BRK)
之所以提供这个编码,是因为在当前的许多系统中,它是USASCII集合之外的一个信号,并且具有本地意义。 可以用它来表示Break键或Attention键已被按下。然而,需要注意的是,它的目的是给需要它的系统提供第129个编码,而不等同于IP的标准表示。
Interrupt Process (IP)
挂起,中断,中止,终止一个NVT连接的进程。另外,它也是那些使用TELNET的其他协议的带外信号的一部分。
Abort Output (AO)
   允许当前的进程继续运行直到结束,但不给用户发送它的输出信息。并且把一个同步信号发送给用户。
Are You There (AYT)
给NVT发送回一些可见的(也就是可打印的)信息以表明已经收到AYT。
Erase Character (EC)
接收者将删除数据流中最后一个未被删除的前导字符或者“打印位置”。
Erase Line (EL)
接收方将删除由TELNET连接发送的数据流中最后一个“CR LF”系列(但不包括该系列)后面的全部内容。    这些“额外”的键,也就是打印机的格式控制字符的本质是,它们是对从“NVT”到“本地”这个必须进行的映射过程的一个自然的扩展。
就象NVT中的字节68(八进制104),可以映射为本地中代表“大写D”的任何一个编码,字符EC也可以映射为本地中代表“删除一个字符”功能。
另外,就象在一个没有“垂直线”字符的环境下,对编码124(八进制174)的映射是任意的,如果在本地没有“删除一个字符”这种机制,对EL的映射也是任意的(甚至不映射)。
类似地,对格式控制字符,如果终端确实有一个“垂直制表键”,那么对VT地映射就是显而易见的,只有在终端没有一个垂直制表键的情况下,VT的作用才是无法预测的。
TELNET命令结构
    所有的TELNET命令至少包含一个两个字节的序列:跟在命令的代码的后面,"当作命令来解释(Interpret as Command)"(IAC)的转义字符。处理选项谈判的命令有三个字节系列,第三个字节就成了被选项引用的编码。之所以选择这种格式,是这种格式能够更大范围地使用"数据空间"---当然,是通过基本NVT的谈判来进行。数据字节与保留的命令值的冲突被
大大减少了,而所有这些冲突都需要复杂,低效的方法来把数据字节转换为流。使用现在的方法,只有在需要把IAC当作数据发送时才需要把相同的数据发送两次,其他255个代码都可以透明地传输。
下面是所有已定义的TELNET命令。需要注意的是,这些代码和代码序列只有在前面跟有一个IAC时才有意义。
      名称                     代码                     意义
SE                             240                子谈判参数的结束
NOP                          241                空操作
Data Mark                     242                  一个同步信号的数据流部分。该
命令的后面经常跟着一个TCP紧急
通知
Break                        243                NVT的BRK字符
Interrupt Process              244                    IP功能.
Abort output                245                AO功能.
Are You There             246                AYT功能.
Erase character            247                EC功能.
Erase Line                248                EL功能.
Go ahead                  249               GA信号.
SB                        250               表示后面所跟的是对需要的选项的子谈判
WILL (option code)         251               表示希望开始使用或者确认所使用的是指定的选项。
WON'T (option code)        252            表示拒绝使用或者继续使用指定的选项。
DO (option code)            253                表示一方要求另一方使用,或者确认你希望另一方使用指定的选项。
DON'T (option code)        254         表示一方要求另一方停止使用,或者确认你不再希望另一方使用指定的选项。 
IAC                         255            Data Byte 255.
连接的建立
TELNET TCP连接是在用户端口U和服务器端口L之间建立的。服务器在用于这种类型的连接的一个众所周知的端口L上监听客户请求。由于一个TPC连接是全双工的,并且通过双方的端口来标识,服务器可以对不同的用户端口U和端口L的之间的许多并发连接进行应答。
端口分配
当用来给远程用户提供访问服务主机的服务(也就是远程终端访问),这个协议分配了服务端口23(把进制27)。也就是L=23。
本RFC指定了一个ARPA互联网社区的标准。在ARPA互联网上的主机应该采纳与实现该标准。
    给TELNET协议提供一些选项的目的是,使相互通信的主机在解决不同设备之间的通信问题时获得比由网络虚拟终端(NVT)提供的可能框架有更好的方案。它可以让主机自由地创建,测试或者丢弃某些选项。当然,可以想象,那些普遍有用的选项最终大部分的主机都应该支持。因此,应该仔细地设计这些选项的文档,并且尽可能地公布它们。另外,确保
不在不同地选项中使用相同的选项代码也是必要的。
本文档指定了一个选项代码的分配和选项的文档标准方面的方法。在进行试验时,可能只需要选项代码分配而不需要完整的文档,不过一般来说,在分配选项代码之前都需要一个文档。我们通过把一个选项的文档作为一个RFC文档来发布,从而发布该选项。当然,选项的创建者也可以用其他的方式发布选项。
    选项代码由下面人员分配:
      Jonathan B。 Postel
      University of Southern California
      Information Sciences Institute (USC-ISI)
      4676 Admiralty Way
      Marina Del Rey, California 90291
      (213) 822-1511
      Mailbox = POSTEL@USC-ISIF
选项的文档至少要包含下面几个小节:
第1节 - - 命令的名称和选项的代码
第2节 - - 命令的意义
    应该描述同该选项相关的每一个TELNET命令的意义。需要注意的是,对于复杂的选项,“子谈判”是必需的,因此可能有许多相关的命令。“子谈判”的原理在下面有更详细的描述。
第3节 - 缺省的规范
    对那些没有实现,或者没有使用该选项的主机,必须描述这些选项在这些主机中的缺省假定值。
第4节 - 动机
    对创建一个特殊的选项,或者对某种选项选择一种特殊的格式的动机进行详细的描述,对那些还没有碰到(或者虽然已经碰到,但没有认识到)该选项设计来解决的问题的人,是非常有用的。
第5节 - 描述(或者实现规则)
为了确保一个命令的两个不同实现相互之间能够通讯,仅仅定义命令的意义和对该命令的意图进行说明有时候是远远不够的。因此,在许多情况下,我们需要给一个命令提供一个完整的描述。这个描述可以用文本来表示,也可以是一个示例性的实现,或者是实现的线索等等。
对“子谈判”的解释
在主机之间传递选项时,除了一个选项编码外可能还需要更多其他信息。例如,要求一个参数的那些选项就属于这种情况。在主机之间传递除了选项代码外的其他信息的策略包含两个步骤:双方都同意去”商讨“该参数,第二,对参数进行”商讨“。
在第一步中,同意去讨论参数以一种普通的方式来进行。一方通过发送一个带有选项代码的DO(或WILL)命令来建议使用选项,另一方发送一个带有选项代码的DO(或WILL)命令来表示接受这个建议。一旦双方都同意使用这选项,通过在SB命令的后面跟上相应的选项代码,参数和命令SE来开始子谈判。每一方都被假设为能够解析该参数。因为在最初通过交换WILL和DO命令,双方都表明可以支持该选项。另外,即使接收方不能解析该参数,接收方也可以通过搜索SE命令(如字符串IAC SE)来定位参数字符串的结束位置。当然,在任何时候,任何一方都可以给另一方发送WON'T或DON'T来拒绝继续进行进一步的子谈判。
Rfc845---TELNET PROTOCOL SPECIFICATION                               
TELNET协议规范10
RFC文档中文翻译计划                   
我们知道Telnet服务器软件是我们最常用的远程登录服务器软件,是一种典型的客户机/服务器模型的服务,它应用Telnet协议来工作。那么,什么是Telnet协议?它都具备哪些特点呢?  
  1 基本内容  
  Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务:  
  1)Telnet定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的程序;  
  2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项;  
  3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。  
  2 适应异构  
  为了使多个操作系统间的Telnet交互操作成为可能,就必须详细了解异构计算机和操作系统。比如,一些操作系统需要每行文本用ASCII回车控制符(CR)结束,另一些系统则需要使用ASCII换行符(LF),还有一些系统需要用两个字符的序列回车-换行(CR-LF);再比如,大多数操作系统为用户提供了一个中断程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。如果不考虑系统间的异构性,那么在本地发出的字符或命令,传送到远地并被远地系统解释后很可能会不准确或者出现错误。因此,Telnet协议必须解决这个问题。
  为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络虚拟终端NVT(Net Virtual Terminal)。它的应用过程如下:
  对于发送的数据:客户机软件把来自用户终端的按键和命令序列转换为NVT格式,并发送到服务器,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式;
  对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将将接收到的NVT格式数据再转换为本地的格式。
  对于NVT格式的详细定义,有兴趣的朋友可以去查找相关资料。  
  3 传送远地命令  
  我们知道绝大多数操作系统都提供各种快捷键来实现相应的控制命令,当用户在本地终端键入这些快捷键的时候,本地系统将执行相应的控制命令,而不把这些快捷键作为输入。那么对于Telnet来说,它是用什么来实现控制命令的远地传送呢?  
  Telnet同样使用NVT来定义如何从客户机将控制功能传送到服务器。我们知道USASCII字符集包括95个可打印字符和33个控制码。当用户从本地键入普通字符时,NVT将按照其原始含义传送;当用户键入快捷键(组合键)时,NVT将把它转化为特殊的ASCII字符在网络上传送,并在其到达远地机器后转化为相应的控制命令。将正常ASCII字符集与控制命令区分主要有两个原因:  
  1)这种区分意味着Telnet具有更大的灵活性:它可在客户机与服务器间传送所有可能的ASCII字符以及所有控制功能;  
  2)这种区分使得客户机可以无二义性的指定信令,而不会产生控制功能与普通字符的混乱。  
  4 数据流向  
  上面我们提到过将Telnet设计为应用级软件有一个缺点,那就是:效率不高。这是为什么呢?下面给出Telnet中的数据流向:   
  数据信息被用户从本地键盘键入并通过操作系统传到客户机程序,客户机程序将其处理后返回操作系统,并由操作系统经过网络传送到远地机器,远地操作系统将所接收数据传给服务器程序,并经服务器程序再次处理后返回到操作系统上的伪终端入口点,最后,远地操作系统将数据传送到用户正在运行的应用程序,这便是一次完整的输入过程;输出将按照同一通路从服务器传送到客户机。  
  因为每一次的输入和输出,计算机将切换进程环境好几次,这个开销是很昂贵的。还好用户的键入速率并不算高,这个缺点我们仍然能够接受。  
  5 强制命令  
  我们应该考虑到这样一种情况:假设本地用户运行了远地机器的一个无休止循环的错误命令或程序,且此命令或程序已经停止读取输入,那么操作系统的缓冲区可能因此而被占满,如果这样,远地服务器也无法再将数据写入伪终端,并且最终导致停止从TCP连接读取数据,TCP连接的缓冲区最终也会被占满,从而导致阻止数据流流入此连接。如果以上事情真的发生了,那么本地用户将失去对远地机器的控制。  
  为了解决此问题,Telnet协议必须使用外带信令以便强制服务器读取一个控制命令。我们知道TCP用紧急数据机制实现外带数据信令,那么Telnet只要再附加一个被称为数据标记(date mark)的保留八位组,并通过让TCP发送已设置紧急数据比特的报文段通知服务器便可以了,携带紧急数据的报文段将绕过流量控制直接到达服务器。作为对紧急信令的相应,服务器将读取并抛弃所有数据,直到找到了一个数据标记。服务器在遇到了数据标记后将返回正常的处理过程。
  6 选项协商  
  由于Telnet两端的机器和操作系统的异构性,使得Telnet不可能也不应该严格规定每一个telnet连接的详细配置,否则将大大影响Telnet的适应异构性。因此,Telnet采用选项协商机制来解决这一问题。  
  Telnet选项的范围很广:一些选项扩充了大方向的功能,而一些选项制涉及一些微小细节。例如:有一个选项可以控制Telnet是在半双工还是全双工模式下工作(大方向);还有一个选项允许远地机器上的服务器决定用户终端类型(小细节)。  
  Telnet选项的协商方式也很有意思,它对于每个选项的处理都是对称的,即任何一端都可以发出协商申请;任何一端都可以接受或拒绝这个申请。另外,如果一端试图协商另一端不了解的选项,接受请求的一端可简单的拒绝协商。因此,有可能将更新,更复杂的Telnet客户机服务器版本与较老的,不太复杂的版本进行交互操作。如果客户机和服务器都理解新的选项,可能会对交互有所改善。否则,它们将一起转到效率较低但可工作的方式下运行。所有的这些设计,都是为了增强适应异构性,可见Telnet的适应异构性对其的应用和发展是多么重要。  
  上面讨论了一些原理方面的东西,虽然我们在Telnet的使用过程中很难接触到这一层面,但我认为了解这些是有意义的,它会给我们带来许多启示。   

一、介绍
TELNETProtocol的目的是提供一个相对通用的,双向的,面向八位字节的通信方法。它主要的目标是允许接口终端设备的标准方法和面向终端的相互作用。可以预见到,此协议也可被用于终端到终端的通信和处理到处理的通信(分布式计算)。

一般考虑
一个TELNET连接是一个用于传输控制协议的传送数据的。TELNET协议是建立在以下三个想法上的:首先是网络虚拟终端的概念;其次是对话选项的方法;最后是终端和处理的协调。
当一个TELNET连接被初次建立时,每一端都被假设使用了网络虚拟终端,也就是NVT。NVT是一个想象中的标准设备通用设备的代表。这就消除了“服务器”和“用户”机要了解对方机器终端的特点,而终端可以直接处理对话。所有的主机,用户端的和服务器端的,它们自己本地的设备特点因此在网络上可以作为一种NVT处理,任何一个都可以认为对方使用的是相同特点的设备。NVT倾向于不过多地限制(提供了一个相应比较丰富的映射到本地设备的字符集),也不是包括一切的(它要求用户使用适当的终端)。注意:用户机通常是与处理终端连接的主机,服务器机通常是提供某种服务的机器。从另一点看,在终端到终端或进程到进程的通信上,用户机是发起通信的机器。
规定选项的原理将以下事实考虑在内,许多机器希望在现在的NVT上提供另外的服务,多数用户有比较复杂的终端,它们也就希望一种比较完整的而不是最小的服务。独立的,但是存在于TELNET协议的不同选项支持这些需求,它们使用"DO,DON'T,WILL,WON'T"结构允许用户机和服务器建立建立一种更加精巧的TELNET会话连接。这种选项包括改变字符集,响应模式等等。设置选项的基本策略是任一方(或者两者)初始化要求一个选项生效的请求。另一方可以接受也可以拒绝这一请求。如果接受请求,此选项立刻生效;如果被拒绝,连接仍然保持基本的NVT的连接属性。很明显,一方可以拒绝另一方关于启用某一选项的请求,但是不能拒绝另一方关于使一选项失效的请求,因为双方必须准备支持NVT。对话选项语法的建立使在双方都发出请求某一选项生效的请求时,另一方可以直接认为收到对方的确认信息。
这种对称式的对话语法潜在地引起了一个不可终止的确认环--任何一方都将收到的确认信息看作是请求,而不是一个确认信息。为了防止这种循环的出现,有下面的规则:任何一方仅可以要求对选项状态的变化:例如,一方不可以发出请求,仅仅说明它在什么样的选项状态下。
如果一方接收到好象是请求的信息,请求进入一个已经进入的状态,此信息将被看作是一个确认消息。这种非响应从本质上防止了不可终止的对话的循环。如果要求发送一个要求改变状态的请求,即使状态并未改变。
无论何时,一方发送选项命令到另一方,无论作为一个请求或者是一个确认消息,选项的使用将对发送的数据处理有影响,这样命令应该被插入到希望发生作用的数据流中的数据点之前。(应该注意,传送请求和收到确认消息之间有一定的时间间隔,这是被动方式的。因此,一个主机希望在要求一个选项后缓存数据,直到它知道它的请求是否被接受,这样就可以使这段不不确定时间对用户不可见。)选项的请求可以在建立TELNET连接时十分频繁地来往交换,因为每一方都希望从对方得到更好的服务。
除此以外,选项也可以在连接持续过程中动态改变来适应本地机器条件的变化。例如,NVT(它将以后被详细解释)对于许多“一次一行”的应用程序,如BASIC是十分适用的,而对于如NLS的“一次一字”的应用程序却不怎么好用。服务器可能被选择作为“一次一字”法则来适应在其上运行的本地进程,它将发起对话以达到合适的选项状态。然而,相对于永久地负责这种多余的处理负担;它可以通过会话,在不需要这样的选项状态下回到NVT状态。由一个进程发起的请求可以导致一个不可终止的请求循环,如果此进程对一个拒绝请求的响应是再次要求此选项。为了防止这样循环的发生,被拒绝的请求在其它事情发生变化之前不能被重复请求。这可能意味着,进程运行另外一个程序,或者用户发送另外的命令,或者用户对于环境或选项的改变。
比较好的方法是,预请求应该作为由另一端发送信息的结果而发生,或者由于人为介入而发生。选项的设计者不应该因为对于选项会话的种种限制而感觉到伸不开手脚。一般语法的目的是更容易地拥有选项--因为表示对它们的忽视也是容易的。
如果特定的选项需要除"DO,DON'T,WILL,WON'T"以外的更丰富的结构,正确的方针是使用"DO,DON'T,WILL,WON'T"来建立连接解释这种新结构,当这一解释工作完成时,就可以自由地使用这一新结构了。例如,一方可能发送请求改变(或建立)每行的长度。如果接受了这些,对于对话的不同行长度可以使用不同的语法来表示--“子对话”可以包括一个域表示最大允许的,最小允许的和希望的长度。重要概念是这样的扩充的会话应该直到双方建立了标准的会话并且能够解释这种扩充的语法之后再进行。总的来说,WILLXXX发送时说明一方希望执行选项XXX,DOXXX和DON'TXXX作为确定的不确定的响应;同样,DOXXX被作为一种请求发送给另一方来启动选项XXX,WILLXXX和WON'T将被作为确定和不确定的响应。因为NVT是没有任何选项时的结果,DON'T和WON'T响应将保证使连接最终保持于这种没有任何选项的状态。因此,所有主机可以不支持不理解的选项,它仅仅需要返回这种选项的请求即可。
尽可能的,TELNET协议被用作服务器-用户的对称,这样,它就可以更容易而自然地处理用户-用户和服务器-服务器的情况。用选项来扩展这一功能是被希望实现的,但不是必要的。在任何情况下,对称是一个运行的准则而不是固定的准则多次被明确提出。一个比较文档,“TELNET选项说明”,可以被用于对建立新选项过程信息的参考。
网络虚拟终端网络虚拟终端(NVT)是一个双向字符设备。NVT有一个显示设备和一个键盘。显示设备响应到达的数据,键盘负责通过TELNET连接发送数据,如果需要回显,也应该在NVT的显示设备上显示。对于网络上的回显并不要求(虽然确实存在这个“远程”回显选项,但是主机必不是必须实现此选项)。字符集是由七位ASCII码组成的,而保存在八位的域中。任何字符的转换和计时方面的考虑都是本地的问题,这不影响NVT的工作。
数据传送方面,虽然TELNET连接是全双工的,NVT却是在线缓冲状态下的半双工设备。传送数据虽然TELNET连接是全双工的,在线缓冲模式下,NVT却被当作半双工的设备。此信号可以由进程或者用户产生。对于一些主机处理网络输入中断,或与默认的不进行远程回显的NVT说明的主机来说,此规则的代价是高昂的。因此,在源点缓存一些数据是有理由的。一些系统在每个输入行未采用一些操作(即使是行打印机或打卡机也经常采用这种方法),这样可以在每行未开始发送。在另一方面,用户或者进程可以有时发觉提供在行未不中断的数据是有用的而且是必须的;因此,也应该在实现在本地能够识别这种信号并把这些数据立刻发送的方法和机制。当一个进程已经完成将数据发送到对方的显示设备而且也没有缓存的输入数据时时,进程必须发送TELNETGoAhead(GA)命令。
这个规则并不是要求TELNETGA命令必须由双方终端发送,因为服务器主机通常不要求特定的信号来继续进程。但是,此命令的设计可以帮助用户的本地主机操作一个物理上半双工的终端,它如果IBM2741一样拥有可锁定的键盘。对此种类型终端的描述有助于解释GA命令的正确使用。终端和计算机的连接总是在计算机或用户的控制之下。任何一方都不能够隐式地从另一方获得控制权;控制权必须显式地从一方转移到另一方。
在终端一方,设置硬件在每一行结束时放弃控制权(例如,当用户按下回车键时)。当这种情况发生时,本地计算机处理输入数据,决定是否输出,如果不需要,将控制权回送给终端。如果需要产生输出,计算机将保有控制权直到输出数据发送完毕。在网络上使用这种终端的困难是显而易见的。“本地”计算机不知道在读到行未符号时是否应该继续保持控制权;这个问题的决定权在远地处理此数据的计算机。因此,TELNETGA命令提供了一种机制让远程计算机能够通知本地计算机,让它将控制权转交给用户终端。在用户需要控制权时,此信号应该也只能在此时发送。注意:过早地发送GA命令会使输出数据阻塞,因为用户可以假定传送系统暂停,因此不能将一行结束。当然,前述内容不能够用于用户到服务器方面的通信方面。在这个方面,GA命令可以在任何时候发送,可以根本不用发送。同样,如果TELNET连接被用于进程到进程的通信,也不需要发送GA命令。
最后,对于终端到终端的通信,可以在两端都需要GA命令,也可以在一端,也可以两端都需要。如果主机希望支持终端到终端的通信主机应该提供一种让用户自由发送GA命令的方法;然而,对于一个TELNET进程而言,这并不是必须的。注意:TELNET模式的对称性要求在概念上,两端中的一端至少是一个NVT。控制函数的标准表示如要本文的介绍中所说的,TELNET协议的目的是提供一种网络上面向终端进程和终端设备的标准接口。
这种类型互连的先前的经验告诉我们,在许多主机上已经实现了类似的功能,但它们的实现方法却差别很大。对于接触这些系统的用户而言,这些差别将是令人头痛的。因此,TELNET定义了以下功能的五种标准表示。这种标准表示有一定的标准的意义,但这也不是必须的(例外是中断处理函功能要其它使用TELNET的协议执行);这也就是说,系统不提供给本地用户的功能也不可以不提供给远程用户,它可以将标准表示作为非操作的功能。
在另一方面,给本地用户提供此功能的系统必须也向传送此功能标准表示的远程用户提供此功能。
中断处理(IP)一些系统提供可以暂停,中断,放弃或终止用户进程操作的功能。当用户确定它的进程处于不可结束的循环中,或不经意地激活了一个进程时经常使用此功能。IP是使用此功能的标准表示。实现者应该注意的是:使用TELNET的其它协议可能也需要IP,因此,如果需要支持其它协议就应该实现IP。放弃输出(AO)许多系统提供此功能,它允许产生输出的进程到达类似操作结束的点,而不将输出发送到用户的终端。更深一层的,此功能通常清除已产生的所有输出,而不显示到用户的终端上。AO是使用此功能的标准表示。
例如,一些子系统可能通常接受用户命令,发送长文本串到用户终端,最后发送一个提示用户允许接收下一命令的提示符到用户终端。如果在传送文本串的过程中接收到AO命令,将会不再发送剩余的字符串,而直接显示提示符告知用户可以输入下一命令。(这与接收到IP之后的操作可能有所不同;IP会放弃发送剩余的字符串而且退出子系统。)应该注意到,使用提供此功能的服务器系统时外部缓冲区(在网络和用户本地主机上)也被清除;完成的正确方法是向用户系统发送“Synch”信号。
你在此吗(AYT)许多系统提供用户这样的功能,让用户知道是否正在运行。此功能在系统由于不可预知长度运算,或系统负载重的情况下长时间不响应时由用户发起。AYT是使用此功能的标准表示。
删除字符(EC)许多系统提供此功能用于删除最近相邻的不可删除字符或用户提供数据流的最近相邻的“显示位置”。此功能通常用于编辑键盘错误的输入。EC是使用此功能的标准表示。注意:“显示位置”可能包括多于一个的字符,它们是过多键入的结果或者如下格式的字符串:<char1>BS<char2>...
删除行(EL)许多系统提供此功能用于删除当前输入行中的所有数据。此功能通常被用于是编辑键盘输入。EL是使用此功能的标准表示。
TELNET的"Synch"信号大部分时分系统提供一种允许终端用户重新获得失控进程的机制;上述的IP和AO功能就是此机制的一个例子。这些系统,当被用于本地时,访问由用户提供的所有信号,无论此信号是一般字符还是不可显示的字符如电传中的“BREAK”或IBM2741中的“ATTN”键。当系统通过网络连接时这种情况不一定就是准确的;网络流量控制机制可能导致一个信号被缓存于网络中某处,例如在用户的主机中。为了克服这个问题,引入了TELNET的“Synch”机制。一个Synch信号包括一个TCP紧急信号和TELNET命令DATAMARK。
紧急信号,它不受限于限制TELNET的流量控制,它可以在接收到进程引发特定的数据处理。
在这种模式中,此数据流立即被看作是“有重大意义的”,而抛弃其它数据。
TELNET命令DATAMARK(DM)是数据流中的同步标志,它指示任何特定的信号已经发生过了,接收可以返回到正常处理其它数据的状态中了。Synch通过TCP发送操作完成,它和紧急标志及在最后的DM标志一起发送。当一些Synch信号被连续快速发送时紧急信号可能被淹没。不可能对紧急信号记数,因为这一数字有可能小于也可能等于已经发送的数目。当处于通常模式下,DM不是一个操作;当处于紧急模型下,它指示紧急处理的结束。如果TCP指示紧急数据结束前发现DM,TELNET应该继续操作数据流直到遇到DM为止。如果TCP在DM之后指示又有一些紧急数据,那只能是因为是一串Synch。TELNET应该继续操作数据流直到遇到DM
“有意义的”信号被定义为:IP,AO和AYT(但不是EC或EL)的TELNET标准定义;如果有的话,本地对这些标准定义的模拟;所有其它TELNET命令;其它站点定义的不需要拖后数据流的信号。因为SYNCH命令的另一个作用是抛弃所有在接收者和发送者之间随了TELNET命令之外的字符,如果需要时,此机制被指定为标准方法来清理数据路径。例如,如果一个在终端的用户传送一个AO命令,收到此命令的服务器(如果此服务器提供此功能)应该返回一个SYNCH给用户。
最后,正如需要TCP紧急信号作为供他们使用的命令一样,其它使用TELNET协议的协议也需要类似的命令。这通过使用[IP,SYNCH]就可以达到。例如,假设其它一些使用TELNET的协议定义了类型于AO命令的停止字符串。试想此协议的用户希望服务器来处理停止字符串,但连接因为服务器正在处理别的命令而被阻塞。用户应该使它的系统做以上工作:
发送TELNETIP字符;
发送TELNETSYNC串,这就是说:发送DM作为在TCP紧急模式发送操作下的唯一字符串。
发送字符串STOP,并且发送其它协议的类型于TELNETDM的命令。
用户(或者进程)必须象步2一样重新发送TELNETSYNCH序列来确保TELNETIP到达服务器的TELNET解释器。“紧急”将唤醒TELNET进程;IP应该唤醒更高级的进程。NVT显示和键盘NVT显示有一个未指定的行宽和页面大小,并且可以产生代表ASCII码的字符。
对于33个控制字符和另外128个没有使用的字符,将指定给显示:
NULL(NUL)0无操作;
LineFeed(LF)10将显示移动到下一行的同一垂直位置。
CarriageReturn(CR)13将显示移至当前行的左边界处。另外,还应该定义如下字符(但这不是必须的),它们对显示也有作用。TELNET的任何一方都不会假定另一方会在接收或传送时采取以下行动:
BELL(BEL)7响铃或者给出一个可视的信号(这并不移动显示位置)。
BackSpace(BS)8将显示向左移一个位置。
HorizontalTab(HT)9将显示移至下一个制表位。现在还未指定任何一方如何决定制表位的位置究竟在什么地方。
HorizontalTab(HT)9将显示移至下一个垂直制表位。现在还未指定任何一方如何决定制表位的位置究竟在什么地方。
FormFeed(FF)12将显示移动到下页起始位置,并保持相同的水平位置。所有现在的代码都不使NVT显示作任何操作。
CRLF序列将使显示定位于下一显示行的左边界处。然而,许多系统和终端并不将这两个字符分开处理而不得不作一些工作模拟它们的作用。(例如,一些终端没有独立于LF的CR,但在这些终端上可以通过后退键模拟CR的功能。)因此,CRLF序列必将作为新行标记使用它们的复合功能;CRNUL必须在希望仅输入一个回车时使用;在其它情况下应该避免单独使用CR。这个法则使必须决定是否进行一个“新行”操作功能或多个回退的系统能够保证包括由一个字符在CR后面的TELNET流的操作,并作出正确的决定。注意:CRLF或者CRNUL对双方都是要求的,这就保证了NVT的对称性。即使在一些情况下可以知道字符未被送到实际的终端,然而,出于一致性的考虑,协议要求在CR后面如果没有LF就必须插入一个NUL。反过来说,在CR后面接收到一个NUL后,应该把它从数据流中抛弃,而不应该将它用于NVT的字符映射。
在NVT上有键盘,组合键或键序列来产生这全部128个字符。注意:虽然其中的一些对NVT显示没有作用,NVT也有能力产生它们。除了这些以外,NVT键盘还应该能够产生如下有意义,但不要求的的字符。对这些字符的实际代码指派在TELNET命令一节中,因为它们被作为普通的应该被提供的,即使在数据流被解释为一些其它字符集的情况下。
Synch此键允许用户清除到另一方的数据通道。此键的激活导致DM的发送,而且还导致同时发送TCP的紧急信号。DM-紧急信号对有如前面定义的意义。
Break(BRK)它的提供是因为它不是ASCII字符集内的一员。它指示Break键和Attention键被按下。然而,请注意:它是作为第129个代码,而不是IP标准定义。
InterruptProcess(IP)暂停,中断,放弃或终止NVT连接的进程的执行。同样的,它也是使用TELNET协议的协议要使用的信号。
AbortOutput(AO)允许当前进程运行至终止,但不将结果送给用户。同样,发送SYNCH给用户。
AreYouThere(AYT)回送给NVT一些可见的字符。
EraseCharacter(EC)接收方应该删除紧后一个未删除的字符或从数据流中删除一个“显示位置”。
EraseLine(EL)接收方应该将数据流中的字符从当前位置开始一直删除到最近的“CRLF”为止。
这些“额外”键的功能和一些显示格式功能键是它们应该代表一个对从NVT到本地机映射的扩充。如同NVT数据字节68应该被映射为大写D一样,一个EC字符应该被映射为一个“删除行”的功能键。另外,如果映射124在一些情况下是武断的一样,EL字符的映射有时候也是武断的。对于格式字符也是一样的:如果终端实际上拥有“垂直制表位”,那么映射到NVT是显然的,如果终端不提供此功能,那么结果将是不可预料的。TELNET命令结构所有TELNET命令结构至少包括一个两个字节的序列:由一个IAC后跟一个命令。关于选项会话的命令是由三个字节的序列构成的,第三个字节是关于选项参考的。选择这种结构,这样随着完全使用数据空格数据与命令值之间的冲突就会减少,所有这些冲突导致了不一致和没有效率和数据的丢失。根据目前的设置,只有与IAC冲突的数据需要被发送两次,其它255个代码都可以直接发送。下面是定义了的TELNET命令。注意:只有当代码和代码序列前面是IAC时它才是命令。
SE240结束子会话参数。
NOP241无操作。
DataMark242Synch的数据流部分。这应该总和TCP紧急标志一起发送。
Break243NVT字符BRK。
InterruptProcess244IP功能。
Abortoutput245AO功能。
AreYouThere246AYT功能。
Erasecharacter247EC功能。
Erasecharacter247EL功能。
Goahead249TheGA信号。
SB250指出所跟随的是指示选项的子对话。
WILL(optioncode)251指示希望开始执行,或者确认现在正在操作指示的选项。
WON'T(optioncode)252指出拒绝执行或继续招待所指示的选项。
DO(optioncode)253指出要求对方执行,或者确认希望对方执行指示的选项。
DON'T(optioncode)254指出要求对方停止执行,或者确诊要求对方停止执行指示的选项。
IAC255数据字节255。
二、建立连接
TELNETTCP连接在用户端口U和服务器端口L之间建立。服务器在这个公认的端口上等待连接。因为TCP连接是一个全双工的,由双方端口共同确认,服务器可以同时在L端口同时处理许多来自不同U端口的连接。端口的指定当用于远程用户访问服务主机,此协议指定端口23(也就是八进制的27)。那是L=23。 3 远程登录的工作过程
使用Telnet协议进行远程登陆时需要满足以下条件:在本的计算机上必须装有包含Telnet协议的客户程序;必须知道远程主机的Ip地址或域名;必须知道登录标识与口令。
Telnet远程登录服务分为以下4个过程:
1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的Ip地址或域名;
2)将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据报;
3)将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;
4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。
上面的内容只是讨论了远程登陆最基本的东西,其中的复杂和编程人员的艰辛是我们难以想象的,不知道你在舒服的使用Telnet的同时,是否想到了这些!
三 Telnet协议
我们知道Telnet服务器软件是我们最常用的远程登录服务器软件,是一种典型的客户机/服务器模型的服务,它应用Telnet协议来工作。那么,什么是Telnet协议?它都具备哪些特点呢?
1 基本内容
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务:
1)Telnet定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的程序;
2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项;
3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。
2 适应异构
为了使多个操作系统间的Telnet交互操作成为可能,就必须详细了解异构计算机和操作系统。比如,一些操作系统需要每行文本用ASCII回车控制符(CR)结束,另一些系统则需要使用ASCII换行符(LF),还有一些系统需要用两个字符的序列回车-换行(CR-LF);再比如,大多数操作系统为用户提供了一个中断程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。如果不考虑系统间的异构性,那么在本地发出的字符或命令,传送到远地并被远地系统解释后很可能会不准确或者出现错误。因此,Telnet协议必须解决这个问题。
为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络虚拟终端NVT(Net Virtual Terminal)。它的应用过程如下:
对于发送的数据:客户机软件把来自用户终端的按键和命令序列转换为NVT格式,并发送到服务器,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式;
对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将将接收到的NVT格式数据再转换为本地的格式。
对于NVT格式的详细定义,有兴趣的朋友可以去查找相关资料。
3 传送远地命令
我们知道绝大多数操作系统都提供各种快捷键来实现相应的控制命令,当用户在本地终端键入这些快捷键的时候,本地系统将执行相应的控制命令,而不把这些快捷键作为输入。那么对于Telnet来说,它是用什么来实现控制命令的远地传送呢?
Telnet同样使用NVT来定义如何从客户机将控制功能传送到服务器。我们知道USASCII字符集包括95个可打印字符和33个控制码。当用户从本地键入普通字符时,NVT将按照其原始含义传送;当用户键入快捷键(组合键)时,NVT将把它转化为特殊的ASCII字符在网络上传送,并在其到达远地机器后转化为相应的控制命令。将正常ASCII字符集与控制命令区分主要有两个原因:
1)这种区分意味着Telnet具有更大的灵活性:它可在客户机与服务器间传送所有可能的ASCII字符以及所有控制功能;
2)这种区分使得客户机可以无二义性的指定信令,而不会产生控制功能与普通字符的混乱。
4 数据流向
上面我们提到过将Telnet设计为应用级软件有一个缺点,那就是:效率不高。这是为什么呢?下面给出Telnet中的数据流向:
数据信息被用户从本地键盘键入并通过操作系统传到客户机程序,客户机程序将其处理后返回操作系统,并由操作系统经过网络传送到远地机器,远地操作系统将所接收数据传给服务器程序,并经服务器程序再次处理后返回到操作系统上的伪终端入口点,最后,远地操作系统将数据传送到用户正在运行的应用程序,这便是一次完整的输入过程;输出将按照同一通路从服务器传送到客户机。
因为每一次的输入和输出,计算机将切换进程环境好几次,这个开销是很昂贵的。还好用户的键入速率并不算高,这个缺点我们仍然能够接受。
5 强制命令
我们应该考虑到这样一种情况:假设本地用户运行了远地机器的一个无休止循环的错误命令或程序,且此命令或程序已经停止读取输入,那么操作系统的缓冲区可能因此而被占满,如果这样,远地服务器也无法再将数据写入伪终端,并且最终导致停止从TCP连接读取数据,TCP连接的缓冲区最终也会被占满,从而导致阻止数据流流入此连接。如果以上事情真的发生了,那么本地用户将失去对远地机器的控制。
为了解决此问题,Telnet协议必须使用外带信令以便强制服务器读取一个控制命令。我们知道TCP用紧急数据机制实现外带数据信令,那么Telnet只要再附加一个被称为数据标记(date mark)的保留八位组,并通过让TCP发送已设置紧急数据比特的报文段通知服务器便可以了,携带紧急数据的报文段将绕过流量控制直接到达服务器。作为对紧急信令的相应,服务器将读取并抛弃所有数据,直到找到了一个数据标记。服务器在遇到了数据标记后将返回正常的处理过程。

telnet(网上收集的,有重复的)相关推荐

  1. Android 阅读器架构图,网上收集,留做存货

    这个结构图是网上收集的图片,基结构明晰简洁,易于后期维护,本文会继续收集更多其它优秀的结构图,望有图的朋友推荐~

  2. 在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享

    在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享: 关于基站定位方面的介绍: http://tech.c114.net/164/a140837.html 开发方面的帮助: h ...

  3. 网上收集的几个花指令

    c++花指令: 00460000: 55                             PUSH EBP 00460001: 8B EC                          M ...

  4. 关于freemarker(网上收集资料)

    copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主 ...

  5. 网上收集的各网摘地址 备用

    网上收集的网摘地址 备用 1.名称:美味书签(del.icio.us) <a href="http://del.icio.us/post" οnclick="win ...

  6. Hadoop面试题 (网上收集版带答案)

    1.列出安装Hadoop流程步骤 a) 创建hadoop账号 b) 更改ip c) 安装Java 更改/etc/profile 配置环境变量 d) 修改host文件域名 e) 安装ssh 配置无密码登 ...

  7. fi sap 凭证冲销 稅_SAP 成本收集器与重复制造配置手册

    1.检查产品成本收集器的评估变式OPN2 2.检查产品成本收集器的成本核算变式OKKN 3.确定作业数量的成本核算变式 4.内部作业估价的成本核算变式 5.定义订单交货的货物接收评估 6.定义利润分析 ...

  8. 关于梅森素数定理(网上收集)

    一.梅森素数 我们把一个大于1的自然数叫作素数,如果只有1和它本身可以整除它.如果一个比1大的自然数不是素数,我们就叫它合数.1既不是素数,也不是合数. 比如说,你很容易就可以验证7是一个素数:而15 ...

  9. svm的一些理解(网上收集)

    机器学习(Machine Learning, ML)的目的是根据给定的训练样本求对某系统输入输出之间依赖关系的估计,使它(这种关系)能够对未知输出做出尽可能准确地预测.机器学习至今没有一个精确的公认的 ...

最新文章

  1. SQLite数据转换成sql server数据
  2. Oracle分区表详解 .
  3. 图解classloader加载class的流程及自定义ClassLoader
  4. 右键命令行在这里-cmd here
  5. python numpy官网_Python Numpy 教程(上)
  6. 【转】php和java之间rsa加密互通
  7. [引]VS2005 之 Visual Basic 程序的结构
  8. 院士:青年科学家5年内拿不出成果就面临淘汰,想坐‘冷板凳’都坐不了!
  9. kali2 安装docker_kali linux 安装docker
  10. python中函数参数*args和**kw的区别
  11. nginx react vue location history 配置
  12. ROS 2正式版终于来了,还增加了这些新特性
  13. perf script 执行时间_在Python中准确地测量代码执行时间
  14. Atitit 软件与互联网理论 attilax总结
  15. go程序设计语言-前言
  16. 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验00 熟悉开发环境(2021级)
  17. TAOCP_READING 1.1完
  18. 用C语言能编程工控机吗,工控机、PLC、单片机的区别 工控机应用于哪些领域
  19. android焦距跟实际距离,android相机焦距和焦距不变
  20. ubuntu16.04+Titan Xp的驱动官网上找不到

热门文章

  1. 米云平台Python调用
  2. 如何生成xmind的复杂流程图
  3. Qt 之 ActiveX要点记录
  4. 20230208-20230212工作及生活总结
  5. linux 之 scp 命令使用详解
  6. unity3d 5 InputField 非法路径文件名字符 输入过滤
  7. 远程控制电脑目前是很重要、很完美的软件
  8. Java双亲委派机制在Android的应用
  9. 小程序如何访问ssm服务器,微信小程序和ssm交互
  10. fgo服务器维护后抽奖,fgo:抽卡机制详解 彩圈是必定会出五星的