当前位置:Linux教程 - Linux - Linux网络

Linux网络



         作者:刘丰

    在这里我们简单地聊聊网络。联网的好处在于提供强大的通讯手段、信息以及资源共享。资源共享又分为设备资源与计算资源,计算资源共享的基本应用如多个用户登录到一个主机上共享CPU资源,更高级的应用是分布式计算/网络并行计算,前一段时间Bewolf并行计算项目宣布的结果吸引了不少人的目光。另外的好处是提供高可靠性/高可用性。
    随便翻一本讲网络的书,无一例外地都会提到ISO OSI的网络7层参考模型,几乎所有的网络都把自己的模型映射到这个7层模型上,包括电话网里的7号信令系统,你打电话时是否想到这个问题呢?我这里有一张图,把绝大多数网络与OSI网络7层模型的映射关系标在一起,可以加深对网络的理解,特别是做异种网络互连时可以让你保持清晰的层次概念。可惜图太大不好扫描(真是费话:-)。
    简单解释一下几种网络设备:转发器/中继器,工作在网络的第一层(最底层),它的主要作用是延长物理介质的传输距离或转换物理传输介质(如把双绞线传输转换为光纤传输);网桥,主要工作在网络的第二层,可以转换不同网络类型的数据帧(Frame,注意Frame一般指网络第二层的数据格式,而packet指网络第三层的数据格式),因此网桥可以用来分隔网段或连接部分异种网络,而透明网桥则使两个网段之间看起来想一个网段;路由器则主要工作在网络的第三层,当然它也能处理下面两层的工作。由于第三层完全是软件层,因此路由器可以做的事很多,除了可以转换网络接口、连接异种网络、隔离网络广播、转换网络协议外,它主要的工作是进行数据包(packet)的路由寻径。在一个稍大一些的网络里是不可能任何两点都存在连接或用广播方式来通讯的,在小型网络中可以用子网化(subnetting)做一做,但是在中大型网络中仔细规划网络拓扑结构、选择合适的路由协议是很重要的事情!现在网络交换机炒得很凶,但是路由技术仍然是必须的,只是有些交换机把路由技术做在里面了。网关主要工作在网络第四层以上,但在TCP/IP网络中网关不是这个意思,它指连接两个网络之间的设备,比如你的Linux Box上有两个网卡分别连接了两个网段,那么在这个网络中你的Linux Box就是网关。因此路由器也算是网关,在配置你的主机(Host)时就要把网关这一项指向路由器上的你能直接到达的一个接口上。
    以太网是我们最容易接触的。它是基于载波多路监听/冲突检测机制,也就是说它用广播方式来发送数据帧:大致是先用arp广播通知目的地址(网络第二层的MAC地址)有数据,其它以太网卡看看不是自己就不管它,而目的地址收到这个数据帧后回应这个arp广播,然后双方建立连接传输数据,由于以太网是完全共享数据链路的,因此这样的数据连接传输仍是广播方式的,网段上其它的网卡当然知道谁跟谁在传数据,只是事不关己不收而已。你也可以打开网卡的混杂工作方式,则不管是不是你的数据帧都收下来,这正是Linux Box配置成网桥的关键(请参考网桥配置的HOWTO),这也是sniffer工作的原理。常有人问:我用ppp拨号上网,架上sniffer可不可以监听到别人?这显然是不可能的,因为ppp顾名思义是点到点连接不是广播方式的。当多个以太网卡同时发广播报文时则冲突发生,这时采用一种退缩算法,各自随机退后一段时间再试。如果退缩算法不好的话则效率很低,事实上以太网的效率确实不太好,再加上操作系统设计上的原因(比如破破的NT在这些方面远不如Solaris),通常实际传输速率能达到实际标称速率的1/4就不错了。另外在实时性上也不行,还不如令牌环网(Token Ring),但是令牌网正逐渐消逝,因为以太网除了价格因素还有很大的发展空间,新的技术可以弥补许多不足,比如交换式集线器(Switch Hub)甚至以太网交换机以及快速以太网甚至千兆以太网,生命力越来越旺盛。我觉得到桌面这一级用以太网就行了,25M ATM等破东西实在没有意思。一般的共享式集线器只是简单地提供一个物理数据链路而已,可以看成一个多端口的中继器。而交换式集线器的概念有点不同,它的背板带宽约为所有端口线速的总和,当源地址与目的地址传送数据时不再占用整个链路,而是背板带宽的一部分,当然不再是广播方式了,你可以想象一下高速公路上几个车道同时跑的情况。这样sniffer只能监听到发送到你的主机上的数据。由于不采用广播方式,交换式集线器必须要缓存MAC地址(当然发现MAC地址的过程还依赖于ARP广播),选择产品时要根据网络大小注意它能缓存多少个MAC地址。以太网交换机的概念扩充得更大了。交换技术上除了存储转发还有Cut-Through交换、碎片交换等,网管除了SNMP还有RMON等,MAC地址缓存数可达到几千个,背板带宽可到数G甚至更高,等等。有些厂商还加进了路由技术,可以实现VPN(虚拟专用网)等,也来号称第三层交换,更有甚者用ASIC技术直接从第二层的数据帧中解出第三层的数据包,并做快速交换,如Mage就宣称它的一款交换机是达到线速的第三层交换机。不过基于以太网技术的交换机再快也只能适用于中小规模的网络,因为它的交换吞吐能力及路由能力还是不行。
    X.25的概念与以太网的概念则差了十万八千里。X.25的核心是基于虚电路的分组交换,没有谁能独占数据物理链路,你只能把你的数据报放在串流不熄车流中的一个空车上,到达叉路口倒在另一个空车上,直到目的地。简单地说就是时分复用技术。帧中继(Frame Relay)是从X.25发展而来的,首先取消了一些繁复的软件差错校验(因为传输技术的提高,误码率下降),然后增加了新的概念。而ATM(异步传输模式)也脱不了FR的影子,比如在SVC/PVC等概念上。在ATM里首先大幅度取消了差错校验(现在光纤的误码率极低),很多差错校验放到两端自己来做,然后把分组交换改成信元(cell)交换,信元长度固定而且很小(53个字节),它的大小经过严格的计算,既要在传输话音等业务时保证实时性----极低的延迟/消除回音等,又要在传输纯数据业务时不至于效率太低。ATM技术不但在一条物理链路上可以定义VC,还可以进一步定义VP,这样更方便传输多种业务以及实现Qos(服务质量)。ATM的高速、多种业务能力以及QoS听起来真是太美好了,不过价格太贵技术太复杂(越复杂越可能出问题)。它的挑战来自于IPoverSONET+RSVP,我这么认为。
    去年网络讨论的热点是IP over ATM以及第三层交换。ATM是面向连接的,而IP是无连接类型的,中间的结合是个大问题,Classical IP over ATM只是个临时办法,应付\"IP over Everything\"的。而第三层交换是基于网络第二层交换的,因为网络第三层完全是基于软件的,比如路由器只能做存储转发。第三层交换技术就是把路由技术与交换技术结合起来,在第三层的源地址与目的地址建立路由后控制第二层交换硬件用交换的方式而不是存储转发来传输后续数据。第三层交换的类型主要分为基于流驱动的实现和基于拓扑结构驱动的实现两种。Flow-driven的代表有Ipsilon的IP Switch、ATM论坛的MPOA等,Topology-driven的代表有Cisco的Tag Switching、IBM的ARIS等。不过这些都过去了,现在正在做的标准是MPLS(多协议标记交换)。但是ATM太贵了且技术上太复杂,相对地路由交换机或交换路由器正大行其道。现在还有人在吹第四层交换,其实也就是把TCP/UDP的端口之间的数据传输映射到第二层的交换硬件上,在一般的第三层交换上稍微加点东西,但在Ipsilon的IP Switching中这却是最基本的应用。我有幸较深入地接触过Ipsilon的IP交换技术(做过pre-sale及技术支持/安装),写了一篇\"IP Switch, ATM under IP?\",有兴趣可以了解一下。之所以把这篇文章放在这儿,是因为它最初就是用freebsd来实现的,freebsd也是自由软件吧。我想freebsd能做,Linux也能。经常有人问Linux这样的自由软件能做什么,我想这算是一个间接的例证吧!去年Ipsilon被诺基亚(Nokia)以1.2亿美圆收购后不再出相关产品了,我都以为它的IP Switch技术死了,不想几个月前居然看到Lucent出了极其相似的产品,不过背板带宽已经提高到几十个Giga。我想IP Switch的思想是非常棒的,影响是广泛的,在它之后IP over ATM及第三层交换技术蓬勃发展起来。而Linux这样的东西给中小公司提供了最佳的平台及基础知识库。
    言归正转,还是继续聊TCP/IP以及Linux Box上的网络配置。讲TCP/IP的书现在太多了,其中VLSM(可变长子网掩码)却很少提及。传统的IP编址用A,B,C类划分(D,E类用于特殊目的),网络号与主机号的分隔必须固定在某个点分符上,在IP地址越来越紧张的时候这个问题就很突出了,虽然IP地址有32个比特位之多,这样的分法确实不够用。而VLSM(RFC1009)允许在主机号的比特位中继续定义子网掩码/子网扩展前缀,分隔不必在点分符上。例如:
    子网号 193.1.1.32/27 11000001.00000001.00000001.00100000
    网络号-->|<-主机号
    掩码 255.255.255.224 11111111.11111111.11111111.11100000
    上图中带下划线的分别表示子网号和子网掩码。同样的还可以定义第二个子网如193.1.1.64/27等。这样共有2^3=8个子网。
    而在每个子网中可以有2^5-2=30个主机。减去2是因为后5位为全0时表示这个网络,全1时为这个子网的广播地址。
    193.1.1.32/27中27表示网络号占前面27个比特位,在有些路由器中这样的写法可以省掉网络掩码。

    注意1985年的RFC950中阻止使用全0全1的子网号以便与老式的路由器兼容,所以上图中的8个子网还要减去两个。但是稍微新一点的路由器都支持CIDR协议,8个子网还是8个,193.1.1.0/27表示第一个子网(子网号为0)并且可以用。另外193.1.1.32/27仍然是C类地址,你不可能去定义一个193.1.0.0/16出来!当然10.10.0.0/16之类从上而下是可以的。
    子网化(Subneting)的过程还可以继续进行下去,比如为193.1.1.32/27继续划分子网如193.1.1.40/29。VLSM还允许路由集束,可以减小路由器上路由表的大小。使用VLSM时的缺点就是如果子网号与主机号的分隔不在点分符上则在DNS里不能做反向名字解析,当然对于路由器来说不存在这个问题。
    Linux上缺省使用TCP/IP网络协议,注意第三层的网络地址如IP,IPX等是纯软件性,如果不是连到真实的大网中你可以随意设定修改,而第二层的网络地址如MAC地址等则是固定在网络接口设备中的。但是第三层的网络地址也是分配到网络接口设备上的,而不是主机!比如你的Linux Box上有个网卡,分配的地址是10.1.1.1,你可以说到10.1.1.1可以到你的主机,而说你的主机为10.1.1.1是不严谨的,想象一下如果你有多个网卡呢?特殊的情况是前缀为127的IP地址保留给本地主机了,这是一个Local Loopback(lo)接口,这是缺省的必备的网络接口,如果你把lo给down掉了(如ifconfig lo down),则访问本地主机可能有问题。用ifconfig命令来看lo则像下面这样:
    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0
    UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1
    RX packets:8 errors:0 dropped:0 overruns:0
    TX packets:8 errors:0 dropped:0 overruns:0
    如果你有其它网络接口设备,首先你得让Linux能识别支持它。以最简单的以太网卡为例。支持这个网卡后会有个eth?设备(eth0表示第一个网卡,eth1表示第二个网卡...),如果物理设备名不是eth?系列,你需要用别名设定上去(可以用ifconfig -a看看都有那些网络接口设备)。之后就可以使用ifconfig来配置这个网卡的IP地址/地址掩码/MTU等参数,用ifconfig eth0 up激活它。只是ifconfig只在修改内核里修改,不能保存在文件里。各种Linux发行版都提供了自己的配置工具,如Slackware的netconfig,Redhat的netconf/netcfg等等。配置完网卡后用ifconfig查看大致像下面这样:
    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0
    UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1
    RX packets:8 errors:0 dropped:0 overruns:0
    TX packets:8 errors:0 dropped:0 overruns:0

    eth0 Link encap:10Mbps Ethernet HWaddr 00:10:4B:0F:AA:E8
    inet addr:10.10.10.111 Bcast:10.10.10.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:22016 errors:0 dropped:0 overruns:0
    TX packets:10552 errors:0 dropped:0 overruns:0
    Interrupt:10 Base address:0xb400
    其中HWaddr指的是这个网卡的MAC地址,你也可以用arp来查看。
    如果你要访问其它网段,则还要设置网关(gateway)指向网关设备。参看一下/etc/sysconfig/network文件。然后用ping来测试一下能否到达其它网段。如果不能到达,需要用route来检查内核路由表,运行route后显示的信息看起来像这样:
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    130.233.16.0 * 255.255.240.0 U 0 0 1 eth0
    127.0.0.0 * 255.0.0.0 U 0 0 1 lo
    default trinet-gw.tky.h 0.0.0.0 UG 0 0 10 eth0
    如果你没有缺省路由,需要用类似于route add eth0这样的命令来添加静态路由。如果你的Linux Box上有多块网卡,可以用routed/gated守护程序(deamon)来做动态路由。而netstat是一个基本的TCP/IP网络监控工具。你需要仔细研究这两个程序。如果你想知道从源地址到目的地址的路径到底是怎样的,可以用traceroute来跟踪路由。
    接下来就是配置名字服务。通常要记住冷冰冰的数字很难,而把数字与一个有意义的名字联系起来,通过名字去访问则方便的多。不同的网络有不同的关联方法。最初Internet的前身用hosts文件来记录对应关系,但是随着网络规模的扩大,这样就不适应了,于是开发出DNS域名系统。很多书上都有讲它。
    最简单的情况是你的网络上已经有了DNS服务器,在配置时简单地添上这个DNS服务器的IP地址即可,参考/etc/resolv.conf配置文件。用Linux Box也可以自己提供名字服务,也供选择的有files,DNS,NIS+及NIS(Yellow Page),参考/etc/nsswitch.conf配置文件。注意NIS系统与DNS系统是不同的,使用它的目的主要在于当你的网络中有多个主机时可以简化管理。可以同时使用以上几种名字服务,顺序由nsswitch.conf来指定。具体怎么配置已经有文章讲了。
    正如主机有名字和IP地址一样,网络和子网也能命名,这个由/etc/networks文件控制。
    至于目录服务,可以去找OpenLDAP。Novell也在开发NDS for Linux。
    Linux支持很多种网络接口设备和网络协议,配置一下内核就看到了。比如Novell的IPX,再加上一个mars_nwe守护软件也可以做Netware 3.1提供的服务,在这方面做的最好的是OpenLinux发行版。不过现在IPX/SPX趋于消失,没有多大的意思,除非考虑与旧网络兼容的问题。

    发布人:netbull 来自:奥索网