telnet/demo_for_develop/telnet.md

494 lines
64 KiB
Markdown
Raw Permalink Normal View History

2024-04-24 02:32:26 +00:00
# 概览
Telnet"teletype network"的缩写)是一种客户端/服务器应用协议它提供对局域网或互联网上远程系统的虚拟终端的访问。它是一种双向8位通信的协议。其主要目标是连接终端设备和面向终端的进程。
Telnet 由两个组成部分构成1协议本身它规定了两个方如何通信2提供服务的软件应用程序。用户数据与 Telnet 控制信息一起,以 8 位字节为基础的数据连接通过传输控制协议TCP进行交错传输。Telnet 于 1969 年开发,起始于 RFC 15后在 RFC 855 中得到扩展并被标准化为互联网工程任务组IETF互联网标准 STD 8这是最早的互联网标准之一。Telnet 传输的所有信息,包括用户名和密码,都是以明文形式,因此不推荐用于对安全性要求较高的应用,如远程管理路由器。使用 Telnet 进行此类操作的情况已大幅减少,转而更多采用 SSH。已经提出了一些为 Telnet 提供加密的扩展。
# 组成
Telnet 由两部分组成1协议本身和2服务组件。Telnet 协议是基于可靠的面向连接的传输的客户端-服务器协议。该协议用于建立连接到传输控制协议TCP端口号23或2323这是 Telnet 服务器应用程序正在监听的位置。Telnet 协议将任何终端抽象为一个网络虚拟终端NVT。客户端在与服务器通信时必须使用 NVT 代码来模拟一个网络虚拟终端。
Telnet 在 UDP/IP 之前已经存在最初是在网络控制协议NCP之上运行。Telnet 服务最好在以下情境中理解:一个用户使用简单的终端,通过本地的 Telnet 程序(即客户端程序)在远程计算机上运行登录会话,用户的通信需求由 Telnet 服务器程序处理。
# 协议
## 历史
虽然Telnet最初是一个临时的协议直到1973年3月5日才有正式的定义但其名称实际上指的是“网络上的电传打字机协议”Teletype Over Network Protocol。RFC 206NIC 7176中对Telnet的描述明确了这一点
TELNET协议基于虚拟电传打字机的概念使用7位ASCII字符集。因此用户TELNET的主要功能是提供一种手段使其用户可以“敲击”那个虚拟电传打字机上的所有键。
本质上它使用8位通道来交换7位ASCII数据。任何高位被设置的字节都是特殊的Telnet字符。1973年3月5日在加州大学洛杉矶分校UCLA定义了Telnet协议标准同时发布了两个NIC文件《Telnet协议规范》NIC 15372和《Telnet选项规范》NIC 15373。这些文件为Telnet的发展提供了官方标准和详细的操作规范。
## 选项
Telnet的协议架构允许进行可协商的选项因此许多扩展被引入。其中一些扩展已被采纳为互联网标准即IETF文件中的STD 27至STD 32。这些标准包括不同的Telnet选项如二进制传输、回显、抑制去向和终端类型协商等。
这些扩展有些已被广泛实施而其他一些则是IETF标准轨道上的建议标准。例如有些扩展提供了改进的安全性或兼容性特性使Telnet能够在更多的环境中使用尽管在安全性要求高的应用中人们通常会选择使用更安全的协议如SSH。
以下是一些IETF标准轨道上的Telnet扩展示例
1. **Telnet二进制传输**Telnet Binary Transmission允许数据以二进制形式传输而不仅限于7位ASCII。
2. **Telnet回显选项**Telnet Echo Option允许服务器控制回显功能这对于实现远程命令行界面非常有用。
3. **Telnet抑制去向协商**Suppress Go Ahead在双向操作模式中删除了不必要的网络流量优化了通信效率。
4. **Telnet终端类型**Terminal Type允许客户端和服务器协商终端类型使服务器可以根据连接的终端类型提供适当的输出。
这些扩展和其他相关的改进使Telnet能够在其生命周期内适应网络环境的变化尽管如今它已经大部分被更现代的技术所取代。
## 服务
Telnet服务是通过Telnet协议提供服务的应用程序。大多数操作系统提供了一项服务可以安装或启用以向客户端提供Telnet服务。
# 安全漏洞
Telnet容易受到网络攻击的威胁如嗅探数据包以窃取敏感信息包括密码和指纹信息。Telnet服务还容易受到利用通过嗅探横幅泄露服务器信息如主机名、IP地址和品牌进而搜索确定Telnet服务是否接受未经身份验证的连接。Telnet也经常被恶意软件利用因为它配置不当。事实上与其他常见协议相比Telnet更常被攻击者针对尤其是与UPnP、CoAP、MQTT、AMQP和XMPP相比。常被攻击的设备包括物联网设备、路由器和调制解调器。
SANS Institute建议在正常情况下应停止使用Telnet进行远程登录原因如下
1. 默认情况下Telnet不加密连接上发送的任何数据包括密码因此往往可以窃听通信并稍后将密码用于恶意目的。
2. 大多数Telnet实现缺乏身份验证。安全研究人员发现的约22,887个Telnet启用设备不仅缺乏身份验证而且还提供对系统的无限制访问。
3. 大多数Telnet身份验证机制容易受到中间人攻击的拦截。
Telnet的扩展提供了传输层安全性TLS和简单认证与安全层SASL身份验证以解决上述问题。然而大多数Telnet实现不支持这些扩展而且它们也无法解决其他漏洞如解析横幅信息。
通过自定义Telnet客户端TN5250/TN3270和IBM i系统支持IBM 5250或3270工作站仿真。设计用于通过Telnet传递IBM 5250数据流的客户端和服务器通常支持SSL加密因为SSH不包括5250仿真。在IBM i也称为OS/400端口992是安全Telnet的默认端口。
## 历史使用方式
Telnet 提供了对远程主机上命令行界面的访问。然而,由于通过开放网络(如互联网)使用 Telnet 存在严重的安全问题,其用途已大大减少,转而支持 SSHSecure Shell。SSH 提供了 Telnet 的许多功能,增加了强加密功能,以防止密码等敏感数据被截获,以及公钥身份验证,以确保远程计算机确实是其所声称的那个。
随着时间的推移,特别是在公共互联网上,使用 Telnet 进行远程管理的频率已经迅速下降,转而使用更安全的 SSH 协议。这种变化主要是由于:
1. 安全性SSH 通过加密所有传输的数据,提供了比 Telnet 更高的安全级别。这保护了传输中的数据不被窃听或篡改。
2. 认证强度SSH 支持更先进的认证机制,如公钥/私钥对,而不仅仅是密码。这减少了身份验证数据被盗用或破解的风险。
3. 功能性SSH 不仅支持远程命令行访问,还支持端口转发、文件传输等高级功能。
因此,尽管 Telnet 曾广泛用于教育和研究环境中进行远程管理和网络测试现在它的使用主要限于内部网络或那些不需要高安全性的特定环境。在绝大多数现代网络环境中SSH 由于其增强的安全性和功能性,已成为远程访问的首选协议。
## 现在的使用方式
Telnet客户端可用于调试诸如SMTP、IRC、HTTP、FTP或POP3等网络服务以向服务器发出命令并检查响应。例如Telnet客户端应用程序可以建立与Telnet服务器端口之外的端口的交互式TCP会话。然而与这些端口的通信不涉及Telnet协议因为这些服务仅使用透明的8位TCP连接因为Telnet协议的大多数元素都是围绕着访问命令行界面的想法设计的而这些选项或机制在大多数其他Internet服务连接中都没有使用。
例如命令行Telnet客户端可以如下向TCP端口80上的Web服务器发出HTTP请求
如今这种较老的协议只在极少数情况下用于访问几十年前的遗留设备因为这些设备不支持更现代的协议。例如许多工业和科学设备只有Telnet作为通信选项。有些设备仅带有标准的RS-232端口并使用串行服务器硬件设备来提供TCP/Telnet数据和RS-232串行数据之间的转换。在这种情况下SSH并不是一个选择除非可以为接口设备配置SSH或者用支持SSH的设备替换
业余无线电操作员通常使用Telnet提供公共信息。
尽管不建议使用Telnet但安全研究人员估计截至2021年仍有7,096,465个Internet上的系统暴露使用Telnet。然而关于这个数字的估计因超出默认TCP端口23的端口扫描数量而有很大不同。
# 协议内容
## 常用的ASCII码
- NULL空字符字节码为0。在文本中通常表示字符串的结束或空字符。
- Line feed换行字节码为10。在Unix和Unix-like系统中表示换行。
- Carriage return回车字节码为13。在老式的打字机中表示将打印头移回行首。
- Bell响铃字节码为7。在打印机或终端上发出声音或闪烁光标用于提醒用户。
- Backspace退格字节码为8。在文本编辑中表示向左移动光标一个位置通常用于删除最后输入的字符。
- Horizontal tab水平制表符字节码为9。在文本编辑中表示向右移动光标到下一个制表位。
- Vertical tab垂直制表符字节码为11。在文本中很少使用可以用于在打印机上控制页面的垂直间距。
- Form feed换页字节码为12。在打印机中表示换页将打印位置移动到下一页。
这些控制码可以在文本编辑、打印和终端控制等场景中使用,用于控制文本的格式和行为。
## telnet命令
Telnet命令至少由两个字节组成。第一个字节是IAC转义字符通常为字节255后跟给定命令的字节码
| 功能 | 字节码 | 说明 |
| ----------------------------- | ------ | ---------------------------------------- |
| SE子协商结束 | 240 | 结束协商(或数据块)的子服务的协议机制。 |
| NOP无操作 | 241 | 不执行任何操作的数据包。 |
| Data Mark数据标记 | 242 | |
| Break中断 | 243 | |
| Interrupt Process中断进程 | 244 | 请求另一方结束当前进程。 |
| Abort output中止输出 | 245 | 请求另一方停止发送输出。 |
| Are you there?(你在吗?) | 246 | |
| Erase character擦除字符 | 247 | |
| Erase Line擦除行 | 248 | |
| Go ahead继续 | 249 | |
| SB子协商开始 | 250 | 启动协议机制的子服务的协商。 |
| WILL | 251 | 通知另一方,本方将使用某个协议机制。 |
| WON'T | 252 | 通知另一方,本方将不使用某个协议机制。 |
| DO | 253 | 指示另一方使用某个协议机制。 |
| DON'T | 254 | 指示另一方不要使用某个协议机制。 |
| IAC序列初始化器/转义字符) | 255 | |
希望这个表格能够帮助你更清晰地理解这些功能和它们的字节码。
这些命令用于Telnet协议的控制和协商以便在Telnet会话期间执行各种操作和协议交互。
## telnet转移字符
除了0xff之外的所有数据八位组都按原样传输到Telnet上。(0xff或十进制255是IAC字节Interpret As Command它表示下一个字节是Telnet命令。插入0xff到流中的命令是0xff所以当通过Telnet协议发送数据时必须将0xff转义为两倍。)
好的,下面是将上述内容转换为表格并翻译成中文的结果:
| 代码 | 名称 | 规范 | 备注 |
| ------- | ------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0 | 二进制传输 | RFC 856 | 8位模式即二进制选项旨在传输二进制数据而不是ASCII字符。标准建议将代码00000176解释为ASCII但并未提供高位设置数据八位组的任何含义。曾尝试引入类似于HTTP的可切换字符编码支持但对其实际软件支持情况一无所知。 |
| 1 | 回显 | RFC 857 | |
| 2 | 重新连接 | 1973年NIC 15391 | |
| 3 | 抑制前导 | RFC 858 | 原始Telnet协议中的“Go Ahead”命令代码249用于通知另一端另一端可以开始发送消息。这在“半双工”通信中使用因为某些终端可以发送消息和接收消息但不能同时进行。 |
| 4 | 大小约定 | 1973年NIC 15393 | |
| 5 | 状态 | RFC 859 | |
| 6 | 时间标记 | RFC 860 | |
| 7 | 远程控制传输和回显 | RFC 726 | |
| 8 | 输出行宽 | 1978年8月NIC 20196 | |
| 9 | 输出页大小 | 1978年8月NIC 20197 | |
| 10 | 输出回车符处理 | RFC 652 | |
| 11 | 输出水平制表符站位 | RFC 653 | |
| 12 | 输出水平制表符处理 | RFC 654 | |
| 13 | 输出换页符处理 | RFC 655 | |
| 14 | 输出垂直制表符站位 | RFC 656 | |
| 15 | 输出垂直制表符处理 | RFC 657 | |
| 16 | 输出换行符处理 | RFC 658 | |
| 17 | 扩展ASCII | RFC 698 | |
| 18 | 注销 | RFC 727 | |
| 19 | 字节宏 | RFC 735 | |
| 20 | 数据输入终端 | RFC 1043, RFC 732 | |
| 21 | SUPDUP | RFC 736, RFC 734 | |
| 22 | SUPDUP输出 | RFC 749 | |
| 23 | 发送位置 | RFC 779 | |
| 24 | 终端类型 | RFC 1091 | |
| 25 | 记录结束 | RFC 885 | |
| 26 | TACACS用户识别 | RFC 927 | |
| 27 | 输出标记 | RFC 933 | |
| 28 | 终端位置号 | RFC 946 | |
| 29 | Telnet 3270模式 | RFC 1041 | |
| 30 | X.3 PAD | RFC 1053 | |
| 31 | 关于窗口大小协商 | RFC 1073 | |
| 32 | 终端速度 | RFC 1079 | |
| 33 | 远程流量控制 | RFC 1372 | |
| 34 | Linemode | RFC 1184 | |
| 35 | X显示位置 | RFC 1096 | |
| 36 | 环境选项 | RFC 1408 | |
| 37 | 认证选项 | RFC 2941 | |
| 38 | 加密选项 | RFC 2946 | |
| 39 | 新环境选项 | RFC 1572 | |
| 40 | TN3270E | RFC 2355 | |
| 41 | XAUTH | | |
| 42 | 字符集 | RFC 2066 | |
| 43 | Telnet远程串行端口RSP | | |
| 44 | COM端口控制选项 | RFC 2217 | |
| 45 | Telnet抑制本地回显 | | |
| 46 | Telnet启动TLS | | |
| 47 | KERMIT | RFC 2840 | |
| 48 | 发送URL | | |
| 49 | FORWARD_X | | |
| 50-137 | 未分配 | | |
| 138 | TELOPT PRAGMA LOGON | | |
| 139 | TELOPT SSPI LOGON | | |
| 140 | TELOPT PRAGMA HEARTBEAT | | |
| 141-254 | 未分配 | | |
| 255 | 扩展选项列表 | RFC 861 | |
# RFC 854
## 1. 介绍
TELNET的目标是提供一个相对通用双向面向八位字节的通信机制。它的主要目的标是允许通过标准方法来连接终端设备和面向各个终端的进程。可以想象此协议同样可用于终端间通信“链接”以及进程间通信“分布式计算”
## 2. 总则
TELNET连接是用于传输带有TELNET控制信息的数据的TCP连接。
TELNET协议的设计主要基于三点一、网络虚拟终端Network Virtual Terminal的概念二、选项可协商的原理三、平等看待终端和进程。
1一个Telnet连接建立时两端都做为一个“网络虚拟终端NVT”来发起来关闭。一个NVT是一个提供标准的、网络范围的、中间的规范终端的代表。这使得“服务器”和“用户”无需保存对方终端和终端处理协定的相关信息。所有的主机包括用户和服务器把他们本地的设备属性和协定映射为一个网络上的NVT同时可以假设对方也有一个类似的映射。NVT试图在过度约束没有提供给主机足够的词汇来映射到他们的本地字符集和过度包容限定用户使用适当的终端之间取得平衡。
注意:“用户”端指那些通常带有物理终端的主机,“服务器”指的是那些能够提供一些服务的机器。另一个类似的观点(同样适用于端对端和过程对过程通信环境)是,“用户”指的是初始化通信连接的机器。
2可选项协商的原理基于这样一个事实许多主机都希望能够在NVT之上提供更多的服务许多用户将会拥有一个更复杂的终端并且希望能够得到一流的而不是极少的一点服务。尽管相互独立但TELNET协议中内建有许多的“选项”这些被认可的选项与“DODON'TWILLWON'T”结构一起使用以允许用户和服务器协商在他们的TELNET连接上使用更复杂的或者差异的约定。这些选项包括改变字符集回显模式等。
设置选项使用的基本策略是让每一方或双方初始化一个使一些选项有效的请求另一方可以接受或拒绝该请求。如果该请求被接受了选项立即生效如果该请求被拒绝相关特性将保持与NVT默认的一致。很显然一方可以总是拒绝启用某个选项的请求但不应拒绝任何禁用某个选项的请求因为双方都应支持NVT。
我们已经建立了一套谈判选项的规则。
若双方同时请求一个相同的选项,则每一方都可以把对方的请求当作对自己的请求的肯定回应。
3谈判句法的对称性可能会导致无穷尽的应答循环——每一方都把对方发送过来的命令当作必须回答的请求而不是对方的应答。为防止这种循环可以应用下列规则
A一方只能请求改变选项的状态。也就是一方不能发送只声明它所使用的模式的请求。
B如果一方接收到要求它进入当前它所在的状态的请求那么该请求将不会被应答。这种不应答对防止无穷尽的循环是非常重要的。对于那些改变模式的请求都需要一个应答——尽管该模式不一定改变。
C无论何时只要一方向第二方发送一个选项命令不管该命令是请求还是应答而且使用该选项将会对从第一方发送到第二方的数据的处理生产影响那么必须把该命令插到数据流中它希望开始起作用的点上。要注意到在传送请求和接收到可能是否定的应答的过程需要一些时间。因此一台主机可能希望在发出选项的请求后缓冲要发送的数据直到它知道该请求是被接受还是被拒绝来隐藏这段对用户来说是”不确定”的时间。
选项请求在TELENT连接刚刚建立起的时候要在在连接的两端来来回回传送许多次每一方都试图从对方获取尽可能好的服务。另外选项也可以用来动态地改变连接的特性使它与对本地状态的改变相一致。例如NVT后面将要解释使用的传输方式比较适合“每次一行”的应用程序例如BASIC但不适合那些“每次一个字符”的应用程序比如NLS。若对本地的处理来说是合适的服务器可能会接受“每次一个字符”所需的巨大的处理器开销并且会谈判一个合适的选项。然而当不再需要细致的控制时可以通过谈判切换回NVT下的状态以降低开销。
如果一个过程在收到一个拒绝回应后,仅仅是重新请求该选项,那么由一个过程发起的请求将会陷入循环。 为了防止出现这样的循环,不能重复被拒绝的请求,除非已经情况已经改变。实际中,这可能意味着该过程运行了另外一个程序,或者用户已经发出了另外的命令,或者出现了其他所有将影响一个过程及其选项的上下文的东西。根据经验,重请求应做为随后来自连接另一端的信息的回复,或由本地用户人为触发。
选项的设计者不应该拘泥于选项谈判中有限的一些语法。使用简单的语法的本意是希望使得选项易于使用 因为要忽略它们是很容易的。如果有一些特殊的选项需要一个比“DODON'TWILLWON'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选项规范”来得到关于如何建立新的选项的信息。
## 3. 网络虚终端
网络虚终端NVT是一个双向的字符设备。NVT有一个打印机和一个键盘。打印机负责进来的数据而键盘负责产生通过TELNET连接发送出去的数据并且在需要“回显”时同时在NVT的打印机上回显这些数据。“回显”并不要求数据一定要经过网络尽管有一个选项可以控制该操作的”远程“模式但并不要求主机实现该选项
除了在这里说明的外所有的编码集合都是有八位的但只使用其中的七位的USASCII码。所有的代码转换和时区方面的问题都是本地的事情而不影响NVT。
## 4. 数据的传输
尽管一个通过网络连接的TELNET连接本质上是全双工的但通常把NVT看作在线性缓冲模式下的半双工设备。也就是说除非已经和对方谈判好则以下条款默认适用于在TELNET连接的数据传输
1 在本地缓冲空间允许的可用范围内,可以在产生数据的机器上汇集数据,直到完整的一行数据已经准备好传输,或者某些在局部定义的信号明确地要求传输数据。这些信号既可以有进程产生,也可以有用户发出。
定义这个规则的动机是对于一些主机处理网络输入中断的代价是很高的另外缺省的NVT规范指定“回显”不经过网络的传输。因此有理由在产生数据的源上缓冲一些数据。许多系统都会在输入一行结束后进行一些动作行式打印机或者卡片打孔机经常都是这样子的因此数据传输可以在一行数据结束时触发。另外有时候用户或者进程会发现有必要或者应该在尚未到达行未时就提供数据因此实现者应注意提供局部信号机制以确保所有的缓冲数据都能够被立即发送出去。
2 当一个过程已完成向一个NVT打印机发送数据并且输入队列中也没有来自NVT键盘需要进一步进行处理的数据就是说当一个在TELNET连接的一端的过程无法在另一端没有数据输入的情况下进行处理该过程必须传输TELNET 的继续Go AheadGA命令。
这个规则并不要求在一个连接的两端上的终端都发送TELNET GA命令因为服务器开始进行处理时一般情况下都不需要一个特别的信号以及断开连接信号和其他在本地定义的特性。确切的说TELNET GA被设计用来帮助用户在一个具有“可锁定”键盘的本地计算机如IBM2741上操作一个物理上的半双工终端。这类终端的说明书可能对解释GA命令的正确用法有帮助。
终端到计算机的连接总是在用户或者计算机的控制之下。任何一方都不能单方面地夺取另一方的控制;而且取得控制的一方必须明确地放弃它的控制。在终端这一方,应在硬件上支持在每次行终止的时候(也就是在用户按下“新行”的键时),它就放弃控制。此时,连接的(本地)计算机处理输入的数据,决定是否要产生输出,如果不需要的话,就把控制返回给终端。如果要产生输出,计算机维持控制,直到所有的输出都被传输完毕。
通过网络使用这种类型的终端困难是显而易见的。“本地”计算机在看到一个行终止信号后无法决定是否要保持控制这个决定只能由处理这些数据的“远程”计算机作出。因此TELNET中的GA命令提供了一个机制使“远程”计算机服务器如何给“本地”计算机用户发送信号告诉对方现在是给用户终端传递控制的时间。它应该并且只应该在应向终端用户赋予控制权时传输。注意过早地传递GA命令将导致输出阻塞由此用户可能会认为传输系统已经被暂停因此将导致用户手工转向连接时失败。
当然前面所说的这种情况不会在通讯过程中用户到服务器这个方向上出现。在这个方向上可以随时发送GA但这没有必要。同样如果TELNET连接被应用在过程到过程的通讯中在两个方向上都不需要发送GA。最后对于终端到终端的通讯在两个方向上可能都需要GA。如果一个主机打算支持终端到终端的通讯建议主机在需要通过TELNET连接发送GA的时候提供一个手工发信号给用户的方法。然而在实现TELNET过程中这一点并不是必需的。
注意由于TELNET模型的对称性从理论上来说在一个TELNET连接的每一端都必须有一个NVT。
## 5. 控制功能的标准表示
就象我们在本文档的简介中所说TELENT协议的主要目标是在通过网络连接的终端设备和面向终端的过程之间提供一个标准的接口。早期具有这种互联性质的实验表明大部分的服务器都实现了某些功能但调用这些功能的方式却差别很大。对于一个要与多种服务器系统交互的用户来说这些差别会使人沮丧。因此TELNET协议定义了这些功能中的其中5种的标准表示。这些标准表示具有标准涵义 —— 但不是必要的除了中断进程IP功能使用TELENT协议的其他协议可能需要该功能。也就是说一个没有给本地用户提供某种功能的系统也没有必要给网络上的其他用户提供该功能并且可以把该功能的标准表示当作No操作。另一方面如果一个系统已经给本地用户提供了该功能那么它必须给网络上那些传送该功能的标准表示的用户提供同样的功能。
中断进程 Interrupted ProcessIP
许多系统提供挂起中断中止终止用户进程的操作的功能。当用户确信他的进程已经进入了无穷尽的循环或者不小心激活了一个并不希望激活的进程时就要经常使用该功能。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是调用该功能的标准表示。
## 6. TELNET中的“同步SYNCH”信号
许多分时系统提供了一种机制以允许终端用户重新获得对“失控”进程的控制权。上面描述的IP和AO功能就是这种机制的例子。当在本地使用时这样的系统可以访问由用户提供的所有信号而不管这些信号是一些普通字符或者是由电传打字机中的“BREAK”键或IBM 2741中的”ATTN”键发送的”带外“信号。然而当通过网络把系统联结起来时这可能是不正确的。网络的流程控制机制可能导致把这些信号缓冲到其他地方比如用户的机器中。
为了解决这个问题提出了TELNET中的”同步” 机制。一个同步信号包含一个带有TELNET命令DATA MARK的TCP紧急通知。该紧急通知不受TELNET连接的流控制的影响接收它的进程用它来调用数据流的特殊处理过程。在这种模式中将立即开始对数据流进行扫描查找下面定义的一些“有趣”的信号并丢弃期间的数据。
TELNET命令DATA MARKDM是数据流中的同步标记表示某个特殊的信号已经经产生接受者可以继续对数据流进行一般的处理。
同步信号通过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命令。
根据约定,序列[IPSynch] 可以作为这样的信号。例如假设有一个使用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将激活随后级别较高的进程。
## 7. NVT打印机和键盘
NVT打印机有一个没有指定宽度的走纸器并且每一页的长度也没有指定。NVT打印机可以产生所有95个USASCII编码的图形表示从32到126的编码。在33个USASCII编码0到31及127和未包含的其他128个编码128到255下面几个编码对NVT打印机有限定的意义
| 名称 | 编码 | 描述 |
| --------------------- | ---- | ------------------------------------------------ |
| NULL NUL | 0 | 空操作 |
| Line Feed LF | 10 | 打印头移到下一个打印行,但不改变打印头的水平位置 |
| Carriage ReturnCR | 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的作用才是无法预测的。
## 8. TELNET命令结构
所有的TELNET命令至少包含一个两个字节的序列“当作命令来解释Interpret as CommandIAC的转义字符以及紧跟的命令码。处理选项谈判的命令是三字节序列第三个字节为选项的编码。之所以选择这种格式是这种格式能够更大范围地使用“数据空间”相对于基本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 | 251 | 表示希望开始使用或者确认所使用的是指定的选项 |
| WON'T | 252 | 表示拒绝使用或者继续使用指定的选项 |
| DO | 253 | 表示一方要求另一方使用,或者确认你希望另一方使用指定的选项 |
| DON'T | 254 | 表示一方要求另一方停止使用,或者确认你不再希望另一方使用指定的选项 |
| IAC | 255 | Data Byte 255 |
## 9. 连接的建立
TELNET TCP连接是在用户端口U和服务器端口L之间建立的。服务器在用于这种类型的连接的一个众所周知的端口L上监听客户请求。由于一个TPC连接是全双工的并且通过双方的端口来标识服务器可以对不同的用户端口U和端口L的之间的许多并发连接进行应答。
端口分配
当用来给远程用户提供访问服务主机的服务也就是远程终端访问此协议分配的服务端口是23八进制27。也就是L=23。
# RFC 930 获取客户端类型
首先使用 IAC命令启用该功能
IAC WILL 24
然后发送
IAC SB 24, 1, IAC, SE
等待一段时间后接收到以下字符串
IAC SB 24 0 n1,n2,n3.... IAC SE
其中 n1....nx 就是客户端类型(字符串格式)
# RFC1184 行显示控制
## 从RFC1116变更的内容
添加了两个新的模式位SOFT_TAB和LIT_ECHO。这些位允许服务器向客户端提供一些关于如何回显制表符和非打印字符的建议。
当支持视觉编辑时,添加了几个新的特殊字符映射,用于光标移动。这些包括:将光标向左/向右移动一个字符SLC_MCL/SLC_MCR将光标向左/向右移动一个单词SLC_MCWL/SLC_MCWR将光标移动到行首/行尾SLC_MCBOL/SLC_MCEOL进入插入/覆盖模式SLC_INSRT/SLC_OVER向右删除一个字符/单词SLC_ECR/SLC_EWR以及删除到行首/行尾SLC_EBOL/SLC_EEOL
## 概述
Linemode Telnet是一种在Telnet连接客户端进行终端字符处理的方式。当处于Linemode模式并且本地端启用编辑功能时网络流量将减少到每行命令几个数据包而不是每个输入字符几个数据包。这对于具有较长延迟的网络来说非常有用因为用户在输入命令行时可以获得本地响应时间只在命令输入完毕后才会遇到网络延迟。此外它也有助于减少按数据包收费的网络的成本。
### 打开该功能:
IAC WILL 34
### 选项:
IAC SB 34 MODE mask IAC SE
MODE :
| 序号 | 命令名称 | 代码 |
| ---- | -------- | ---- |
| 1 | EDIT | 1 |
| 2 | TRAPSIG | 2 |
| 3 | MODE_ACK | 4 |
| 4 | SOFT_TAB | 8 |
| 5 | LIT_ECHO | 16 |
| 命令名称 | 描述 |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| EDIT | 当设置时,连接的客户端应处理所有输入行,执行任何编辑功能,并仅将完成的行发送到远程端。当未设置时,客户端不应处理来自用户的任何输入,服务器端应负责处理所有需要完成的字符处理。 |
| TRAPSIG | 当设置时,客户端应将适当的中断/信号转换为它们的Telnet等效项。这些将是IP、BRK、AYT、ABORT、EOF和SUSP当未设置时客户端应将中断/信号作为它们的正常ASCII值传递。 |
| FLOW | 逻辑上这属于“mask”。然而这将与Telnet的TOGGLE-FLOW-CONTROL选项重叠因此使用Telnet的TOGGLE-FLOW-CONTROL选项代替。当DO/WILL LINEMODE被协商时也应协商DO/WILL TOGGLE-FLOW-CONTROL。有关正确使用请参阅RFC 1080“Telnet远程流量控制”。 |
| ECHO | 逻辑上这属于“mask”。然而这与Telnet的ECHO选项重叠因此使用Telnet的ECHO选项代替。客户端不应协商“WILL ECHO”。当服务器协商了“WILL ECHO”时客户端不应将用户输入的数据回显给用户。当服务器协商了“WONT ECHO”时客户端负责将用户输入的数据回显给用户。有关Telnet ECHO选项使用的完整讨论请参阅RFC 857“Telnet ECHO OPTION”。 |
| SOFT_TAB | 当设置时客户端应将水平制表符HT代码USASCII 9扩展为适当数量的空格以便将打印机移动到下一个水平制表符停止位置。当未设置时客户端应允许水平制表符代码未经修改地通过。 |
| LIT_ECHO | 当设置时如果客户端正在将用户输入的非打印字符回显到用户屏幕上则应将字符作为字面字符回显。如果未设置LIT_ECHO位则客户端可以以任何它想要的方式回显字符。许多系统将非打印字符回显为两个字符的序列例如它们会将ASCII值为1的字符回显为“^A”。 |
当连接的客户端接收到MODE命令时它必须至少同意EDIT和TRAPSIG位的状态。如果接收到一个当前正在使用的模式掩码忽略MODE_ACK位的MODE命令则该MODE命令将被忽略。如果接收到的MODE命令与当前模式掩码不同则发送带有新模式掩码和MODE_ACK位设置的回复或者发送新模式掩码的子集。唯一的例外是如果服务器接收到EDIT或TRAPSIG位未设置的MODE它可以在响应中设置EDIT和TRAPSIG位而如果客户端接收到EDIT或TRAPSIG位设置的MODE它不能在响应中清除这些位。
当接收到MODE_ACK位设置的MODE命令且该模式与当前模式不同时客户端将忽略新模式而服务器将切换到新模式。这确保了连接的两端都将解析为相同的模式。在所有情况下对于设置了MODE_ACK位的MODE命令永远不会生成响应。
### 子选项
IAC SB LINEMODE DO FORWARDMASK mask0 mask1 ... mask31 IAC SE
这条命令的发送方请求对方在接收到由位掩码定义的任何ASCII字符时发送任何缓冲的数据。只有发送DO LINEMODE命令的连接方即服务器端可以协商此选项。掩码的长度最多为32个八位字节。每个八位字节代表8个ASCII字符编码。mask0的最高位对应于ASCII码0而mask0的最低位对应于ASCII码7。mask1的最高位对应于ASCII码8而mask1的最低位对应于ASCII码15以此类推。掩码列表可以在列表结束之前终止在这种情况下假设掩码八位字节的其余部分都被重置等于零。当服务器端处于DONT TRANSMIT-BINARY模式时则仅使用掩码的前16个八位字节ASCII码0到127。如果掩码的任何单个八位字节等于IAC则必须将其发送为双IAC。