Microsoft Windows 的 TCP/IP 基础知识

第 2 章 – TCP/IP 协议套件体系结构概述

发布日期: 2005年01月27日

摘要

本章更加详细地研究了传输控制协议/Internet 协议 (TCP/IP) 协议套件,分析了它的四个层和各层内使用的核心协议。网络管理员必须理解各层内的核心协议及其功能,才会懂得网络应用程序如何工作,数据如何从一个应用程序发送到另一个应用程序,以及如何解释网络捕获。本章还讨论了 Microsoft® Windows® 操作系统的网络应用程序使用的两种主要应用程序编程接口 (API) 及 API 的命名方案。

本页内容
本章目标本章目标
TCP/IP 协议套件TCP/IP 协议套件
IPv4 Internet 层IPv4 Internet 层
IPv6 Internet 层IPv6 Internet 层
传输控制协议 (TCP)传输控制协议 (TCP)
用户数据报协议 (UDP)用户数据报协议 (UDP)
数据包多路复用和多路分解数据包多路复用和多路分解
应用程序编程接口应用程序编程接口
Windows 中的 TCP/IP 命名方案Windows 中的 TCP/IP 命名方案
本章小结本章小结
本章术语表本章术语表

本章目标

读完本章后,您将能够:

描述 TCP/IP 协议套件如何映射到国防部高级研究计划局 (DARPA) 模型和开放系统互连 (OSI) 模型。

列出 DARPA 模型的网络接口层、Internet 层、传输层和应用层内使用的主要协议。

描述 IPv4 Internet 层的核心协议的用途。

描述 IPv6 Internet 层的核心协议的用途。

描述 TCP 协议和用户数据报协议 (UDP) 的用途和特征。

讲解 IP 如何使用 IP 数据包中的信息将数据传送到目标节点的正确应用程序。

描述 Windows 套接字 API 和网络基本输入/输出系统 (NetBIOS) API 的用途和特征。

描述 Microsoft Windows Server™ 2003 和 Windows XP 操作系统中的 TCP/IP 组件使用的主机名称和 NetBIOS 命名方案的用途和特征。

TCP/IP 协议套件

TCP/IP 协议套件映射到一个称为 DARPA 模型的四层概念模型 — DARPA 模型是根据最初开发 TCP/IP 的美国政府机构的名称命名的。DARPA 模型的四个层是:应用层、传输层、Internet 层和网络接口层。DARPA 模型中的各个层分别对应于七层 OSI 模型中的一层或多层。

图 2-1 描绘了 TCP/IP 协议套件的体系结构。

图 2-1  TCP/IP 协议套件的体系结构

图 2-1  TCP/IP 协议套件的体系结构
查看大图

TCP/IP 协议套件在 Internet 层有两个协议集:

IPv4,又称 IP,它是当前在专用 Intranet 中和 Internet 中普遍使用的 Internet 层。

IPv6 是新的 Internet 层,它最终将取代现有的 IPv4 Internet 层。

网络接口层

网络接口层(又称网络访问层)向网络媒体发送 TCP/IP 数据包并从网络媒体接收 TCP/IP 数据包。TCP/IP 独立于网络访问方法、帧格式和媒体。因此,您可以使用 TCP/IP 来在采用 LAN 技术(例如以太网和 802.11 无线 LAN)和 WAN 技术(例如帧中继和异步传输模式 (ATM))的不同网络类型之间进行通信。通过让 TCP/IP 独立于任何特定的网络技术,可以使它能够适应新的技术。

DARPA 模型的网络接口层包括 OSI 模型的数据链路层和物理层。DARPA 模型的 Internet 层没有利用 OSI 模型的数据链路层中可以使用的排序服务和确认服务。Internet 层假定网络接口层不可靠,并假定传输层或应用层负责通过建立会话和进行数据包的排序及确认来确保可靠地进行通信。

Internet 层

Internet 层的职责包括寻址、打包和路由功能。Internet 层与 OSI 模型的网络层类似。

IPv4 Internet 层的核心协议包括以下几种:

地址解析协议 (ARP),它将 Internet 层地址解析为网络接口层地址(例如硬件地址)。

Internet 协议 (IP),它是一个可路由的协议,可以为数据包进行寻址、路由、分段和重组。

Internet 控制消息协议 (ICMP),它报告错误和其他信息以帮助您诊断不成功的数据包传送。

Internet 组管理协议 (IGMP),它管理 IP 多播组。

有关 IPv4 Internet 层的核心协议的详细信息,请参见本章下文中的“IPv4 Internet 层”。

IPv6 Internet 层的核心协议包括以下几种:

IPv6,它是一个可路由协议,为数据包进行寻址和路由。

Internet 控制消息协议 IPv6 版 (ICMPv6),它报告错误和其他信息以帮助您诊断不成功的数据包传送。

邻居发现 (ND) 协议,它管理相邻 IPv6 节点间的交互。

多播侦听器发现 (MLD) 协议,它管理 IPv6 多播组。

有关 IPv6 Internet 层的核心协议的详细信息,请参见本章下文中的“IPv6 Internet 层”。

传输层

传输层(又称主机到主机传输层)为应用层提供会话和数据报通信服务。传输层承担 OSI 传输层的职责。传输层的核心协议是 TCP 和 UDP。

TCP 提供一对一的、面向连接的可靠通信服务。TCP 建立连接,对发送的数据包进行排序和确认,并恢复在传输过程中丢失的数据包。

与 TCP 不同,UDP 提供一对一或一对多的、无连接的不可靠通信服务。如果要传输的数据量很少(例如单个数据包可以容纳的数据),应用程序开发人员不希望产生与 TCP 连接有关的开销,或者应用程序或上层协议提供了可靠的传送,则使用 UDP。

TCP 和 UDP 在 IPv4 和 IPv6 Internet 层上都能够运行。

注意:Windows 的 Internet 协议 (TCP/IP) 组件包含的 TCP 和 UDP 协议的版本不同于 Microsoft TCP/IP 版本 6 组件所包含的版本。Microsoft TCP/IP 版本 6 组件中的版本在功能上相当于 Microsoft Windows NT® 4.0 操作系统中提供的那些版本,并且包含了所有的最新安全更新。不同的协议组件分别使用各自的 TCP 和 UDP 版本的结构叫做双堆栈体系结构。这种理想的体系结构被称为双 IP 层;在该体系结构中,可以在 IPv4 和 IPv6 上运行相同版本的 TCP 和 UDP(如图 2-1 所示)。Microsoft 正考虑在将来的 Windows 操作系统更新中为 TCP/IP 协议组件使用双 IP 层体系结构。

