TCP/IP 简史
近年来,随着“传输控制协议/网际协议(TCP/IP)”套件的广泛使用,它已经成为网络通信中事实上的标准。这绝大部分要归功于因特网的迅猛发展以及对在不同平台、设备和操作系统中以它们都理解的“语言”来共享数据的需要。让我们首先了解 TCP/IP 的历史。
在 20 世纪 60 年代后期,美国国防部(DOD)意识到其内部日渐突出的通信问题。在 DOD 工作人员、研究实验室、大学以及承包商之间日益增长的电子信息通信量遇到了严重的障碍。组成 DOD 的不同实体和组织拥有来自不同计算机制造商的计算机系统,这些计算机系统运行不同的操作系统并使用不同网络拓扑结构和协议。
高级研究项目局(Advanced Research Projects Agency,ARPA)被授命提出一种解决这个问题的方案。ARPA 与各大学和计算机制造商结盟来开发一组通信标准。该联盟确定并构建了 4 节点的网络,这就成为当今因特网的基础。在 20 世纪 70 年代,该网络移植到一个新的、核心的协议设计中,这个协议就成为 TCP/IP 的基础。
开放系统互连(Open System Interconnection,OSI)模型
现在,我们使用许多不同类型的计算机,它们有着不同的操作系统、CPU 和网络接口等等。这些不同使得计算机系统间的通信出现问题。在 1997 年,国际标准化组织(ISO)创建了一个小组委员会来开发数据通信标准以促进多供应商的互操作性。其结果就是开放系统互连(OSI)模型。
OSI 模型并未确定任何通信标准或协议;相反,它只是提供了通信任务应该遵循的一些指导性建议。
注:OSI 模型只是一种模型或框架,它确定了要执行的功能,理解这一点很重要。它并未详细说明如何执行这些功能。但是,对于部分 OSI 模型,ISO 也确实接纳了某些符合 OSI 标准的具体协议。例如,ISO 接受 CCITT X.25 协议,该协议作为一种实现提供了 OSI 模型中网络层的大部分服务。
7 个 OSI 层
为简单起见,ISO 小组委员会采用分而治之的方法。将复杂的通信过程分为较小的子任务,问题就变得更容易处理,每个子任务可以分别优化。OSI 模型由 7 层组成:
· 应用层
· 表示层
· 会话层
· 传输层
· 网络层
· 数据链路层
· 物理层
给每一层都分配了一组特定的功能。每一层都使用下层的服务并为其上层提供服务。例如,网络层使用数据链路层的服务并为传输层提供与网络相关的服务。
OSI 层,续
利用相邻层的服务和为其相邻层提供服务,这种层的概念很简单。考虑公司是如何运做的:秘书写备忘录来向总裁(相邻的上一层)提供秘书服务。秘书使用信使的服务(相邻的下一层)来发送消息。通过将这些服务分开,秘书(应用程序)就不必知道消息实际上是如何传递到接收者手中。秘书只需要求信使(网络)发送消息即可。正如许多秘书通过使用这种标准的信使服务来发送备忘录一样,分层的网络可以通过将信息包交给网络层来发送这些信息包。
注:不要将应用层与在计算机上执行的应用程序混淆(在英文中都是一个词 — application)。请记住,应用层是 OSI 模型的一部分,它并未具体指定用户和通信路径之间的接口是如何工作的,应用程序是这个接口的具体实现。实际的应用程序通常执行应用层、会话层和表示层的服务,而将传输层、网络层、数据链接层和物理层服务留给网络操作系统来处理。
跨层通信
每一层都与其它计算机中的同一层通信。例如,一个系统中的第 3 层与另一个计算机系统的第 3 层通信。
当信息从一层传到下一层时,会在数据前面加一个头,以指出该信息的来源和目的地。来自某一层的由数据和头所组成的信息块又成为下一层的数据。例如,当第 4 层将数据传递到第 3 层时,它会添加自己的头。当第 3 层将该信息传递到第 2 层时,第 3 层会将来自第 4 层的头加数据作为它的数据,并在该数据前添加第 3 层的头,然后才将这个“头 + 数据”组合传给下一层。
每一层信息单元的名称都不同:
应用层 --> 消息
传输层--> 段
网络层 --> 数据报
数据链路层 --> 帧(也称做信息包)
物理层 --> 位
在 OSI 模型出现前,美国国防部定义了它自己的网络模型,即 DOD 模型。DOD 模型与 TCP/IP 协议套件有紧密的联系,这将在下一节说明。
TCP/IP 协议栈(TCP)
TCP/IP 协议栈表示了与 OSI 模型类似的网络体系结构。
但 TCP/IP 不象 OSI 模型那样详细区分协议栈的上面几层。OSI 最上面的 3 层大致与 TCP/IP 的网际处理协议相当。处理协议的一些示例有 Telnet、FTP、SMTP、NFS、SNMP 和 DNS。
OSI 模型的传输层负责可靠数据的发送。在网际协议栈中,这对应于主机到主机协议。这方面的示例是 TCP 和 UDP。TCP 用来转换来自上层协议的不定长消息以及提供远程系统间必要的确认和面向连接的流控制。
UDP 与 TCP 相似,但它不是面向连接的,而且不对数据接收进行确认。UDP 仅接收消息并将其传递给上层协议。因为 UDP 没有与 TCP 有关的那些开销,所以它为如远程磁盘服务等操作提供更高效的接口。
TCP/IP 协议栈(IP)
网际协议(IP)负责系统间无连接方式的通信。它相当于 OSI 模型中网络层的一部分,它负责网络间的信息移动。通过检查网络层地址来完成这种通信,该地址确定了发送消息的系统和路径。
IP 提供与网络层相同的功能并帮助获取系统间的消息,但是它不保证这些消息能够成功传送。IP 还可以将这些消息分成多个段,然后在目的地重组这些段。另外,每一段可以采用不同的网络路径在系统间传送。如果这些段到达时乱了次序,IP 则会在目的地将这些信息包重组成正确的序列。
IP 地址
网际协议要求为网络上的每个设备分配一个地址。这个地址就是 IP 地址,它由 4 个八位元组成。这些八位元每个都定义唯一的地址,这个地址的一部分表示网络(有时也可以表示子网),而另一部分则表示网络上特定的节点。
在 TCP/IP 网络中有几个地址具有特殊含义:
· 以零开头的地址表示当前网络中的本地节点。例如,0.0.0.23 指当前网络中的 23 号工作站。地址 0.0.0.0 指当前工作站。
· 在进行故障排除和网络诊断时,以 127 开头的地址非常重要。形式上将网络地址块 127.x.x.x 定义为 A 类地址,保留了该地址块以用于内部回送(loopback)。
· 将地址上所有位全置为 1(也就是值 255)代表"所有"地址。所以,192.18.255.255 意味着将消息发送给 192.18. 网络上的所有节点;类似的,255.255.255.255 意味着将消息发送给因特网上的每个节点。这些地址用于多点广播消息和服务公告。
注意:给系统分配节点号时,不要使用 0 或 255,它们都是保留数字,具有特殊含义。
IP 地址类型
将 IP 地址按一定范围分配,称为将 IP 地址分类,这取决于应用和组织的规模。三种最常见的类型地址是 A 类地址,B 类地址和 C 类地址。这三种分类表示了可为本地网络分配的 IP 地址中位的数目。
A 类地址用于非常大的网络或相关网络的集合。B 类地址用于超过 256 个节点(但少于 65536 个节点)的大型网络。而大多数组织采用 C 类地址。一个组织采用几个 C 类地址的做法是一个好主意,因为 B 类地址的数量是有限的。 D 类地址被保留用于网络上消息的多点广播,E 类地址则被保留用于实验和开发。
类 地址
A 从 0.x.x.x 到 126.x.x.x
B 从 128.0.x.x 到 191.255.x.x
C 从 192.0.0.x 到 223.255.255.x
D 从 224.0.0.1 到 239.255.255.255
E 从 240.x.x.x 到 255.255.255.255
“专用”IP 地址
如果您的网络没有连接到因特网而且最近也不会连接的话,则可以自由选择任何合法的网络地址。只是要确保您内部网络信息包不会跑到实际的因特网中即可。要确保即便信息包确实跑出也不会有任何危害,应该使用为专用而保留的那些网络地址的某个号码。因特网赋号管理局(Internet Assigned Numbers Authorit,IANA) 已经在 A、B 和 C 类地址中保留了一些网络号,您无需注册就可以使用这些地址。这些地址只有在专用网络中才有效,而且(理论上)不会路由到实际的因特网站点中。
A 10.0.0.0
B 172.16.0.0 - 172.31.0.0
C 192.168.0.0 - 192.168.255.0
请注意第二块和第三块分别包含 16 个和 256 个网络。
从这些网络号码中选择一个地址对于那些完全没有连接到因特网的网络是十分有用的。通过将单个主机用做网关,仍然可以实现访问另一个网络(如因特网)。对于本地网络而言,可以通过内部专用 IP 地址来访问该网关,而外部世界则通过正式注册的地址(由带宽供应商分配)知道该网关。
子网和子网掩码
划分子网是将大型的、实际的网络分成较小的逻辑网络的过程。划分网络的原因有以下几点:联网技术的电气(物理层)限制;为简便起见,希望在建筑物的每一层(或每个部门或针对每个应用)放置一个独立的网络而划分网络;减少网络段负载;或需要用高速线路连接远程位置。
划分网段的结果是使整个网络变成由一些小型子网块组成的网络,从而易于管理。这些较小的子网之间的通信通过网关和路由器进行。同样,一个组织可以有几个物理上在同一个网络中的子网,以便将网络功能逻辑地分成多个工作组。
单独的子网是整个网络的分支。假使将一个 B 类网络分成 64 个单独的子网。要完成这种子网划分,需要将 IP 地址视为两部分:网络和主机。网络部分由所分配的 IP 地址和子网信息位组成。实际上,这些位是借用主机的地址部分。分配给 B 类网络来表示网络部分的位数是 16,再加上子网部分的 6 位,共有 22 位来区分子网。这种划分的结果是有 64 个网络,每个网络 1024 个节点。IP 地址中的网络部分可大可小,这取决于所希望的网络数目或每个网络的节点数。
子网,第二部分
设置子网掩码实际上就是确定网络地址在何处结束以及主机地址在何处开始。子网掩码是由全为 1 的网络部分和全为零的主机部信息包成。
假使一个 C 类网由下列部信息包成:
N = 网络
H = 主机
NNNNNNNN.NNNNNNNN.NNNNNNNN.HHHHHHHH
每一位置表示 32 位地址空间中的一位。如果将这个 C 类网分成四个 C 类网络,其表示形式如下:
NNNNNNNN.NNNNNNNN.NNNNNNNN.NNHHHHHH
子网掩码如下:
11111111.11111111.11111111.11000000
如果用十进制数和点符号表示(即点分四组(dotted quad))这个地址,则子网掩码是 255.255.255.192。该掩码用于这个特定网络中所有子网上的节点之间的通信。
子网,示例
相反,如果从 IP 地址的主机部分取出三位,则可以形成八个网络,其网络掩码如下:
11111111.11111111.11111111.11100000
该子网掩码是 255.255.255.224。这八个网络中的每一个可有 30 个节点,因为有 5 个地址位可以使用。(本应该是 32 个,但由于全为 1 和全为 0 是不合法的主机地址,所以不能使用)。
网络 主机地址范围 广播
192.168.1.0 192.168.1.0 to 192.168.1.30 192.168.1.30
192.168.1.32 192.168.1.32 to 192.168.1.63 192.168.1.63
192.168.1.64 192.168.1.64 to 192.168.1.95 192.168.1.95
192.168.1.96 192.168.1.96 to 192.168.1.127 192.168.1.127
192.168.1.128 192.168.1.128 to 192.168.1.159 192.168.1.159
192.168.1.160 192.168.1.160 to 192.168.1.191 192.168.1.191
192.168.1.192 192.168.1.192 to 192.168.1.223 192.168.1.223
192.168.1.224 192.168.1.224 to 192.168.1.254 192.168.1.254
提示:如果需要一些计算子网方面的帮助,可以在 www.cotse.com/networkcalculator.html 上查找在线子网计算器。
跨网络通信:网关和路由
由于 IP 寻址具有这种结构,所以主机只能与同一网络上的其它主机通信。为克服这种限制,我们给网络添加了路由和网关。路由是确定信息包从源到目的地所采用的路径的机制。通过在路由表中查找目的地的 IP 地址来建立路径或路由。如果找到该地址,则将信息包发送到那个网络;如没有找到,则将信息包转发到称为缺省路由的项,这就是所有“未知”地址的信息包转发到的机器或设备的 IP 地址。
执行路由和/或转发功能的机器或设备称做网关或路由器。有时这两个术语也可以互换使用。从技术角度讲,网关描述这样的系统或设备,它在不同类型网络之间发送消息;而路由器在相同类型网络之间发送消息。因为我们只讨论使用 TCP/IP 协议的联网,所以不考虑这点细微差别,但是要意识到二者之间是有区别的。
还值得注意的是,通过定义,我们知道网关装配了不止一个网络接口(即 A 和 B),每一个网络接口都配置了不同的 IP 或 IP/子网。这就是“网络桥接”得以实现的原因。信息包到达接口 A,然后根据充当网关的这台设备上路由表中的各项,执行下列四个操作之一。可以将信息包:
· 发送到网络 A 上的主机
· 传递到网络 A 上的“上游”缺省路由设备
· 发送到网络 B 上的主机
· 传递到网络 B 上的“上游”缺省路由设备
路由配置
有四种常见的路由配置:
· 最小 — 完全与其它所有网络隔离开的网络仅需要最小的路由。通常在初始化网络接口时,建立最小的路由表。如果不需要与其它的 TCP/IP 网络通信,而且不用划分子网,则这就是系统所需的所有路由信息。
· 静态 — 网络有一个或两个网关时,通常使用静态路由来配置网络。静态路由表由网络配置脚本(使用用户提供的 IP)自动地创建或者由系统管理员手工创建(使用第五节中讨论的 /sbin/route 命令)。该表正如其名称所指的那样 — 是静态的。它不随网络的变化而做调整。当网络变化时,必须手工重新配置该路由表。
· 动态 — 大型网络通常都安装了多个路由器和/或网关,出于冗余/故障恢复的目的,它们可能指向同一远程网络。这就是动态路由的用武之地。动态路由允许使用一种协议 — 是的,您猜对了 — 称作路由协议,根据路由设备之间所交换的信息动态地构造(并不断地更新)路由表。这种持续不断的信息交换提供了一种机制,利用这种机制可以自动调节路由来适应不断变化的网络条件 — 譬如,通信量过大或运行中断。动态路由的最大缺点是设备间的路由信息交换会消耗相当大的带宽。
· 第四个选项是使用静态和动态路由的组合。每个子网上的机器都使用静态路由以到达紧邻它们的机器。缺省路由 — 那些没有由路由表分配特定路由的信息包所使用的路由 — 被设置通向一台网关机器,该机器被配置成可以提供动态路由,因此也就了解其子网以外的网络。
动态路由是基于这几个路由协议(内部协议,如 RIP、Hello 和 OSPF 等等;外部协议,如 EGP 和 BGP)之一,通过网关路由守护程序 gated 来启用动态路由。动态路由不是本教程所讨论的范围。想要了解有关这方面的更多信息,请参阅本教程结束部分的“结束语,参考资料和反馈意见”中所列出的 Craig Hunt 的 TCP/IP Network Administration 一书。
继续……
现在该将先前所有的理论知识付诸于实践了。在接下来的章节中,我们将探讨:
· Red Hat 7.0 中负责网络接口的配置文件
· 使用 ifconfig 检查和配置接口
· 添加和编辑静态路由
· 使用 netstat 对网络接口进行监视/排除故障
关键文件和脚本
网络接口初始化的实际过程(有时也称做“启动接口”)是由一组配置文件和脚本控制的,这些文件和脚本大多数在/etc 目录下。这些配置文件告诉 Linux 它的 IP 地址、主机名和域名;脚本则负责网络接口的初始化。
遗憾的是,不同分发版(distribution)中文件位置和命名约定至今还没有统一的标准。为给本文提供具体的示例,将基于广泛使用的 Red Hat 7.0 包做出描述。请记住,若您的分发版不是使用 Red Hat 或不是基于 Red Hat 约定(如 Mandrake 分发版),在此所引用的一些文件会位于别的目录中或有其它的名称。然而,网络效果和实际效果是一样的 — 将存储在一系列配置文件中的网络信息传递给脚本,然后用脚本初始化接口和网络路由。
涉及初始化和配置网络接口的关键文件有:
· /etc/hosts (将主机名映射到 IP 地址)
· /etc/networks (将域名映射到网络地址)
· /etc/sysconfig/network (打开或关闭联网,设置主机名和网关)
· /etc/resolv.conf (设置名称服务器或 DNS 服务器的 IP 地址)
· /etc/rc.d/rc3.d/S10network (在引导时激活已配置的以太网接口,由运行级别目录 /etc/rc.d/rcN.d/ 中的符号链接调用)
· /etc/sysconfig/network-scripts 中一些文件的集合。这些文件包括用于网络连接的主要配置,以及提供接口状态和控制功能的符号链接。
/etc/hosts
/etc/hosts 是将 IP 地址和主机名联系起来的简单文本文件。 TCP/IP 网络中的每台计算机都必须有唯一的 IP 地址。hosts 文件只允许用户将主机名与 IP 地址联系起来,以便当访问计算机时使用该名称,而不用输入一长串数字。/etc/hosts 中的每一项都依次包含一个 IP 地址、空白和主机名和/或别名。井号(#)表示注释开始。例如:
# /etc/hosts
# last updated 12/3/2000
127.0.0.1 loopback localhost # loopback (lo0) name/address
192.168.1.5 janus.syroidmanor.com janus
192.168.1.6 thumper.syroidmanor.com thumper
192.168.1.7 donovan.syroidmanor.com donovan
192.168.1.8 raidserver
192.168.1.20 phoenix.syroidmanor.com phoenix
192.168.1.15 hydras.syroidmanor.com hydras
在上面显示的 Hosts 文件中,IP 地址 192.168.1.5 映射到主机 janus.syroidmanor.com ,并且分配给它一个备用主机名(或别名)janus。尽管 DNS 已经取代了这个主机文件,但出于以下原因仍然使用它:
· 大多数系统都有一个包含本地网络上的关键主机的名称和地址信息的小主机表。当 DNS 未运行时,例如,在最初系统启动期间,则使用该表。即便本地 DNS 服务器正在运行,在每个系统上也应该有一个小 hosts 文件,该文件包含一个主机本身项、一个 localhost 项以及局域网上任何主要的网关和服务器项。
· 未连接到因特网或其他网络的小网络不需要 DNS 服务。然而,这些网络上的主机也需要知道如何定位同一网络上的其它主机。
/etc/networks
就如主机有名称和地址一样,为方便起见,也可以为网络和子网命名。 /etc/networks 文件在布局上与 /etc/hosts 很相似,只不过名称和地址互换了一下。
# /etc/networks for syroidmanor.com
localnet 127.0.0.0 #loopback
syroid-C1 192.168.1 #development, class C
syroid-C2 192.168.2 #support, class C
在上面的示例中,可将网络名称 syroid-C1 用于脚本或任何命令行实用程序中来引用 192.168.1 这个 C 类网。
/etc/sysconfig/network
将 /etc/sysconfig/network(注意与 /etc/networks 文件不同,这个 network 是单数而不是复数)用于指定所期望的网络配置信息;在引导时,有几个脚本要使用它。该文件可以包含下列所示的一个或多个关键字/值对:
NETWORKING=YES|NO -- YES 表示需要配置网络;NO 表示不需要配置网络。
HOSTNAME=hostname — 主机的全限定域名;为与较老的程序兼容,这应该与在 /etc/hosts 中的主机项相匹配。
GATEWAY=gw-ip — 网络网关的 IP 地址。
GATEWAYDEV=gw-dev — 网关设备的名称(例如 eth0)。
NISDOMAIN=dom-name — 表示 NIS 域,如果有的话。
下面是 /etc/sysconfig/network 最小配置的示例:
NETWORKING=yes
HOSTNAME=phoenix.syroidmanor.com
GATEWAY=192.168.1.1
/etc/resolv.conf 和 /etc/rc.d/rc3.d/S10network
/etc/resolv.conf 是网络用来确定主机解析的关键文件之一。在此可以标识最多三个名称服务器;如果列在第一位的服务器未对查询做出响应,则后面两个起到备用的作用。domain 项定义缺省域名。解析器(顺便提一下,该解析器不是一个单独的进程,而是由网络进程调用的例程库)将这里所列出的域名附加在任何不包含句点的主机查询上。
# /etc/resolv.conf
# domain name resolver config file
domain syroidmanor.com
nameserver 192.168.1.7
nameserver 192.168.1.10
nameserver 165.142.268.19
在上面所显示的示例中,如果提交给解析器的查询是想要查询找主机 phoenix(注意,没有点),则将该域附加到这个请求之后,这会将该查询扩展为 phoenix.syroidmanor.com。若需要了解更多详细信息和可以使用的选项,请输入 man resolv.conf 。
/etc/rc.d/rc3.d/S10network 是指向 /etc/rc.d/init.d/network 脚本的符号链接。当系统达到运行级别 3 时,它负责初始化所有已配置的网络接口。在这里我们不想花时间来详细讨论该文件后面的逻辑,因为该文件主要是调用本节中所提到的其它脚本和程序。但是,如果您对 S10network 中初始化各种网络组件和服务的顺序感兴趣的话,则可以使用 less /etc/rc.d/rc3.d/S10network 命令来仔细研读它。
/etc/sysconfig/network-scripts/ 目录
最后,通常可在 /etc/sysconfig/network-scripts/ 目录中查找到下列文件:
· /etc/sysconfig/network-scripts/ifup
· /etc/sysconfig/network-scripts/ifdown
· /etc/sysconfig/network-scripts/network-functions
· /etc/sysconfig/network-scripts/ifcfg-interface-name
· /etc/sysconfig/network-scripts/ifcfg-interface-name:clone-name
· /etc/sysconfig/network-scripts/chat-interface-name
· /etc/sysconfig/network-scripts/dip-interface-name
· /etc/sysconfig/network-scripts/ifup-post
在随后的几页中,我们将简要地看一下这些关键文件,了解它们做什么和包含什么。
……/network-scripts/,第一部分
/etc/sysconfig/network-scripts 中的 ifup 和 ifdown 项实际是分别指向 /sbin/ifup 和 /sbin/ifdown 的符号链接。这两个脚本是在该目录下唯一应该直接调用的脚本,并且它们按需要调用所有其它脚本。
ifup 和 ifdown 通常只带一个参数:设备名(例如 eth0)。系统在引导过程期间用参数“boot”调用它们,以便于不激活没有被配置成在系统启动时初始化的设备(请参阅下面关于 interface-name 描述中的 ONBOOT=no)。
network-function 不是公共文件。它包含这个目录中的几个脚本所需的函数。具体地说,它包含了用于处理替代接口配置的大多数代码。
……/network-scripts/,第二部分
配置文件 ifcfg-interface-name 和 ifcfg-interface-name:clone-name 包含了初始化接口所需的大部分详细信息。第一个文件定义接口,而第二个文件仅包含与“别名”(或替代)接口相关的部分定义。例如,网络地址或许不同,但其它可能会一样。
在 ifcfg 文件中定义的各项目取决于接口类型;下列值很常见:
· DEVICE=name ,其中 name 是物理设备名
· IPADDR=addr ,其中 addr 是 IP 地址
· NETMASK=mask ,其中 mask 是网络掩码值
· NETWORK=addr ,其中 addr 是网络地址
· BROADCAST=addr ,其中 addr 是广播地址
· GATEWAY=addr ,其中 addr 是网关地址
· ONBOOT=answer ,其中 answer 是“yes”(引导时激活设备)或“no”
· USERCTL=answer ,其中 answer 是“yes”(非 root 用户可以控制该设备)或“no”
· BOOTPROTO=proto ,其中 proto 取下列值之一:“none”(引导时不使用协议)“bootp”(使用 BOOTP 协议)或“dhcp”(使用 DHCP 协议)
此外,下列值对所有的 SLIP(串行线 IP)文件是公共的:
· PERSIST=answer ,其中 answer 是“yes”(即使调制解调器已经挂断连接,也保持设备处于激活状态)或“no”(不保持激活状态)
· MODEMPORT=port ,其中 port 是调制解调器端口的设备名(例如,/dev/modem)
· LINESPEED=baud ,其中 baud 是调制解调器的线路速度
· DEFABORT=answer ,其中 answer 是“yes”(当创建/编辑该接口的脚本时,插入缺省的异常终止字符串)或“no”(不插入缺省的异常终止字符串)
…/network-scripts/,第三部分
chat-interface-name 文件是用于 SLIP 连接的交谈脚本(chat script)。它的功能是启动 SLIP 连接。对于 SLIP 设备,DIP 脚本是根据这个交谈脚本编写的。
chat-interface-name 是只写脚本,它由程序 netcfg 根据交谈脚本创建的。不要修改该文件。
当初始化任何网络设备(除了 SLIP 设备)时,调用 /etc/sysconfig/network-scripts/ifup-post。它调用 /etc/sysconfig/network-scripts/ifup-routes 以启动依赖于该设备的静态路由,它还启动为该设备配置的任何别名,并且,如果还没有设置主机名,则设置主机名 — 这样找到与该设备 IP 地址匹配的主机名。最后,ifup-post 给请求通知网络事件的任何程序发送信号(SIGIO)。
ifconfig 程序
ifconfig 命令设置、检查或监控网络接口的配置值。它还可以用于设置接口的“状态”— 即“up”(启动)或“down”(关闭)。一个对 ifconfig 简单的调用是:
ifconfig interface-name ip-address up|down
这会激活指定的接口并将所提供的 IP 地址分配给它。
ifconfig 有许多个可用的选项(metric、mtu 以及 pointtopoint 等等;有关详细信息,请参阅帮助页)用于显式地设置唯一的接口参数,但一般来说,提供接口名称(例如, eth0)、IP 地址和网络掩码就足够了。例如:
ifconfig eth0 192.168.1.5 netmask 255.255.255.0 up
分配给接口 eth0 的 IP 为 192.168.1.5,网络掩码为 255.255.255.0 并“启动该接口”或将其初始化。类似的,若将接口“关闭”,则输入 ifconfig eth0 down ;不需要指定 IP 和网络掩码。
使用 ifconfig 检查接口
运行不带参数的 ifconfig 会使该程序显示所有网络接口的状态。若要检查特定接口的状态,则在 ifconfig 后附加这个接口的名称。例如:
[tom@phoenix tom]$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:10:5A:00:87:22
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9625272 errors:0 dropped:0 overruns:0 frame:0
TX packets:6997276 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:19 Base address:0xc800
以上输出显示 MAC 地址(Hwaddr)、所分配的 IP 地址(inet addr)、广播地址(Bcast)和网络掩码(Mask)。另外可以看出该接口处于 UP 状态,其 MTU 为 1500 并且 Metric 为 1。接下来的两行给出有关接收到(RX)和已发送的(TX)信息包数,以及错误、丢弃和溢出信息包数的统计。最后两行显示冲突信息包的数目、发送队列大小(txqueuelen)和 IRQ 以及这块卡的基址。
配置路由
让我们通过查看尚未配置网关的网络接口来看一下如何配置路由。正如您所见,使用不带参数的 route 命令将显示内核路由表。
[root@phoenix tom]# /sbin/route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
127.0.0.0 127.0.0.1 255.0.0.0 U 0 0 0 lo
192.168.1.0 192.168.1.5 255.255.255.0 U 0 0 0 eth0
第一项是到 localhost 的回送路由,它是在配置 lo 时自动创建的。第二项是通过接口 eth0 到网络 192.168.1.0 的路由。地址 192.168.1.5 不是远程网关地址。它是分配给 phoenix eth0 的地址。
注意每项的标志。它们都设置了 U(启动)标志,这表示准备使用它们,但它们都未设置 G(网关)标志。不设置 G 标志是因为这两个路由都是通过本地接口,而不是通过外部网关的直接路由。
上述示例仅包含一个网络路由 192.168.1.0。因而 phoenix 仅可以与位于 192.168.1.0 网络中的主机进行通信。
添加静态路由
最小的路由表仅允许在同一网络中的主机互相通信。要与远程主机通信,必须将通过外部网关的路由添加到路由表中。达到该目的的一种方法是通过使用 /sbin/route 命令。拿上页中的例子来说,我们现在就将路由 192.168.1.1 添加到网络配置中。
[root@phoenix tom]# /sbin/route add default 192.168.1.1 1
在上面这个示例中,route 命令后的第一个参数是关键字 add 。在 route 命令上的第一个关键字要么是 add 要么是 del (删除路由)。下一个值是目的地地址,它是通过该路由到达的地址。如果关键字 default 用于目的地地址,则创建缺省路由。只要没有到目的地的特定路由时,就使用缺省路由;通常,这就是您在路由表中唯一需要的项。如果网络中只有一个网关,则使用缺省路由引导所有要到远程网络的数据流量通过那个网关。
这个命令行的下一个参数是网关地址。该地址必须是直接连接本机所在网络的网关地址。在到远程目的地的网络路径中,TCP/IP 路由要指定下一跳(next-hop)。这个下一中继必须是本机可直接访问的;因而,它必须是在直接连接在本机所在的网络中。
注:因为大多数的路由都是在系统启动过程早期时添加的,所以建议用数字的 IP 地址替代主机名。这样做就可以确保路由配置不依赖于名称服务器的状态。而且要确保总是使用完整的数字地址(共 4 个字节);如果不用完整的 IP 地址,则路由只能猜想部分 IP 地址,这样可能会导致不正确的配置。
静态路由,续
在上页的 route 命令中,最后一个参数是数字 1,称之为路由度量(routing metric)。当删除路由时是不需要此 metric 参数的,但是在添加路由时许多系统都需要它。尽管需要度量,route 仅使用它来确定路由是通过直接连接的接口还是通过外部的网关。如果 metric 是 0,建立的这条路由是通过本机接口且不设置 G 标志;如果 metric 值比 0 大,则建立的这条路由带 G 标志且网关地址被认为是外部的。静态路由不使用其它 metric 值。需要真正用到多个 metric 值的是动态路由。
要显示新的路由表,输入 /sbin/route 或使用 netstat -rn 命令(我们将再下一节讨论该命令):
[root@phoenix tom]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
最后做一个测试来证明一切都如同我们讲到的那样运行,ping 另一个网络上的主机;应该可以接收到响应。如果没有接收到响应,则重新检查您的配置。
要熟悉 route 其它的选项和参数,请输入 man route 。
netstat 程序
如果管理任意规模的 TCP/IP 网络,则 netstat 程序是一个相当有价值的工具。它可以显示内核路由表,活动网络连接的状态和每个已安装网络接口的一些有用的统计信息。
象大多数 Linux 管理命令行程序一样,netstat 可以通过其后面的附加选项或标志来选择所显示信息的细节数量和/或信息的范围。一些常用选项有:
-a — 显示所有连接的信息,包括那些正在侦听的
-i — 显示所有已配置网络设备的统计信息
-c — 持续更新网络状态(每秒一次)直至被人为中止(^C)
-r — 显示内核路由表
-n — 以数字(原始)格式而不是已解析的名称显示远程和本地地址
-t — 仅显示 TCP 套接字信息(不包括任何 UCP 套接字信息)
-v — 显示 netstat 的版本信息
输入 man netstat 可获得所有可用标志的完整列表和详细说明每个标志的用途。请注意还可以组合这些标志,所以输入 netstat -rn 将以原始的 IP 地址格式显示关于本地和远程主机(n)的系统路由表(r)。
显示活动的网络连接
netstat 支持一组显示活动或非活动的套接字的选项:-t、-u、-w 和 -x 分别显示活动的 TCP、UDP、RAW 或 UNIX 套接字连接。如果加上 -a 标志,还会显示等待连接的(换句话说,就是侦听)套接字。这将为您显示现在正在系统上运行的所有服务器。
例如:在主机 phoenix 上输入 netstat -ta 会显示下列内容:
[tom@phoenix tom]$ netstat -ta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 40 phoenix.syroidmanor:ssh 192.168.1.5:1132 ESTABLISHED
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 phoenix.syroidmano:1028 hydras.syro:netbios-ssn ESTABLISHED
tcp 0 0 phoenix.syroidmano:1027 raidserver:netbios-ssn ESTABLISHED
tcp 0 0 *:printer *:* LISTEN
tcp 0 0 *:auth *:* LISTEN
tcp 0 0 *:1024 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
上述输出显示大多数的服务器仅仅在等待到来的连接(LISTEN)。但是,第一行显示主机 phoenix 和 IP 地址为 192.168.1.5 之间的连接;第三和第四行显示两个 netbios 连接(Samba SMB 共享)。
用 netstat 查看路由表
当使用 -r 标志时,netstat 显示内核中的路由表,这类似于输入 /sbin/route :
[tom@phoenix tom]$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
-n 选项强制 netstat 以点分四组 IP 数字的形式,而不是主机和网络名称的形式输出地址。当您不想通过网络(例如,用 DNS 或 NIS 服务器)进行地址查询时,这个选项特别有用。
第二列显示路由项中所指向的网关。如果没有使用网关,就会显示星号。第三列是路由的网络掩码。内核在将信息包的 IP 地址与路由的目的地 IP 地址进行比较之前,将 Genmask 值与信息包的 IP 地址逐位进行“与”操作,从而使路由“通用化”。
第四列显示路由的标志:U 表示处于活动状态,H 表示主机,G 表示网关,D 表示动态路由,而 M 表示已经修改过。
用 netstat 查看路由表,续
[tom@phoenix tom]$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
接下来的三列显示 MSS、Window 和 irtt,它们将被应用于通过该路由建立的 TCP 连接。MSS(Maximum Segment Size)表示“最大分段尺寸”,也是内核所构建以通过该路由发送的数据报的最大尺寸。Window 表示系统一次从远程主机接收突发的最大量数据。
首字母缩写词 irtt 代表“初始往返时间(initial round trip tim)”。TCP 协议确保主机间可靠地发送数据,如果数据已经丢失,则重新发送。TCP 协议一直对发送给远程端点的数据报和接收到的确认所花费的时间进行记数,以便知道假定要重发数据报前需要等待的时间;这个过程称为往返时间。TCP 协议将使用第一次建立连接时所用时间作为初始往返时间的值。对于大多数类型的网络,用缺省值就够了,但对某些速度较慢的网络(特别是某些业余的分组无线网络),这个时间太短了,会造成不必要的重发。可以使用 route 命令设置 irtt 值。在上面这个路由表中,这些字段均为零值,这表明正在使用缺省值。
最后,最后这个字段表示的是所显示的路由使用的网络接口。
用 netstat 显示一些网络接口使用的统计信息
用 -i 选项调用 netstat 可以显示所有已配置接口的一些有用的统计信息 — 这是一个用于排除网络故障的非常有用的工具。有了该命令,很容易检查连接的状态以及连接是否“正常”。
[tom@phoenix tom]$ netstat -i
Kernel Interface table
eth0 Link encap:Ethernet HWaddr 00:10:5A:00:87:22
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10554374 errors:0 dropped:0 overruns:0 frame:0
TX packets:8528339 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:19 Base address:0xc800
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:5612 errors:0 dropped:0 overruns:0 frame:0
TX packets:5612 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX packets 和 TX packets 行分别显示了已经接收到的信息包或已经发送了的信息包数目以及出错的信息包、丢失的信息包以及溢出的 RX/TX 统计信息。最常见的接口错误都是源于不正确的配置,所以,如果遇到了某些困难,最好再三检查所有的设置来进行诊断。
假使接口已经启动,则应该没有信息包排队等候发送(txqueuelen)— 如果有,则可能是由于网络电缆或网卡有问题。首先换一根备用电缆,然后重新检查连接。RX/TX 错误应该近乎为零。如果 TX 错误过多,则表示网络已经饱和或物理连接有问题;如果 RX 错误过多,则表示网络已经饱和、物理连接有问题或主机过载。如果遇到过高的冲突率(冲突率是输出信息包(output packet)的百分比,而不是从发送/接收信息包的总数中计算得出),它可能也表示网络已经饱和;通过从同一子网上的另一台主机执行 netstat -i 命令并比较结果来证实这一点。
要解决网络中错误,一定要仔细地以及系统地分析接口的所有方面(硬件和软件),这是必要的。不要匆忙行事,……啊……我们提到了总是要先检查网络电缆。在这一点,相信我。
结束语
在本教程中,我们已经讨论了 TCP/IP 的历史、OSI 模型和它与 TCP/IP 设计的关系、IP 寻址、子网划分和路由 — 所有这些都是从理论角度来阐述的。然后我们着手研究了如何在 Red Hat 7.0 下初始化 TCP/IP 网络,以及讲述了 Red Hat 下的一些文件是做什么用的。接下来,我们探讨了如何配置网络接口以及如何指定本地局域网和“外部世界”间的路由。最后,本教程探讨了 netstat 程序以及如何使用该程序来检查网络是否正常。
确实,需要汲取许多知识,但是 TCP/IP 是一个很大的主题,有数百条的分支,一个人不可能在两三天内完全掌握它。事实仍然是:TCP/IP 是因特网的主干,路由是将所有主机和网络“粘”在一起的“粘合剂”,而 IP 地址代表我们在这个世界里“冲浪”时所要访问的地方。当您想到这一点,并考虑到过去三、四年人们对计算机领域,特别是因特网的需求飞速增长时,您会觉得这些基础设施确实在非常好地支撑这些。
在网上有:
· Linux System Administrator's Guide
· 学习如何 Easily configure TCP/IP on your AIX system
· IBM 提供了一些用于网络监控的工具,譬如 Tivoli NetView Performance Monitor for TCP/IP
· 访问 TCP/IP for OS/40O 的主页
· 请阅读关于实现 iSeries 和 AS/400 的 TCP/IP 和因特网访问
· 如果您可以在线搜索和参考,则我强烈向您推荐 O'Reilly 新的 Safari 订阅服务。您可以完全搜索并选择一些曾经出版过的有关网络方面最好的书籍。
出版的书籍有:
· TCP/IP Network Administration, 2nd Edition,Craig Hunt(O'Reilly)ISBN:1-56592-322-7
· Linux in a Nutshell, 3rd Edition,Siever, Spainhour, Figgins, and Hekman(O'Reilly)ISBN:0-596-00025-1
· Running Linux, 3rd Edition, Welsh, Dalheimer, and Kaufman(O'Reilly)ISBN:1-56592-469-X