[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 下一页 ]


Debian GNU/Linux 网络管理员手册 (过时文档)
第 3 章 - TCP/IP


作者 = Duncan C Thomson duncan@sciuro.demon.co.uk

主题 = IP 协议, TCP 协议, IP 地址, IP 接口, 路由


3.1 简介

TCP/IP,正如其名称所示,是一对协议,也是大多数互联网构建的基础。尽管互联网的物理构成是由各种各样的网络技术组成的,从慢速调制解调器链路到以太网,再到高速基于 ATM 的交换网络,并且在其上运行着各种不同的应用程序 - 仅举两个例子,万维网和电子邮件,但将所有东西联系在一起的协议是互联网协议 (IP),以及,也许几乎同样重要的,传输控制协议。另一种协议,UDP,在某些应用程序中代替 TCP 使用,尤其是在 LAN 环境中,但在互联网上,TCP/IP 伙伴关系占据主导地位。

图表:各种物理网络,IP,TCP 和 UDP,应用程序

本章首先描述 IP 网络的基本知识,然后描述 Debian 用户可用的 TCP/IP 的一些更高级的功能。


3.2 IP 地址

每台直接连接到互联网(或任何基于 IP 的网络)的计算机都由一个 IP 地址标识。IP 地址是四个字节长,通常写成由点分隔的四个十进制数字,如下例所示。

IP 地址通常标识两件事。首先,它们标识特定计算机所在的网络。其次,它们标识该网络上的特定计算机。这两个信息都存在于 IP 地址中,它们可以被称为网络部分主机部分。这里应该提到主机部分的两个特殊值 - 如果主机部分全部为零,则地址指的是网络(即它是网络地址而不是主机地址)。或者,如果主机部分全部为一,则地址指的是网络上的所有主机(即它是广播地址)。

为了识别 IP 地址的哪一部分是主机部分,哪一部分是网络部分,我们可以使用两种方法。第一种(也是最初的)方法更容易理解,所以让我们先来看看它是如何工作的。IP 地址被分成许多,正是这个类告诉我们如何将 IP 地址分成网络部分和主机部分。

A 类

A 类 IP 地址的第一个字节是一个介于 1 和 126 之间的数字。A 类 IP 地址的第一个字节标识网络,其余三个字节标识主机。

B 类

B 类 IP 地址的第一个字节是一个介于 128 和 191 之间的数字。它的前两个字节是网络标识符,其余两个字节是该网络上的主机标识符。

C 类

C 类 IP 地址的第一个字节是一个介于 192 和 223 之间的数字。它的前三个字节标识网络,其余字节标识该网络上的单个主机。

从上面的列表中,您可能会注意到以 224 及以上的字节开头的 IP 地址缺失了。这些属于其他类别的 IP 地址,不用于正常的 IP 主机,并且超出了本节的讨论范围。

您可能还会注意到以 127 开头的 IP 地址缺失了。以 127 开头的 IP 地址被称为环回地址,可以用于在没有实际网络连接的情况下测试 TCP/IP。

这一切都很好,但是如果我们已经被分配了一个 C 类地址范围,但想要将其拆分到多个网络中怎么办?这就是可以使用第二种指定网络和主机部分的方法的地方。这种方法与 IP 地址一起指定一个子网掩码,它在网络部分将其位设置为一,并在主机部分将其位设置为零。因此,例如,各种网络类别的默认子网掩码如下

A 类

255.0.0.0

B 类

255.255.0.0

C 类

255.255.255.0

这些并没有给我们提供超出原始地址类别告诉我们的任何新信息。然而,使用子网掩码的强大之处在于,我们可以选择网络部分和主机部分之间的任意分割 - 例如,子网掩码 255.255.255.192 将允许我们将一个 C 类网络分成四个部分,每个部分有 62 个主机地址。困惑了吗?让我们更详细地看看这个例子。