应用层

应用层允许应用程序访问其他层的服务,它定义了应用程序用来交换数据的协议。应用层包含大量的协议,而且人们一直在开发新的协议。

人们最熟悉的那些应用层协议可以帮助用户交换信息:

超文本传输协议 (HTTP) 用于传输那些构成万维网上的页面的文件。

文件传输协议 (FTP) 用于传输独立的文件,通常用于交互式用户会话。

简单邮件传输协议 (SMTP) 用于传输邮件和附件。

此外,以下应用层协议可以帮助您使用和管理 TCP/IP 网络:

域名系统 (DNS) 协议将主机名称(例如 www.microsoft.com)解析为 IP 地址并在 DNS 服务器之间复制名称信息。

路由信息协议 (RIP) 是路由器用来在 IP 网络上交换路由信息的协议。

简单网络管理协议 (SNMP) 用于收集网络管理信息并在网络管理控制台和网络设备(例如路由器、网桥和服务器)之间交换网络管理信息。

Windows 套接字和 NetBIOS 就是两个用于 TCP/IP 应用程序的应用层接口的示例。有关详细信息,请参见本章下文中的“应用程序编程接口”。

IPv4 Internet 层

IPv4 Internet 层包含以下协议:

ARP

IP (IPv4)

ICMP

IGMP

下面几节将更详细地介绍每一种协议。

ARP

当 IP 通过共享访问、基于广播的网络技术(例如以太网或 802.11 无线 LAN)发送数据包时,协议必须能够解析与数据包要转发到的节点的 IPv4 地址(又称下一跃点 IPv4 地址)相对应的媒体访问控制 (MAC) 地址。正如 RFC 826 所定义的,ARP 使用 MAC 级广播将下一跃点 IPv4 地址解析为它们的相应 MAC 地址。

在转发数据包时,IPv4 基于目标 IPv4 地址和路由确定过程来决定下一跃点 IPv4 地址和接口。然后,IPv4 将 IPv4 数据包、下一跃点 IPv4 地址和下一跃点接口传递给 ARP。

如果数据包的下一跃点的 IPv4 地址与数据包目标的 IPv4 地址相同,则 ARP 执行到目标的直接传送。在直接传送中,ARP 必须将数据包目标的 IPv4 地址解析为它的 MAC 地址。

如果数据包的下一跃点的 IPv4 地址与数据包目标的 IPv4 地址不同,则 ARP 执行到路由器的间接传送。在间接传送中,ARP 必须将路由器的 IPv4 地址解析为它的 MAC 地址。

为将数据包的下一跃点的 IPv4 地址解析为它的 MAC 地址,ARP 使用共享访问网络技术(例如以太网或 802.11)上的广播工具来发送一个广播 ARP 请求帧。作为响应,发送方会收到一个 ARP 应答帧,其中包含与数据包的下一跃点的 IPv4 地址相对应的 MAC 地址。

ARP 缓存

为最大限度地减少广播 ARP 请求帧的数量,许多 TCP/IP 协议实现都包含一个 ARP 缓存,它是一个记录了最近解析过的 IPv4 地址及其相应的 MAC 地址的表。在发送 ARP 请求帧之前,ARP 将首先检查此缓存。每个接口都有其自己的 ARP 缓存。

ARP 缓存可具有以下特性(具体取决于供应商实现):

ARP 缓存条目可以是动态的(基于 ARP 应答),也可以是静态的。静态 ARP 缓存条目是永久性的,您可以使用 TCP/IP 工具(例如 Windows 附带的 Arp 工具)手动添加它们。静态 ARP 缓存条目禁止节点发送对常用的本地 IPv4 地址(例如路由器和服务器的 IPv4 地址)的 ARP 请求。使用静态 ARP 缓存条目的问题是,在网络适配器设备发生更改时您必须手动更新它们。

动态 ARP 缓存条目拥有与之相关的超时值,所以在超过指定的时间后,将从缓存中删除它们。例如,Windows 的动态 ARP 缓存条目不超过 10 分钟就会被删除。

要查看基于 Windows 的计算机上的 ARP 缓存,请在命令提示符下键入 arp -a。您还可以使用 Arp 工具来添加或删除静态 ARP 缓存条目。

ARP 过程

在发送主机发送初始数据包或路由器转发数据包时,IPv4 会将 IPv4 数据包、下一跃点 IPv4 地址和下一跃点接口发送给 ARP。无论是执行直接传送还是间接传送,ARP 都执行下面的过程:

1.

根据下一跃点 IPv4 地址和接口,ARP 会检查适当的 ARP 缓存以查找与下一跃点 IPv4 地址相匹配的条目。如果 ARP 找到了一个相应条目,则 ARP 会跳到步骤 6。

2.

如果 ARP 没有找到任何相应的条目,则 ARP 将构造一个 ARP 请求帧。此帧包含发出 ARP 请求的接口的 MAC 地址和 IPv4 地址以及 IPv4 数据包的下一跃点 IPv4 地址。然后,ARP 将从相应的接口广播此 ARP 请求帧。

3.

子网中的所有节点都会接收此广播帧并处理 ARP 请求。如果 ARP 请求中的下一跃点地址对应于分配给子网中的某个接口的 IPv4 地址,则该接收节点会使用 ARP 请求方的 IPv4 地址和 MAC 地址更新它自己的 ARP 缓存。所有其他节点都会悄悄地丢弃该 ARP 请求。

4.

被分配了 IPv4 数据包的下一跃点地址的接收节点会构造一个 ARP 应答,并会直接将该应答发送给 ARP 请求方;该应答包含被请求的 MAC 地址。

5.

ARP 请求方将在收到 ARP 应答后使用地址映射更新其 ARP 缓存。通过 ARP 请求和 ARP 应答的交换,ARP 请求方和 ARP 应答方都在其 ARP 缓存中拥有了对方的地址映射。

6.

