拨号 IP 服务器通常通过特殊用户帐户提供 SLIP 服务。登录到此类帐户后,您不会进入通用 shell;而是执行程序或 shell 脚本,该脚本为串行线路启用服务器的 SLIP 驱动程序并配置适当的网络接口。然后,您必须在链路的另一端执行相同的操作。
在某些操作系统上,SLIP 驱动程序是用户空间程序;在 Linux 下,它是内核的一部分,这使其速度更快。然而,这种速度要求将串行线路显式转换为 SLIP 模式。此转换通过特殊的 tty 线路规程 SLIPDISC 完成。当 tty 处于正常线路规程 (DISC0) 时,它仅使用正常的read(2)和write(2)调用,并且 SLIP 驱动程序无法写入或读取 tty。在 SLIPDISC 中,角色颠倒了:现在任何用户空间进程都被阻止写入或读取 tty,而串行端口上接收的所有数据都直接传递给 SLIP 驱动程序。
SLIP 驱动程序本身了解 SLIP 协议的多种变体。除了普通的 SLIP,它还了解 CSLIP,它对传出的 IP 数据包执行所谓的 Van Jacobson 标头压缩(在 RFC-1144 中描述)。这种压缩显着提高了交互式会话的吞吐量。这些协议中的每一种协议都有六位版本。
将串行线路转换为 SLIP 模式的一种简单方法是使用 slattach 工具。假设您的调制解调器位于/dev/ttyS3并且已成功登录到 SLIP 服务器。然后您将执行
# slattach /dev/ttyS3 & |
此工具切换了线路规程ttyS3为SLIPDISC并将其附加到 SLIP 网络接口之一。如果这是您的第一个活动 SLIP 链接,则该线路将附加到sl0;第二个将附加到sl1,依此类推。当前的内核支持默认最多 256 个并发 SLIP 链接。
slattach 选择的默认线路规程是 CSLIP。您可以使用–p开关来选择任何其他规程。要使用普通 SLIP(无压缩),您可以使用
# slattach -p slip /dev/ttyS3 & |
可用的规程在 表 7-1 中列出。有一种特殊的伪规程称为adaptive,这会导致内核自动检测远程端正在使用的 SLIP 封装类型。
表 7-1. Linux SLIP 线路规程
规程 | 描述 |
---|---|
slip | 传统的 SLIP 封装。 |
cslip | 带有 Van Jacobsen 标头压缩的 SLIP 封装。 |
slip6 | 带有六位编码的 SLIP 封装。编码方法类似于 uuencode 命令使用的方法,并导致 SLIP 数据报转换为可打印的 ASCII 字符。当您的串行链路不是 8 位干净时,此转换非常有用。 |
cslip6 | 带有 Van Jacobsen 标头压缩和六位编码的 SLIP 封装。 |
adaptive | 这不是真正的线路规程;相反,它使内核尝试识别远程计算机正在使用的线路规程并与之匹配。 |
请注意,您必须使用与对等方相同的封装。例如,如果 cowslip 使用 CSLIP,您也必须这样做。如果您的 SLIP 连接不起作用,您应该做的第一件事是确保链路的两端就是否使用标头压缩达成一致。如果您不确定远程端正在使用什么,请尝试将您的主机配置为自适应 slip。内核可能会为您找出正确的类型。
slattach 不仅允许您启用 SLIP,还允许启用使用串行线路的其他协议,例如 PPP 或 KISS(火腿无线电人员使用的另一种协议)。但是,这样做并不常见,并且有更好的工具可用于支持这些协议。有关详细信息,请参阅slattach(8)手册页。
将线路交给 SLIP 驱动程序后,您必须配置网络接口。同样,您可以使用标准的 ifconfig 和 route 命令来执行此操作。假设我们已从 vlager 拨号连接到名为 cowslip 的服务器。在 vlager 上,您将执行
# ifconfig sl0 vlager-slip pointopoint cowslip # route add cowslip # route add default gw cowslip |
第一个命令将接口配置为到 cowslip 的点对点链接,而第二个和第三个命令添加了到 cowslip 的路由和默认路由,使用 cowslip 作为网关。
关于 ifconfig 调用,有两件事值得注意:pointopoint 选项,它指定点对点链接的远程端的地址,以及我们使用 vlager-slip 作为本地 SLIP 接口的地址。
我们已经提到,您也可以为 SLIP 链路使用分配给 vlager 以太网接口的相同地址。在这种情况下,vlager-slip 可能只是地址 172.16.1.1 的另一个别名。但是,您也可能必须为 SLIP 链路使用完全不同的地址。一种情况是您的网络使用未注册的 IP 网络地址,就像 Brewery 所做的那样。我们将在下一节中更详细地讨论这种情况。
在本章的剩余部分,我们将始终使用 vlager-slip 来指代本地 SLIP 接口的地址。
在关闭 SLIP 链路时,您应该首先使用带有del选项的 route 命令删除所有通过 cowslip 的路由,然后关闭接口,并向 slattach 发送挂断信号。然后您必须再次使用终端程序挂断调制解调器
# route del default # route del cowslip # ifconfig sl0 down # kill -HUP 516 |