假设我们已经被分配了一个以 192.168.50 开头的 C 类网络。如果我们将子网掩码 255.255.255.192 转换为二进制,我们可以看到在最后一个字节中,前两位是一(即,它们包含在地址的网络部分中),最后六位是零(即,它们构成主机部分)。因此,通过使用我们被赋予的 IP 地址,以及这个子网掩码,我们将我们的网络分成了四个,网络地址通过将这两位设置为它们的四种可能的组合 (00, 01, 10, 11) 同时保持主机部分设置为零(以标识网络)来给出

现在我们知道我们的四个网络地址来自哪里了。那么我们的主机地址呢?它们来自将每个子网中的主机部分设置为从 000001 到 111110 的所有值(记住 - 全为一是一个广播地址)。这为我们提供了每个网络总共 62 个主机,地址为

在 Linux 中,如果我们没有提及我们正在使用的子网掩码,软件通常会假定我们想要使用该特定类别的 IP 地址的默认子网掩码。只有当您使用非特定类别的 IP 地址的标准方案的子网掩码时,您才需要指定子网掩码。不过,指定它永远不会有任何坏处。

每个 IP 地址在互联网或您连接的任何 IP 网络上都应该是唯一的。这意味着您不能随机地将 IP 地址分配给您的机器,因为大多数 IP 地址已经在互联网上使用。为了为您的机器获得一组合法的 IP 地址,您通常会通过互联网服务提供商 (ISP)。如果您没有被分配这样的地址范围,您应该使用一组为互联网或测试使用而预留的私有 IP 地址。请注意,您将无法直接从这样的网络连接到互联网;您需要使用某种形式的网络地址转换 (NAT) 来做到这一点。为私有使用而预留的 IP 地址范围是


3.3 IP 接口配置

一旦我们知道我们希望为我们的机器使用哪个 IP 地址,我们将不得不启动我们的一个网络接口,并将该 IP 地址(可能连同子网掩码)分配给它。在大多数 Debian 系统上,这是在安装系统时完成的,并且在简单的系统上您很少需要更改它。

ifconfig 命令用于配置接口以便将 IP 与它们一起使用。Linux 内核提供了许多不同的网络接口,其中一些总结如下

环回

环回接口 (lo),通常配置为 IP 地址 127.0.0.1

以太网

以太网接口(名称如 eth0eth1eth2)用于访问以太网卡

PPP

PPP 代表点对点协议,用于在任何类型的串行线路(空调制解调器、调制解调器、ISDN)上运行各种网络协议,包括 IP。它们的名称如 ppp0ppp1

令牌环

令牌环设备使用设备名称如 tr0tr1 访问

虚拟

虚拟网络驱动程序用于具有并非总是使用的接口的系统,以便为相关地址提供永久 IP 接口。设备名称是 dummy,或 dummy0dummy1

还有各种各样的其他网络设备可用,包括 SLIP、PLIP(串行和并行线路 IP)、用于控制某些接口上的流量的“shaper”设备、在单个设备上拥有多个 IP 地址的能力,以及帧中继、AX.25、X.25、ARCnet、LocalTalk 等。但是,在这里,我们将专注于最常见的接口之一 - 以太网接口。

在许多情况下,如果您希望您的内核自动加载某些设备驱动程序的模块,您可能需要更改您的 /etc/conf.modules/etc/modules 文件。例如,要自动加载 NE2000 驱动程序,您可以有以下行

     alias eth0 ne

在您的 /etc/conf.modules 文件中。

调用 ifconfig 的最简单方法是简单地键入其名称

     # /sbin/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:18584 errors:0 dropped:0 overruns:0 frame:0
               TX packets:18584 errors:0 dropped:0 overruns:0 carrier:0
               Collisions:0