ARP 请求方通过将 IPv4 数据包定址到解析的 MAC 地址来将其发送到下一跃点。

图 2-2 描绘了此过程。

图 2-2  ARP 地址解析过程

图 2-2  ARP 地址解析过程
查看大图

Internet 协议版本 4 (IPv4)

IPv4 是一个数据报协议,它主要负责在主机之间为数据包进行寻址和路由。IPv4 是无连接的,这意味着它在交换数据之前不建立连接;IPv4 也是不可靠的,这意味着它不能保证数据包的正确传送。IPv4 总是尽“最大努力”来尝试传送数据包。IPv4 数据包可能会丢失、错序发送、重复或延迟。IPv4 不会尝试从这些类型的错误进行恢复。更高层协议(例如 TCP 或某个应用协议)必须能够确认所传送的数据包并根据需要恢复丢失的数据包。IPv4 是在 RFC 791 中定义的。

IPv4 数据包由 IPv4 标头和 IPv4 有效负载组成。IPv4 有效负载又包含上层协议数据单元,例如 TCP 段或 UDP 消息。图 2-3 描绘了 IPv4 数据包的基本结构。

图 2-3  IPv4 数据包的基本结构

图 2-3  IPv4 数据包的基本结构
查看大图

表 2-1 列出了 IPv4 标头中的主要字段并作了说明。

IP 标头字段说明

源 IP 地址

IP 数据包的源的 IPv4 地址。

目标 IP 地址

IPv4 数据包的中间目标或最终目标的 IPv4 地址。

标识

一个标识符,用于标识某个特定的 IPv4 数据包中的所有段(如果进行了分段)。

协议

一个标识符,用于标识 IPv4 有效负载必须传送到的上层协议。

校验和

一种简单的数学计算,用于检查 IPv4 标头中的位级错误。

生存时间 (TTL)

在路由器丢弃数据报之前允许数据报通过的网段数。TTL 是由发送主机设置的;路由器在转发 IPv4 数据包时会使 TTL 递减 1。此字段用于防止数据包在 IPv4 网络中无休止地循环传播。

表 2-1  IPv4 标头中的主要字段

分段与重组

如果路由器接收的 IPv4 数据包对于数据包在其上转发的网段来说过大,路由器上的 IPv4 就会将原始数据包分割为适合在转发网段上传输的较小数据包。数据包到达其最终目标后,目标主机上的 IPv4 就会将这些段重组为原始的有效负载。这一过程叫做分段与重组。在混合使用多种网络技术(例如以太网或令牌环)的环境中可能会发生分段。

分段与重组的具体过程如下:

1.

在 IPv4 数据包发送之前,源会在“标识”字段中放置一个唯一值。

2.

发送主机和目标之间的路径中的某个路由器接收到 IPv4 数据包并发现数据包大于它要转发到的网络的最大传输单位 (MTU)。

3.

IPv4 将原始 IPv4 有效负载分割为适合下一个网络的段。每个段接收它自己的 IPv4 标头,这包括:

原始“标识”字段,它用于标识属于一个整体的所有段。

“更多段”标志,它表示后面还有其他段。最后一段上没有设置“更多段”标志,因为它后面没有其他段。

“段偏移量”字段,它表示该段相对于原始 IPv4 有效负载的位置。

远程主机接收到这些段后,它会使用“标识”字段来识别属于一个整体的段,并使用“段偏移量”字段来按照段的正确顺序重组这些段,以重新创建原始 IPv4 有效负载。

Internet 控制消息协议 (ICMP)

ICMP(RFC 792 中对其进行了定义)报告无法传送的数据包的错误并帮助对这些错误进行疑难解答。例如,如果 IPv4 不能将数据包传送到目标主机,则路由器上的或目标主机上的 ICMP 会向发送主机发送一条“无法到达目标”消息。表 2-2 列出了最常见的 ICMP 消息并作了说明。

ICMP 消息说明

回显

Ping 工具通过发送 ICMP 回显消息检查到特定节点的 IPv4 连接来排查网络问题。

回显答复

节点发送回显答复消息响应 ICMP 回显消息。

重定向

路由器发送“重定向”消息,告诉发送主机到目标 IPv4 地址的更好路由。

源结束

路由器发送“源结束”消息,告诉发送主机它们的 IPv4 数据包将被丢弃 — 因为路由器上发生了拥塞。于是,发送主机将以较低的频度发送数据包。

无法到达目标

路由器和目标主机发送“无法到达目标”消息,通知发送主机它们的数据包无法传送。

表 2-2  常见的 ICMP 消息

ICMP 包含一系列已定义的“无法到达目标”消息。表 2-3 列出了这些最常见的消息并作了说明。

无法到达目标消息说明

不能访问主机

路由器找不到到目标 IPv4 地址的路由时发送“不能访问主机”消息。

无法访问协议

目标 IPv4 节点无法将 IPv4 标头中的“协议”字段与当前使用的 IPv4 客户端协议相匹配时会发送“无法访问协议”消息。

无法访问端口

IPv4 节点在无法将 UDP 标头中的“目标端口”字段与使用该 UDP 端口的应用程序相匹配时发送“无法访问端口”消息。

需要分段但设置了 DF

当必须分段但发送节点在 IPv4 标头中设置了“不分段”(DF) 标志时,IPv4 路由器会发送“需要分段但设置了 DF”消息。

表 2-3  常见的 ICMP 无法到达目标消息

ICMP 没有使 IPv4 成为一个可靠的协议。ICMP 试图报告错误并对特定的情况提供反馈。ICMP 消息是以未确认的 IPv4 数据包传送的,它们自己也不可靠。

Internet 组管理协议 (IGMP)

路由器和主机使用 IGMP 管理子网上的 IPv4 多播组中的成员身份。IPv4 多播组(又称主机组)是一组主机,它们侦听发往特定的 IPv4 多播地址的 IPv4 通信量。给定子网上的 IPv4 多播通信量发往一个 MAC 地址,但是会有多台 IPv4 主机接收并处理该通信量。主机组成员侦听特定的 IPv4 多播地址并接收发送到该 IPv4 地址的所有数据包。

要让一台主机接收 IPv4 多播,应用程序必须告诉 IPv4 该主机将接收指定 IPv4 多播地址处的多播。然后,IPv4 将向本地连接的子网上的路由器发出通知,让它们接收向指定 IPv4 多播地址发送的多播。IGMP 是用于注册主机组成员身份信息的协议。

