作者:蓬岸 Dr.Quest
知乎文章编号:715264418
创建于:2024-08-19 12:56:14
修改于:2024-08-21 12:19:42
在国内,目前各种关于互联网历史的内容中,往往都错误地将WWW作为“互联网”的起源,却往往忽视WWW之前,互联网就已经存在、并在一定范围内得到广泛使用。
这种误解部分地是由于互联网在1994年才进入中国,人们接触互联网的时间恰恰是WWW开始流行的时间,很少有人对WWW出现之前互联网的功能有清晰的记忆。但我们需要注意到,电子邮件、Telnet、BBS、FTP、Gopher等技术在WWW出现之前就已经让Internet具备了相当的实用性。忽视这些功能,陷入到“Web 1/2/3”的营销话术中,是我特别不愿意看到的。
在这篇文章中,我希望向各位展示一款在80年代末、90年代初Internet用户中颇为流行的TCP/IP软件——KA9Q,它是最早在低端微型计算机的TCP/IP软件包之一,从时间顺序上来讲它是第二个,仅晚于麻省理工学院的PC/IP。 对当时的PC而言,KA9Q的功能相当丰富和强大:它可以同时充当互联网客户端、服务器和IP数据包路由器,并且可以同时处理多个客户端和服务器会话,具备了一定的多任务能力。
KA9Q的名字来源于作者Phil Karn的电台呼号,这也体现出它和业余无线电之间的联系:KA9Q是最早支持使用AX.25(业余 X.25)协议在业余无线电网络上传输IP数据的软件包,这让它几乎成为该领域的事实标准。 由于KA9Q在不到200KB的单个软件包里提供几乎完整的TCP/IP操作功能,因此它也被视为一款NOS(网络操作系统),国内爱好者通常对这一概念感到陌生,而本文也希望大家亲自体验一下80年代末90年代初典型NOS所具备的功能。
在KA9Q作者Phil Karn的Github上,仍然提供KA9Q的下载,版本为951123,这个版本可以在386或更新的电脑上运行
GitHub - ka9q/ka9q-nos: KA9Q Network Operating System但这个版本的KA9Q并不能在8088、8086和286电脑上运行,目前我找到的能在这些电脑上运行的版本是e920603版,可以在这里下载,我的演示也基于这个版本。这个链接里也有一些可以配合KA9Q使用的工具。
DOS File Area基础版本的KA9Q只有一个文件,net.exe,我们将这个文件解压在DOS电脑的C:\KA9Q目录下,就算安装完成了。
在KA9Q出现的80年代,以太网尚未被广泛使用。大多数网络都是使用Modem和电话线路实现的。而SLIP正是最早在电话拨号线路上广泛使用的传输IP数据包的方式之一,它对IP数据包进行封装,使之可以在任何使用串行端口的通信线路上传输。 SLIP在Unix-like系统中的支持非常广泛,从80年代初的4.2BSD开始几乎所有现代Unix-link系统都支持SLIP,这其中也包括今天的大多数Linux发行版。
我的家庭网络状况如图所示,路由器和Linux PC使用以太网连接,都在192.168.1.0/24子网里,Linux PC使用USB串口适配器和Null-modem线连接到Pocket 8086 DOS主机。
在Linux超级用户(su)权限下执行下列命令
slattach -p slip -s 57600 /dev/ttyUSB0 &
ifconfig sl0 192.168.9.2 pointopoint 192.168.9.3
即可开启一个简单的SLIP端口,slattach命令用于在串口上启用SLIP协议:-p slip是指没有压缩的SLIP协议,-s 57600则是指端口速率,/dev/ttyUSB0则是第一个USB串口,最后的&代表在后台运行。 Ifconfig则是配置一对点对点的IP地址,Linux主机的SLIP是192.168.9.2,DOS主机则是192.168.9.3。注意中间的参数是“point-o-point”而不是“point-to-point”。
如果希望DOS电脑访问外网,还需要开启Linux的NAT:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o sl0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i sl0 -o eth0 -j ACCEPT
这样我们的Linux电脑就配置好了。
在DOS电脑下启动KA9Q比较只要执行net.exe就可以看到KA9Q的net>提示符,输入问号回车,就可以看到它支持的命令列表。
本文将介绍一些常用的KA9Q命令,如果你对KA9Q的详细用法感兴趣,可以参阅其说明书:
http://www.textfiles.com/internet/FAQ/tcpipsw.man
https://ftp.heise.de/ix/Historisches/msdos/net/ka9q-doc/
与Linux下的slattach命令对应,KA9Q使用attach将串口设置为SLIP端口,命令的格式类似
attach asy 0x3f8 4 slip sl0 1024 296 57600
0x3f8和4分别是COM1的I/O端口和IRQ,sl0则是端口名称,1024是缓冲区大小,296是MTU(最大传输单元)大小,而57600则是端口速率。值得注意的是,虽然大部分的PC串口最高能够使用115200bps,但8088、8086级别的电脑由于CPU较慢,在最高速率下未必能成功建立链接,如果无法连接,可以适当降低端口速率。
我们可以看到作为一款早期的TCP/IP软件包,KA9Q需要使用者了解较多PC硬件和TCP/IP协议的知识。在Linux下,SLIP的MTU通常默认为296,可以使用ifconfig命令确认,我们在KA9Q中将他设置的和Linux一致,这样保证传输的效率。如果你使用DOS电脑上COM1之外的串口,可以参照下表找到对应的I/O端口和IRQ
COM# | I/O port | IRO |
---|---|---|
COM1 | 0x3F8 | 4 |
COM2 | 0x2F8 | 3 |
COM3 | 0x3E8 | 4 |
COM4 | 0x2E8 | 3 |
启用完端口后我们为新开放了sl0端口分配IP地址,在Linux主机上我们已经指定了DOS主机的IP地址是192.168.9.3,我们在DOS主机上再指定一遍
ifconfig sl0 ipaddress 192.168.9.3 netmask 0xffffffff
此处的子网掩码设置为0xffffffff,也就是255.255.255.255的16进制形式,因为只有点对点连接,所以本地子网没有任何其他主机。我们还要加入一条路由信息,将DOS主机的默认路由设置为sl0,即所有的IP包都从sl0发出,并传递到唯一的目的地Linux主机上。
route add default sl0
最后,我们把本地局域网的DNS服务器(通常是家用路由器的IP)添加到KA9Q里
domain addserver 192.168.1.254
这时KA9Q就可以ping通外网上的网站,也可以telnet到外网上的BBS了。
虽然这时的KA9Q主机已经可以自由访问外网,但家用局域网里的其他电脑,比如图中的Windows PC却看不到它,这是因为它并没有直接连接到192.168.1.0/24子网,而是隐藏在Linux PC的后面。
使用NAT会有一些明显的限制,比如FTP只能工作于被动而非主动模式下, 为了方便后续的调试,我们可以在其他需要访问KA9Q的电脑上加入一条路由表信息,将KA9Q的路由从默认网关(家用路由器的192.168.1.254)转向Linux PC(192.168.1.103)。
以在家庭网络的Windows电脑添加路由表信息为例(需要管理员权限):
route add 192.168.9.3 192.168.1.103
添加完路由信息后,Windows PC知道“通往192.168.9.3的路径经过192.168.1.103”,就可以途径Linux PC访问到KA9Q DOS主机。此时的Windows主机和DOS主机可以实现所有端口的互访,就像在一个局域网中那样,而没有NAT的限制。
如果你的DOS电脑上有以太网卡,可以将它直接连接到家庭网络中,它的传输速度更快,而且不需要额外的串口服务器支持。
在DOS下,根据使用的网络操作系统的不同,以太网卡驱动使用多个不同的标准,比如Novell Netware使用ODI(Open Data-Link Interface),微软LAN Manager使用NDIS等等。而各类DOS TCP/IP软件包,比如PC/IP、WATTCP、mTCP和今天用到的KA9Q则通常使用由MIT PC/IP开发者设计的Packet驱动标准。
PC/IP的开发者虽然设计了Packet驱动标准,但这一标准的广泛使用却得益于开源Packet驱动集Crynwr Collection的广泛传播。Crynwr驱动集的开发者Russ Nelson在其履历中提到,开发这一驱动集的起点,是为KA9Q加入对Racal-Interlan NI5210网卡的支持:
Russ Nelson's Bio在今天,几乎所有的网卡制造商仍然为它们制造的有线网卡提供Packet驱动,除了制造商网站之外,还有几个来源可以找到更多的Packet驱动
Crynwr Collection:Listing: ./drivers
http://packetdriversdos.net:http://packetdriversdos.net/
如果你的DOS电脑是比较新的型号,BIOS是1995年之后的版本,它们通常可以支持ISA PnP,或者你使用的本来就是PCI插槽的网卡,Packet驱动的启动就很容易,以RTL8019芯片为例,只要执行
pnppd.com
就可以自动配置网卡的Packet驱动,并将其绑定到中断0x60。
如果你的电脑或网卡不支持即插即用,你需要手动确认ISA网卡的I/O地址和IRQ,一些老式网卡提供跳线设置I/O和IRQ,而另外一些则使用针对自己网卡芯片的设置工具,比如RTL8019芯片对应的RSET8019.exe工具。我会在之后专门开一篇文章讲解这些工具的使用。
如果你的电脑正在使用XT-IDE硬盘适配卡,包括Book 8088、Pocket 8086集成的XT-IDE支持,使用ISA网卡的时候要注意避开被占用的I/O地址300,如上图中的SMC网卡,就应当使用跳线选择I/O 280+IRQ 3的组合,而无法使用I/O 300+IRQ 10的组合。下面是一个启动IO 320+IRQ 5的NE2000兼容型非即插即用网卡Packet驱动的例子:
ne2000 0x60 5 0x320
与SLIP类似,将KA9Q连接到以太网同样以attach命令开始
attach packet 0x60 en0 1024 1500
packet是指驱动的类型,而后面的0x60分别是网卡驱动的中断号,端口名称,缓存和MTU,对于以太网来说,MTU通常默认为1500 然后根据局域网的设置,为DOS主机分配一个静态IP地址:
ifconfig en0 ipaddress 192.168.1.33 netmask 0xffffff00 broadcast 192.168.1.255
命令中的ipaddress、netmask和broadcast后面分别是IP地址,子网掩码和广播地址,仍然需要注意子网掩码在这里要使用16进制,0xffffff00就是255.255.255.0。 然后添加默认路由
route add default en0 192.168.1.254
以及DNS服务器
domain addserver 192.168.1.254
就可以ping通外网的服务器了,同时由于使用以太网连接的DOS主机是直接连接到家庭网络中的,所以其他主机无需配置即可访问KA9Q主机。
如果每一次使用KA9Q都需要手动输入上面的命令配置端口、IP地址会很麻烦。一个让KA9Q自动配置的方式就是编写一个配置文件。配置文件是一个纯文本文件,我们可以用edit autoexec.net
创建一个配置文件。 类似DOS的BAT文件,配置文件的内容就是上面提到的一系列配置命令按顺序放在文本文件中,此外如果希望将KA9Q作为服务器或用来电子邮件,最好同时使用hostname命令为它分配主机名,比如对于SLIP网络来说,就会类似于:
attach asy 0x3f8 4 slip sl0 1024 296 57600
ifconfig sl0 ipaddress 192.168.9.3 netmask 0xffffffff
route add default sl0
domain addserver 192.168.1.254
hostname mydospc1
对于以太网,则类似于
attach packet 0x60 en0 1024 1500
ifconfig en0 ipaddress 192.168.1.33 netmask 0xffffff00 broadcast 192.168.1.255
route add default en0 192.168.1.254
domain addserver 192.168.1.254
hostname mydospc1
配置IP地址、子网掩码和广播地址的ifconfig既可以写为一行,也可以分多行写,比如上面的以太网配置也可以写为
attach packet 0x60 en0 1024 1500
ifconfig en0 ipaddress 192.168.1.33
ifconfig en0 netmask 0xffffff00
ifconfig en0 broadcast 192.168.1.255
route add default en0 192.168.1.254
domain addserver 192.168.1.254
hostname mydospc1
有了配置文件,我们就可以在net命令后加配置文件名的方式让KA9Q自动配置端口了。
如果KA9Q运行在独立的盘符上,它就可以不需要参数自动调用http://autoexec.net,而且在之后配置电子邮件、FTP服务器目录时也更加方便,因此我们通常在独立的盘符下运行KA9Q。 使用DOS下的SUBST命令可以将目录映射为盘符,比如 SUBST N: C:\KA9Q 就可以将KA9Q目录映射到N盘,在N:盘符下运行net命令,KA9Q就会自动加载配置文件,用起来更便利。 有时SUBST会报错说N:盘符不可用,这时需要在config.sys文件中加入LASTDRIVE=Z一行,启用A~Z的所有盘符。我们也可以将SUBST命令、Packet驱动等都放进DOS的autoexec.bat,这样开机时只要切换到N:然后启动net就可以访问互联网了。
完成上面的配置,KA9Q可以访问互联网上大部分Telnet服务器和局域网里的FTP服务器(由于不支持FTP被动模式,KA9Q无法穿越家用路由器的NAT使用FTP)。我们可以用
telnet 192.168.1.103
这样的命令来访问Telnet服务器,或者使用
ftp 192.168.1.73
来访问FTP服务器。
KA9Q支持多线程功能,可以同时保持和多个服务器的连接,当连接到一个服务器时,按F10键可以跳回net>提示符,然后建立下一个连接,在net>提示符下,还可以使用session命令查看活跃的连接,或是使用session+线程号切回特定的线程。
这一功能在访问FTP服务器时时必要的,因为FTP的控制端口和数据传送端口并不是一个,当FTP服务器向访问者传送任何数据,比如使用ls命令列出的文件清单时,都会使用一组新的端口,在KA9Q中也会新建一个新的线程。
在上图中,线程#2是FTP的控制线程,连接到192.168.1.73,线程#4则是ls命令传送文件列表的线程,在访问FTP服务器时,我们往往需要多次使用F10键在上述线程中切换。
这一集中,我们将装有KA9Q的电脑配置上网,并使其具备了一系列Internet客户端功能,而下一集,我们将聚焦于如何将KA9Q配置成一台Internet服务器。