这只是返回有关当前配置的接口的信息。如果我们现在希望启动一个地址为 192.168.50.23 的以太网接口,我们将在 ifconfig 的命令行上指定接口名称和 IP 地址

     # /sbin/ifconfig eth0 192.168.50.23
     # /sbin/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:18584 errors:0 dropped:0 overruns:0 frame:0
               TX packets:18584 errors:0 dropped:0 overruns:0 carrier:0
               Collisions:0 
     
     eth0      Link encap:Ethernet  HWaddr 00:00:E8:C5:64:2A  
               inet addr:192.168.50.23   Bcast:192.168.50.255  Mask:255.255.255.0
               UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
               RX packets:55 errors:0 dropped:0 overruns:0 frame:0
               TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
               Collisions:7 
               Interrupt:10 Base address:0x300

从示例中可以看出,ifconfig 现在提供了有关新接口的信息,包括子网掩码、网络统计信息以及有关网络驱动程序本身的信息。ifconfig 还允许在配置接口时指定子网掩码,例如

     # /sbin/ifconfig eth0 192.168.50.23 netmask 255.255.255.192

最后,要关闭接口,请使用以下 ifconfig 调用

     # /sbin/ifconfig eth0 down

有关 ifconfig 可用选项的完整信息,请参阅手册页 - ifconfig(8)

如果您在安装 Debian GNU/Linux 时设置了机器上的 IP 寻址,您应该会发现 ifconfig 命令在启动时自动运行。这是从文件 /etc/init.d/network 完成的。查看此文件应该会显示许多类似于以下行的行

     IPADDR=192.168.50.23
     NETMASK=255.255.255.0
     BROADCAST=192.168.50.255
     ifconfig eth0 ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST}

这是以太网接口设置发生的地方。在这些行之上,您应该看到一行设置环回接口,并且您应该看到许多行似乎运行一个名为 route 的命令。这个程序及其功能是下一节的主题。


3.4 基本 IP 路由

一旦 IP 接口被设置好,就有必要告诉 Linux 内核将 IP 信息发送到 IP 网络上各种机器的位置。内核保存一个表,称为路由表,其中列出了许多主机或网络地址,以及有关如何将 IP 数据包发送到这些目的地的信息。

route 命令用于检查或更新此表。如果只配置了您的环回接口,则单独使用此命令通常会给出看起来类似于以下内容的输出

     # /sbin/route
     Kernel IP routing table
     Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
     127.0.0.0       *               255.0.0.0       U     0      0        2 lo

这表示任何针对标识为“127”的网络的流量都应该通过环回接口 (lo) 路由。“genmask”列以类似于子网掩码的方式指定,此特定路由表条目应该用于匹配任何以数字 127 开头的 IP 地址,无论其余部分是什么。

如果我们的机器连接到以太网网络,那么通常我们会希望确保内核路由表知道如何将信息发送到此网络。假设我们将我们的机器设置为 192.168.50.23,并使用默认的 C 类子网掩码,以下命令将为我们的本地网络添加路由表条目

     # /sbin/route add -net 192.168.50.0
     # /sbin/route
     Kernel IP routing table
     Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
     127.0.0.0       *               255.0.0.0       U     0      0        2 lo
     192.168.50.0    *               255.255.255.0   U     0      0      137 eth0

这告诉内核,任何以 192.168.50 开头的 IP 地址都在我们的本地以太网网络上,并且它们应该通过“eth0”接口路由。如果您使用非标准子网掩码,则可以将其指定为 route 命令的命令行选项

     /sbin/route add -net 192.158.50.0 netmask 255.255.255.192

如果我们的 TCP/IP 网络仅由单个网络组成,并且未连接到其他任何地方,则像上面这样的命令就足够了。然而,TCP/IP 的优势在于其互联网工作能力,并且通常基于 IP 的网络由多个网络组成。为了将 IP 数据包从您的机器路由到这些其他网络,您需要指定网关主机(通常称为路由器),它们负责将信息发送到这些其他网络。总的来说,有两种可能性。

