TCP/IP 详解 - 卷一:协议
TCP/IP 详解 - 卷一:协议(第二版)的阅读笔记,介绍网络概述、Internet 地址结构等核心内容
本文为实体书TCP/IP 详解 - 卷一:协议(第二版)的阅读笔记,会对内容删减不再重要的部分。因本书原版出版于 2016 年,且计算机领域发展至今已经发生了很多变化。
阅读前说明
- 写作动机:本书内容为本人感兴趣的内容,但本人并非从事此专业领域,故此作文为笔记。
- 文章内容:作为笔记,不会将原文全部内容记录下来。
第一章:网络概述
计算机发明时并未存在网络,网络出现是出于对计算机数字资料分享、传输的目的而设计。注意此处用 “设计” 表达,是因为 “网络” 这个概念更多是艺术,而不是科学。
在设计时,网络底层传输利用人类已知的物理电气特性、规律,并加以有序或规律性控制,用以表达人类定义的信息、概念。
正如前文所述,如何按照特定规律有序控制并作为信息表达,以实现人类可理解的描述、信息,此部分则为人类概念中的 “协议” 部分内容。
TCP/IP 就是上文中的协议,但 TCP/IP 不用于表达物理特性,而是在 OSI 网络层级中的传输层和网络层中工作。此部分层级的工作已经不涉及物理规律,更多的是表达如何有效传递逻辑控制部分的信息。
工作在利用物理特性、规律进行控制的协议是 OSI 网络模型中的物理层、链路层的协议,包括以太网协议和 WiFi 协议等。但本书更多解读 OSI 网络模型及其以上层级的部分内容,对链路层会涉及一点,但不是主要内容。
协议作为人类定义的描述概念,在牛津辞典中的概念为:
国家事务或外交场合的正式程序或规则系统
正如我提到的 OSI 网络层级、模型一样,协议和物理规律结合工作,就是网络体系结构。
该体系结构可以用网络分层来划分,正如物理层就是单纯物理层规律一样,链路层监听物理层规律的特征、规律,用以识别该物理特征、规律是否是网络体系中需要的协议信息。如果满足特定的协议内容则加以处理,并识别是否需要交给网络层,或自身处理。
网络层则监听来自链路层的信息、协议内容,加以解析判断是否有效,在信息有效时,判断信息是否需要在网络层转发,或就在本地处理并交给更上层工作的设备处理。
一般来说,更高层级的网络设备能识别所有同级别及以下设备传递的信息,毕竟不同设备之间传输,底层也属于物理特性的规律表达而来的。
1. 体系结构原则
Internet 体系结构在几个目标的指导下建立。在 [c88] 中,Clark 描述的首要目标是:发展一种重复利用已有的互联网络的技术。这句话本质是 Internet 体系结构应将多种网络互联起来,并在互联的网络上同时运行多个应用。基于这个首要目标,Clark 还提供了以下的二级目标:
-
Internet 通信在网络或网关(IP 路由器)失效时必须能持续
-
Internet 必须支持多种类型的通信服务
-
Internet 体系结构必须兼容多种网络
-
Internet 体系结构必须允许对其资源的分布式管理
-
Internet 体系结构必须是经济有效的(军事、管理要求)
-
Internet 体系结构必须允许低能力主机的连接
-
Internet 中使用的资源必须是可统计的
上述目标中大部分被设计决策所采纳。但在制定这些体系结构的原则时,会影响到设计者所做的选择,最后少数几种设计方案脱颖而出。接下来会提到:
1.1 分组、连接和数据报
20 世纪 60 年代,网络最初主要用于电话网络。它是针对在一次通话中连接双方通话而设计的,一次通话通常需要在双方之间建立一条连接(在早期就是一条物理线路)。在线路的一端输入一定的数据,经过一定的延时,沿着预先建立的网络交换机路径,在线路另一端以一种可以预测的方式出现。
20 世纪 60 年代,分组交换的概念提出。该概念主要是:将原本需要连续发送的信息,切割、分解为更小的数据块,这些数据块可分别发向多个独立网络路径(多路复用),并在网络目的地上,这些分解数据块可以组合起来(分解和组合在后续章节介绍)。这样可以让网络更加具有弹性,不用担心线路受到物理攻击。基于统计复用可以更好地利用网络链路和交换设备。
这种方式传输信息时,因为不依赖特定网络路径,具有很高的灵活性,但对交换机中统计信息(流量)的可预测性有限。交换机如同数据流通的高速公路,其作为高速公路的瓶颈和阻塞点,任何一个交换机出现故障,都会导致其他交换机繁忙。
针对这种不可预测的特点,又想让通话不被突然的单点故障影响,人们提出了一些分时复用(TDM)和静态复用的替代性技术:在连接上保留一定的处理资源或时间资源。虽然这保证了通话的可预测性,但是却无法让整个网络带宽充分利用,因为可能这部分虚拟电路(交换机上保留的处理和时间资源)并未使用。
对于 “虚拟电路” 这个词汇,需要在每个交换机中为每个虚拟电路连接储存一些信息或状态。结合分组数据中携带的少量信息,这部分少量的信息就是用于索引状态或信息的索引,用于决定是否转发到下一个交换机。当然,索引使用前,已经在每个交换机上建立了状态信息,通过协议来建立、清除连接在交换机中的状态或索引信息。这类网络称为 “面向连接” 的。
无论是建立在线路还是交换的基础上,以上所描述的网络均称为面向连接的网络,是 20 世纪 60 年代前期以及之前最流行的联网方式。在这之后,数据报作为另一种方案得到发展,该方案起源于 CYCLADES [P73] 系统。该网络体系在数据分组中包含了来源和最终目的地所有的识别信息(不在分组交换机中),这虽然需要更大的数据包,但是不再需要在分组交换机中维护连接状态,可以用于建立一个 “无连接” 的网络,也不再需要使用复杂的信令协议。数据报很快被早期 Internet 设计者接受,这个决定对协议族其他部分有深远影响。
另外有一个关于 “消息边界、记录标记” 的概念。当一个应用程序将多个信息、消息数据发送到网络中,这些信息、消息的分割点可能会被通信协议保留,也可能不会被保留。大多数数据报协议是保留这些分割点的。这样设计很自然,因为数据报也有开始和结束标识。但是在交换网络、虚拟电路网络中,对于连续的几块数据,接收方将按照一个数据块和多个数据块接收,因为这些协议不保留消息边界,所以需要应用程序或者更高级的网络层协议提供消息边界的功能。
1.2 端到端和命运共享论点
当我们设计一个大型系统(操作系统或协议族)时,通常会涉及到什么位置、模块实现哪个功能。
只有在通信系统端角度的应用知识的帮助下,才能完全正确地实现问题中提到的功能。因此,作为通信系统自身的一个特点,不可能提供有疑问的功能。(有时,通信系统提供的一个不完整的功能可能用于提高性能)
这段话认为只有涉及参与通信的终端系统的应用程序或最终用户,才能正确实现通信功能的正确性和完整性,即使协议为正确实现应用程序做了努力,其功能注定不会很完善。总之,这个原则认为重要的功能(例如:差错控制、加密、交付确认)不应该在大型系统的底层(见 2 节)实现。但底层可以提供方便端系统工作的功能,并最终可能改善性能。
这种观点表明底层系统功能不应以完美为设计目标,这是因为对端系统中的应用程序做出完美推测是不可能的。
最终,端到端论点倾向于基于 “一个哑网络和连接到这个哑网络的智能系统” 的结构设计方案。由此,TCP/IP 协议族中的很多功能:数据完整、发送控制速率都是在终端系统中的应用程序中实现的。至于哪些功能在同一个计算机、网络或软件栈中实现,这是另外一个称为命运共享的原则。
命运共享原则建议将必要的状态放在终端系统中,这些状态用于维护一个正在使用的网络通信。通常,一个端点失效时,整个通信也就失效了,中间底层设备的状态维护将不存在任何意义,且也浪费资源。这样,即使中间底层设备出了短暂的故障,也能维持整个通信关联性,因为通信的关联性都在终端系统中,不会因为底层设备出现故障导致通信关联性消失。即使一段时间内整个故障设备无法恢复,也能通过其他底层的通信中间设备恢复通信链路。通信链路概念为虚拟的,是一种虚拟的连接(例如:由 TCP 实现通信关联),即逻辑链路,是路径可变化的。
命运共享论点也支持一种 “带智能终端主机的哑网络” 模型,当前 Internet 中主要矛盾是:哪些功能在网络中实现,哪些功能不在网络中实现。
1.3 差错控制和流量控制
网络中可能出现数据损坏或丢失的情况。这可能出于各种原因:硬件问题、数据传输过程中意外的修改、超出无线网络传输范围等。对于这类错误的处理称为差错控制,可以在网络基础设施系统、网络终端系统或其他组合中实现。显然,端到端和命运共享论点建议在应用程序附近或内部实现差错控制。
通常,在只有少数数据位出错的情况下(此处关注错误位置是在传输过程中或已接收的情况),通常可以通过网络中执行数学代码检测和修复这种位错误。当更多严重损坏发生在网络中时,整个分组通常被重新发送或重新传输。在线路网络或虚拟电路网络中,通常传输在网络内部进行。
这对于对分组数据顺序要求严格和无差错的应用是很有用的。但是有些应用不希望为数据的可靠交付而付出代价(建立连接或重新传输带来的延迟),例如文件传输就不需要顺序,只需要将分散的文件数据块按照原来的顺序重新组合即可。
针对网络中可靠、按顺序交付的实现考量,帧中继和 Internet 协议采用一种尽力而为的交付服务。这样尽力而为的交付中,网络不会花很大的努力来确保数据在没有差别或缺陷的情况下交付。但也会采用差错检测码或校验和来检测某些差错,例如可能一个数据包定向的差错,被检测到时,数据报仅仅丢弃而不会有进一步的动作。
如果尽力而为的交付成功,发送方能以超过接收方接收能力的速度发送数据。在尽力而为交付的 IP 网络中,降低发送方的发送速率可通过流量控制实现,它在网络外部或通信系统的高层实现并运行。TCP 会处理这样的问题(原书第 15 章和 16 章有介绍)。这与端到端论点表现一致:TCP 在终端主机中实现速率控制。也与命运共享论点一致:在基础设施单元中失效的情况下,不会影响网络设备的通信能力(只要某些通信路径仍然可用)。
2. 设计和实现 {#second}
虽然建议用一个特定的方式实现一个协议体系结构,但通常不是强制的。因此需要对协议体系结构和实现体系结构加以区分,实现体系结构定义了协议体系结构中的概念如何以软件形式实现。
很多负责实现 ARPANET 协议的人员非常熟悉操作系统的软件结构,一篇有影响力的论文描述的 “THE” 多编程系统 [D68],主张使用一种具有层次结构的处理方式,检查一个大型软件实现逻辑的稳定性和正确性。最终,这帮助形成了网络协议的设计理念,它涉及实现和设计了多个网络层次,这种方案现在称为分层,是实现协议族的常用方案。
2.1 分层
通过分层,每层协议只负责通信的一个方面。这样的好处是显然的:允许不同专业领域的开发人员实现不同的部分。最常提到的协议分层概念基于一个称为 “开放系统互连标准(OSI)” 的模型。Internet 的分层模型更简单,在第 3 节:TCP/IP 协议结构和协议介绍。
尽管 OSI 建议的 7 个逻辑层在协议体系中结构的模块化实现是可取的,但是本文所介绍的 TCP/IP 体系结构(现实大部分网络体系结构)仅包含 5 层。在 20 世纪 70 年代,有很多关于 OSI 模型的不足和相对优势,以及 ARPANET 优于它的争论,但最后 TCP/IP 最终取得胜利。原书对网络层或互联网络层最有兴趣。
| 层级 | 名称 | 描述/例子 | |
|---|---|---|---|
| 主机 | 7 | 应用层 | 指定完成某些用户初始化任务的方法。应用协议通常由应用程序开发者设计和实现,例如 FTP、Skype |
| 6 | 表示层 | 指定针对应用的数据表示格式和转换规则的方法。加密有时候也在本层,也可能在其他层 | |
| 5 | 会话层 | 指定由多个连接组成一个通信会话的方法,它可能关闭连接、重启连接和检查点进程 | |
| 4 | 传输层 | 指定运行在相同计算机系统中多个程序之间的连接或关联的方法。如果在其他地方没有实现,本层可能实现可靠的投递。如 TCP、ISO TP4 | |
| 所有网络设备 | 3 | 网络层 | 指定经过潜在不同类型链路层网络的多跳通信方法。对于分组网络,它描述了抽象的分组格式和标准的编码结构,如 IP 数据报、X.25 PLP、ISO CLNP |
| 2 | 链路层 | 指定经过单一链路通信的方法,包括多个系统共享同一介质时的访问控制协议。本层通常包含差错检测和链路层地址格式,例如以太网、WiFi | |
| 1 | 物理层 | 连接器、数据速率和如何在某些物理介质上进行位编码。本层也描述底层的差错检测和纠正、频率分配。原书将尽量避开这层 |
2.2 分层的复用、分解和封装的实现
分层体系结构的一个主要优点就是协议复用能力。其允许多种协议共存于同一基础设施中,也允许多个相同的协议对象多个实例同时存在,并且不会混淆。
一般来说,每一层有属于该层协议的数字标识,用于在该层级传输,并用于识别该分组携带的数据包属于该层的哪种协议或信息流。例如,链路层(以太网、WiFi)接收到来自相邻的上层数据报(IP 数据报)时,会将整个数据报数字位前面或数据位最后加一个标识符用来标识,用以标识是否是 IP 数据流。类似在数据前面加标识的过程称之为封装,用以标识本层的传输办法(协议)。
通常,上述链路层对相邻上层(IP 数据报)的数据报作为不可理解(不透明)数据,无条件执行封装传输,并形成一个本层的协议数据包,这个包可称之为 “协议数据单元(PDU)”。类似的,网络层(IP 数据报)的相邻上层也会下发网络层分组数据,由网络层处理程序将相邻上层(传输层)的数据包在数据位前面加一些标识符,形成网络层的协议数据单元,并转发给下层网络(程序)处理。
通常,更底层的网络会承诺不查看上层 PDU 的内容,这是封装的本质,每一层都将来自于上层的数据看为不可解析、无需解释的信息。
当数据在本层发送后,来到本层网络接收方按照协议规定的头部或尾部获得自己层所需要的标识位后就将这部分被加上标识的数据删除(解析、分解、拆分),并将这部分内容当作上层网络协议数据单元(PDU)。
因此,工作在底层的网络,通常不需要实现上层网络的协议,因为它为上层网络执行网络传输,并不需要处理上层网络的 PDU,因此不需要实现上层网络的协议(处理程序)。甚至,底层网络有属于自己层的专属协议,用于相同设备之间的协商和维护,不会转发到上层网络。
但实际情况不是这样的,当前的交换机和路由器通常实现更多的协议,这已经超出单纯实现数据转发的需要。原因通常包括出于管理的需要,例如允许远程登录,这通常需要实现更多的协议,已经可以充当一台主机了!
路由器通常包含多个网络接口,用于连接两个或多个网络。拥有多个网络接口的设备称之为多宿主。
一台主机可以是多宿主的,如果这台主机专门用于将一个分组从一个接口转发到另外一个接口,否则,不能把这台主机称之为路由器。
互联网络的目标之一是对应用隐藏所有有关于物理布局(拓扑)和底层协议的异构性细节。
3. TCP/IP 协议结构和协议 {#three}
目前为止,已经介绍了体系结构、协议、协议族和抽象的实现技术。本节将讨论构成 TCP/IP 协议族的体系结构和特定协议。虽然这已成为 Internet 使用的协议的既定术语,但是也有很多 TCP 和 IP 以外的协议包含在 Internet 使用的协议集合和协议族中。我们将从形成 Internet 协议分层基础的 ARPANET 模型开始介绍,探讨它和前面 OSI 模型
3.1 ARPANET 参考模型
| 层级 | 名称 | 描述/例子 | |
|---|---|---|---|
| 主机 | 7 | 应用层 | 实际上指的是Internet兼容的任何应用哦,包括网页(HTTP),dns,dhcp |
| 4 | 传输层 | 提供在抽象由应用管理的端口之间的数据交换.可能包括差错和流量控制.例如tcp,udp,sctp,dccp | |
| 所有网络设备 | 3.5 | 网络层(辅助) | 协助完成网络层设置,管理和安全的非正式的层,例如:ICMP,IGMP,IPsec |
| 3 | 网络层 | 定义抽象的数据报和提供路由,例子:ip(32位,64kb),ipv6(128位,最大支持4gb) | |
| 2.5 | 链路层(辅助) | 用于网络层到基于多接入链路层网络的链路层的地址映射和非正式的层,例子:ARP |
3.2 TCP/IP 中的复用、分解和封装
简单来说,网络层到链路层的数据报(IP PDU,即 IP 协议数据单元),会经过分片操作,并被切割(分装)为数据帧。
3.3 端口号
端口号是 16 位的非负整数(0-65535)。在物理上,这些端口并不存在,它是终端主机中存在的逻辑概念。该概念通常与 IP 地址结合使用,每个 IP 地址通常可以使用 65536 个端口号。大多数传输协议会使用这些端口号,它们通常绑定到主机上运行的具体服务。
由于某些与特定服务关联的端口经常被使用,标准的端口号由 Internet 号码分配机构(IANA)定义,分为熟知端口号(0-1023)、注册端口号(1024-49151)、动态 / 私有端口号(49152-65535)。传统上,服务器端软件需要绑定到熟知端口,这通常需要管理员或超级管理员这样的特殊权限。
3.4 ip地址和域名服务(DNS)
在tcp/ip网络协议族中,每台计算机(包括路由器)的每个链路层接口至少有一个ip地址. 虽然ip地址足以识别主机,但是不方便被记忆(ipv6就更长了). 由此产生的dns服务, 此服务是一个分布式数据库.
提供主机名(域名)和ip地址之间的转换, 也可查询ip到域名的查询. 域名通常是以.分割的单词组合, 通常以.com,.org,.gov,.in,.uk,.edu等结尾. DNS服务本身属于一个应用层协议,因此DNS服务依赖于
其他协议. 虽然tcp/ip协议本身不关心域名, 但是用户(例如使用web浏览器)通常会使用域名,如果dns不能正常工作,正常的Internet访问也难以使用. (第11章介绍DNS)
4. Internet中的内网(内联网)和外网(外联网)
根据本章第一节提到的, 由大写字母开头的Internet表示世界范围内可以使用Tcp/ip协议的主机集合, 由小写字母开头的internet则表示使用常见协议族的多个网络.
那么internet则表示的范围要大于Internet, 因此可以说Internet是一个internet
5. 应用设计
5.1 客户机/服务器
5.2 对等
6. 标准化进程
组织
-
IETF(Internet 工程任务组):每年在世界不同地点举行 3 次会议,负责开发、讨论并通过 Internet 的核心协议标准,承担着繁重且细致的工作。工作组主席负责协调执行此任务的志愿者,该会议并非免费。
-
IAB(Internet 架构委员会):由 IETF 选举产生,负责指导 IETF 的活动并执行相关任务,例如任命标准制定组的联络员。
-
IESG(Internet 工程指导组):由 IETF 选举产生,拥有决策权,可修改现有标准,建立和审批新的标准。
-
SDO(Internet 标准制定组)
-
IRTF:研究讨论那些尚未成熟到足以形成标准的协议、体系结构和程序,其主席是 IAB 的列席成员。
-
ISOC(Internet 协会):与 IAB 共同影响和促进涉及 Internet 技术和使用的相关政策与培训工作。
6.1 RFC
Internet 的每个官方标准均以 RFC(征求意见稿)的形式发布。
6.2 其他标准
-
IEEE(电气和电子工程师学会)
-
W3C(万维网联盟)
-
ITU(国际电信联盟)
第二章: Internet 地址结构
本章算粗略介绍了ip 层的 ip 协议二进制结构. 后续将详细介绍ip及其附属协议
1. 引言
本章介绍 Internet 中使用的网络层地址,又称 IP 地址。现在,连接到 Internet 的每个设备至少有一个 IP 地址,即基于 TCP / IP 专用网络协议的设备都需要 IP。任何情况下,由 IP 路由器(第 5 章)内的转发程序实现 IP 地址的流量去向和来源。IP 地址通常被 DNS(域名解析服务,见第 11 章)屏蔽在用户视线之外,DNS 让大多数用户直接使用域名,而不是一个 IP 地址。
为了了解 Internet 如何识别主机和路由器,并在它们之间实现流量交付,必须了解 IP 地址:管理、结构和用途。不论是连接到 Internet 还是专用网络的设备,为它们分配的地址必须经过协调,这样就不会重复使用网络中的其他地址。成组的 IP 地址被分配给用户和组织。这些地址的拥有者再将它们分配给设备,这通常根据某些编号方案进行。对于全球性的 Internet 地址,一个分层结构管理实体帮助用户和服务提供商分配地址。个人用户通常由 Internet 服务提供商(ISP)分配地址,通过支付费用用来获得地址和执行路由。
2. IP 地址表示方法
- IPv4: 点分十进制表示法
- IPv6: 表示方法采用冒号分割的 4 位 16 进制字符,中间最长的 0 用 :: 表示,且 :: 只能有一个,否则难以区分两个 :: 究竟多少个 0
3. IP 地址初始划分办法
3.1 地址分类寻址
IP 地址最初被设计为 IP 32 位中第一位为 0 的 A 类,第一二位为 10 的网络地址为 B 类网络,前三位为 110 的地址被划分为 C 类网络。以这些地址位开头的都将作为单播地址。
在基于地址分类法的 Internet 第一个十年(20 世纪 80 年代)增长中,还能应付。此后,每一个新网段被添加到 Internet 中,对于采用几种协调的方式,为其分配一个 A 类、B 类、C 类网络号变得很不方便。且 A 类和 B 类网络通常会浪费掉很多主机号,而 C 类网络号又不能提供足够多的主机号。
3.2 基于地址分类的子网寻址
为了解决单纯使用分类寻址带来的难以为新网段分配新网络号,以及 20 世纪 80 年代初局域网发展和增加,人们很自然想到了一种方式:当一个站点计入到 Internet 后利用其网络号作为子网的网络前缀,并在站点内部实现对主机号自治。即根据分配到的网络号 + 子网位数 + 主机位数,管理内部的网络。
这样,在不改变 Internet 核心路由基础设施的情况下,将更好解决新接入 Internet 设备 IP 分配问题。此方法仅用于单个站点内部,对于 Internet 上的其他部分,仅能看到该站点的 A 类、B 类和 C 类部分,并不清楚站点内部如何划分和管理内部主机。此功能方法称之为子网寻址 [RFC0950]。通过子网寻址,一个站点被分配一个 A 类、B 类、C 类的网络号,保留一些剩余主机号进一步对站内进行分配。本质上来说,子网寻址为 IP 地址结构增加了一个额外的部分,但它没有为地址增加长度。所以,一个站点管理员能在子网数和每一个子网中的主机数中折中,同时又不影响其他站点。
子网寻址为站点本身提供了灵活性,但也增加了成本:由于站点内部的管理子网字段和主机字段的定义是自己指定的(与网络号分类无关),所以需要采用新的方式确定内部的子网部分和主机部分。在子网出现前,可以直接从网络号中获得。
3.3 为分类子网寻址而生:子网掩码
子网掩码现在的标识方法为:网络号加子网位数。子网掩码是主机或路由器用来从 IP 地址中提取网络和子网信息的分配位。子网掩码与其对应的 IP 地址具有相同的长度(IPv4 为 32 位,IPv6 为 128 位)。它们像 IP 地址一样被配置,无论是静态的还是动态的(例如,通过 DHCP)。对于 IPv4,子网掩码以点分十进制表示法编写。子网掩码的常见格式是一系列前导 1 后跟 0,前导 1 的数量称为“前缀长度”。
表 2-4: 各种格式的 IPv4 子网掩码的例子
| 点分十进制表示 | 容易记的格式 (前缀长度) | 二进制表示 |
|---|---|---|
| 128.0.0.0 | /1 | 10000000 00000000 00000000 00000000 |
| 192.0.0.0 | /2 | 11000000 00000000 00000000 00000000 |
| 224.0.0.0 | /3 | 11100000 00000000 00000000 00000000 |
| 240.0.0.0 | /4 | 11110000 00000000 00000000 00000000 |
| 248.0.0.0 | /5 | 11111000 00000000 00000000 00000000 |
| 252.0.0.0 | /6 | 11111100 00000000 00000000 00000000 |
| 255.0.0.0 | /8 | 11111111 00000000 00000000 00000000 |
| 255.255.0.0 | /16 | 11111111 11111111 00000000 00000000 |
| 255.255.255.0 | /24 | 11111111 11111111 11111111 00000000 |
| 255.255.255.255 | /32 | 11111111 11111111 11111111 11111111 |
表 2-5 列出了 IPv6 的一些例子。
表 2-5: 各种格式的 IPv6 子网掩码的例子
| 十六进制表示 | 容易记的格式 (前缀长度) | 二进制表示 |
|---|---|---|
| ffff:ffff:ffff:ffff:: | /64 | 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| ff00:: | /8 | 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
子网掩码的功能是:路由器使用它们来定义 IP 地址的网络/子网部分和主机部分之间的边界。子网掩码中的 ‘1’ 表示属于网络/子网部分的位(用于转发数据),而 ‘0’ 表示属于主机 ID 的位。参考表 2-4,可以看到 IPv4 地址如 128.32.1.14 是如何被处理的。
3.4 可变长度子网掩码
以上通过子网掩码,将分配给站点的网络号,划分为多个相同大小的子网,并根据网络管理员的合理要求使每个子网能支持相同数量的主机号。但是还有种方法,将不同的子网分配不同长度的掩码,这样虽然进一步增加了管理的复杂性,但是也提高了子网结构的灵活性,这是因为不同长度的掩码可容纳不同的主机,网络管理员可根据不同子网的需求灵活分配和管理。
目前,大多数主机、路由器和路由协议支持可变长度子网掩码(VLSM)。即同一个子网中,路由器/主机可以为不同的子网分配不同的掩码长度。
3.6 IPv6 地址和接口标识符
除了比 IPv4 长 4 倍以外,IPv6 使用特殊的数字位前缀表示其地址的通信范围:本地(仅和本机通信)、链路本地(同一网络链路或 IPv6 前缀中的所有主机)、全球(Internet 范围)。
在 IPv6 中,大部分接口同时拥有多个 IPv6 地址。虽然 IPv4 也支持多个地址,但是并不常见。在分配的链路本地地址和全球性 IPv6 地址中,后 64 位以接口标识符(IID)为基础构成一个单播地址,IID 通常为 64 位。同时,IID 采用的是 EUI-64 格式,这里需要提出的是,链路层 MAC 地址也是一种 EUI 段格式,具体名称为 EUI-48。
上文提到的 EUI,在 IEEE 标准中称为拓展唯一标识符。EUI-48 或 EUI-64 中前面 24 位组织唯一标识符(OUI),它由 IEEE 注册权威机构 [IEEERA] 来维护和分配,而除去这 24 位,剩余位则由组织分配。
多年来,很多 IEEE 标准兼容的网络接口地址使用的是 EUI-48,与 EUI-64 最显著的区别就是位数长度不同。其中 EUI 格式中,第一个字节的第 7 位 bit 表示该 EUI 是否用于本地/通用(u 位),第 8 位标识是否是一个组(g 位)。通常在 IPv6 地址中用于标识是否是组播地址。我们只关心没有 EUI 第一个字节的第 8 位没有被设置为 1 的情况。
EUI-64 可以由 EUI-48 生成,生成办法就是在 EUI-48 第三个字节开始插入 FFFE 即可表示为 EUI-64。因此,IID(EUI-64)就可以采用链路层 MAC(EUI-48)地址生成。
4. 现代路由系统: CIDR 和聚合
20 世纪 90 年代初期,采用子网寻址缓解增长带来的痛苦后,Internet 面临更严重的规模问题。
- 1994 年,一半以上 B 类地址已被分配。预计 1995 年 B 类空间将被用尽。
- 32 位的 IPv4 地址被认为不足以应付 21 世纪初的预期规模。
- 全球性路由表的条目数(网络号条目),1995 年为 65000 个,随着 A 类、B 类和 C 类的增长,路由性能将受到影响。
这些问题,在 1992 年开始就受到 IETF 中 ROAD(路由和寻址)小组的关注。问题 1 和 3 快速来临,并提出短期解决方案使有效清除 IP 地址分类的缺陷,并提高层次化分配 IP 地址的聚合能力。而 IPv6 则被设想于解决问题 2。
4.1 网络前缀
为了缓解 IPv4 的压力,分类寻址方案通常使用一个类似 VLSM 的方案,并拓展 Internet 路由系统以支持无类别域间路由(CIDR)[RFC4632]。这提供了方便连续分配地址范围的分配方式,此分配方式可以分配包含多于 255 台并少于 65536 台主机的网络号。
使用 CIDR,未经过预定义的任何地址范围可作为一个类的一部分,但需要一个类似于子网掩码的掩码,有时也称为 CIDR 掩码。CIDR 掩码不再局限于一个站点,而对全球性路由系统都是可见的。因此,除了网络号之外,核心 Internet 路由器必须能解释和处理掩码。这个数字组合称为网络前缀,它用于 IPv4 和 IPv6 地址管理。
消除一个 IP 地址中网络和主机号的预定义分隔,将使更细粒度的 IP 地址分配范围成为可能。与分类寻址类似,地址空间分割成块最容易通过数值连续的地址来实现,以便用于某种类型或某些特殊用途。目前,这些分组普遍使用地址空间的前缀表示。一个 n 位的前缀是一个地址的前 n 个位的预定义值。对于 IPv4,n(前缀长度)的值通常在范围 0 ~ 32;对于 IPv6,通常在范围 0 ~ 128。它通常被追加到基本 IP 地址,并且后面跟着一个 / 字符。表 2-6 给出了一些前缀的例子,以及相应的 IPv4 或 IPv6 地址范围。
表 2-6 前缀的例子及其相应的 IPv4 或 IPv6 地址范围
| 前缀 | 前缀(二进制) | 地址范围 |
|---|---|---|
| 0.0.0.0/0 | 00000000 00000000 00000000 00000000 | 0.0.0.0 ~ 255.255.255.255 |
| 128.0.0.0/1 | [1]0000000 00000000 00000000 00000000 | 128.0.0.0 ~ 255.255.255.255 |
| 128.0.0.0/24 | [10000000 00000000 00000000] 00000000 | 128.0.0.0 ~ 128.0.0.255 |
| 198.128.128.192/27 | [11000110 10000000 10000000 110]00000 | 198.128.128.192 ~ 198.128.128.223 |
| 165.195.130.107/32 | [10100101 11000011 10000010 01101011] | 165.195.130.107 |
| 2001:db8::/32 | [00100000 00000001 00001101 10111000] 00000000… | 2001:db8:: ~ 2001:db8:ffff:ffff:ffff:ffff:ffff:ffff |
在二进制前缀列中,方框内的位是固定的,而剩余的位可以是 0 和 1 的任意组合,从而定义了地址范围。前缀长度越短,对应的地址范围越大。
这种基于前缀的寻址方式(CIDR)取代了旧的分类寻址方案。例如,C 类网络 192.125.3.0 可以写作 192.125.3.0/24 或 192.125.3/24。类似地,A 类网络可以用 /8 表示,B 类网络可以用 /16 表示。
4.2 路由表的聚合
以前,路由器的路由条目是通过增加单条路由应该往哪边转,所以对于不断增长的网络,路由表会越来越大。但是,通过 CIDR 对地址划分范围后,则可以通过网络地址中和本机路由器中的地址范围表进行匹配,很容易就知道应该往哪个方向转发流量。这样,路由表在确定后,增长不会像之前记录单个路由条目一样会随着时间增长不断将路由表变大。因为流量包的网络地址和路由表比对,在路由表中确定它属于哪个范围,向指定端口转发即可实现路由转发。减少了路由表查找量,自然就提高了路由性能。这对于核心路由尤为重要。
通过对以上问题的理解后,很容易发现 20 世纪 90 年代初遇到的问题。当时,没有什么技术可以解决以下问题:在维护 Internet 中到所有目的地的最短路径的同时,又能显著减少路由表的条目。此处,最有名的方法是 20 世纪 70 年代末由 Kleinrock 和 Kamoun 发表的分层路由研究 [KK77]。聚合过程此处不再介绍。
5. 特殊用途的地址 (CIDR 表示)
特殊用途地址是指那些不用于标准单播地址分配的地址范围。
表 2-7 IPv4 特殊用途地址 (定义于 2010 年 1 月)
| 前缀 | 特殊用途 | 参考文献 |
|---|---|---|
| 0.0.0.0/8 | 本地网络主机,仅用作源 IP | RFC 1700 |
| 10.0.0.0/8 | 私有网络(内网)地址,不出现在公网 Internet 上 | RFC 1918 |
| 127.0.0.0/8 | Internet 主机回环地址 | RFC 5735 |
| 169.254.0.0/16 | 链路本地地址 | RFC 3927 |
| 172.16.0.0/12 | 私有网络(内网)地址,不出现在公网 Internet 上 | RFC 1918 |
| 192.0.0.0/24 | IETF 协议分配(IANA 保留) | RFC 5736 |
| 192.0.2.0/24 | TEST-NET 地址,用于文档 | RFC 5737 |
| 192.88.99.0/24 | 用于 6to4 中继 | RFC 3068 |
| 192.168.0.0/16 | 私有网络(内网)地址,不出现在公网 Internet 上 | RFC 1918 |
| 198.18.0.0/15 | 用于基准测试 | RFC 2544 |
| 198.51.100.0/24 | TEST-NET 地址,用于文档 | RFC 5737 |
| 203.0.113.0/24 | TEST-NET 地址,用于文档 | RFC 5737 |
| 224.0.0.0/4 | IPv4 多播地址 | RFC 5771 |
| 240.0.0.0/4 | 保留空间 | RFC 5735 |
| 255.255.255.255/32 | 本地网络广播地址 | RFC 919 |
表 2-8 IPv6 特殊用途地址 (定义于 2008 年 4 月)
| 前缀 | 特殊用途 | 参考文献 |
|---|---|---|
| ::/0 | 默认路由条目 | RFC 4291 |
| ::/128 | 未指定地址 | RFC 4291 |
| ::1/128 | IPv6 主机回环地址 | RFC 4291 |
| ::ffff:0:0/96 | IPv4 映射地址 | RFC 4291 |
| ::{ipv4-address}/96 | IPv4 兼容地址(已弃用) | RFC 4291 |
| 2001::/32 | Teredo 地址 | RFC 4380 |
| 2001:10::/28 | ORCHI(覆盖路由加密哈希标识符) | RFC 4843 |
| 2001:db8::/32 | 用于文档和示例的地址范围 | RFC 3849 |
| 2002::/16 | 6to4 地址 | RFC 3056 |
| 3ffe::/16 | 用于 6bone 实验(已弃用) | RFC 3701 |
| 5f00::/16 | 用于 6bone 实验(已弃用) | RFC 3701 |
| fc00::/7 | 唯一本地单播地址 | RFC 4193 |
| fe80::/10 | 链路本地单播地址 | RFC 4291 |
| ff00::/8 | IPv6 多播地址 | RFC 4291 |
关于特殊地址定义时间的说明
5.1 为什么特殊地址在 2010 年才”定义”?
这里需要澄清一个重要的概念:2010 年的”定义”实际上是指 RFC 文档的发布时间,而不是这些地址的实际使用时间。这些特殊地址在 1995 年之前就已经被定义和使用,只是相关的 RFC 文档在 2010 年进行了更新和整理。
5.2 1995-2010 年网络正常运行的关键技术
CIDR(无类别域间路由)
- 1993 年引入,1995 年正式部署
- 解决了地址分类寻址的浪费问题
- 允许更灵活的地址分配(如 /27、/28 等)
- 显著提高了 IPv4 地址空间的利用效率
NAT(网络地址转换)
- 1994 年 RFC 1631 引入
- 让私有地址可以在公网上使用
- 一个公网 IP 可以支持多个内网设备
- 成为解决地址短缺的核心技术
私有地址空间
- RFC 1918(1996 年)定义了私有地址范围
- 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16
- 这些地址可以在不同组织内重复使用
- 大大缓解了公网地址的压力
5.3 网络架构的演进过程
- 1995年前:分类寻址 + 子网划分
- 1995-2000:CIDR + NAT + 私有地址
- 2000年后:IPv6准备 + 地址优化
5.4 2010 年”定义”的真正含义
这里的”定义”实际上是:
- 标准化整理:将分散的 RFC 整合,形成统一的规范
- 最佳实践总结:基于多年使用经验,优化地址分配策略
- 向后兼容:确保现有网络不受影响,平滑过渡
- 文档完善:为 IPv6 过渡期提供更清晰的 IPv4 地址管理指南
5.5 总结
1995-2010 年网络正常运行不是因为 2010 年才定义特殊地址,而是因为:
- CIDR 技术让地址分配更高效,减少了地址浪费
- NAT 技术让私有地址可以上网,一个公网 IP 支持多个设备
- 私有地址空间解决了地址短缺,不同组织可以重复使用
- 路由聚合提高了网络性能,减少了路由表条目
这些技术的组合让 IPv4 地址空间在 IPv6 成熟之前能够继续支撑互联网的快速发展,为全球网络的稳定运行提供了技术保障。
6. IP 地址分配
现阶段,IP 地址空间通常被分配为大的块(范围),这由一些分层次的权威机构完成。权威机构是为各种 [所有者] 分配地址空间的组织。[所有者] 通常是 ISP 或其他较小的权威机构。权威机构进场参加与全球单播地址空间分配,权威机构为用户分配一个固定/限时地址块,最后这个层次的最顶部机构是 IANA,它负责分配 IP 地址和 Internet 协议使用的其他号码。
6.1 单播地址
对于单播 IPv4 和 IPv6 地址空间,IANA 将分配权限主要委托给几个地区性 Internet 注册机构 (RIR),RIR 通过 2003 年创建的号码资源组织 (NRO) 相互协作。
表 2-14 列出了截至 2011 年中期加入 NRO 的一组 RIR。截至 2011 年初,IANA 剩余的 IPv4 单播地址空间将转移给这些 RIR 进行分配。
表 2-14: 加入 NRO 的地区性 Internet 注册机构 (Regional Internet Registries joining NRO)
| RIR 名称 | 负责的地区 | 参考文献 |
|---|---|---|
| AfriNIC - 非洲网络信息中心 (African Network Information Centre) | 非洲 (Africa) | http://www.afrinic.net |
| APNIC - 亚洲太平洋地区网络信息中心 (Asia Pacific Network Information Centre) | 亚洲/太平洋地区 (Asia/Pacific Region) | http://www.apnic.net |
| ARIN - 美洲 Internet 号码注册机构 (American Registry for Internet Numbers) | 北美洲 (North America) | http://www.arin.net |
| LACNIC - 拉丁美洲和加勒比地区的 IP 地址注册 (Latin American and Caribbean IP Address Registry) | 拉丁美洲和一些加勒比岛屿 (Latin America and some Caribbean Islands) | http://lacnic.net/en/index.html |
| RIPE NCC - 欧洲网络协调中心 (RIPE Network Coordination Centre) | 欧洲、中东、中亚 (Europe, Middle East, Central Asia) | http://www.ripe.net |
这些 RIR 实体通常处理较大的地址块(如 IP4AS、IP6AS)。它们将地址空间分配给较小的注册机构和各国的大型 ISP(如澳大利亚和新加坡)。随后,ISP 向其客户提供地址空间。当用户注册 Internet 服务时,他们通常使用 ISP 地址空间的一小部分(通常很小),以地址前缀的形式出现。这些地址范围由客户的 ISP 拥有和管理,被称为提供商可聚合(PA)地址。
6.2 组播地址(略)
7. 单播地址分配分类
- 单个供应商/无网络/单个地址
- 单个供应商/单个网络/单个地址(家庭)
- 单个供应商/多个网络/多个地址(组织)
- 多个供应商/多个网络/多个地址(多宿主—依赖 Internet 接入的持续运营组织)
总结
CIDR(无类别域间路由)可以说是互联网开发和部署核心路由系统的根本性变化。CIDR 成功地为分配地址空间提供了更多的灵活性,并通过聚合提升了路由的可扩展性。此外,IPv6 在 20 世纪 90 年代初开始受到更多的重视,这是因为人们预见到很快会需要更多的地址。然而,没有预见到的是,NAT(网络地址转换)的广泛使用显著推迟了 IPv6 的使用,因为连接到互联网的每一台主机不再需要唯一的地址。相反,大型网络使用专用地址空间已经司空见惯。但是,可用于路由的 IP 地址数量最终将减少到零,因此未来将出现一些变化。