武汉华中理工大学电信系(武汉430074)  丁 夫
  摘 要 文章首先介绍了TELNET 协议的主要内容,包括网络虚拟终端、选项协商的概念和
对称性问题及其解决办法;然后结合作者在实时操作系统VxWorks 下的实践,提出了TELNET 协
议的一种具体的实现方法。
  关键词 TELNET 协议 网络虚拟终端 选项协商 对称性 FSM

TELNET 协议是当今Internet 上应用最广泛
的协议之一,尤其在使用Unix 操作系统的计算机
上,它已成为不可或缺的一种工具。更重要的是,
TELNET 协议提供了在Internet 上异质网之间传
递数据和控制信息的重要方法,具有很重要的实用
价值和启发意义。
1  TELNET协议
TELNET 协议提供了双向的、面向字符( 以
8bit 为数据单位) 的通信方式。最初它被用作终端
与面向终端的进程之间通信的标准方法,到后来它
也用于终端间的点对点通信以及在分布式环境下进
程间的通信。RFC854 对TELNET 协议进行了总
体描述,RFC855 规定了制定协商选项所应遵循的
标准,各种各样的选项的定义则在此后的RFC 中被
单独分别说明。
TELNET 协议在TCP/ IP 协议栈中位于应用
层( application layer ) , 直接工作在TCP 层之上;
TELNET 服务器程序工作在TCP 的23 号端口上。
TELNET 协议有三个基本概念:网络虚拟终端、选
项协商和对称性,现分述如下:

 

1. 1  网络虚拟终端
众所周知,两个仅仅只懂自己方言的人是不能
够正确地与对方交流的;但是如果这两个人都懂普
通话的话,他们就能够利用彼此都懂的普通话顺利
地交流了。由于网络上使用TELNET 协议进行通
信的两端(end) 所用的字符集可能不一样,它们的通
信同样存在着类似的问题。解决这一问题就得定义
一个网络上的“普通话”, 这就是网络虚拟终端
(NVT) 。NVT 包括键盘( keyboard ) 和打印机
(printer) ,分别对应于普通终端的键盘和显示器。
TELNET 程序的工作是:在发送数据前先把要发送
的字符转换为NVT 的字符,送给NVT 键盘;把从
网络上来的数据(已是NVT 字符) 送给NVT 打印
机,经过NVT 打印机过滤的字符交给上层软件处
理。这样就能实现两端的正确通信。
NVT 打印机没有规定回车的宽度( carriage
width) 和页长(page length) 。它提供了USASCII 的
95 个图形码( graphics , 从32 到126) 。对于US2
ASCII 的33 个控制码(cont rol code ,从0 到31 和
127) 和128 个USASCII 所没有覆盖的码(从128 到
255) ,它只使用了以下部分(剩余部分对打印机的行

 

频道。具体说明如下:
(1) 解压卡。在本模块中解压卡将所有MPEG
信息解压后以AV 方式送到频道调制器中,并最终
在STB 端接收。由于送给解压卡的数据源有多种,
如本地MPEG文件,本地动态生成的MPEG流,从
网络接收到的MPEG流等,因此定义一个统一接口
作为解压卡输入数据。同时解压模块也作为一个独
立的DLL 而存在。
(2) 用户命令。用来解释接入服务器和Media2
cache Server 间的动作。

(3) 选择菜单。菜单以MPEG 流的形式发送
到STB ,这个MPEG流是动态生成的。
(4) 客户。当用户进行异地点播时,Mediacache
Server 处理MPEG 数据的方式和电信网视频服务
器处理是类似的。
5. 2  系统组成
系统由Mediacache Server 软件、服务器平台
———Windows NT ,ATM 网卡(用于访问远程宽带
视频中心) ,管理工具软件,数据库平台———Sybase 、
Oracle 、Informix、Microsoft SQL Server 等组成。

 

为不产生任何作用) :
NULL (NUL) 0 空操作
Line Feed(L F) 10 换行
Carriage Return (CR) 13 回车
BELL (BEL) 7 响铃
Back Space (BS) 8 退格
Horizontal Tab(HT) 9 光标移至下一水平制表符处
Vertical Tab(VT) 11 光标移至下一垂直制表符处
Form Feed(FF) 12 换页
  NVT 键盘可以通过键、键组合和键序列产生所
