16.5. UUCP 底层协议

为了与远程端协商会话控制和文件传输,uucico 使用一组标准化的消息。这通常被称为高层协议。在初始化阶段和挂断阶段,这些消息只是作为字符串发送。然而,在真正的传输阶段,会采用一个额外的底层协议,这个协议对于高层来说基本上是透明的。这个协议提供了一些额外的优势,例如允许对在不可靠的链路上发送的数据进行错误检查。

16.5.1. 协议概述

UUCP 用于不同类型的连接,例如串行线路、TCP,有时甚至是 X.25;在专门为底层网络协议设计的协议中传输 UUCP 是有利的。此外,UUCP 的几个实现引入了不同的协议,这些协议的功能大致相同。

协议可以分为两类:流式协议和协议。流式协议将文件作为一个整体传输,可能会计算校验和。这种方式几乎没有开销,但需要可靠的连接,因为任何错误都会导致整个文件被重新传输。这些协议通常用于 TCP 连接,但不适合在电话线路上使用。虽然现代调制解调器在纠错方面做得相当出色,但它们并非完美无缺,而且在您的计算机和调制解调器之间也没有任何错误检测。

另一方面,面向包的协议将文件分成若干个大小相等的块。每个数据包被单独发送和接收,计算校验和,并向发送方返回确认。为了提高效率,人们发明了滑动窗口协议,这种协议允许在任何时候都有有限数量(一个窗口)的未完成确认。这大大减少了 uucico 在传输过程中必须等待的时间。尽管如此,与流式协议相比,相对较大的开销使得包协议在 TCP 使用中效率低下,但对于电话线路来说却是理想的选择。

数据路径的宽度也会产生影响。有时,通过串行连接发送 8 位字符是不可能的;例如,连接可能通过一个愚蠢的终端服务器,该服务器会剥离第八位。当您通过 7 位连接传输 8 位字符时,必须在传输时进行引用。在最坏的情况下,引用会使要传输的数据量加倍,尽管硬件完成的压缩可能会弥补这一点。可以传输任意 8 位字符的线路通常被称为8 位洁净。对于所有 TCP 连接以及大多数调制解调器连接来说,情况都是如此。

Taylor UUCP 1.06 支持各种 UUCP 协议。其中最常见的是

g

这是最常见的协议,几乎所有的 uucico 都应该理解它。它进行彻底的错误检查,因此非常适合嘈杂的电话线路。g 需要 8 位洁净的连接。它是一种面向包的协议,使用滑动窗口技术。

i

这是一种双向数据包协议,可以同时发送和接收文件。它需要全双工连接和 8 位洁净的数据路径。目前只有 Taylor UUCP 理解它。

t

此协议旨在用于 TCP 连接或其他真正无错误的网络。它使用 1,024 字节的数据包,并需要 8 位洁净的连接。

e

这基本上应该与 t 的功能相同。主要区别在于 e 是一种流式协议,因此仅适用于可靠的网络连接。

f

这旨在用于可靠的 X.25 连接。它是一种流式协议,并期望 7 位数据路径。8 位字符会被引用,这会使其效率非常低下。

G

这是 g 协议的 System V Release 4 版本。一些其他版本的 UUCP 也理解它。

a

此协议类似于 ZMODEM。它需要 8 位连接,但会引用某些控制字符,如 XON 和 XOFF。

16.5.2. 调整传输协议

所有协议都允许数据包大小、超时等方面的某些变化。通常,默认设置在标准情况下运行良好,但可能并非最适合您的情况。g 协议例如,使用的窗口大小从 1 到 7,数据包大小为 2 的幂,范围从 64 到 4096。如果您的电话线路通常非常嘈杂,以至于丢失的数据包超过 5%,您可能应该降低数据包大小并缩小窗口。另一方面,在非常好的电话线路上,为每 128 字节发送确认的协议开销可能被证明是浪费的,因此您可能会将数据包大小增加到 512 甚至 1,024。Linux 发行版中包含的大多数二进制文件默认窗口大小为 7,数据包大小为 128 字节。

Taylor UUCP 允许您使用 protocol-parameter 命令在sys文件中调整参数。例如,要将与 pablo 通信时 g 协议的数据包大小设置为 512,您必须添加
system          pablo
...
protocol-parameter g  packet-size  512

可调整的参数及其名称因协议而异。有关它们的完整列表,请参阅 Taylor UUCP 源代码中包含的文档。

16.5.3. 选择特定协议

并非每个 uucico 的实现都讲和理解每种协议,因此在初始握手阶段,两个进程必须就一个通用协议达成一致。主 uucico 通过发送P协议列表向从属 uucico 提供支持的协议列表,从属 uucico 可以从中选择一个。

根据使用的端口类型(调制解调器、TCP 或直接连接),uucico 将组成一个默认的协议列表。对于调制解调器和直接连接,此列表通常包括 iagGj。对于 TCP 连接,该列表为 teiagGjf。您可以使用 protocols 命令覆盖此默认列表,该命令可以在系统条目以及端口条目中指定。例如,您可以编辑port文件中调制解调器端口的条目,如下所示
port            serial1
...
protocols       igG

这将要求通过此端口的任何传入或传出连接使用 igG。如果远程系统不支持其中任何一个,则对话将失败。