IGMP 消息采用以下形式:

主机组成员使用“IGMP 主机成员身份报告”消息来声明它们在某个特定主机组中的成员身份。

路由器使用“IGMP 主机成员身份查询”消息来轮询所有子网以获取主机组成员的信息。

当主机组成员离开子网上它们可能是其最后一个成员的组时,它们将使用“IGMP 离开组”消息。

为使 IPv4 多播跨越 IPv4 网络上的多个路由器进行传播,路由器使用多播路由协议来传达主机组信息。然后,每个支持多播转发的路由器可以确定如何转发 IPv4 多播通信量。

Windows Server 2003 和 Windows XP 支持 IGMP、IGMPv2 和 IGMPv3,RFC 1112、RFC 2236 和 RFC 3376 分别对这三种协议进行了定义。

IPv6 Internet 层

IPv6 最终将取代 DARPA 模型中的 IPv4 Internet 层协议。IPv6 将按以下方式进行取代:

IPv6 取代 IPv4  IPv6 是一个可路由的协议,它可为数据包进行寻址、路由、分段和重组。

ICMPv6 取代 ICMP  ICMPv6 提供诊断功能,并可在 IPv6 数据包无法传送时报告错误。

MLD 取代 IGMP  MLD 管理 IPv6 多播组成员身份。

ND 取代 ARP  ND 管理相邻节点间的交互,包括自动配置地址和将下一跃点 IPv6 地址解析为 MAC 地址。

除非地址是协议所维护的有效负载或数据结构的一部分,否则软件开发人员无须更改传输层和应用层的协议就可以支持在 IPv6 Internet 层之上的操作。例如,软件开发人员必须更新 TCP 和 UDP 才能执行新的校验和计算,而且必须更新 RIP 才能发送和接收基于 IPv6 的路由信息。

IPv6 Internet 层包括以下协议:

IPv6

ICMPv6

ND

MLD

下面几节将详细介绍这些协议。

IPv6

像 IPv4 一样,IPv6 也是一个无连接的、不可靠的数据报协议,主要负责在主机之间为数据包进行寻址和路由。

RFC 2460 定义了 IPv6 数据包结构。IPv6 数据包由 IPv6 标头和 IPv6 有效负载组成。IPv6 有效负载包括零个或多个 IPv6 扩展标头和一个上层协议数据单元(例如 ICMPv6 消息、TCP 段或 UDP 消息)。图 2-4 描绘了 IPv6 数据包的基本结构。

图 2-4  IPv6 数据包的基本结构

图 2-4  IPv6 数据包的基本结构
查看大图

表 2-4 列出了 IPv6 标头中的主要字段并作了说明。

IPv6 标头字段说明

源地址

一个 128 位的 IPv6 地址,标识 IPv6 数据包的原始源。

目标地址

一个 128 位的 IPv6 地址,标识 IPv6 数据包的中间目标或最终目标。

下一标头

一个标识符,标识紧跟在 IPv6 标头后的 IPv6 扩展标头或标识一个上层协议,例如 ICMPv6、TCP 或 UDP。

跃点限制

数据包被路由器丢弃之前允许其通过的链路数。跃点限制由发送主机设置,路由器在转发 IPv6 数据包时会将跃点限制递减 1。此字段用于防止数据包在 IPv6 网络中无休止地循环传播。

表 2-4  IPv6 标头中的主要字段

IPv6 扩展标头

IPv6 有效负载可以包含零个或多个扩展标头,扩展标头的长度可以改变。IPv6 标头中的“下一标头”字段表示下一个扩展标头。每个扩展标头都包含另外一个“下一标头”字段,表示下一个扩展标头。最后一个扩展标头表示上层协议数据单元中包含的上层协议(如果有),例如 TCP、UDP 或 ICMPv6。

IPv6 标头和扩展标头将取代现有的 IPv4 标头及其包括选项的能力。扩展标头的新格式允许对 IPv6 进行扩充以满足将来的需要和支持将来的功能。与 IPv4 标头中的选项不同,IPv6 扩展标头没有最大大小,因而可以扩展以容纳 IPv6 通信所需的所有扩展数据。

RFC 2460 定义了所有 IPv6 节点都必须支持的以下 IPv6 扩展标头:

逐跃点选项标头

目标选项标头

路由标头

段标头

身份验证标头

封装安全性有效负载标头

典型的 IPv6 数据包不包含扩展标头。只有中间路由器或目标需要以某种特别方式处理数据包时,发送主机才添加一个或多个扩展标头。

IPv6 中的分段

在 IPv4 中,如果路由器接收的 IPv4 数据包对于数据包转发到的网段来说过大,但允许对数据包进行分段,则路由器上的 IPv4 会把原始数据包分割为适合在转发网段上传输的较小数据包。在 IPv6 中,只有发送主机能够对数据包进行分段。如果 IPv6 数据包太大,IPv6 路由器会向发送主机发送一条“ICMPv6 数据包太大”消息并丢弃该数据包。

通过使用“段”扩展标头,发送主机可以对数据包进行分段,而目标主机可以对数据包进行重组。

Internet 控制消息协议 IPv6 版 (ICMPv6)

同 IPv4 一样,IPv6 也不报告错误。不过,IPv6 使用的是 ICMP for IPv4 的更新版本。这一新版本叫做 ICMPv6,它执行常见的 ICMP for IPv4 功能 — 报告传送或转发中的错误并为疑难解答提供简单的回显服务。ICMPv6 协议还为 ND 和 MLD 消息提供消息结构。

表 2-5 列出了 RFC 2463 中定义的 ICMPv6 消息并作了说明。

ICMPv6 消息说明

请求回显

发送主机发送请求回显消息来检查与特定节点的 IPv6 连接。

回显答复

节点发送回显答复消息响应 ICMPv6 请求回显消息。

无法到达目标

路由器或目标主机发送“无法到达目标”消息,通知发送主机它们的数据包或有效负载无法传送。

数据包太大

路由器发送“数据包太大”消息,通知发送主机数据包因太大而无法转发。

超时

路由器发送“超时”消息,通知发送主机 IPv6 数据包的跃点限制已到期。

参数问题

