为了理解 uucico 为何需要了解某些信息,这里快速描述一下它如何实际连接到远程系统可能是有序的。
当您从命令行执行 uucico -s system 时,它首先需要进行物理连接。采取的行动取决于要打开的连接类型——例如,当使用电话线时,它必须找到调制解调器并拨号。通过 TCP,它必须调用 gethostbyname(3) 将名称转换为网络地址,找出要打开的端口,并将地址绑定到相应的套接字。
建立此连接后,必须通过授权程序。它通常包括远程系统请求登录名,以及可能的密码。这通常被称为登录聊天。授权程序可以由通常的 getty/login 套件执行,或者——在 TCP 套接字上——由 uucico 本身执行。如果授权成功,远程端启动 uucico。发起连接的本地 uucico 副本被称为 master(主控端),远程副本被称为 slave(从属端)。
接下来是握手阶段:master 现在发送其主机名,以及几个标志。slave 检查此主机名以获得登录、发送和接收文件等的权限。这些标志描述(除其他外)要传输的 spool 文件的最大等级。如果启用,则在此处进行会话计数或呼叫序列号检查。使用此功能,两个站点都维护成功连接的计数,并进行比较。如果它们不匹配,握手将失败。这对于保护自己免受冒名顶替者侵害很有用。
最后,两个 uucico 尝试就一个通用的传输协议达成一致。此协议管理数据的传输方式、一致性检查以及在发生错误时重新传输的方式。由于支持的连接类型不同,因此需要不同的协议。例如,电话线需要一个“安全”协议,该协议对错误持悲观态度,而 TCP 传输本质上是可靠的,可以使用更高效的协议,该协议放弃了大多数额外的错误检查。
握手完成后,实际的传输阶段开始。两端都打开选定的协议驱动程序。驱动程序可能会执行协议特定的初始化序列。
首先,master 发送为远程系统排队的所有 spool 文件,这些文件的等级足够高。完成后,它通知 slave 它已完成,并且 slave 现在可以挂断。slave 现在可以选择同意挂断,或接管对话。这是一个角色转换:现在远程系统变为 master,本地系统变为 slave。新的 master 现在发送其文件。完成后,两个 uucico 交换终止消息,并关闭连接。
我们不会对此进行更详细的介绍:请参阅源代码或任何关于 UUCP 的优秀书籍。网上还流传着一篇非常古老的文章,由 David A.-Novitz 撰写,其中详细描述了 UUCP 协议。《Taylor UUCP FAQ》也讨论了 UUCP 实现方式的一些细节。它定期发布到 comp.mail.uucp。