摘要

  • RFC 1043 记录了 1988 年 DODIIS 对 TELNET 数据录入终端选项的实现。文档指出,字符回显模式下,一次按键便送出一个携带 TCP/IP 头的报文,主机再发回一个同样带头的报文作回显。
  • DET 让应用构建表单、终端在本地编辑开放栏位。双方先协商共同支持的功能,以 GO-AHEAD 交接操作权,完成后可以只回传修改过的栏位;协议中的 Modified 标记还可能覆盖用户没有碰过的栏位。

一封信只装一个字母

RFC 1043 开头有一幅令人心疼的网络图景:终端上的一个字符,加上 TCP/IP 头,成为送往主机的数据报;主机又以类似的数据报把字符回显给用户。美国国防情报局当时正在为分组交换网络上的全屏应用寻找做法。文档称,相关数据录入终端功能已在 IAS、MVS、OS86 和 UNIX 上实现,VM 与 VMS 的版本仍在开发。机器各不相同,用户却希望眼前是一张完整表单,而不是一台把每个按键送去远方审批的打字机。

DET 选项早在 RFC 732 就有定义。RFC 1043 处理的是之后的现实:不同组织分别写出了实现,大家担心这些实现彼此说不通。节省网络报文的表单若只能在一款终端上正常显示,省出的流量很快会变成维护工单。于是这份文档把可用命令、能力协商和人机交替操作的顺序详细写了下来。

它设想的是一台半双工的表单终端。矩形屏幕上,一些字段受保护,一些字段允许用户编辑;键盘能在本地改动开放字段,也可以用功能键或选择字段来回应应用。默认屏幕为每行 80 个字符、共 24 行,用户主机应支持 24 至 48 行;尺寸变化靠协商。远端应用按位置、长度、属性和内容构建表单,然后送出 TELNET 的 GO-AHEAD。这盏“轮到你了”的灯亮起,终端才开放键盘。用户完成表单或按下可用的功能键后,终端送回回应,再把 GO-AHEAD 交还给应用。光标仿佛一根接力棒,不能让双方同时拿着乱跑。

表单出现之前,双方先同意进入 DET。它使用 TELNET 选项编号 20,DO 和 WILL 必须在连接的两个方向上谈妥。谈不拢时,默认是 WONT DET -- DONT DET,连接仍按 TELNET 的普通网络虚拟终端方式运行。进入 DET 时,文档要求拒绝或结束可能冲突的 Echo、Suppress Go-Ahead 和 Binary 等 TELNET 选项。全屏表单有自己的轮流说话方式,旧回显习惯同时开着会把规则搅成一团。

谈成 DET 还不够,附加能力也得一项项对上。四类 facilities 子命令分别说明编辑、擦除、传输和格式处理功能。终端报出自己提供什么,应用说明自己想用什么,双方位图的逻辑交集才是这一轮真正可用的能力。显示强度则取双方较低的级别。未协商的附加功能先别用;任何一方以后也可以撤销某项能力。保留位发送时要置零,免得将来的新功能被旧机器意外“同意”。文档甚至提醒双方记住是谁先发起协商,否则两台过分客气的机器可能不停回礼。

回传时,省流量的办法终于落地。应用可以请求整屏、只请求未受保护的字段,或只请求修改字段,对应 TRANSMIT-SCREEN、TRANSMIT-UNPROTECTED 和 TRANSMIT-MODIFIED。没有明确请求时,已经协商的 Modified 与 Protection 属性决定默认选择,尽量回传允许的最小数据量。表单仍留在终端屏幕上,下一轮应用可以改动其中一部分。用户按键首先在本地变成字段内容,完成表单之后才集中上路。

“修改字段”四个字还有暗门。RFC 1043 的警示框规定,TRANSMIT-MODIFIED 既要送回用户实际改动的字段,也要送回带 Modified 属性标记的字段。收到一个字段,应用不能立刻断言用户刚刚碰了它;也可能是表单设计者事先给它贴了标签。这条细节写得像给未来的调试员留下一盏小台灯:传回来的集合来自协议规则,人手动作则是另一回事。

文档还划出兼容性的边界。无需额外协商的最小 DET 命令集不足以支撑 DODIIS 的全部表单交互,因此用户主机要实现更多指定子命令及硬件支持或软件容易模拟的属性;服务器主机则实现应用需要的能力。RFC 用表格列出两端各自建议发送和接收的命令。共同语法很窄,终端硬件和应用需求仍各有脾气。

RFC 1043 把每次敲键都吵醒网络的做法,改成双方同意的一张表单。用户在本地填,能力在会话里谈,回程只带该带的字段。安静下来的线路,是两台不同机器把同一套小规则讲明白后的结果。