有128 个USASCII 码。除此之外,键盘还应该能够
产生这些键值:
Synch 同步
Break (BRK) (为某些系统提供)BREAK键
Interrupt Process ( IP) 挂起或中断与NVT 相连的进程
Abort Output (AO) 清除输出
Are You There (AYT) “你还在吗”
Erase Line ( EL) 删除一行
Erase Character ( EC) 删除字符
1. 2  选项协商
并不是说有了“普通话”交流就万事大吉了。一
个认识汉字的英国人来到中国,仍然会对很多汉语
现象难以理解,交流仍然存在很大的问题。这中间
存在着一个说话习惯和认识观念的不同。同样,
NVT 并不能解决通信中所有的问题。当用户需要
使用NVT 所不能提供的额外服务时,必须有个机
制使通信双方对通信中的“语法”进行预先商定,这
一过程就是选项的协商。目前RFC 已经定义了很
多的选项,最常用的如RFC856 定义了二进制传输
(binary t ransmission) 的选项、RFC857 定义了回显
(echo) 的选项、RFC858 定义了抑制GA 信号( sup2
press go ahead signal) 的选项等等。协商的方法是一
端发出使某一选项生效的请求(request) 命令给另一
端,而另一端则可以通过发送响应(acknowledge) 命
令来接受(accept) 或拒绝( reject ) 这一请求。该选项
若被接受,在连接的两端立即同时生效; 如若被拒
绝,两端仍都保持原来的约定。
TELNET 的命令是至少包括两个字符的字节
序列: IAC (interpreter as command) 转义符和命令
码。选项协商的命令则有三个字节,第三个字节指
示协商的选项。以下是TEL ENT 的所有命令码:
 
SE 240 子协商结束
NOP 241 无操作
Data Mark 242 Data Mark
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 (协商码) 本方将响应
WONT(option code) 252 (协商码) 本方将不响应
DO(option code) 253 (协商码) 对方应答
DONT(option code) 254 (协商码) 对方不应答
IAC 255 数据255
1. 3  对称性
由于进行选项协商的两端是完全对称的,任意
一端都有可能将对方的确认命令当成是请求命令而
再次发出响应命令,这样就会造成协商过程的无限
循环(loop) 。因此为了避免循环的发生,协商过程
应遵循下面三个规则:
(1) 只为选项的变化发出请求;
(2) 接收到的请求如果要求自己进入已经具有
的状态,那么此请求将不被响应;
(3) 当一端向另一端发送一个协商命令时(不
管这个命令是请求还是响应命令) ,如果该选项的使
用(接受) 将影响到对方对接收数据的处理,那么这
个命令应该被插入到该选项开始起作用的数据流的
首部。建立这一规则是因为从请求命令的发出到接
收到响应命令将会有一定的延时。
2  TELNET协议的实现方法
笔者在实际工作中需要在VxWorks 实时操作
系统下编写一个TELNET 的服务器程序。TEL2
NET 服务器运行起来后,监听TCP 的23 号端口,
等待客户机的连接请求;连接建立起来之后,服务器
和客户机就能够平等的交流了。虽然实现TEL2
NET 的应用程序有服务器和客户机之分,但如前所
述,运用TELNET 协议进行通信的双方是完全对称
的,就此而言是不分服务器和客户机的。这里仅描
述其中一方的软件实现,另一方的是完全相同的。
2. 1  概述
TELNET 软件可由三大部分组成:NVT 键盘、
NVT 打印机和命令解释执行体。图1 是它的原理
方框图。
  图中,NVT 键盘处理用户的输出流,输出NVT