路由器在处理 IPv6 标头或 IPv6 扩展标头时,如果遇到错误,便发送“参数问题”消息来通知发送主机。

表 2-5  常见的 ICMPv6 消息

ICMPv6 包含一系列已定义的“无法到达目标”消息。表 2-6 列出了这些最常见的消息并作了说明。

无法到达目标消息说明

找不到路由

路由器在其本地 IPv6 路由表中找不到指向目标 IPv6 地址的路由时便发送此消息。

管理策略禁止通信

当路由器上配置的某条策略禁止与目标进行通信时,路由器便发送此消息。例如,当防火墙丢弃数据包时,路由器便发送此类消息。

无法到达目标地址

IPv6 路由器无法解析目标的 MAC 地址时便发送此消息。

目标端口无法访问

当发往目标 UDP 端口的、包含 UDP 消息的 IPv6 数据包与正在侦听的应用程序不对应时,目标主机便发送此消息。

表 2-6  常见的 ICMPv6 无法到达目标消息

ICMPv6 没有使 IPv6 成为一个可靠的协议。ICMPv6 会尝试报告错误并会在特定的情况下提供反馈。ICMPv6 消息是以未确认的 IPv6 数据包传送的,它们自己也不可靠。

邻居发现 (ND)

ND 是一组 ICMPv6 消息和过程,用于确定相邻节点间的关系。ND 取代了 IPv4 中使用的 ARP、ICMP 路由器发现和 ICMP 重定向,提供了更丰富的功能。

主机可以使用 ND 完成以下任务:

发现相邻的路由器。

发现并自动配置地址和其他配置参数。

路由器可以使用 ND 完成以下任务:

公布它们的存在、主机地址和其他配置参数。

向主机提示更好的下一跃点地址来帮助数据包转发到特定目标。

节点(包括主机和路由器)可以使用 ND 完成以下任务:

解析 IPv6 数据包将被转发到的一个相邻节点的链路层地址(又称 MAC 地址)。

动态公布 MAC 地址的更改。

确定某个相邻节点是否仍然可以到达。

表 2-7 列出了 RFC 2461 中描述的 ND 过程并作了说明。

邻居发现过程说明

路由器发现

主机通过该过程来发现它的相邻路由器。有关详细信息,请参见本章下文中的“路由器发现”。

前缀发现

主机通过该过程来发现本地子网目标的网络前缀。有关 IPv6 网络前缀的详细信息,请参见第 3 章“IP 编址”。

地址自动配置

无论是否存在地址配置服务器(例如运行动态主机配置协议版本 6 (DHCPv6) 的服务器),该过程都可以为接口配置 IPv6 地址。有关详细信息,请参见本章下文中的“地址自动配置”。

地址解析

节点通过该过程将邻居的 IPv6 地址解析为它的 MAC 地址。IPv6 中的地址解析相当于 IPv4 中的 ARP。有关详细信息,请参见本章中的“地址解析”。

下一跃点确定

节点根据目标地址通过该过程来确定数据包要转发到的下一跃点 IPv6 地址。下一跃点地址可能是目标地址,也可能是某个相邻路由器的地址。

邻居不可访问性检测

节点通过该过程确定邻居的 IPv6 层是否能够发送或接收数据包。

重复地址检测

节点通过该过程确定它打算使用的某个地址是否已被相邻节点占用。

重定向功能

该过程提示主机更好的第一跃点 IPv6 地址来帮助数据包向目标传送。

表 2-7  IPv6 邻居发现过程

地址解析

IPv6 地址解析包括交换“邻居请求”和“邻居公布”消息,从而将下一跃点 IPv6 地址解析为其对应的 MAC 地址。发送主机在适当的接口上发送一条多播“邻居请求”消息。“邻居请求”消息包括发送节点的 MAC 地址。

当目标节点接收到“邻居请求”消息后,将使用“邻居请求”消息中包含的源地址和 MAC 地址的条目更新其邻居缓存(相当于 ARP 缓存)。接着,目标节点向“邻居请求”消息的发送方发送一条包含它的 MAC 地址的单播“邻居公布”消息。

接收到来自目标的“邻居公布”后,发送主机根据其中包含的 MAC 地址使用目标节点条目来更新它的邻居缓存。此时,发送主机和邻居请求的目标就可以发送单播 IPv6 通信量了。

路由器发现

主机通过路由器发现过程尝试发现本地子网上的路由器集合。除了配置默认路由器之外,IPv6 路由器发现还配置以下设置:

IPv6 标头中的“跃点限制”字段的默认设置。

用于确定节点是否应当为地址和其他配置参数使用地址配置协议(例如,动态主机配置协议 IPv6 版 (DHCPv6))的设置。

为链路定义的网络前缀列表。每个网络前缀都包含 IPv6 网络前缀及其有效的和首选的生存时间。如果指示了网络前缀,主机便使用该网络前缀来创建 IPv6 地址配置而不使用地址配置协议。网络前缀还定义了本地链路上的节点的地址范围。

IPv6 路由器发现过程如下:

IPv6 路由器定期在子网上发送多播“路由器公布”消息,以公布它们的路由器身份信息和其他配置参数(例如地址前缀和默认跃点限制)。

本地子网上的 IPv6 主机接收“路由器公布”消息,并使用其内容来配置地址、默认路由器和其他配置参数。

一个正在启动的主机发送多播“路由器请求”消息。收到“路由器请求”消息后,本地子网上的所有路由器都向发送路由器请求的主机发送一条单播“路由器公布”消息。该主机接收“路由器公布”消息并使用其内容来配置地址、默认路由器和其他配置参数。

地址自动配置

IPv6 的一个非常有用的特点是,它无须使用地址配置协议(例如动态主机配置协议 IPv6 版 (DHCPv6))就能够自动进行自我配置。默认情况下,IPv6 主机能够为每个接口配置一个在子网上使用的地址。通过使用路由器发现,主机还可以确定路由器的地址、其他地址和其他配置参数。“路由器公布”消息指示是否使用地址配置协议。RFC 2462 中对 IPv6 地址自动配置进行了定义。

多播侦听器发现 (MLD)