第一种可能性是我们想要将 IP 数据包路由到特定网络,并且我们知道处理该网络信息的网关主机或路由器的地址。例如,假设我们的网络上有一台机器 192.168.50.1,它是网络 172.20.0.0(一个 B 类网络)的路由器。route 命令的以下选项指定了这一点

     # route add -net 172.20.0.0 gw 192.168.50.1

由于我们的路由表已经包含一个条目,告诉我们如何将信息发送到 192.168.50.1(它在我们的本地网络上),因此任何针对远程网络 172.20.0.0 的流量现在都会发送到该机器,该机器会适当地处理它。

另一种可能性是我们使用某个网关作为默认路由 - 用于所有与我们的路由表中的其他规则不匹配的 IP 数据包的路由。例如,如果 IP 地址为 192.168.50.254 的机器是我们的通往世界其他地方(例如互联网)的路由器,我们使用 route 命令如下

     # /sbin/route add default gw 192.168.23.254

在这个阶段,让我们再次看一下我们的路由表

     # /sbin/route
     Kernel IP routing table
     Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
     127.0.0.0       *               255.0.0.0       U     0      0        2 lo
     192.168.50.0    *               255.255.255.0   U     0      0      137 eth0
     172.20.0.0      192.168.50.1    255.255.0.0     UG    1      0        7 eth0
     default         192.168.50.254  0.0.0.0         UG    1      0       36 eth0

逐行浏览上面的表格

  1. 我们首先为所有 127.*.*.* 地址指定一个环回地址

  1. 接下来,我们指定如何到达我们本地网络上的所有机器,标识为 192.168.50.*

  1. 接下来,我们给出通往连接到机器 192.168.50.1 的网络 (172.20.*.*) 上所有机器的路由,192.168.50.1 是该网络的路由器(或网关)

  1. 最后,我们指定机器 192.168.50.254 将处理所有其他 IP 流量

现在,我们不会查看各种“flags”、“metric”和“ref”条目的含义。

让我们再次看看典型的 /etc/init.d/network 文件,它是在典型的以太网连接机器上由 Debian 的安装程序设置的

     #! /bin/sh
     ifconfig lo 127.0.0.1
     route add -net 127.0.0.0
     IPADDR=192.168.50.23
     NETMASK=255.255.255.0
     NETWORK=192.168.50.0
     BROADCAST=192.168.50.255
     GATEWAY=192.168.50.254
     ifconfig eth0 ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST}
     route add -net ${NETWORK}
     [ "${GATEWAY}" ] && route add default gw ${GATEWAY} metric 1

这个 shell 脚本的前两行设置环回接口,并为其添加一个路由表条目。随后的变量设置我们机器的 IP 地址、子网掩码、本地网络的地址、广播地址和默认路由器的 IP 地址。最后,我们的本地以太网接口通过 ifconfig 设置,并且两次调用 route 命令首先为本地网络添加路由表条目,其次为我们的默认网关添加路由表条目。

您很可能会发现来自 route 命令的输出中的地址(网络地址和机器地址)不是以 IP 地址形式出现,而是以名称形式出现。网络名称可以在 /etc/networks 文件中设置(该文件通常在安装时由 Debian 的网络设置例程设置),并且主机名称可以来自各种机器,包括 /etc/hosts 文件和域名服务 (DNS)。现在让我们看看 DNS 是什么以及它做什么。


3.5 域名服务 (DNS)

每台连接到互联网或任何使用 IP 作为其网络协议的网络的计算机都有一个 IP 地址,以便信息能够正确地路由到它和从它路由。然而,IP 地址对于人类来说有点难以记住,因此,每台机器通常也会被赋予一个名称。当您安装 Debian 时,这是您将被问到的问题之一 - 您的计算机的名称是什么。

您的计算机的名称将存储在几个位置。您可以通过键入 hostname 命令来查找您的计算机的名称,该命令返回文件 /etc/hostname 中的值。如果您连接到互联网,此名称通常会有几个部分,彼此之间用点分隔,例如

     debian.anon.com