键盘所允许的字符和命令。如果输出的是命令字
符,调用命令执行体完成相应功能; 如果是普通字
符,则可以将之发送到网络上。另外,NVT 键盘还
维护一个字符缓冲区,缺省情况下当该缓冲区存满
一行数据时,才将数据真正发送到网络上;当然也可

 

以让NVT 键盘每收到一个字符时就立即发送到网
络。
NVT 打印机的工作很简单:网络上输入的数据
如果在所支持的95 个字符内,直接交给上层软件;
如果输入的数据为前面所述的八个特殊字符
(NUL 、L F、CR、BEL 、BS、HT、VT 和FF) ,则把它们
转换为本机所使用的相应字符再上传;对于其他字
符,一律作抛弃处理。
命令解释执行体将混杂在输入流中的TEL2
NET 命令分离出来,解释之后执行相应的操作。它
通过直接写SOCKET 发送TELNET 命令。此外,
NVT 键盘和打印机的工作方式(如回显、二进制方
式收发等) 都要受到命令解释执行体的选项的协商
结果的影响,因此命令解释执行体还要通过选项来
影响它们的工作方式(图中以粗线箭头表示这种控
制信息的流向) 。
2. 2  命令解释执行体的实现
命令解释执行体要接收识别TELNET 命令执
行,具有较多的状态,是实现的难点。用有限状态机
(finite state machine) 来记录状态间的变化转移,并
执行相应的操作,可以大为简化程序的设计、提高编
程效率,更能增强源代码的可读性,是实现命令解释
执行体的理想方法。图2 所示为命令解释执行体所
使用的FSM 框图(图中所使用的符号的说明见后) 。
图2  TELNET 有限状态机
  该框图使用FSM 常规记法:圆圈表示状态,圆
圈之间的有向线段表示状态间的转移。每根有向线
段上面都有一个或几个α/β样式的标签,α表示造
成状态转移的输入字符,β表示转移发生之时应执
行的操作。例如在状态X 到状态Y 的转移线段上
的标签α/β表示这样的意义:在状态X 时,如有字符
α来到,那么执行操作β并转移状态到Y。
图2 所使用的符号说明如下: S- DATA 表示处
于通常的数据处理的状态,S- IAC 表示已收到IAC

 

字符的状态, S- WOPT 表示已收到WONT/ WILL
字符的状态,S- DOPT 表示已收到DONT/ DO 字符
的状态。IAC、DO、DONT、WILL 、WONT、ECHO、
NOGA、TXBINARY、NOP、DM 等为前面所述TEL2
NET 所定义的命令字符,AN Y 代表除此以外的其
他所有字符。大写字符A~K代表了状态转移时执
行的操作,具体说明如下:
A  响应IAC- WILL/ WONT2ECHO 请求,发
送IAC2DO/ DONT2ECHO 命令;
B  响应IAC- WILL/ WONT2NOGA 请求,发
送IAC2DO/ DONT2NOGA 命令;
C  收到不认识的WILL/ WONT 请求,禁止对
方使用该选项;
D  响应IAC2WILL/ WONT2TXBINARY 请
求,发送IAC2WILL/ WONT2TXBINARY命令;
E  空操作;
F  记录协商的动作(DONT、DO、WONT、
WILL) ,以备后用;
G 处理DM 命令;
H  完成NVT 打印机的任务;
I  收到不认识的DO/ DONT 请求,不使用该
选项;
J  响应IAC2DO/ DONT2ECHO 请求, 发送
IAC2WILL/ WONT2ECHO ;
K 响应IAC2DO/ DONT2TXBINARY请求,发
送IAC2WILL/ WONT2TXBINARY命令。
为了突出重点,这里所示的FSM 只支持TEL2
NET 协议中回显、二进制发送和抑制GA 等基本选
项,并且没有支持子协商选项( sub2negotiation) 。根
据这里所使用的原理,其他的选项协商和子协商的
内容都可以很容易加入。
这样就可以实现TELNET 协议了。