MLD 是 IGMP 版本 2(用于 IPv4)的 IPv6 版本。MLD 是由路由器和节点交换的一组 ICMPv6 消息,供路由器用来为各个连接的接口发现有侦听节点的 IPv6 多播地址的集合。同 IGMPv2 一样,MLD 只能发现那些至少包含一个侦听器的多播地址,而不能发现各个多播地址的单个多播侦听器的列表。RFC 2710 中对 MLD 进行了定义。

与 IGMPv2 不同,MLD 使用 ICMPv6 消息而不是定义它自己的消息结构。MLD 消息有三种类型:

多播侦听器查询  路由器使用“多播侦听器查询”消息来查询子网上是否有多播侦听器。

多播侦听器报告   多播侦听器使用“多播侦听器报告”消息来报告它们有兴趣接收发往特定多播地址的多播通信量,或者使用这类消息来响应“多播侦听器查询”消息。

多播侦听器完成  多播侦听器使用“多播侦听器完成”消息来报告它们可能是子网上最后的多播组成员。

传输控制协议 (TCP)

TCP 是一种可靠的、面向连接的传送服务。面向连接意味着主机必须首先建立连接才能进行数据交换。可靠性是通过为传输的每个段分配一个序列号获得的。TCP 对等方(两个节点)在接收数据时使用 TCP 进行通信和确认。TCP 段又称段,它是由 TCP 标头和 TCP 有效负载构成的协议数据单元 (PDU)。对于发送的每个包含数据的 TCP 段,接收主机必须返回确认 (ACK)。如果在计算出的时间内未收到 ACK,发送主机就会重新传输此 TCP 段。RFC 793 中对 TCP 进行了定义。

表 2-8 列出了 TCP 标头中的主要字段并作了说明。

字段说明

源端口

发送应用程序的 TCP 端口。

目标端口

目标应用程序的 TCP 端口。

序列号

TCP 段中的数据的第一个字节的序列号。

确认号

发送方预期从其 TCP 对等方收到的下一个字节的序列号。

窗口

发送此 TCP 段的主机上用来存储传入段的内存缓冲区的当前大小。

校验和

一种简单的数学运算,用于检查 TCP 段中的位级错误。

表 2-8  TCP 标头中的主要字段

TCP 端口

要使用 TCP,应用程序必须提供源和目标应用程序的 IP 地址和 TCP 端口号。端口提供了一个用于发送段的位置。每个端口由一个唯一的编号来标识。尽管某些 TCP 端口和 UDP 端口使用相同的编号,但这两种端口是截然不同且相互独立的。1024 以下的端口号是人们熟悉的端口,由 Internet 编号分配机构 (IANA) 分配。表 2-9 列出了人们熟悉的一些 TCP 端口。

TCP 端口号说明

20

FTP(数据通道)

21

FTP(控制通道)

23

远程登录协议

80

用于万维网的 HTTP

139

NetBIOS 会话服务

表 2-9  人们熟悉的 TCP 端口

有关已分配的 TCP 端口的完整列表,请参见 http://www.iana.org/assignments/port-numbers

TCP 三向握手

TCP 连接是通过三向握手进行初始化的。三向握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:

1.

客户端向服务器发送一个 TCP 段,其中包含连接的初始序列号和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。

2.

服务器发送回一个 TCP 段,其中包含它选择的初始序列号、对客户端的序列号的确认和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。

3.

客户端向服务器发送一个 TCP 段,其中包含对服务器的序列号的确认。

TCP 使用类似的握手过程来结束连接。这可确保两个主机均能完成传输并确保所有的数据均得以接收。

用户数据报协议 (UDP)

UDP 提供无连接的数据报服务,该服务对消息中传输的数据提供不可靠的、最大努力传送。这意味着它不保证数据报的到达,也不保证所传送数据包的顺序是否正确。UDP 不重新传输丢失的数据。UDP 消息又称消息,由 UDP 标头和 UDP 有效负载构成。RFC 768 中对 UDP 进行了定义。

如果应用程序不要求确认数据的接收,则它们使用 UDP,且通常每次只传输少量数据。NetBIOS 名称服务、NetBIOS 数据报服务和 SNMP 是使用 UDP 的服务和应用程序的实例。

表 2-10 列出了 UDP 标头中的主要字段并作了说明。

字段说明

源端口

发送应用程序的 UDP 端口。

目标端口

目标应用程序的 UDP 端口。

校验和

一种简单的数学运算,用于检查 UDP 消息中的位级错误。

表 2-10  UDP 标头中的主要字段

UDP 端口

要使用 UDP,应用程序必须提供源和目标应用程序的 IP 地址和 UDP 端口号。端口提供了用于发送消息的位置。每个端口由一个唯一的编号来标识。尽管某些 UDP 端口和 TCP 端口使用相同的编号,但这两种端口是截然不同且相互独立的。与 TCP 端口一样,1024 以下的 UDP 端口号是人们熟悉的、由 IANA 分配的端口。表 2-11 列出了一些人们熟悉的 UDP 端口。

UDP 端口号说明

53

域名系统 (DNS) 名称查询

69

次要文件传输协议 (TFTP)

137

NetBIOS 名称服务

138

NetBIOS 数据报服务

161

SNMP

表 2-11  人们熟悉的 UDP 端口

有关已分配的 UDP 端口的完整列表,请参见 http://www.iana.org/assignments/port-numbers

数据包多路复用和多路分解

发送主机发送 IPv4 或 IPv6 数据包时,它在数据包中包含了一些相应的信息,能够使数据包内的数据传送给目标处的正确应用程序。这种包含标识符以便数据能够传送到分层体系结构各层中的多个实体之一的功能,叫做多路复用。IP 数据包的多路复用信息包括标识网络上的节点和 IP 上层协议;对于 TCP 和 UDP,还包括标识与数据发往的应用程序相对应的端口。目标主机使用这些标识符来将数据多路分解到或逐层传送到正确的目标应用程序。IP 数据包还包含了目标主机用于发送响应的信息。

IP 包含多路复用信息,用于完成以下操作:

标识发送节点(IPv4 标头中的“源 IP 地址”字段或 IPv6 标头中的“源地址”字段)。

标识目标节点(IPv4 标头中的“目标 IP 地址”字段或 IPv6 标头中的“目标地址”字段)。

标识 IPv4 或 IPv6 Internet 层的上层协议(IPv4 标头中的“协议”字段或 IPv6 标头中的“下一标头”字段)。