只有其中的第一部分是您自己的计算机的名称 - 其余部分被称为域名 - 这是 anon.com 部分。由于互联网上可能有几台具有相同名称的计算机,因此每台计算机都通过将其放在自己的域中来使其唯一。在一个域内,通常有一个人负责给出计算机名称,并管理一个数据库,该数据库保存该域中所有计算机的名称和地址。此系统称为 DNS,就像电话簿一样 - 您可以按名称查找计算机,并找出其 IP 地址。

在 DNS 之前,人们必须记住 IP 地址才能使用互联网,并且名称仅对一小部分机器已知 - 通常是本地网络中的机器,以及可能一两台永久连接到我们站点的机器。这些名称存储在一个文件中 - /etc/hosts - 您通常会发现当安装 Debian 时,您自己的机器名称和 IP 地址已被添加到该文件中。

DNS 是一个相当复杂的系统,我们稍后将更详细地研究它,以及允许您管理自己的 DNS 域的软件 (bind)。

但是,在这里,我们将从客户端的角度 - 即,从只需要在 DNS 中查找机器而不是必须提供 DNS 服务的机器的角度 - 来看看 DNS 是如何工作的。

当 Debian 机器需要查找另一台计算机的名称以找出其 IP 地址时,它会使用 C 库中的一组例程,称为解析器。反过来,解析器例程首先查阅文件 /etc/nsswitch.conf,该文件针对 hosts 的条目将列出解析器应检查以找出 IP 地址的位置。这里有三个可能的条目,如果其中存在多个条目,则解析器将按顺序检查每个条目。这些条目是

文件

检查文件 /etc/hosts 中是否有特定主机名的条目

nis

检查 NIS 数据库(我们稍后将研究)中是否有主机名

dns

检查域名服务

/etc/nsswitch 中的典型条目可能是

     hosts:         files dns

这告诉解析器首先检查文件 /etc/hosts,然后查询 DNS。

DNS 由文件 /etc/resolv.conf 配置。此文件通常指定两件事 - 首先,我们的机器所在的域,其次,一些要询问信息的名称服务器。一个例子是

     domain anon.org
     nameserver 172.19.0.1
     nameserver 172.19.5.1

第一行告诉解析器库,如果我们请求一台机器并且没有指定域名,它应该附加 anon.org - 即解析器,假设机器在我们自己的域中,应该搜索它。以 nameserver 开头的两行指定我们应该使用 DNS 查询的机器的 IP 地址。由于显而易见的原因,这些应该始终是 IP 地址 - 而不是名称。

大多数网络实用程序会在您指定名称时自动查找机器的 IP 地址,但是如果您想直接查询 DNS,dnsutils 软件包包含一个名为 nslookup 的程序。nslookup 可以一次性使用,方法是给出您正在搜索的机器的名称,可能还带有命令行参数,也可以交互式使用,只需单独键入 nslookup 即可。交互式模式允许进行多次搜索,并提供一些有限的帮助。

nslookup,以及其他查询 DNS 的程序以及提供 DNS 服务的软件,都将在稍后更详细地描述。

有关 DNS 的更多信息,请参阅 DNS/BIND,第 8 章


3.6 ICMP 和 IP 故障排除


3.7 TCP 和 UDP


3.8 服务器、守护进程和超级服务器


[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 下一页 ]


Debian GNU/Linux 网络管理员手册 (过时文档)

本手册自 2000 年起已过时且已弃用,请参阅 http://www.debian.org/doc/user-manuals#quick-reference

Ardo van Rangelrooij ardo.van.rangelrooij@tip.nl
Oliver Elphick olly@lfix.co.uk
Ivan E. Moore II rkrusty@debian.org
Duncan C. Thomson duncan@sciuro.demon.co.uk