跳到主要内容

网络虚拟终端 (The Network Virtual Terminal)

网络虚拟终端 (Network Virtual Terminal, NVT) 是一种双向字符设备。NVT 有一个打印机和一个键盘。打印机响应传入数据, 键盘产生传出数据, 这些数据通过 TELNET 连接发送, 如果需要"回显", 也发送到 NVT 的打印机。"回显"不期望穿越网络 (尽管存在启用"远程"回显操作模式的选项, 但没有主机被要求实现此选项)。代码集是八位字段中的七位 USASCII, 除非本文另有修改。任何代码转换和时序考量都是本地问题, 不影响 NVT。

数据传输 (TRANSMISSION OF DATA)

尽管通过网络的 TELNET 连接本质上是全双工的, 但 NVT 应被视为在行缓冲模式下运行的半双工设备。也就是说, 除非协商了相反的选项, 否则以下默认条件适用于通过 TELNET 连接的数据传输:

  1. 在本地缓冲区空间允许的范围内, 数据应在生成它的主机中积累, 直到一整行数据准备好传输, 或者直到某个本地定义的显式传输信号出现。此信号可以由进程或人类用户生成。

    此规则的动机是某些主机处理网络输入中断的高成本, 加上默认 NVT 规范"回显"不穿越网络。因此, 在源处缓冲一定量的数据是合理的。许多系统在每个输入行末尾采取某些处理动作 (甚至行式打印机或读卡机也经常倾向于这样工作), 因此传输应在行末触发。另一方面, 用户或进程有时可能发现有必要或希望提供不在行末终止的数据; 因此, 实现者被告诫要提供本地信号方法, 表明所有缓冲数据应立即传输。

  2. 当进程完成向 NVT 打印机发送数据且没有来自 NVT 键盘的排队输入供进一步处理时 (即, 当 TELNET 连接一端的进程在没有来自另一端输入的情况下无法继续时), 进程必须传输 TELNET Go Ahead (GA) 命令。

    此规则并非要求在每行末尾从终端发送 TELNET GA 命令, 因为服务器主机通常不需要特殊信号 (除了行末或其他本地定义的字符) 来开始处理。相反, TELNET GA 旨在帮助用户的本地主机操作具有"可锁定"键盘 (如 IBM 2741) 的物理半双工终端。对此类终端的描述可能有助于解释 GA 命令的正确使用。

    终端-计算机连接始终处于用户或计算机的控制之下。任何一方都不能单方面从另一方夺取控制权; 相反, 控制方必须明确放弃其控制权。在终端端, 硬件被构造为每次"行"终止时 (即用户按下"新行"键时) 放弃控制权。发生这种情况时, 连接的 (本地) 计算机处理输入数据, 决定是否应生成输出, 如果不应生成则将控制权返回给终端。如果应生成输出, 则计算机保留控制权直到所有输出都已传输。

    通过网络使用此类终端的困难应该是显而易见的。"本地"计算机不再能够在看到行末信号后决定是否保留控制权; 这个决定只能由处理数据的"远程"计算机做出。因此, TELNET GA 命令提供了一种机制, 使"远程" (服务器) 计算机可以向"本地" (用户) 计算机发出信号, 表明是时候将控制权传递给终端用户了。它应该在且仅在用户应该获得终端控制权的时候传输。注意, 过早传输 GA 命令可能导致输出阻塞, 因为用户可能会认为传输系统已暂停, 因此他将无法手动翻转线路。

    当然, 上述内容不适用于用户到服务器的通信方向。在此方向上, GA 可以随时发送, 但不必发送。此外, 如果 TELNET 连接用于进程到进程的通信, 则两个方向都不需要发送 GA。最后, 对于终端到终端的通信, 两个方向都可能不需要 GA, 或者一个方向需要, 或者两个方向都需要。如果主机计划支持终端到终端的通信, 建议主机为用户提供手动发出信号的方法, 表明是时候通过 TELNET 连接发送 GA 了; 但这不是对 TELNET 进程实现者的要求。

    注意, TELNET 模型的对称性要求在 TELNET 连接的每一端都有一个 NVT, 至少在概念上是这样。

控制功能的标准表示 (STANDARD REPRESENTATION OF CONTROL FUNCTIONS)

如本文档简介所述, TELNET 协议的主要目标是通过网络提供终端设备和面向终端的进程的标准接口。早期使用此类互连的经验表明, 大多数服务器都实现了某些功能, 但调用这些功能的方法差异很大。对于与多个服务器系统交互的人类用户来说, 这些差异非常令人沮丧。因此, TELNET 为以下五个功能定义了标准表示, 如下所述。这些标准表示具有标准但非强制的含义 (例外是中断进程 (IP) 功能可能被使用 TELNET 的其他协议所要求); 也就是说, 不向本地用户提供该功能的系统不需要向网络用户提供它, 并且可以将该功能的标准表示视为无操作。另一方面, 向本地用户提供该功能的系统有义务向传输该功能标准表示的网络用户提供相同的功能。

中断进程 (Interrupt Process, IP)

许多系统提供了一种功能, 可以暂停、中断、中止或终止用户进程的操作。当用户认为其进程处于无限循环中, 或者无意中激活了不需要的进程时, 通常使用此功能。IP 是调用此功能的标准表示。实现者应注意, IP 可能被使用 TELNET 的其他协议所要求, 因此如果要支持这些其他协议, 应实现 IP。

中止输出 (Abort Output, AO)