对于 TCP 段和 UDP 消息,标识消息的来源应用程序(TCP 或 UDP 标头中的“源端口”)。

对于 TCP 段和 UDP 消息,标识消息的目标应用程序(TCP 或 UDP 标头中的“目标端口”)。

TCP 和 UDP 端口可以使用 0 到 65,535 之间的任意数字。客户端应用程序的端口号通常是在发生服务请求时动态分配的;IANA 为人们熟悉的服务器端应用程序预分配了端口号。http://www.iana.org/assignments/port-numbers 上列出了预分配的端口号的完整列表。

所有这些信息都用于提供多路复用信息,因此:

数据包能够转发到正确的目标。

目标可以使用数据包有效负载将数据传送到正确的应用程序。

接收应用程序能够发送响应。

发送数据包后,将按照以下方式使用这些信息:

转发 IPv4 或 IPv6 数据包的路由器使用 IPv4 标头中的“目标 IP 地址”字段或 IPv6 标头中的“目标地址”字段将数据包传送到网络上的正确节点。

目标节点使用 IPv4 标头中的“协议”字段或 IPv6 标头中的“下一标头”字段将数据包有效负载传送到正确的上层协议。

对于 TCP 段和 UDP 消息,目标节点使用 TCP 或 UDP 标头中的“目标端口”字段将 TCP 段或 UDP 消息中的数据多路分解到正确的应用程序。

图 2-5 显示了一个目标 IP 地址为 131.107.89.223 的 IPv4 数据包内的 DNS 名称查询请求消息的示例,该数据包将被多路分解到 DNS 服务。

图 2-5  IPv4 数据包多路分解示例

图 2-5  IPv4 数据包多路分解示例
查看大图

应用程序编程接口

Windows 网络应用程序使用两种主要应用程序编程接口 (API) 来访问 Windows 中的 TCP/IP 服务:Windows 套接字和 NetBIOS。图 2-6 显示了这些 API 和使用它们时可能产生的数据流。

图 2-6  Windows 套接字 API 和 NetBIOS API 的体系结构

图 2-6  Windows 套接字 API 和 NetBIOS API 的体系结构
查看大图

下面是 Windows 套接字 API 和 NetBIOS API 之间存在的一些体系结构差异:

NetBIOS over TCP/IP (NetBT) 按照定义适合在 IPv4 上运行。Windows 套接字在 IPv4 和 IPv6 上都可以运行。

Windows 套接字应用程序无须使用 TCP 或 UDP 就可直接在 IPv4 或 IPv6 Internet 层上运行。NetBIOS 只能在 TCP 和 UDP 上运行。

Windows 套接字

Windows 套接字是常用的、用于 Windows 中的网络应用程序的新式 API。Windows 附带的 TCP/IP 服务和工具都属于 Windows 套接字应用程序。Windows 套接字提供的服务允许应用程序使用特定的 IP 地址和端口,发起和接受到特定目标 IP 地址和端口的连接,发送和接收数据,以及关闭连接。

有三种类型的套接字:

流套接字,它使用 TCP 提供双向的、可靠的、序列化且无重复的数据流。

数据报套接字,它使用 UDP 提供双向数据流。

原始套接字,它允许协议直接访问 IP,而无须使用 TCP 或 UDP。

套接字充当网络通信的终结点。应用程序可通过指定以下三项来创建一个流套接字或数据报套接字:主机的 IP 地址、服务类型(TCP 用于基于连接的服务,UDP 用于无连接的服务)和应用程序使用的端口。两个套接字(分别用于连接的一端)构成了一条双向通信路径。对于原始套接字,应用程序必须指定整个 IP 有效负载。

NetBIOS

NetBIOS 是较旧的 API,它向 NetBIOS 应用程序提供名称管理、数据报和会话服务。使用 NetBIOS 接口 API 进行网络通信的应用程序可以在支持 NetBIOS 接口的任意协议实现上运行。“文件和打印机共享”与 Computer Browser 服务就属于使用 NetBIOS 的 Windows 应用程序和服务。

NetBIOS 还定义了一个在 OSI 会话层运行的协议。该层是由基础协议来实施的,例如 NetBIOS over TCP/IP (NetBT)(RFC 1001 和 1002 中对该协议进行了定义)。NetBIOS 名称服务使用 UDP 端口 137。NetBIOS 数据报服务使用 UDP 端口 138。NetBIOS 会话服务使用 TCP 端口 139。

Windows 中的 TCP/IP 命名方案

尽管 IP 就是用来操作发送主机和目标主机的 32 位 (IPv4) 和 128 位 (IPv6) 地址的,但是计算机用户更擅长使用和记忆名称而非 IP 地址。如果将名称用作 IP 地址的别名,则必须有某些机制能够将名称分配给 IP 地址,能够确保它们的唯一性,并能够将名称解析为其 IP 地址。

Windows 的 TCP/IP 组件对主机名称(用于 Windows 套接字应用程序)与 NetBIOS 名称(用于 NetBIOS 应用程序)的分配及解析分别使用不同的机制。

主机名称

主机名称是分配给 IP 节点的别名,它将 IP 节点标识为 TCP/IP 主机。主机名称的最大长度是 255 字符,可以包含字母和数字字符及“-”和“.”字符。可以为同一主机分配多个主机名称。

Windows 套接字应用程序(例如 Internet Explorer 和 Ping 工具)可以使用下面的两种值之一来引用目标:IP 地址或主机名称。当用户指定 IP 地址时,不需要进行名称解析。当用户指定主机名称时,主机名称必须解析为 IP 地址,然后才能开始与目标资源进行基于 IP 的通信。

主机名称可以采用各种不同的形式。最常用的两种形式是昵称和完全限定的域名 (FQDN)。昵称就是个人可以分配和使用的 IP 地址别名。FQDN 是一个结构化的名称(例如 www.microsoft.com),它遵循 DNS 中使用的 Internet 规范。

NetBIOS 名称

NetBIOS 名称是一个 16 字节的名称,用于标识网络上的 NetBIOS 应用程序。NetBIOS 名称可以是一个唯一(排他的)名称,也可以是一个组(非排他)名称。当某个 NetBIOS 应用程序与特定计算机上的特定 NetBIOS 应用程序进行通信时,将使用唯一名称。当某个 NetBIOS 进程与多台计算机上的多个 NetBIOS 应用程序进行通信时,将使用组名称。

