1.9 测试用网络及主机
图1-16展示了本书示例所用的各个网络和主机。对于每个主机,我们都标出了它的操作系统和硬件类型(因为有些操作系统可运行在不止一种硬件上)。各个框内的名字就是出现在本书中的各个主机名。
图1-16所示的拓扑适合本书的例子,不过机器大范围地散布在因特网上,物理拓扑实际上变得不太重要。事实上虚拟专用网络(virtual private network,VPN)或安全shell(secure shell,SSH)连接提供这些机器之间的连通性,而无需顾及这些主机的物理位置。
图中“/24”(和/64)指出从地址的最左位开始用于标识网络和子网的连续位数。A.4节将说明现今用于指定子网边界的/n记法。
Sun操作系统的真实名字是SunOS 5.x,而不是Solaris 2.x,但是大家习惯称它为Solaris,实际上这是操作系统和与之捆绑的其他软件的合称。
网络拓扑的发现
图1-16展示了本书的全部示例所用主机的网络拓扑,但是为了在你自己的网络上运行这些例子和完成习题,你可能需要了解自己的网络拓扑。尽管目前还没有关于网络配置和管理的现行Unix标准,但大多数Unix系统都提供了可用于发现某些网络细节的两个基本命令:netstat和ifconfig。通过阅读所用系统上这些命令的手册页面⑨,你可以获悉有关它们的输出信息的详情。要留意的是,有些厂商把这些命令存放在诸如/sbin或/usr/sbin这样的管理目录中,而不是通常的/usr/bin目录,而这些管理目录可能不在通常的shell搜索路径中(由PATH环境变量指定)。
(1)netstat -i提供网络接口的信息。我们还指定-n标志以输出数值地址,而不是试图把它们反向解析成名字。下面的例子给出了接口及其名字和统计信息:
linux % netstat -ni
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR -OK TX-ERR -OVR Flg
eth0 1500 049211085 0 0 040540958 0 0 0 BMRU
lo 16436 098613572 0 0 098613572 0 0 0 LRU
其中环回(loopback)接口称为lo,以太网接口称为eth0。下面的例子给出了支持IPv6的一个主机的类似信息:
freebsd % netstat -ni
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
hme0 1500 <Link#1> 08:00:20:a7:68:6b 29100435 35 46561488 0 0
hme0 1500 12.106.32/24 12.106.32.254 28746630 - 46617260 - -
hme0 1500 fe80:1::a00:20ff:fea7:686b/64
fe80:1::a00:20ff:fea7:686b
0 - 0 - -
hme0 1500 3ffe:b80:8d:1::1/64
3ffe:b80:8d:1::1 0 - 0 - -
hme1 1500 <Link#2> 08:00:20:a7:68:6b 51092 0 31537 0 0
hme1 1500 fe80:2::a00:20ff:fea7:686b/64
fe80:2::a00:20ff:fea7:686b
0 - 90 - -
hme1 1500 192.168.42 192.168.42.1 43584 - 24173 - -
hme1 1500 3ffe:b80:8d:2::1/64
3ffe:b80:8d:2::1 78 - 8 - -
lo0 16384 <Link#6> 10198 0 10198 0 0
lo0 16384 ::1/128 ::1 10 - 10 - -
lo0 16384 fe80:6::1/64 fe80:6::1 0 - 0 - -
lo0 16384 127 127.0.0.1 10167 - 10167 - -
gif0 1280 <Link#8> 6 0 5 0 0
gif0 1280 3ffe:b80:3:9ad1::2/128
3ffe:b80:3:9ad1::2 0 - 0 - -
gif0 1280 fe80:8::a00:20ff:fea7:686b/64
fe80:8::a00:20ff:fea7:686b
0 - 0 - -
注意:为了对齐输出字段,我们对较长的代码行做了回行处理。
(2)netstat –r展示路由表,也是另一种确定接口的方法。我们通常指定-n标志以输出数值地址。它还给出默认路由器的IP地址。
freebsd % netstat -nr
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 12.106.32.1 USGc 10 6877 hme0
12.106.32/24 link#1 UC 3 0 hme0
12.106.32.1 00:b0:8e:92::00 UHLW 9 7 hme0 1187
12.106.32.253 08:00:20:b8:f7:e0 UHLW 0 1 hme0 140
12.106.32.254 08:00:20:a7:68:6b UHLW 0 2 lo0
127.0.0.1 127.0.0.1 UH 1 10167 lo0
192.168.42 link#2 UC 2 0 hme1
192.168.42.1 08:00:20:a7:68:6b UHLW 0 11 lo0
192.168.42.2 00:04:ac:17:bf:38 UHLW 2 24108 hme1 210
Internet6:
Destination Gateway Flags Netif Expire
::/96 ::1 UGRSc lo0 =>
default 3ffe:b80:3:9ad1::1 UGSc gif0
::1 ::1 UH lo0
::ffff:.0/96 ::1 UGRSc lo0
3ffe:b80:3:9ad1::1 3ffe:b80:3:9ad1::2 UH gif0
3ffe:b80:3:9ad1::2 link#8 UHL lo0
3ffe:b80:8d::/48 lo0 USc lo0
3ffe:b80:8d:1::/64 link#1 UC hme0
3ffe:b80:8d:1::1 08:00:20:a7:68:6b UHL lo0
3ffe:b80:8d:2::/64 link#2 UC hme1
3ffe:b80:8d:2::1 08:00:20:a7:68:6b UHL lo0
3ffe:b80:8d:2:204:acff:fe17:bf38 00:04:ac:17:bf:38 UHLW hme1
fe80::/10 ::1 UGRSc lo0
fe80::%hme0/64 link#1 UC hme0
fe80::a00:20ff:fea7:686b%hme0 08:00:20:a7:68:6b UHL lo0
fe80::%hme1/64 link#2 UC hme1
fe80::a00:20ff:fea7:686b%hme1 08:00:20:a7:68:6b UHL lo0
fe80::%lo0/64 fe80::1%lo0 Uc lo0
fe80::1%lo0 link#6 UHL lo0
fe80::%gif0/64 link#8 UC gif0
fe80::a00:20ff:fea7:686b%gif0 link#8 UHL lo0
ff01::/32 ::1 U lo0
ff02::/16 ::1 UGRS lo0
ff02::%hme0/32 link#1 UC hme0
ff02::%hme1/32 link#2 UC hme1
ff02::%lo0/32 ::1 UC lo0
ff02::%gif0/32 link#8 UC gif0
24
(3) 有了各个网络接口的名字,执行ifconfig就可获得每个接口的详细信息。
linux % ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:C0::06:B0:E1
inet addr:206.168.112.96 Bcast:206.168.112.127 Mask:255.255.255.128
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:49214397 errors:0 dropped:0 overruns:0 frame:0
TX packets:40543799 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1098069974 (1047.2 Mb) TX bytes:3360546472 (3204.8 Mb)
Interrupt:11 Base address:0x6000
该命令给出了指定接口的IP地址、子网掩码和广播地址。其中的MULTICAST标志通常指明该接口所在主机支持多播。有些ifconfig的实现还提供-a标志,用于输出所有已配置接口的信息。
(4) 找出本地网络中众多主机的IP地址的方法之一是,针对从上一步找到的本地接口的广播地址执行ping命令。
linux % ping -b 206.168.112.127
WARNING: pinging broadcast address
PING 206.168.112.127 (206.168.112.127) from 206.168.112.96 : 56(84) bytes of data.
64 bytes from 206.168.112.96: icmp_seq=0 ttl=255 time=241 usec
64 bytes from 206.168.112.40: icmp_seq=0 ttl=255 time=2.566 msec (DUP!)
64 bytes from 206.168.112.118: icmp_seq=0 ttl=255 time=2.973 msec (DUP!)
64 bytes from 206.168.112.14: icmp_seq=0 ttl=255 time=3.089 msec (DUP!)
64 bytes from 206.168.112.126: icmp_seq=0 ttl=255 time=3.200 msec (DUP!)
64 bytes from 206.168.112.71: icmp_seq=0 ttl=255 time=3.311 msec (DUP!)
64 bytes from 206.168.112.31: icmp_seq=0 ttl=64 time=3.541 msec (DUP!)
64 bytes from 206.168.112.7: icmp_seq=0 ttl=255 time=3.636 msec (DUP!)
...