许多系统提供了一种功能, 允许正在生成输出的进程运行到完成 (或到达如果运行到完成时会到达的相同停止点), 但不将其输出发送到用户的终端。此外, 此功能通常会清除已生成但尚未实际打印 (或显示) 在用户终端上的任何输出。AO 是调用此功能的标准表示。例如, 某个子系统通常可能接受用户的命令, 向用户的终端发送一个长文本字符串作为响应, 最后通过向用户的终端发送"提示符"字符 (前面有 <CR><LF>) 来表示准备好接受下一个命令。如果在传输文本字符串期间收到 AO, 合理的实现是抑制文本字符串的其余部分, 但传输提示符字符和前面的 <CR><LF>。(这可能与收到 IP 时可能采取的动作不同; IP 可能导致抑制文本字符串并退出子系统。)

提供此功能的服务器系统应注意, 网络和用户本地主机中可能存在应清除的外部缓冲区; 适当的方法是向用户系统传输"Synch"信号 (如下所述)。

你还在吗 (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 "Synch"机制。Synch 信号由 TCP 紧急通知加上 TELNET 命令 DATA MARK 组成。紧急通知不受 TELNET 连接流量控制的约束, 用于调用接收进程对数据流的特殊处理。在此模式下, 立即扫描数据流以查找如下定义的"有趣"信号, 丢弃中间数据。TELNET 命令 DATA MARK (DM) 是数据流中的同步标记, 指示任何特殊信号已经发生, 接收方可以恢复对数据流的正常处理。

Synch 通过设置了 Urgent 标志的 TCP 发送操作发送, DM 作为最后 (或唯一) 的数据八位字节。

当快速连续发送多个 Synch 时, 紧急通知可能会合并。由于接收到的数量将小于或等于发送的数量, 因此无法计算 Urgent 的数量。在正常模式下, DM 是无操作; 在紧急模式下, 它表示紧急处理的结束。

如果 TCP 在找到 DM 之前指示紧急数据结束, TELNET 应继续对数据流进行特殊处理, 直到找到 DM。

如果 TCP 在找到 DM 之后指示更多紧急数据, 这只能是因为后续的 Synch。TELNET 应继续对数据流进行特殊处理, 直到找到另一个 DM。

"有趣"信号定义为: IP、AO 和 AYT 的 TELNET 标准表示 (但不包括 EC 或 EL); 这些标准表示的本地类似物 (如果有); 所有其他 TELNET 命令; 其他站点定义的信号, 可以在不延迟数据流扫描的情况下对其采取行动。

由于 SYNCH 机制的一个效果是丢弃 Synch 发送方和接收方之间基本上所有字符 (TELNET 命令除外), 因此该机制被指定为在需要时清除数据路径的标准方式。例如, 如果终端用户导致传输 AO, 接收 AO 的服务器 (如果它提供该功能) 应向用户返回 Synch。

最后, 正如 TCP 紧急通知在 TELNET 级别作为带外信号所需一样, 使用 TELNET 的其他协议可能需要一个 TELNET 命令, 该命令可以被视为不同级别的带外信号。

按照惯例, 序列 [IP, Synch] 将用作此类信号。例如, 假设某个使用 TELNET 的其他协议将字符串 STOP 定义为类似于 TELNET 命令 AO。假设此协议的用户希望服务器处理 STOP 字符串, 但连接被阻塞, 因为服务器正在处理其他命令。用户应指示其系统:

  1. 发送 TELNET IP 字符;

  2. 发送 TELNET SYNC 序列, 即:

    在 TCP 紧急模式发送操作中将 Data Mark (DM) 作为唯一字符发送。

  3. 发送字符串 STOP; 以及

  4. 发送其他协议的 TELNET DM 类似物 (如果有)。

用户 (或代表他行动的进程) 必须传输上述步骤 2 的 TELNET SYNCH 序列, 以确保 TELNET IP 到达服务器的 TELNET 解释器。

Urgent 应唤醒 TELNET 进程; IP 应唤醒下一个更高级别的进程。

NVT 打印机和键盘 (THE NVT PRINTER AND KEYBOARD)

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 后面跟着一个字符, 允许做出合理的决定。

注意, 在两个方向上都需要"CR LF"或"CR NUL" (在默认 ASCII 模式下), 以保持 NVT 模型的对称性。即使在某些情况下 (例如, 启用了远程回显和抑制继续选项时) 已知字符不是发送到实际打印机的, 尽管如此, 为了一致性, 协议要求在数据流中 CR 后面不跟 LF 时插入 NUL。与此相反, 在 CR 之后在数据流中收到的 NUL (在没有明确另行规定的选项协商的情况下) 应在应用 NVT 到本地字符集映射之前被剥离。

NVT 键盘具有用于生成所有 128 个 USASCII 代码的键、键组合或键序列。注意, 尽管许多代码对 NVT 打印机没有效果, 但 NVT 键盘能够生成它们。

除这些代码外, NVT 键盘还应能够生成以下附加代码, 除非另有说明, 这些代码具有已定义但非强制的含义。这些"字符"的实际代码分配在 TELNET 命令部分, 因为它们被视为在某种意义上是通用的, 即使数据流被解释为其他字符集时也应可用。

Synch

此键允许用户清除其到另一方的数据路径。激活此键会导致 DM (见命令部分) 在数据流中发送, 并与之关联一个 TCP 紧急通知。DM-Urgent 对具有如前所述的强制含义。

Break (BRK)

提供此代码是因为它是 USASCII 集之外的信号, 目前在许多系统中具有本地含义。它旨在指示按下了 Break 键或 Attention 键。但请注意, 这旨在为需要它的系统提供第 129 个代码, 而不是作为 IP 标准表示的同义词。

中断进程 (Interrupt Process, IP)

暂停、中断、中止或终止 NVT 连接的进程。也是使用 TELNET 的其他协议的带外信号的一部分。

中止输出 (Abort Output, AO)

允许当前进程 (看起来) 运行到完成, 但不将其输出发送给用户。同时, 向用户发送 Synch。

你还在吗 (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 的效果才应该是不可预测的。