第4章 网络配置与使用60年代末,美国国防部(DOD)对建立分组交换的广域网很感兴趣,其基本想法是通过连接多个地域的分散网络,那么局部地区的网络故障不影响其他部分网络的正常运行。主要是由于当时正处于冷战的形势下,他们要求建立能够在部分地区被袭击的情况下,仍正常运行的军事网络。
研究机构ARPA开始了这个称为ARPAnet的网络项目的研究,由于这个项目要求在不同的计算机之间进行通信,而不同的计算机上会运行不同的操作系统,因此就存在不同系统之间如何按照同样的规则进行交流的问题。因此最重要的问题就是开发所有的系统都遵守的标准协议,让它来实现应用程序对应用程序的通信,并独立于具体的计算机平台。因此,他们开发了独立于特定计算机系统的标准协议,以实现各种计算机之间的通信。
由于存在多种应用程序,因此协议也并非一个,而是一组协议。而TCP协议和IP协议就是他们开发的这些协议中最重要的两个,因此通常就以TCP/IP来称呼整个协议族,称为TCP/IP协议,这正是当前流行的Internet使用的协议标准。
TCP/IP的成功与BSD Unix分不开的,由于TCP/IP是平台独立的,而当时大学的研究机构主要使用BSD Unix,因而加州大学伯克利分校最先在BSD Unix中实现了TCP/IP。于是这一技术很快推广到使用BSD Unix的大学中,TCP/IP得到迅速推广,越来越多的网络使用这个协议,越来越多的网络也通过这个协议进行了互联,逐渐形成了今天的Internet。
DOD参考模型
参考模型是关于计算机之间如何进行通信的一种形象化表示方式,它将进行通信所需要的每一步骤按照层次的概念组织起来。如果一个步骤处理的事情是负责物理线路的具体传输,就认为属于模型中的低层,反过来,如果一个步骤是与具体的应用程序打交道,就认为属于模型中的高层,在高层和低层之间按照逻辑关系,还有一些中间层次。
将通信过程划分为不同层次的原因是因为通信过程是一个复杂的过程,对于用户来讲,能使用WWW浏览信息,能发送电子邮件就能满足需要,他们只关心这些应用程序,而不关心具体的通信过程;另外一些软件驻留在后台处理通信过程中必要的任务,如建立连接,发送数据等,而不关心数据是如何发送出去的;还有一些硬件专门用来负载信号的传递;这样不同的软硬件有着层次分明的调用关系,自然就形成了层次的概念,而参考模型正是对这些层次进行区分和定义。
在参考模型中,数据的物理传送是由应用程序──属于模型的最高层,向低层传送,直至具体传输数据的传输协议层,由这个层将数据通过物理介质──如电缆、光缆、微波等传送到目的计算机。当数据到达目的计算机时,它沿模型向上传递,最终到达目的计算机中的应用程序。这个过程就是传送数据的物理过程。
可以使用一个简单例子来解释这个通信过程。例如朋友之间互相传递信函是另一种较容易理解的通信过程,这个过程中有寄信者、收信者、邮递员、邮车等等。由寄信者将信交给邮递员,邮递员处理信件之后将信通过邮车发到对方的城市,对方城市的邮递员再将信交给收信者。这样就可以将这个过程按层次划分,寄信者和收信者可以看作一个层次,他们使用邮政服务,可以看成应用层;所有层次的邮政员工是一个层次,进行具体的处理通信工作,可以称为通信层;而邮车可以看成另一个层次,处理具体发送邮件工作,称为传输层;这只是一个简单例子,具体网络通信过程则要复杂的多。
从上图可以看出,虽然物理数据的传送是先从上到下,再从下到上回到另一台计算机的应用程序中,如果不考虑低层是如何进行具体处理的,就可以将通信看成在每一层与另一个计算机中的相应层之间进行的。这样在每层与另一台计算机相应层之间就存在逻辑上的连接通信和传递数据的能力。如果还使用前面的寄信的例子来说明的话,就是寄信者只考虑收信者,收信者也只考虑寄信者,而不管邮递员是如何处理信件的,在逻辑上就是朋友之间的通信关系。
这样用逻辑通信的方式将数据传送归结到各层中的协议上,每一个协议只定义了完成通信的一个任务,成功的完成整个通信过程要求多个协议协同进行,这些协议将分属参考模型的不同层次,而且每个协议只与对方相应的协议通信,而不需考虑整个通信过程,这样复杂的通信过程就得到了简化,从而能更容易实现。
按照对网络的不同理解,可以有不同的参考模型,将通信分为不同的层次结构,其中影响最大的就是国际标准化组织开发的OSI标准七层模型和TCP/IP中使用DOD四层模型。
DOD模型的四层分别为:
应用层(Application)
主机到主机层(Host to Host)
网络互连层(Internet)
网络访问层(Network Access)
网络访问层
TCP/IP并没有定义任何网络访问层的协议,这个层的协议大部分是由其他通信组织定义的,这反而使TCP/IP能适合几乎全部硬件平台。网络访问层和硬件相关,负责基本的通信,这一层最常见硬件的是以太网和使用普通电话线的拨号连接。对于以太网,这一层定义了介质访问控制地址(MAC地址),用于标识不同的计算机。有了网络访问层,计算机之间就有了物理连接,计算机之间就为相互交换数据提供了条件。
在FreeBSD下,网络硬件是以网络界面(Interface)的形式存在的,如果计算机的网卡被正确探测到的话,则就有一个相应的网络界面。例如第一个3C905网卡的网络界面是xl0,第一个Ne2000兼容网卡网络界面是ed0,使用内核级PPP驱动的ppp网络界面为ppp0等。这些网络界面都对应于内核中的硬件驱动程序,只有在硬件被检测到之后,这些网络界面才能被正常使用。除此之外,还有一个本地环路网络界面lo0,这使得即使没有任何网络界面的硬件存在,也能使用FreeBSD运行网络程序为本机提供网络服务。
网际层(Internet层)
Internet层负责确定一台计算机能在网络上的位置,并找出通向它的路径,然后才能够相互交换数据。这种路径选择功能既复杂又重要,因此实现这个功能的IP协议是整个TCP/IP协议组中的最基本协议。
IP地址
IP协议给每个计算机都分配了一个唯一的IP地址,这个地址是一个分为四部分的32位长的数,每个部分为8位,使用点将其分开,例如192.168.1.64,这样IP地址就表示的比较清晰;每个IP地址被划分为两个部分,一个为网络地址(Network Address),用于表示计算机所在的子网络,一个为节点地址(Node Address),用于标识计算机在子网络中的位置;网络地址和节点地址通过网络掩码(netmask)进行区分,对应网络掩码二进制位为一的IP地址部分为网络部分,其他的为节点部分。
例如网络掩码255.255.255.0(16进制形式为0xffffff00)将192.168.1.64的网络部分分为192.168.1和64两部分,因此其网络地址为192.168.1.0,节点部分为0.0.0.64。这个IP地址在FreeBSD下可以写作192.168.1.64/255.255.255.0或者192.168.1.64/24,后面一种形式和前一个是等价的,表示子网掩码的二进制位中前面为1的位共有24位,即255.255.255.0。
同一个网络中的网络地址应该相同,但节点地址应该不同,因而子网掩码可以决定这个网络中可以拥有的TCP/IP主机的数量,即节点地址的范围减2,其中节点地址二进制位全为0的地址为网络地址,表示这个网络本身,而节点地址二进制位全为0的地址为广播地址,用于在网络中发送广播包。
在IP协议中,为了便于管理,为不同种类的IP地址定义了缺省的网络掩码,而定义的具备不同网络掩码的IP地址就组成不同的网络类别。
A类网络:1.0.0.0到127.0.0.0,缺省网络掩码为255.0.0.0,每个网络可以容纳16,777,214台计算机;
B类网络:128.0.0.0到191.0.0.0,缺省网络掩码为255.255.0.0,每个网络可以容纳65,534台计算机;
C类网络:192.0.0.0到223.0.0.0,缺省网络掩码为255.255.255.0,每个网络只能容纳254台计算机;
其他的IP地址属于D、E、F类地址,被IP协议保留用在了mutlicast等其他方面。
这样划分的目的是为了让IP地址可以同时满足要求不同IP地址数量的大型网络和小型网络的需要。然而随着Internet的发展,IP地址开始变得紧张起来,当前已经提出了IPv6标准,以扩展IP地址的范围,解决地址紧张的问题。当前绝大多数网络还没有支持IPv6,因此完全转向IPv6还是一个漫长的过程,这也是FreeBSD不将比较成熟的FreeBSD IPv6计划──KAME,包括入FreeBSD发行版本的原因之一。当前主要使用另一种IP地址转换技术(NAT, Network Address Translete)来解决IP地址紧张的问题。
路由
有了IP地址,计算机就能确定在它在网络上的位置。当一台计算机要和另外计算机通信时,它首先必须知道对方的IP地址,如果该IP的网络地址和它相同,两台计算机就处在同一个子网上,能通过网络访问层进行通信。直接通过IP地址请求获得对方的MAC地址,以通过网络访问层进行通信,这需要通过另一个协议──ARP协议,从IP地址获得对方的MAC地址。
如果两台计算机不在同一个网络内,就需要一些特殊的计算机──路由器的帮助,才能将IP数据包发送到对方计算机上。当两台计算机不在同一个网络内时,计算机将查看自己的路由表,找出通往对方的合适路由器的IP地址,将IP数据包发送给这台路由器,由各级路由器负责将IP包发送到目的地。因此一台计算机要想和子网外的计算机通信,至少要知道一台路由器,由这台路由器负责将数据发送到子网外,通常称这台路由器为缺省网关(default Gateway)。
那么,路由器就必须了解到通往其他子网的通路,这些路径可以通过route命令由管理员手工加进去,也可以通过路由器之间相互交换数据,使路由器学习到更多的路由信息。路由器之间交换路由数据的协议主要有RIP、OSPF、BGP等协议。FreeBSD也能很好的支持这些路由交换功能,因此FreeBSD也是用做软件路由器的最佳选择。
DNS与名字解析
通常IP地址不易记忆,实际使用中是通过使用主机名来标记一台计算机,而主机名可以自动转换为IP地址,再进行实际的连接。主机名与IP地址的对应关系可以配置在主机名配置文件/etc/hosts中,但在网络上更普遍的是通过DNS协议,将对应关系保存在网络上多台名字服务器(DNS server)中,这样就能通过名字服务器来维护自己组织机构的名字解析数据。
由于网络上不同的计算机属于不同的网络和组织机构,因此计算机的名字可以分为区分组织的域名(Domain Name)和在组织内区分计算机的主机名,形成一种多级的结构。例如一台计算机的名字为wb.example.com.cn,其中wb为主机名,example.com.cn为域名,其中example代表工作的单位,com是类别代码,代表这个单位是公司机构,cn是国别代码,代表这个机构位于中国。
主机-主机层
这一层负责维护不同计算机上的两个进程的通信,它的主要作用就是将应用程序与网络的复杂性相隔离,应用层只需发出请求,而不必顾及任务是如何完成的。这一层包括两个协议:传输控制协议TCP和数据报协议UDP。
TCP协议是一种面向连接、有分组顺序控制和差错控制的安全准确的协议,因此必须在网络上传送额外的维护信息,网络开销大,但也是最常用的网络协议。TCP协议在不同机器之间建立了虚拟连接,它使用一个16位的端口地址(port number)来区分不同连接。应用程序必须使用一个或几个端口地址用来提供网络服务,因此对于常用的网络服务,其使用的端口地址就是固定的。FreeBSD下在/etc/services就定义了一些常用的端口地址。
UDP协议不建立连接,因此也不保证数据正确完整,相对来讲网络开销小,然而对于不可靠的网络连接,数据完整性无法保证。UDP也使用端口地址发送和接受属于不同应用程序的数据。
应用层
应用层就是为了让应用程序在不同的计算机上运行并相互通信而实现的多种协议,每种协议都对应一类应用程序。并且随着Internet上的应用程序的不断增加,应用协议的种类也越来越多。在/etc/services文件中定义的每一行就对应一个固定端口,就可能对应于一种应用程序类型。除此之外还有很多非标准应用程序,当然一个系统中并不会同时运行所有种类的应用程序。
大部分TCP/IP应用程序是属于客户机/服务器类型的,这种类型的应用程序包含两个部分,其中服务器程序通常运行在服务器系统的后台,称为守护程序(daemon)。守护进程运行在后台,随时接受客户连接以提供服务;客户软件就是应用程序的用户接口,用户通过它使用服务器上的资源。
由于希望在需要的时候服务器能立即提供服务,这样就需要启动大量并不常用的守护进程运行在系统中,就浪费了系统资源。因此Unix使用一个超级守护程序inetd来监控这些不常用到的服务请求。只有在inetd接到客户程序的连接请求后,才启动相应的应用服务程序进行处理,这样系统中就不必运行过多的守护进程了,从而节约系统资源。inetd的配置文件为/etc/inetd.conf,管理员必须配置这个文件,以便指定系统提供那种服务。
#
# Internet server configuration database
#
#@(#)inetd.conf5.4 (Berkeley) 6/30/90
#
ftpstreamtcpnowaitroot /usr/libexec/ftpdftpd -l
telnetstreamtcpnowaitroot /usr/libexec/telnetdtelnetd
shellstreamtcpnowaitroot /usr/libexec/rshdrshd
loginstreamtcpnowaitroot /usr/libexec/rlogindrlogind
fingerstreamtcpnowaitnobody/usr/libexec/fingerdfingerd -s
#execstreamtcpnowaitroot /usr/libexec/rexecdrexecd
#uucpdstreamtcpnowaitroot /usr/libexec/uucpduucpd
#nntpstreamtcpnowaitusenet/usr/libexec/nntpdnntpd
comsatdgramudpwait root /usr/libexec/comsatcomsat
ntalkdgramudpwait root /usr/libexec/ntalkdntalkd
#tftpdgramudpwait nobody/usr/libexec/tftpdtftpd /tftpboot
inetd.conf中的第一列为使用的端口地址,通常在/etc/services中进行定义,第二列和第三列为连接种类,stream为tcp连接,dgram为udp,第四列可以为非daemon方式启动的进程配置为nowait,为以daemon方式启动的进程设置为wait。然后为执行程序的用户,要执行的程序位置和要执行的程序命令及其参数。
未完,待续。。。