NetBIOS 名称标识 OSI 模型的会话层的应用程序。例如,NetBIOS 会话服务在 TCP 端口 139 上运行。因为所有的 NetBT 会话请求都定址到 TCP 目标端口 139,所以 NetBIOS 应用程序在建立 NetBIOS 会话时必须使用 NetBIOS 名称。

基于 Windows 的计算机上的“文件和打印共享服务器”服务就是一个使用 NetBIOS 名称的进程。当您的计算机启动时,该服务器服务根据您的计算机名称注册一个唯一的 NetBIOS 名称。该服务器服务使用的确切名称是包含 15 个字符的计算机名称再加上第 16 个字符 0x20。如果计算机名称不足 15 个字符,便使用空格将其扩充到 15 个字符的长度。其他网络服务也使用计算机名称来构造其 NetBIOS 名称,第 16 个字符通常用于标识各种服务。

当您试图通过指定计算机名称来建立到运行 Windows Server 2003 或 Windows XP 的计算机的文件共享连接时,您指定的文件服务器上的 Server 服务对应于一个特定的 NetBIOS 名称。例如,当您试图连接到名为 CORPSERVER 的计算机上时,对应于 Server 服务的 NetBIOS 名称是“CORPSERVER     <20>”。(注意使用空格字符的填充。)必须先创建 TCP 连接,然后才能建立文件和打印共享连接。要创建 TCP 连接,必须将 NetBIOS 名称“CORPSERVER     <20>”解析为 IPv4 地址。NetBIOS 名称解析是一个将 NetBIOS 名称映射到 IPv4 地址的过程。

本章小结

本章主要包括以下内容:

TCP/IP 协议套件映射到 DARPA 模型的四个层:应用层、传输层、Internet 层和网络接口层。

IPv4 Internet 层的协议包括 ARP、IP (IPv4)、ICMP 和 IGMP。

IPv6 Internet 层的协议包括 IPv6、ICMPv6、ND 和 MLD。

传输层的协议包括 TCP 和 UDP。TCP 是一种可靠的、面向连接的传送服务。UDP 提供无连接的数据报服务,该服务对消息中传输的数据提供不可靠的、最大努力传送。

应用程序间的 IP 数据包多路复用和多路分解是根据 IPv4、IPv6、TCP 和 UDP 标头中的字段进行的。

Windows 中的 TCP/IP 组件支持两种用于网络应用程序的主要 API:Windows 套接字和 NetBIOS。Windows 套接字是一种新式 API,它允许应用程序管理流套接字、数据报套接字和原始套接字。NetBIOS 是一种较旧的 API,它允许应用程序管理 NetBIOS 名称、数据报和会话。

Windows 中的 TCP/IP 组件支持两种网络应用程序命名方案:主机名称(用于 Windows 套接字应用程序)和 NetBIOS 名称(用于 NetBIOS 应用程序)。

本章术语表

地址自动配置 – 自动在接口上配置 IPv6 地址的 IPv6 ND 过程。

地址解析 – 为下一跃点 IP 地址解析 MAC 地址的 IPv4(使用 ARP)或 IPv6(使用 ND)过程。

地址解析协议 (ARP) – 使用本地网络上的广播通信量将 IPv4 地址解析为其 MAC 地址的一种协议。

ARP – 参见“地址解析协议”。

ARP 缓存 – 各个接口的表,表中包含静态的或动态解析的 IPv4 地址及其对应的 MAC 地址。

ICMP – 参见“Internet 控制消息协议”。

ICMPv6 – Internet 控制消息协议 IPv6 版。

IGMP – 参见“Internet 组管理协议”。

Internet 控制消息协议 (ICMP) – IPv4 Internet 层中的用于报告错误和提供疑难解答工具的一种协议。

Internet 控制消息协议 IPv6 版 (ICMPv6)  – IPv6 Internet 层中的一种协议,用于报告错误和提供疑难解答工具及主机 ND 与 MLD 消息。

Internet 组管理协议 (IGMP) – IPv4 Internet 层中的一种协议,用于管理子网上的多播组成员身份。

Internet 协议 (IP) – 用于 IPv4,是 IPv4 Internet 层中的一种可路由协议,可为 IPv4 数据包进行寻址、路由、分段和重组。还用于表示 IPv4 和 IPv6 协议集。

IP – 参见“Internet 协议”。

IPv4 – 在 Internet 和专用 Intranet 上广泛使用的 Internet 层。IP 的另一种叫法。

IPv6 – 新版本 Internet 层,它最终将取代 IPv4 Internet 层。

MLD – 参见“多播侦听器发现”。

多播侦听器发现 (MLD) – 由三个 ICMPv6 消息构成的集合,供主机和路由器用来管理子网上的多播组成员身份。

名称解析 – 将名称解析为地址的过程。

ND – 参见“邻居发现”。

邻居缓存 – 由每个 IPv6 节点维护的缓存,用于存储邻居的 IPv6 地址及其对应的 MAC 地址。邻居缓存相当于 IPv4 中的 ARP 缓存。

邻居发现 (ND) – 一组 ICMPv6 消息和过程,用于确定相邻节点间的关系。邻居发现取代了 IPv4 中使用的 ARP、ICMP 路由器发现和 ICMP 重定向消息。

网络基本输入/输出系统 (NetBIOS) – 一种用于用户应用程序的标准 API,用于管理 NetBIOS 名称和访问 NetBIOS 数据报服务与会话服务。

NetBIOS – 参见“网络基本输入/输出系统”。

路由器发现 – 一个“邻居发现”过程,主机通过该过程发现连接的子网上的本地路由器。

TCP – 参见“传输控制协议”。

传输控制协议 (TCP) – 一种运行于 IP 之上的、可靠的、面向连接的传输层协议。

UDP – 参见“用户数据报协议”。

用户数据报协议 (UDP) – 一种运行于 IP 之上的、不可靠的、无连接的传输层协议。

Windows 套接字 – Windows 应用程序用来使用 TCP/IP 传输数据的一种常用应用程序编程接口 (API)。


返回页首返回页首上一页第 3 页,共 6 页下一页
**
本文内容
**