ASCII 表的前 32 个字符(0x00 - 0x1F)都是不可打印字符(表末尾的“DEL”除外)。
除了在 cat 二进制文件时堵塞你的终端之外,它们还有什么用途?
其中一些是显而易见的:
Oct Dec Hex Char
----------------------------------------------
000 0 00 NUL '\0'
007 7 07 BEL '\a' (bell)
010 8 08 BS '\b' (backspace)
011 9 09 HT '\t' (horizontal tab)
012 10 0A LF '\n' (new line)
013 11 0B VT '\v' (vertical tab)
014 12 0C FF '\f' (form feed)
015 13 0D CR '\r' (carriage ret)
033 27 1B ESC (escape)
其他,例如
020 16 10 DLE (data link escape)
021 17 11 DC1 (device control 1)
022 18 12 DC2 (device control 2)
023 19 13 DC3 (device control 3)
024 20 14 DC4 (device control 4)
我还没见过用过的。
ACK、NAK 和 SYN 是否与 TCP 中三次握手所使用的字节相同,或者它们只是类似?
编辑:参见 Eric Raymond 的每个黑客都知道的事情
如果您是在 1990 年左右学会的,那么其中最神秘的部分可能是控制字符,即代码点 0-31。您可能知道 C 使用 NUL 作为字符串终止符。其他字符,尤其是 LF = 换行符和 HT = 水平制表符,会以纯文本显示。但其余的呢?
其中许多是电传协议的残余,这些协议要么已经消亡了很长时间,要么即使仍然存在,在计算机界也完全不为人知。有些协议具有传统含义,甚至在互联网时代之前就已被遗忘了一半。如今,只有极少数协议仍在二进制数据协议中使用。
答案1
这些被称为控制代码并且旨在告诉实际的终端您要执行某些操作,而不是通过终端显示某些内容。其中一些,例如 BEL (0x07),可以追溯到终端还是实际的电传打字机的时候(在这种情况下,0x07 会响起电传打字机中的物理铃声)。
DLE 的工作方式类似于 ESC - 一旦终端接收到它,进一步传入的字符将被视为命令或对终端的其他通信,而不是输出到实际设备本身。虽然我从未亲眼目睹过它的实际用途。
ACK、NAK 和 SYN(以及许多其他符号,如 SOH 标头开头、STX 文本开头、ETX 文本结尾)可用于实现协议,但它们的设计并未考虑 TCP/IP。TCP/IP 通过在标头中设置位来指示这一点,而不是通过传输整个 ASCII 代码。如果要执行诸如通过 56k 调制解调器传输文件之类的操作,这些符号可能很有用。我知道 ZModem 等串行/调制解调器协议使用了其中的几个,而且我确信还有其他基于串行/56k 调制解调器的东西会这样做。
这个维基百科页面和此页面可通过 Wayback Machine 获取我对它们的了解比我多,包括 DC1、DC2、DC3 和 DC4 代码的用途。
答案2
在过去,他们使用大型计算机进行批量处理,并使用简单的“终端”机来显示数据。
这些终端通过串行数据线连接,这意味着需要某种命令集,以便双方可以在准备好接收数据、准备发送数据等时发出信号。ASCII 字符集基本上列出了所有可用的命令和字符并对其进行了标准化。
您从未见过的信号很可能只在特定的终端上看到,虽然 ACK、SYN 和 NAK 与它们的 TCP 对应部分类似,但它们并没有直接关系。
答案3
第一组 ASCII 字符代码或一组控制代码字符是为计算机提供一种控制通过电缆连接到计算机的外围设备的方法,例如RS-232串行接口或者RS-485串行接口或者IEEE 1284 并行接口。
这些控制代码有几个用途:
- 控制设备的行为(回车键使打印头返回到行首或按铃在电传打字机上响铃以引起操作员的注意)
- 提供用于向设备发送消息的标准消息格式字符(STX 表示文本开始,ETX 表示文本结束)
- 触发带外通信(使用文本中的 ESC 字符来指示向设备发出命令的开始,或使用 XON 指示器的 DC1 字符来告诉远程设备恢复发送文本,或使用 XOFF 指示器的 DC3 字符来告诉远程设备停止发送文本)
网络交换的 RFC 20 ASCII 格式提供了建议的控制代码及其功能的描述。例如,以下是 RFC20 第 5.2 节控制代码的部分列表:
NUL (Null): The all-zeros character which may serve to accomplish time fill and media fill. SOH (Start of Heading): A communication control character used at the beginning of a sequence of characters which constitute a machine-sensible address or routing information. Such a sequence is referred to as the "heading." An STX character has the effect of terminating a heading. STX (Start of Text): A communication control character which precedes a sequence of characters that is to be treated as an entity and entirely transmitted through to the ultimate destination. Such a sequence is referred to as "text." STX may be used to terminate a sequence of characters started by SOH. ETX (End of Text): A communication control character used to terminate a sequence of characters started with STX and transmitted as an entity. EOT (End of Transmission): A communication control character used to indicate the conclusion of a transmission, which may have contained one or more texts and any associated headings. ENQ (Enquiry): A communication control character used in data communication systems as a request for a response from a remote station. It may be used as a "Who Are You" (WRU) to obtain identification, or may be used to obtain station status, or both. ACK (Acknowledge): A communication control character transmitted by a receiver as an affirmative response to a sender. BEL (Bell): A character for use when there is a need to call for human attention. It may control alarm or attention devices.
原本的电传打字机使用带纸的打印头,由阴极射线管端子它在 CRT 屏幕表面模拟了原始电传打字机的行为。
CRT 最著名的例子是 DECVT-100 终端其使用 ANSII 控制代码已成为 CRT 的事实标准。VT-100 控制代码也通常在各种 Unix、Linux、MS-DOS 和其他操作系统的终端窗口中模拟(另请参阅curses 用户界面编程库)。
VT100 于 1978 年 8 月推出,取代了 VT50/VT52 系列。与早期型号一样,它通过串行线路与主机系统通信,最低速度为 50 bit/s,但最高速度提高到 19,200 bit/s,是 VT52 的两倍。2
系统内部的主要变化是控制系统。与 VT50/52 的专有光标控制语言不同,VT100 基于新兴的 ANSI X3.64 命令代码标准。[a] 当时,计算机供应商认为该标准超出了最先进的水平,无法以合理的价格实现。低成本微处理器的推出和计算机内存成本的不断下降解决了这些问题,VT100 使用新的 Intel 8080 作为其内部处理器。4此外,VT100 还为 VT52 用户提供向后兼容性,支持 VT52 控制序列。5
ASCII 控制代码应用
ASCII 控制代码旨在为常见的串行消息协议需求提供一组标准代码。虽然消息的结构或格式以及消息中发送的数据都是专有的,但 ASCII 控制代码提供了每个人都同意在其消息的控制部分使用的标准代码。
现代协议使用 JSON 或 XML 等文本,因为这些消息大部分通过高速网络传输。然而,早期的计算机设备通常使用 RS-232 或 RS-485 串行通信设备,设备之间的消息尽可能紧凑和简洁。因此,设备在确认消息时不会发送三个字符的文本消息(例如“ACK”),而是发送一个字符(即 ACK 控制代码)。
ASCII 控制代码的一个示例是当 PC 向热敏收据打印机发送带有格式指令的文本时。收据打印机通过串行电缆(通常是 DB-9 电缆或 USB 电缆)连接到 PC。PC 向收据打印机发送一系列文本字符,但有些字符打印正常,而其他字符则打印成双倍高和双倍宽。
通过使用 ESC 或转义控制代码将打印格式命令嵌入文本字符流中,将打印文本大小的更改传达给收据打印机。当打印机看到 ESC 控制代码时,它知道后面会有打印机命令,因此它会查找打印机命令字符序列,更改其打印行为,然后继续处理发送的文本,直到看到另一个 ESC 控制代码。
另外,在处理文本字符串时,当收据打印机看到指示打印头位置变化的 ASCII 控制代码(例如回车符或制表符或退格符或换行符)时,收据打印机会改变打印头的位置,然后恢复打印文本。
这维基百科主题 IPTC 7901描述了自 1979 年 IPTC 协议正式批准以来,这些控制字符在新闻服务消息中的使用情况,听起来类似于RSS订阅协议。实际规范可从 IPTC 网站获取,网址为IPTC 推荐的消息格式,1995 年。
数据流控制
在两台机器之间进行慢速串行通信时,如果数据量较大(例如文件传输),发送设备很容易发送更多数据,速度比接收设备处理速度要快。这就是为什么 RS-232 串行通信协议规范有几个硬件流控连接器中的引脚用于数据集状态通信。然而,在许多情况下,没有带附加电线的电缆,因此使用软件流控制使用 ASCII 控制代码,DC1 表示 XON,DC3 表示 XOFF。
串行通信调制解调器还使用 ASCII 控制码进行软件流控制以及传真等应用程序(见维基百科主题命令和数据模式(调制解调器))。