RT-Thread 软件包-物联网-Telnet协议原理及使用体验①
软件包-物联网-Telnet协议原理及使用体验①
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 上传输的数据采用 8 bit 字节数据,其中最高位为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 命令
其中常用的 TELNET选项协商如下:
WILL (option code) 251 指示希望开始执行,或者确认现在正在操作指示的选项。 WON’T (option code) 252 指出拒绝执行或继续招待所指示的选项。 DO (option code) 253 指出要求对方执行,或者确认希望对方执行指示的选项。 DON’T (option code) 254 指出要求对方停止执行,或者确诊要求对方停止执行指示的选项。 那么对于接收方和发送方有以下几种组合:
表2 TELNET 选项协商的六种情况
发送者希望对方使某选项无效,接受者必须接受该请求
选项协商需要 3 个字节:IAC,然后是 WILL、DO、WONT 或 DONT;最后一个标识字节用来指明操作的选项。常用的选项代码如下:
表3 TELNET 选项代码
table.png
通常情况下,客户机向服务器发送字符而服务器将其回显到用户
终端上,但是,如果网络的时延回引起回显速度太慢,用户可能更愿意让本地系统回显字符。在客户机允许本地系统回显前,它要向服务器发送以下序列:
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 的含义是“我的终端类型为”。
RT-Thread软件包中的Telnet协议实现
RT-Thread是一款开源的实时操作系统,广泛应用于嵌入式设备中。RT-Thread软件包是RT-Thread生态系统的重要组成部分,提供了丰富的中间件组件,以支持各种应用场景。其中,物联网是RT-Thread的一个重要应用领域,而Telnet协议则是物联网设备远程管理的一种常用手段。本文将对RT-Thread软件包中的Telnet协议实现进行详细介绍和分析。
Telnet协议概述
Telnet协议是一种网络协议,用于在客户端和服务器之间建立远程连接。通过Telnet协议,用户可以在本地计算机上远程访问和管理另一台计算机或设备。Telnet协议使用TCP作为传输层协议,默认端口号为23。在建立连接后,客户端和服务器之间可以通过双向的字节流进行通信。
RT-Thread软件包中的Telnet实现
- 软件包概述
RT-Thread软件包中的Telnet实现提供了一个基于RT-Thread操作系统的Telnet服务器和客户端。该软件包支持标准的Telnet协议,允许用户在本地计算机上通过Telnet客户端远程访问和管理运行RT-Thread操作系统的设备。
- Telnet服务器实现
Telnet服务器的实现主要包括以下几个部分:
(1)初始化:在服务器启动时,需要初始化Telnet服务器的相关参数,如监听端口号、最大连接数等。同时,还需要创建一个监听套接字,用于接收客户端的连接请求。
(2)连接处理:当客户端发起连接请求时,服务器需要接受该请求,并创建一个新的套接字用于与该客户端进行通信。在接受连接请求时,服务器还需要对客户端进行身份验证,以确保只有合法的客户端才能建立连接。
(3)命令处理:当客户端发送命令时,服务器需要对命令进行解析和处理。如果命令是合法的,则执行相应的操作;否则,返回错误信息给客户端。在处理命令时,服务器还需要考虑并发访问的问题,以避免多个客户端同时执行相同的命令而导致冲突。
(4)数据传输:除了命令处理外,服务器还需要支持数据的双向传输。当客户端发送数据时,服务器需要接收并存储这些数据;当服务器需要发送数据时,可以通过套接字将数据发送给客户端。
- Telnet客户端实现
Telnet客户端的实现相对简单,主要包括以下几个部分:
(1)连接建立:客户端需要知道服务器的IP地址和端口号才能建立连接。在建立连接时,客户端还需要进行身份验证,以确保只有合法的客户端才能与服务器进行通信。
(2)命令发送:客户端可以通过输入命令来与服务器进行交互。在发送命令时,客户端需要将命令转换为字节流,并通过套接字发送给服务器。
(3)数据接收:当服务器发送数据时,客户端需要接收并显示这些数据。在接收数据时,客户端需要考虑数据的完整性和正确性,以避免数据丢失或损坏。
应用实例
以下是一个使用RT-Thread软件包中的Telnet实现进行远程管理的应用实例:
假设我们有一个运行RT-Thread操作系统的嵌入式设备,需要对其进行远程管理。我们可以通过以下步骤实现这一目标:
- 在设备上安装RT-Thread软件包中的Telnet实现;
- 配置Telnet服务器的监听端口号和最大连接数;
- 在本地计算机上安装一个Telnet客户端;
- 通过Telnet客户端连接到设备的IP地址和端口号;
- 输入命令对设备进行管理和操作。