书名:TCP/IP路由技术(第一卷)(第二版)
ISBN:978-7-115-15429-3
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
• 著 [美] Jeff Doyle, CCIE#1919 Jennifer Carroll, CCIE#1402
译 葛建立 吴剑章
责任编辑 李 际
• 人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
• 读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书是一本详细而又完整地介绍互连网络内部网关协议(IGP)的专业书籍,堪称有关IGP方面不可多得的经典之作。本书共分三个部分。第一部分主要介绍了网络和路由选择的基本知识,其中包括IPv4协议、IPv6协议和路由技术。第二部分是本书的精华,这一部分详细、深入地讲述了各种常用的内部路由协议,如RIP、RIPv2、RIPng、无类别路由选择、EIGRP、OSPFv2、OSPFv3、IS-IS等协议,每一章除了对该协议的实现机制和参数详尽阐述,使读者对协议的实现原理有一个清晰的理解外,还通过在实际网络环境中的实例,详细地论述了该协议在Cisco路由器上的配置和故障处理方法,帮助读者获取大量解决实际问题的专业技能。第三部分介绍了如路由重新分配、缺省路由/按需路由选择、路由过滤、路由映射等多种重要而有效的路由控制工具,用来创建和管理多个IP路由选择协议的协调和互操作。附录部分讲述了二进制、十六进制转换、访问列表、CCIE提示等内容。
相对于第一版,本书第二版具有以下更新:在第一版详细讲述IPv4协议中IGP的基础上,大量增加了相应协议在IPv6协议中的实现和配置,其中单独一章用来讲述IPv6中应用的OSPFv3协议,这是本书新版的一大亮点;同时本书根据Internet和Cisco IOS系统的最新发展,适当地删减了如网桥、IGRP等过时的内容,并增加了许多新的IOS增强特性的讲解。
本书的读者不仅是那些准备CCIE考试的考生,也是任何需要完整理解IPv4,特别是IPv6下TCP/IP内部路由选择协议实现的网络设计和工程人员。本书中对协议细节的讲解和对网络实例的探讨相信会让读者获益匪浅。
Jeff Doyle(CCIE #1919)是专注于研究IP路由选择协议、MPLS和IPv6方面的专家。他设计了或协助设计了遍及北美、欧洲、中国、韩国以及日本等很多地区的大型IP服务提供商的网络。Jeff经常在为数众多的研究团体和会议上出现,并在NANOG、JANOG、APRICOT以及IPv6论坛会议上发言。Jeff拥有Memphis州立大学的文学学士学位,并在新墨西哥大学学习了电气工程专业。Jeff目前生活在科罗拉多州的丹佛地区。
Jennifer Carroll(CCIE #1402)是华盛顿州雷蒙德地区的独立网络顾问专家。在过去的15年中,她设计、实施和优化了许多TCP/IP网络,并开发和讲授了多种有关路由选择协议和Cisco公司路由器方面的网络组网和网间互连课程。读者可以通过电子邮件jennifer.carroll@ieee.org与Jennifer联系。
1976年,当我在数字设备公司(DEC)第一次看到Arpanet IMP的时候,今天我们熟知的网络当时还处于发展初期。SNA、XNS和DECnet等网络处于早期发展阶段,当时有关分组交换和电路交换的讨论还是热点话题。我们这些从事交换和路由选择算法设计的人处理的是具有64KB内存的路由器(虽然我们那时不这样称呼它们),56KB的数据链路被认为是非常快的,具有256个节点的网络就已经足够大了。假如你是卖出了那256台计算机的销售人员,你将会拥有可观的财富并可以退休了。
30年是很长的一段时间,如今,组成Internet的单个网络就包含了数以千计或数以万计的节点,整个Internet包含了数以亿计的计算机。在我们这一代的网络发展过程中,最显著的一点是基于TCP/IP协议簇的Internet基础并没有大的变化;虽然在这期间,计算机体系结构经历了四代或更多代,操作系统技术经历了整整3代,而传输速度也提高了5个数量级。
然而,我们仍然把分组交换网络中的路由选择看作一种“魔法”,为什么呢?
首先,设计强壮的、可扩展的分布式算法是困难的。虽然我们非常希望网络尽可能的简单,但是不可避免的要遇到一些特别的实际案例、网络优化、特殊的拓扑结构,以及链路技术等各种情况,因此网络的复杂性也在一点一点的增加。由于整个网络铲车式升级(fork lift upgrade)是几乎不可行的,因此,目前同时存在多种技术版本,我们必须维护一个向后兼容的、无缝连接的网络来提供网络服务。当控制数据包路由选择的策略变得越来越复杂的时候,我们设计用来自动发现和配置网络的能力就会受到限制,我们又不得不退回到依赖于手工配置和调整性能的技术。最后,当这些网络运行的环境已经从相互之间默认为信任关系的环境发展为会受到内外部攻击的环境时,设计和部署更加安全可靠的路由选择系统就变成一种迫切需要解决的优先问题。
本书完全解开了这个“魔法”之谜。新版的第一卷涵盖了TCP/IP网络所有必不可少的基础知识,并给出了理解在Internet的某个单一管理区域内如何完成路由选择所需要的所有工具。首先,在开始的有关地址和静态路由的章节中介绍了分组交换网络中路由技术的基本概念,然后深入地讨论了目前最流行的IGP——RIP、EIGRP、OSPF以及IS-IS协议。最后讲述了路由重新分配、路由过滤和策略路由选择等方面的高级课题。
这次出版的第二版也增加了有关IPv6方面的基本内容,并提供了Cisco IOS软件系统最新版本有关示例和配置的所有最新内容。
本书对于任何希望全面了解在TCP/IP网络中路由选择是如何实现的读者都是有帮助的:从路由选择算法的设计原则、地址规划的发展到设计和配置大型自主系统网络路由选择的实践等。
David Oran
Cisco Fellow
Frank Knox,是Skyline Computer公司的首席技术执行官,已经供职6年多。他具有两个CCIE资格证书(CCIE#3698:SNA/IP和路由选择/交换),同时也是一位CCSI(Cisco公司授权资深讲师)。除了负责CTO方面的职责外,Frank教授过几门与Cisco有关的高级课程,其中包括为期一周的CCIE实验室考试准备专题培训等。他是与路由器相连的大型主机技术的权威,也是有关网络互连集成方面问题和技术的专家(例如,SNA/IP和语音/数据)。他在IBM公司、GTE(Verizon)Directories公司以及Skyline Computer公司积累了超过37年的网络组网经验。这些经验包括服务、技术支持、产品规划、管理,以及网络互连教育的各个方面。另外,Frank还为Dallas大学电信MBA项目开发和讲授了一些课程。他在Pace大学获得了电信方面的硕士学位(4.0 GPA)。
Steven Edward Moore在Cisco公司工作的6年半的时间里,作为一名工程师担任了不同的角色,目前转到了IP Routing Protocol Scalability团队(IP路由选择协议扩展团队)。在这个团队,他主要是围绕对网络与协议的可扩展性进行扩展的各个方面进行工作:考虑协议架构的新特性和优化,设计对当前协议的可扩展性的测试和评估,帮助客户一起实现对客户网络的功能扩展,以及参加像Networkers会议这样的活动,来指导其他人怎样从路由选择的角度来增强他们的网络性能和可扩展性。
Rena Yang是Cisco公司的一位软件工程师。她具有超过6年的实现Cisco IOS软件编码方面的经验。目前她从事IS-IS协议方面的工作。在这之前,她主要从事IPv4、UDP、访问列表、策略路由和路由选择基础架构方面的工作。Rena在MIT获得了理学学士和计算机科学工程硕士的学位。
Since the publication of Routing TCP/IP Volumes I and II, I have had many opportunities to visit the People’s Republic of China. In no other country have I received as many warm compliments on these books as I have in China. I am therefore delighted that PT Press is now offering a version of Volume I in Mandarin.
China is aggressively expanding its Internet infrastructure, and along with it services such as mobile IP and online gaming. In the next few years, I predict that China will become the world’s leader in the commercial implementation of IPv6. Already China exceeds Japan in the number of PCs, and it will soon have the world’s largest mobile network. All of this expansion means that over the coming decade, there will be an enormous increase in the demand for IP networking experts. The Cisco Certified Internet Expert program provides the opportunity for potential employers to discern the best networking engineers, and it provides those holding the certification a testament to their expertise. Therefore the CCIE program plays an increasingly important role in the growing Chinese networking industry. I hope that you, the reader, will find this book useful in your preparation to earn this coveted certification.
Best Regards,
Jeff Doyle
As I mentioned in the foreword of the first Chinese version of this volume, I make several trips each year to the People’s Republic of China and have made many friends there; on every trip I meet people who have kind words about Routing TCP/IP Volumes I and II. I am, therefore, very pleased to introduce this Mandarin version of the second edition of Volume I.
Although the first edition of Volume I was first published more than eight years ago, the material it covers remains as relevant today as it was then. Understanding the concepts and protocols in this book is essential for building a foundation of knowledge before progressing to more advanced networking concepts. Too often, engineers try to tackle such difficult topics as IP multicast, complex inter-domain peering, routing policies, and MPLS traffic engineering without first acquiring a firm grasp of the routing basics underlying all of them all. This book, if you study it carefully, will give you that necessary foundation and help you to confidently move on to more advanced subjects.
In the foreword to the previous edition I made several predictions that have since become reality. For example, China now has the world’s largest mobile network, which continues to grow at a tremendous rate. I also predicted that China would become the world leader in IPv6 development and deployment. Through the China Next-Generation Internet (CNGI) project, that prediction is quickly moving to reality. There is no other country in the world for which IPv6 is such an urgent and essential protocol, and therefore the coverage of IPv6 in this second edition is of particular importance to Chinese readers.
The translation of any book into another language is a daunting project, and I would like to offer my warmest gratitudeto Mr. Ge Jian Li for his hard work in making this Mandarin version available to you.
I would also like to thank Mr. Liu Tao and PT Press for making this translation possible.
And finally I would like to thank you, dear reader, and the thousands of other Chinese readers who have made Routing TCP/IP such a success in China.
Best Regards,
Jeff Doyle
Denver,Colorado
自从《TCP/IP路由技术》第一卷和第二卷出版以来,我有了很多机会可以来到中国。这些书在其他国家都没有像在中国这样受到大家的热情关注。因此,我很高兴人民邮电出版社能够在中国出版本书第一卷的中文版本。
在中国,Internet基础设施正在迅猛发展与普及,而且也提供了诸如移动IP和在线游戏之类的服务。在未来的几年,我预计中国将成为IPv6商业化部署的世界领导者。在PC机的拥有量上,中国已经超过了日本,并且在不远的将来,中国会拥有世界上最大的移动网络。所有这些巨大的发展都意味着在将来的10年里,中国对IP网络专家的需求量将会有很大的增长。Cisco认证互联网络专家(CCIE)计划可以为企业管理者提供一个渠道,以便识别出最优秀的互联网络工程师;同时,它也为专业技能的证明提供了确实的依据。因此,CCIE计划在中国互联网络产业的发展中将扮演日益重要的角色。我非常期待读者在获取令人羡慕的认证准备过程中,能从本书获益。
最诚挚的问候
Jeff Doyle
正如我在本卷第一版的中文版序言中所提到的,我每年都会到中国几次,并在中国结识了很多朋友;每次我都遇到一些提及有关《TCP/IP路由技术》卷一和卷二的朋友。现在我非常高兴地把卷一第二版的中文版介绍给大家。
虽然本书第一版的首次出版距今已有8个年头,但它涵盖的一些内容到现在依然实用。了解本书中提及的概念和协议是建立基本知识架构的基础,这将有利于进一步学习更高级的网络知识。我们常常可以看到,一些网络工程师在未牢固掌握路由技术的基本知识之前,就试图去解决诸如IP多播路由、复杂的域间对等体、路由策略以及MPLS流量工程等困难的课题,而这些高级课题都是建立在前者基础之上的。读者如果认真学习本书,将会获取必要的基本知识,从而可以帮助你有信心进一步学习更高级的课题。
在本书第一版的序言中,我的几个预言现在已经变成了现实。例如,中国现在已经具有世界上最大的移动通信网络,并且仍在继续高速发展。我也预言了中国将成为发展和部署IPv6网络的全球领导者。通过中国下一代因特网的项目(CNGI)可以看出,这个预言也将很快变成现实。现今世界上没有哪个国家比中国更迫切需要IPv6协议,因此,在本书第二版中讲述的IPv6技术,对于中国的读者来说显得尤其重要。
把任何一本书翻译成另一种语言都是一件令人生畏的工作,我对本书译者葛建立先生致以最诚挚的谢意,是他所做的努力工作使本书的中文版本得以与读者见面。
我也要感谢人民邮电出版社和刘涛先生使本书中文版的翻译项目变成现实。
最后,我想感谢您,亲爱的读者朋友,以及使《TCP/IP路由技术》在中国如此成功的其他中国读者。
最诚挚的问候
Jeff Doyle
美国科罗拉多州,丹佛
我愿将本书献给我的妻子Sara和我的孩子们:Anna、Carol、James和Katherine。
——Jeff
我愿将本书献给我的丈夫Mike和我的儿子:Mitchell和Jonathan。他们的耐心和支持帮助我得以完成本书。
——Jennifer
感谢Brett Bartow、Chris Cleveland、Andrew Cupp、San Dee Phillips,以及Cisco Press的所有工作人员,是他们的工作与努力使本书得以完成。
我们需要感谢本书的技术编辑Steven Moore、Rena Yang和Frank Knox,感谢他们认真细致的编辑工作以及对本书提出的非常重要的忠告和建议。
我们还要感谢Frank Knox、Carl Pike、Chris Tonini和其他Skylabs网络的工作人员。Skylabs lab为我们提供了设备安装和访问方便的实验室,使我们可以完成本书中所有配置和案例研究所需要的工作。
路由技术即使在最小的数据通信网络中也是基本的要素。在某种程度上,路由技术和路由器的配置是相当简单的。但是,当网络的规模越来越大,并且越来越复杂的时候,路由选择问题就变得比较突出和难以控制了。或许,有点不恰当地说,作为一名网络系统顾问,我应该感谢当前出现的大规模路由技术难题,这些问题给了我谋生的手段。假设没有它们,“你何以为生?”这句习语可能就会不幸地成为我每天生活词汇的一部分了。
Cisco认证互联网专家(CCIE)在大型网络的设计、故障排除和管理能力方面得到广泛的认同。这种广泛的认同来自于这样一个事实:一个网络工作人员仅仅依赖参加一些课程的培训,并反复依赖记忆一些书面测试的内容是不可能成为一名CCIE的。一名CCIE必须通过一个众所周知、难度非常大的、并且需要亲自动手操作的实验室考试,从而使他或者她的专业技能得到提高。
本书是专门讨论TCP/IP路由问题的两卷书中的第一本。在早期撰写本书的第一版时,Cisco Systems的前CCIE项目经理Kim Lew说过:“我们的目标是使人们成为CCIE,而不是使人们通过CCIE实验室考试。”作者完全赞同这种观点,并且把它作为一种指导原则贯穿到本书的写作当中。虽然这本书包括了很多案例研究和练习可以帮助读者准备CCIE实验室考试,但是作者的主要目的还是提高读者对IP路由技术的理解——能有一个普通的水平并能够在Cisco的路由器上进行实现。
本书的读者可以是任何需要完整理解TCP/IP内部路由选择协议的网络设计人员、管理人员或者工程人员。虽然本书的具体实践方面针对Cisco IOS,但是本书的内容也可以应用于
任何路由选择平台。
这本书不仅仅是写给那些计划成为Cisco认证互联网专家的读者阅读的,而且是写给任何希望提高自己的TCP/IP路由技能的读者。这些读者可以划分为以下三类:
“初学者”——具有基本的网络知识,并且希望开始深入学习网络互连的读者;
中级水平的网络专业人员——具有一定的路由器(Cisco或其他厂商的产品)操作经验,并且计划提高自己的技能达到专家水平的读者;
经验丰富的网络专家——这些读者具有丰富和广泛的Cisco路由器的实践经验和专业技能,并且准备参加CCIE实验室考试。但是,这类读者需要自己制定一个复习表和一系列检验与确认自己技能的练习。
本书主要面向具有中级水平的网络专业人员。同时,对于初学者,本书提供了一个网络基本知识的概要。而对于网络方面的专家而言,本书也提供了一些磨炼他们的专业技能所需要的挑战性内容。
第二版所进行的改动受到几个因素的影响。第一个因素是CCIE本身。当笔者撰写本书的第一版的时候,CCIE——现在称为路由选择与交换专业的CCIE——还是Cisco公司提供的惟一的认证考试。目前,已经形成了将CCIE作为塔尖的认证途径的一系列认证。此外,标准的网络互连专业人员也要比1997年具备更多的知识。考虑到这一点,我们删除了原书的第一章,其中包括网桥、路由器和网络地址的最基本的概念(读者在网络中看到网桥设备的最后时间是什么时候?)。
影响本书第二版所做变化的第二个因素是Cisco公司的IOS软件系统的变化。在撰写本书第一版的时候,IGRP协议还经常使用,而现在它已经是一个过时的协议,存在的主要意义就是作为EIGRP协议的前身。因此,在第二版中删除了有关IGRP协议的章节,并在讲述EIGRP协议的章节中将IGRP协议作为历史回顾的一部分来讲述。IOS软件系统的命令集本身也进行了扩展,以便适应新的功能和选项;我们也增加了在20世纪90年代后期还不存在的协议扩展和命令。
最后,IPv6协议在1997年还主要是建议草案,现在却已经处于全球部署的早期阶段了。读者需要了解有关这个协议更为细节的知识,以及在不远的将来支持IPv6的IP路由选择协议扩展方面所需要的知识;如果读者还没有准备好,那么本书深入地探讨了IPv6的路由选择技术。
这个版本的其他一些变化是语法和语义方面的。例如,在第一版中,笔者对作为数据链路的“网络”和作为由路由器连接的网络集的“互连网络”进行了区分。虽然这些术语的确很精确,但也有些呆板,现在已经很少使用“互连网络”这样的术语了。相反,“网络”经常用来表示从本地链路到像Level 3、NTT和Sprint这样的全球自主系统的网络。我们尝试在这个新的版本中带给读者比较现代和通用的术语描述。
本书共有14章,分为3个部分。
第一部分“路由选择的基本知识”介绍了IPv4协议和IPv6协议的基本知识,以及路由技术的基本概念。虽然一些水平较高的读者可能希望跳过第1章,但是我建议这些读者至少应该浏览一下第3章“静态路由”和第4章“动态路由选择协议”的内容。当然,如果读者还不熟悉IPv6协议的话,也必须阅读第2章“IPv6介绍”。
第二部分“内部路由选择协议”包括了IP路由选择的各种内部网关协议。针对具体协议的每一章都是从该协议的基本原理、实现机制以及参数讲解开始的,并在读者对该协议有了一个总体的了解后,接着通过多个不同的网络拓扑环境中的案例研究,详细地讲述了该协议在Cisco路由器上的配置和故障诊断方法。
外部网关协议,BGP协议,还有组播路由选择、服务质量保证、路由器的安全与管理以及网络地址转换等一些主题,将在“TCP/IP路由技术 第二卷”中介绍。
第三部分“路由控制和互操作性”介绍了多种有效的工具,用来创建和管理多个IP路由选择协议的互操作性,例如缺省路由、路由过滤等。同样地,最后部分的这些章节对创建复杂的路由选择策略所需的必要工具做了一个初步介绍,这些策略将会在本书卷二中详细介绍。这些章节和第二部分的章节一样,也是先从概念开始讲解,并以案例研究作为结束。
大多数章节在结束时都配有一组复习题、配置练习和故障诊断练习。复习题主要侧重于每章主题的基本理论方面,而配置和故障诊断练习主要侧重于每章主题在Cisco设备上的实际实现。
在每章末尾还列出了一张命令总结表,简要介绍了在这一章中使用到的Cisco IOS中的所有重要命令。这些命令使用的惯例和Cisco IOS命令参考中使用的惯例是一样的。
本书在介绍命令语法时使用的约定与《IOS命令参考手册》相同,这些约定如下:
粗体字表示实际需要键入的命令和关键字,在实际的配置示例和输出信息(不是一般的命令语法)中,粗体字表示用户手工输入的命令(例如show命令);
斜体字表示需要用实际数值替换的参数;
竖线(|)表示在几个选项中选择一项,并且这些项是互相排斥的;
方括号[ ]表示可选的参数;
大括号{}表示一个必需的选项;
方括号内嵌大括号[{}]表示在一个可选项中的必选项。
译者注:本书第一版出版后,受到了广大读者的关注与厚爱,译者收到许多读者的来信,本书新版对第一版中出现的错误进行了修正,在此感谢读者的批评指正,欢迎广大读者来信交流,译者E-mail:cfa35@126.com。
第1章 ICP/IP回顾
第2章 IPv6概述
第3章 静态路由
第4章 动态路由选择协议
本章包括以下主题:
考虑到这本书的书名是《TCP/IP路由技术》,有必要从回顾TCP/IP的基本知识开始讲起,然后再讲述如何进行TCP/IP路由选择。如果读者正在准备Cisco认证互连网专家(Cisco Certified Internetwork Expert,CCIE)的考试,或者仅仅把本书作为路由选择技术方面的参考书,那么读者大概已经了解了本章所要讲述的大部分内容。但是,如果读者阅读一下本章,作为对基本知识的复习也不是一件坏事,有时还会有所帮助。
本章主要回顾了启用、控制或帮助TCP/IP路由选择的协议,对TCP/IP协议簇并不作深入讨论。本章最后列出的几本参考读物均对TCP/IP进行了深入详细的讲解,读者可以至少选择其中的一本进行阅读。
早在20世纪70年代初期,Vint Cerf和Bob Kahn就对TCP/IP及其分层协议框架进行了构思,它的提出先于ISO的OSI参考模型。本章对TCP/IP协议层的简单回顾有助于读者理解TCP/IP的多种功能与服务是如何进行相互关联的。
图1-1展示了TCP/IP协议簇与OSI参考模型的相互关系。[1] 在TCP/IP协议簇中,网络接口层对应于OSI的物理和数据链路层,但实际上在规范中并不存在这一层。如图1-1所示,作为对物理和数据链路层的表示,它已经成为事实上的一个层次。在本节中,我们将使用OSI的术语——物理和
数据链路层来描述它。
图1-1 TCP/IP协议簇
物理层包含了多种与物理介质相关的协议,这些物理介质用以支撑TCP/IP通信。物理层的协议按照正式的分类可以分为4类,这4类涵盖了物理介质的所有方面:
数据链路层包含了控制物理层的协议:如何访问和共享介质、怎样标识介质上的设备,以及在介质上发送数据之前如何完成数据成帧。典型的数据链路协议有IEEE 802.3/以太网、帧中继、ATM以及SONET。
Internet层与OSI的网络层相对应,主要负责定义数据包格式和地址格式,为经过逻辑网络路径的数据进行路由选择。当然,网络层也是本书内容涉及最多的一层。
与OSI传输层相对应的是主机到主机层,它指定了控制Internet层的协议,这就像数据链路层控制物理层一样。主机到主机层和数据链路层都定义了流控和差错控制机制。二者不同之处在于,数据链路层协议强调控制数据链路上的流量,即连接两台设备的物理介质上的流量;而传输层控制逻辑链路上的流量,即两台设备的端到端连接,这种逻辑连接可能跨越一连串数据链路。
应用层与OSI的会话层、表示层、应用层相对应。虽然一些路由选择协议使用这一层,例如边界网关协议(BGP)、路由选择信息协议(RIP)等 ,[2]但是应用层最常用的服务是向用户应用提供访问网络的接口。
对于图1-1中所示的协议簇和其他协议簇来说,各层之间多路复用是一个通用功能。许多应用可以使用主机到主机层的一个服务,同样许多主机到主机层的服务也可以使用Intenret层。多个协议簇(如IP、IPX、AppleTalk)还可以通过数据链路协议共享一条物理链路。
图1-2给出了IP包头(Packet Header)的格式,相应标准见RFC791。数据包中的大多数字段对路由选择都很重要。
图1-2 IP数据包协议
表1-1 IP版本号
版本号 |
版本 |
RFC |
---|---|---|
0 |
保留 |
|
1~3 |
未分配 |
|
4 |
Internet协议版本4(IPv4) |
791 |
5 |
ST数据报(Datagram)模式 |
1190 |
6 |
简单Internet协议(SIP) |
|
6 |
IPv6 |
1883 |
7 |
TP/IX |
1475 |
8 |
P Internet协议(PIP) |
1621 |
9 |
使用更大地址的TCP和UDP(TUBA) |
1347 |
10~14 |
未分配 |
|
15 |
保留 |
图1-3 服务类型字段(a)或区分服务和ECN(b)字段
在最近几年,ToS字段已经作为区分服务(Diffserv)架构的一部分被重新定义了。1[3]区分服务架构为IP数据包所创建的处理比通过相对严格的ToS定义所允许的处理灵活得多。 在DiffServ下,我们能够在一台路由器上定义服务分类,将数据包归类到这些分类中去。路由器可以根据它们的分类使用不同的优先级对数据包进行排序和转发。每一个排序和转发的处理称为一个Per-Hop Behavior(PHB)。虽然DiffServ定义了这个架构或体系,但这个机制本身称为区分服务类别或简单地称为服务类别(CoS)。
图1-3中的(b)部分显示了ToS字段是如何重新定义的,开始的6个位现在构成了区分代码点(DiffServ Code Point,DSCP)。利用这6个位,我们可以使用任意数值或根据在区分服务体系结构中预先定义的服务类别,最多可以定义64个不同的服务类别,并可整理到PHB中。请注意,在IP报头中的这个字段保留了8位;区分服务体系结构重新定义了路由器对这个字段中数值的解释。
示例1-1 为了测试穿越网络的MTU值,IOS软件中的扩展Ping工具允许设置DF位。在ping的输出信息中,到达目的地172.16.113.17的路径的最大MTU为1 478字节
示例1-2 追踪工具使用TTL字段来标识沿途路由器。星号表示超时数据包
表1-2 一些众所周知的协议号
协议号 |
主机到主机层协议 |
---|---|
1 |
Internet消息控制协议(ICMP) |
2 |
Internet组管理协议(IGMP) |
4 |
被IP协议封装的IP |
6 |
传输控制协议(TCP) |
17 |
用户数据报协议(UDP) |
45 |
域间路由选择协议(IDRP) |
46 |
资源预留协议(RSVP) |
47 |
通用路由选择封装(GRE) |
54 |
NBMA下一跳解析协议(NHRP) |
88 |
Cisco Internet网关路由选择协议(IGRP) |
89 |
开放式最短路径优先(OSPF) |
在Cisco路由器上使用扩展的Ping工具可以调用所有这些选项。示例1-1中使用了记录路由选项,示例1-3使用了松散源路由选择和时间戳选项,严格源路由选择选项在示例1-4中被使用。
示例1-3 使用Cisco的扩展Ping工具来设置IP报头中的可选项字段的各项参数。在这个例子中,用到了松散源路由选择选项和时间戳选项
示例1-4 这里使用扩展Ping在ping数据包中设置严格源路由选择选项
示例1-5显示了协议分析器捕获到的IP报头的信息。请与图1-2中的信息作一下比较。
示例1-5 在协议分析器的窗口中,可以看到IP包头各字段及每个字段的值
IPv4地址长度为32位。像所有其他网络层地址一样,IPv4地址也包括网络号和主机号两部分。网络号部分惟一地标识了一条物理链路或逻辑链路,对于与该链路相连的所有设备来说网络号部分是共同的。而主机号部分惟一地标识了该链路上连接的具体设备。
有几种方式可以表示IP地址的32位。举例来说,32位的IP地址 00001010110101100101011110000011可以用十进制表示为181 819 267。
由此可见用二进制表示IP地址十分麻烦,而全部32位数字用十进制格式表示计算起来又很耗时。图1-4给出了一种更好的表示方法。
32位的地址包含4个字节,每个字节均可以用0~255之间的十进制数表示,而每个十进制数之间用点号分隔。在图1-4中,将32位的地址映射到用点分十进制法表示的地址上。[8]
图1-4 虽然使用点分十进制表示法书写IP地址十分方便,但是不要将它与路由器(或主机)所看到的32位字符串混淆起来
在使用IPv4地址时需要记住一点,点分十进制表示法便于人们阅读和书写,而路由器更适合使用32位的二进制串,而不是按照4个八位组的方式读取地址。牢记这一点可以避免许多易犯的错误。如果读者没有接触过二进制数,特别是二进制与十进制之间的转换方法,那么建议读者在继续学习这一章的内容之前可以阅读一下附录A的内容。
IP地址与众不同的特性可能就是,IPv4地址不像其他网络层地址的网络号和主机号是固定不变的,IP地址的网络号和主机号可以在32位的界线内发生变化。也就是说,IP地址的网络号和主机号都有可能占据32位中的大多数位,也可能两者平分32位。例如NetWare和AppleTalk协议,由于它们主要用于相对较小的网络,所以协议的网络层地址的网络号和主机号长度是固定。这样的安排的确使得工作更加容易,接收设备可以从地址中读入固定的位来获取网络号,剩下的位便是主机号。
然而,TCP/IP从最初设计出来到现在可以灵活地应用于任何网络,从很简单的几个功能发展成为一个庞大的协议簇。TCP/IP这种适应性使得IP地址的管理更加困难。本节仅介绍了IP地址管理的一些基本内容,在第6章中将会介绍一些更高级的技术。
如果不对网络作太过精确的划分,那么网络可以按照主机数量分为3类:大型网络、中型网络和小型网络。
对于这3种规模的网络,高层的地址划分要求有3种类型的网络地址。面向大型网络的地址需要有能力为大量的主机编址,但是由于大型网络的数量有限,所以大型网络仅需要少量的网络地址。
而对小型网络来说情况又颠倒过来了,因为小型网络数量庞大,所以需要大量的小型网络的网络地址。但是小型网络主机有限,所以仅需要少量主机地址。
对于中等规模的网络来说,网络地址和主机地址的需求量均趋于中等水平。
图1-5显示了3类IPv4地址的网络号和主机号是怎样划分的。
图1-5 A、B和C类IPv4地址格式
迄今为止,对于所描述的大型、中型和小型网络,是按照如下方式映射到各类地址的:
因为所有的IPv4地址都是32位二进制字符串,所以需要某种方法来区分一个特定地址到底是属于哪一类地址。表1-3所示的首个八位组规则提供了这种方法,如下所述:
表1-3 首个八位组字节规则
规则 |
最小值与最大值 |
十进制范围 |
---|---|---|
A类:第一位恒为0 |
00000000=0 |
1~126* |
B类:第一、二位恒为10 |
10000000=128 |
128~191 |
C类:第一、二、三位恒为110 |
11000000=192 |
192~223 |
* 0和127保留。
到目前为止,IPv4的编址看上去并不是十分困难。路由器和主机通过首个八位组字节规则能够很容易地确定IP地址的网络号。如果第1位是0,需要读取前8位才能获取网络地址;如果前两位是10,那么需要读取16位;如果前3位是110,则需求读取24位才能获取网络号。不幸的是,事情并不会这样简单。
表示整个数据链路的地址——非特指某台主机的网络地址,可以用IP地址的网络部分来表示,其中主机位全部为0。例如,IP地址管理机构[11]可以将172.21.0.0[12]分配给一个申请者。因为172在128和191之间,所以这是一个B类地址,其中后两个八位组作为主机位,全部被设置为0。虽然前16位(172.21.)已经被指定,但是地址所有者有权决定后16位主机位的使用。
每一台设备和接口都将被分配一个惟一的、主机号明确的地址,例如172.21.35.17。不管设备是路由器还是主机,显然都需要知道自身的地址,而且它还需要能够确定它所属的网络,在这个案例中,它属于172.21.0.0。
这一任务通常由地址掩码来完成。地址掩码是一个32位的字符串,与IPv4地址的每一位相对应。掩码也可以像IPv4地址一样用点分十进制表示。这种表示方法会成为某些初学者的绊脚石。虽然地址掩码可以用点分十进制书写,但是它并不是一个地址。表1-4给出了对应于3类IPv4地址的标准地址掩码。
表1-4 A类、B类和C类IPv4地址的地址掩码
类 |
掩码 |
点分十进制表示 |
---|---|---|
A |
11111111000000000000000000000000 |
255.0.0.0 |
B |
11111111111111110000000000000000 |
255.255.0.0 |
C |
11111111111111111111111100000000 |
255.255.255.0 |
对于每一位IPv4地址位,设备会拿它与地址掩码的对应位进行布尔(逻辑)AND操作。AND函数表述如下:
比较两位并得出结果。当且仅当两位全部为1时,结果为1。如果两位中任意一位为0,则结果为0。
对于一个指定的IPv4地址,图1-6给出了怎样用地址掩码确定网络地址。地址掩码值为1 的位对应于地址的网络位,值为0的位对应于主机位。因为172.21.35.17是B类地址,所以掩码前两个八位组必须全部设置为1,后两个八位组,即主机号的所有位必须设置为0。参见表1-4,这个掩码的点分十进制表示为255.255.0.0。
在IPv4地址和地址掩码的每一位上执行逻辑“与”(AND)操作,结果如图1-6所示。在结果中,网络位不变,所有主机位则变为0。通过向接口分配地址172.21.35.17和掩码255.255.0.0,设备将会知道接口属于网络172.21.0.0。对IPv4地址和掩码应用AND操作总能够得到网络地址。
图1-6 B类地址的每一位与地址掩码的对应位进行AND操作,然后得到网络地址
通过下面命令可以向Cisco路由器的接口分配地址和掩码(本例中接口为E0):
Smokey(config)# interface ethernet 0
Smokey(config-if)# ip address 172.21.35.17 255.255.0.0
但是为什么要使用地址掩码?到目前为止,使用首个八位组字节规则看上去更简单一些。
首先,决不要忽略网络层地址的必要性。为了完成路由选择,每个数据链路(网络)都必须有一个惟一的地址;另外,数据链路上的每台主机也必须有一个地址,这个地址不仅标识主机为一个网络成员,还可以把主机与网络上的其他主机区分开来。
到目前为止的定义中,一个A类、B类或C类地址仅仅能用在一个单一网络中;为了建立一个网络,每个数据链路都必须使用不同的地址,以便这些网络可以被惟一地标识。如果每一个数据链路都使用一个单独的A类、B类或C类地址,那么即使用尽所有的IPv4地址,也只能给少于1700万个数据链路分配地址。显然,这种方法是不切实际的,[13] 在前面的例子中,如果充分地使用主机地址空间,那么在数据链路172.21.0.0中的设备数目可以超过65 000!
使A类、B类或C类地址实用化的惟一方法是对主网地址进行划分,例如将172.21.0.0划分为子网地址。请回忆两个事实:
如图1-7所示,分配给网络的地址为B类地址172.21.0.0。5个数据链路将主机和路由器互连起来,每个数据链路都需要一个网络地址。按照目前的情况,172.21.0.0必须分配给其中的一个数据链路,那么另外4个数据链路还需要4个地址。
注意图1-7所示,地址掩码并不是标准的16位B类地址掩码;而是被扩展了8位,以便IP地址的前24位都被解释为网络位。换句话说,掩码使路由器和主机把读取的前8位主机位作为网络地址的一部分。结果是,主网络地址应用于整个网络,而每一个数据链路则变为一个子网(subnet);一个子网是一个主A类、B类或C类地址空间的一个子集。
现在,IPv4地址包括3个部分:网络部分、子网部分和主机部分。地址掩码现在变为子网掩码,或比标准地址掩码长的掩码。地址的前两个八位组依然是172.21,但是第3个八位组——主机位已经由子网位代替——的变化范围为0~255。在图1-6中的网络有子网1、2、3、4和5(172.21.1.0~172.21.5.0)。在单一B类地址下最多可以有256个子网,对应的掩码如图1-7所示。
图1-7 通过向主机位借位用作子网位,子网掩码使一个单一的网络地址可以用于多个数据链路
下面给出两点告诫。首先,并不是所有路由选择协议都支持子网地址,即子网位全0或全1。因为这些协议是有类别化协议,它们不能区分一个全0子网和主网络号。例如,在图1-7中子网0为172.21.0.0;而主网IP地址也为172.21.0.0。没有更多信息将无法区分二者。
同样的,有类别路由选择协议也不能区分全1子网的广播地址和一个所有子网的广播地址。[14]例如,图1-7中的全1子网为172.21.255.0。对于这个子网,广播地址是172.21.255.255,但是这也是在主网172.21.0.0的所有子网上所有主机的广播地址。没有更多的信息也无法区分二者。第1版RIP协议和IGRP协议都是有类别路由选择协议;第7章将会介绍无类别路由选择协议,这种路由选择协议才可以真正地使用全0或全1子网。
其次是与子网及其掩码的口头表述有关。在图1-7中,对B类地址的第3个八位组进行子网划分是非常普遍的,但还常常听到人们这样表述子网设计:“B类地址使用C类地址掩码”,或者“将B类地址划分为C类地址”。这两种表述都是错误的。它们常常会对子网设计引起误解或者是不准确的理解。对于图1-6中所示的子网划分图解的正确表述应该是“一个使用8位进行子网划分的B类地址”或者“一个带有24位掩码的B类地址”。
可以用以下3种格式中的任何一种表示子网掩码:
点分十进制:255.255.255.0
位计数:172.21.0.0/24
十六进制:0xFFFFFF00
虽然位计数格式变得渐渐流行起来,但是点分十进制暂时一段时期仍旧经常使用在一些软件里面。与点分十进制相比,位计数格式更容易书写(地址后面是/,/后面紧跟着是网络部分的位计数)。另外,位计数格式可以更清楚地描述掩码的实际作用,因而可以避免前面段落出现的语义误解问题。某些UNIX系统使用十六进制格式。
虽然在Cisco路由器中必须使用点分十进制方式表示地址掩码,但是在行配置模式下使用命令ip netmask-format[decimal|hexadecimal|bit-count],可以设置使用3种格式中的任何一种格式显示掩码。例如,为使路由器以位计数格式显示掩码,配置如下:
Gladys(config) # line vty 0 4 Gladys(config-line)# ip netmask-format bit-count
如前面部分所述,在有类别地址环境中,子网位不能全部为0或全部为1。同样的,一个主机的IPv4地址也不能将主机位全部设置为0,这种用法是为路由器保留的,用于表示网络和子网自身。当然IPv4地址的主机位也不能全部被设置为1,因为它用于表示广播地址。所有这些限制无一例外地适用于IP地址的主机位,并且这也是子网规划的起点。除了这些限制,网络设计人员还需要根据地址空间与网络详细的匹配程度来选择最合理的子网划分方案。
在规划子网和子网掩码时,可以使用相同的公式计算一个主网地址下可用的子网数以及每个子网内可用的主机数,公式为:2n−2,其中n表示子网位数或主机空间,2表示减去全0和全1两个不可用地址。例如,给定一个A类地址10.0.0.0,子网掩码10.0.0.0/16(255.255.0.0)意味着有8位子网空间,也就是可以产生28−2 =254个子网,每个子网可以有216−2=65 534个主机地址。 另一方面,掩码10.0.0.0/24(255.255.255.0)表示有16位子网空间,可以产生65 534个子网,其中8位主机空间可以在某个子网中产生254个主机地址。
下面是IPv4地址子网划分的步骤:
步骤1:确定需要多少个子网,每个子网需要多少台主机。
步骤2:为了满足第1步提出的需求,使用公式2n−2确定子网位数和主机位数。如果存在多个子网掩码可以满足第1步需求,那么选择最能够符合未来需求的一个。例如,如果网络最有可能通过增加子网发展起来,那么选择子网位最多的掩码;如果网络最有可能借助增加现有子网内的主机数发展起来,则选择主机位最多的掩码。为了避免所选择的方案中的子网及子网内的主机地址被迅速地用完,需要为将来的发展预留一些空间。
步骤3:使用二进制进行计算,在子网空间中确定所有的位组合方式。在每种组合方式中,将所有主机位都设置为0,将得到的子网地址转换为点分十进制格式。最终结果就是子网地址。
步骤4:对于每一个子网地址,再次使用二进制,在保持子网位不变的情况下写出所有主机位组合,并将结果转换成点分十进制格式。最终结果就是每个子网的可用主机地址。
这里没有过分强调在最后两步中使用二进制的重要性。当进行子网划分时,最主要的惟一错误根源就是,在没有理解在二进制上会发生什么的情况下试图使用点分十进制方法。此外,点分十进制表示法对于人们读写IPv4地址十分方便。但是路由器和主机却把地址看作32位二进制字符串;为了顺利地完成地址操作,必须采用路由器和主机处理地址的方式。
就目前给出的例子而言,作者在前面的段落中似乎有点多虑了。在没有限定必须使用二进制方式表示地址和掩码的时候,子网模式和主机地址看上去还是十分清楚的。下面小节将讨论使用4个步骤完成子网规划,在那里点分十进制表示法将十分不明确。
到目前为止,在给出的例子中,子网空间都是以八位组为界线的。但这并不总是最实用或最有效的选择。例如,如果你需要对一个B类地址进行子网划分,并满足以下需求:数据链路数为500,每个数据链路内主机数不超过100台,应该怎么办?这样的需求很容易得以满足,只要使用9位子网位,就可以得到29−2=510个子网,剩下7位做主机位,每个子网的可用主机数为27−2=126。除此不再有其他位组合可以满足上面的需求。
请注意,如果还是以八位组为界线的话,那么将无法对C类地址进行子网划分。如果要这样做就会占用最后1个八位组,那么就没有更多主机位了。因此,如下面的例子所示,子网位和主机位必须共享最后1个八位组。
图1-8与图1-7中显示的网络除了分配的地址是C类地址192.168.100.0之外,其他完全相同。
图1-8 除了分配C类地址之外,这里沿用图1-7给出的网络。如果子网位占用整个八位组,
那么将无法进行划分,因为主机位将没有空间
在这个网络中共有5条数据链路,因此至少需要划分出5个子网地址。图中还指明了每个子网需要分配的主机数(包括路由器接口)。其中两个以太网最多需要25个主机地址。所以完整的子网划分最小需求是5个子网,每个子网至少需要25个主机地址。
使用公式2n−2可以计算出,3个子网位和5个主机位即可以满足需求:23−2=6,25−2=30。带有3位子网位的C类地址掩码可以用点分十进制表示为255.255.255.224。
图1-9给出了子网位的推导过程。用二进制表示第2步计算出的子网掩码,子网掩码下面是IP地址。垂直线标记了子网空间,从二进制0开始计数,在这一空间中的所有位组合均被写出。
图1-9 从标记的子网空间中可以得到子网位,接着从二进制0开始计数,给出子网空间中所有可能的位组合
在图2-10中,不发生变化的网络位填写在子网空间的左边,全部为0的主机位填写在子网位的右边。结果被转换为点分十进制表示后,得到6个子网地址(记住,第一个和最后一个地址,即在子网空间中全部位为0和全部位为1的地址不能使用)。
图1-10 将网络地址填写在子网空间的左边,全部为0的主机位置填写在子网空间的右边,并将结果用点分十进制表示后得到子网地址
最后一步是计算每个子网内的可用主机地址。这一步通过以下方式完成:首先选择一个子网地址,保持其中的网络位和子网位不变,从二进制0开始计数,写出主机空间中所有的位组合。图1-11给出了针对子网192.168.100.32的计算过程。
注意结果的模式:第一个地址所有主机位全部为0,这是子网地址。最后一个地址主机位全部为1,这是子网192.168.100.32的广播地址。主机地址从子网地址起到广播地址为止。按照顺序,下一个子网地址是192.168.100.64。
现在,在二进制层次上理解子网划分的重要性就显而易见了。给出一个地址,如192.168.100.160,你不能确定它是否是一个主机地址、子网地址或广播地址。甚至在子网掩码已知情况下,结论也并不总是明显的。
这里我们鼓励读者计算例子中所有余下子网的主机地址,并且仔细观察产生地址的模式,理解这些模式对下一部分的内容会有帮助。
图1-11 写出主机空间中所有位组合可以得到子网内的主机地址。这里是子网192.168.100.32的主机位
在“解剖”一个给定的主机地址和掩码时,常常需要确定地址属于哪个子网。例如,如果在一个接口上配置了地址,一个很好的实践就是首先验证对于接口连接的子网来说该地址是否合法。
使用下面的步骤逆推一个IP地址:
步骤1:用二进制写下一个给定的子网掩码。
步骤2:用二进制写下一个主机IPv4地址。
步骤3:在知道一个地址的类别后,掩码的子网位便是显然的了。根据掩码位,在最后网络位和第1个子网位之间画一条线,在最后子网位和第1台主机之间也画另一条线。
步骤4:写下地址的网络位和子网位,设置所有的主机位为0。最终的结果就是主机地址所属的子网地址。
步骤5:再次写下地址的网络位和子网位,这次设置所有主机位为1。结果就是本子网的广播地址。
步骤6:按照顺序可以知道第一个地址是子网地址,最后一个地址是广播地址。而且还可以知道在这两个地址之间的所有地址都是合法的主机地址。
对于地址172.30.141/25,图1-12给出了以上步骤的示例。
这个地址是B类地址,所以前16位是网络位,25位掩码中的后9位是子网位。可以发现子网地址是172.30.0.128,广播地址是172.30.0.255。在这两个地址之间的主机地址对于这个子网来说都是合法的,如对子网172.30.0.128来说,172.30.0.129~172.30.0.254都是主机地址。
图1-12 给定一个IPv4地址和子网掩码,按照以上这些步骤可以找出子网地址、广播地址和主机地址
在这个例子中,初次进行子网划分的人可能会受到以下几种情况的干扰。一种是地址的第3个八位组所有位都为0。另一种是最后一个八位组仅一个子网位。一些人可能会认为广播地址看上去不合法。所有这些不舒服的感觉都源自地址的点分十进制表示法。当使用二进制表示地址和掩码时,这些疑虑会被打消,任何事看上去都一切正常,掩码设定了9位子网空间——包括第3个八位组和第4个八位组的第1位。这个案例说明了如果使用二进制表示法时一切正常,那么就不必担心看上去有些奇怪的点分十进制表示法。
第1章解释了通过读取和操作数据包的网络地址,路由器可以沿逻辑路径传送数据包,其中逻辑路径包括多个数据链路。沿独立的数据链路传送数据包时,需要把数据包封装在帧中,并且使用数据链路标识(如MAC地址)让帧可以从链路的源点到达目的地。本书的主题之一是为了进行路由选择,路由器利用何种机制发现并共享地址信息。类似的,数据链路上的设备也需要一种方法发现邻居的数据链路标识,以便将数据帧传送到正确的目的地。
有几种机制可以提供这些信息;[15] IPv4使用地址解析协议(ARP),详见RFC826。图1-13给出了ARP的工作机制。当一台设备需要发现另一台设备的数据链路标识符时,它将建立一个ARP请求数据包。这个请求数据包中包括目标设备的IPv4地址以及请求设备(发送者)的源点IPv4地址和数据链路标识符(MAC地址)。然后ARP请求数据包被封装在数据帧中,其中带有作为源的发送者的MAC地址和作为目标的广播地址(参见示例1-6)。[16]
图1-13 ARP用于把设备的数据链路标识符映射到它的IP地址上
示例1-6 协议分析器捕捉到图1-13所描述的ARP请求数据包及封装帧
广播地址意味着数据链路上的所有设备都将收到该帧,并且要检查帧内封装的数据包。除了目标机可以识别此数据包外,其他所有设备都会丢弃此数据包。目标机将向源地址发送ARP响应数据包,提供它的MAC地址(参见示例1-7)。
示例1-7 协议分析器捕捉的图1-13所描述的ARP响应数据包
当调用调试功能debug arp时,Cisco路由器可以显示ARP的活动情况,参见示例1-8。
示例1-8 路由器Aretha(172.21.5.1)响应来自主机172.19.35.2的ARP请求
图1-14给出了ARP数据包的格式。这里可以把图中描述的各字段同示例1-6和示例1-7的ARP数据包相对照。
图1-14 ARP数据包格式
表1-5 常用的硬件类型码
编号 |
硬件类型 |
---|---|
1 |
以太网 |
3 |
X.25 |
4 |
Proteon ProNET Token Ring |
6 |
IEEE 802 网络 |
7 |
ARCnet |
11 |
Apple LocalTalk |
14 |
SMDS |
15 |
帧中继 |
16 |
异步传输模式(ATM) |
17 |
高速数据链路控制(HDLC) |
18 |
光纤信道 |
19 |
异步传输模式(ATM) |
20 |
串行链路 |
最后20个八位组是发送者和目标机的数据链路标识符和IPv4地址。
在示例1-9所示屏幕的最上面,命令show arp用于检查Cisco路由器内的ARP表。
示例1-9 连接到相同网络上的3台设备的ARP表:Cisco路由器,Windows主机和Linux主机
请注意年龄一栏,这一栏表明为了防止陈旧信息充满ARP表,每经过一个特定的实际间隔,ARP信息将会被刷新。Cisco路由器保存ARP表项的时间为4个小时(14 400s);这个缺省值可以修改。下面的例子就是将ARP的超时值修改为30min(1 800s):
Martha(config)# interface Ethernet 0 Martha(config-if)# arp timeout 1800
示例1-9所示屏幕的中间给出了Windows PC的ARP表,屏幕底部给出了Linux机器的ARP表。虽然它们的格式不同于Cisco路由器的ARP表,但是3个表中的实质性信息是相同的。
ARP表项还可以永久地保存在表中。为了实现地址172.21.5.131到硬件地址0000.00a4.b74c的静态映射,并且采用SNAP(Subnetwork Access Protocol)封装类型,可以使用以下命令完成:
Martha(config)# arp 172.21.5.131 0000.00a4.b74c snap
命令clear arp-cache可以从ARP表中强制删除所有动态表项。并且此命令也可以清除快速交换高速缓冲区和IP路由高速缓冲区中的内容。
ARP还有几种变形,其中至少有一种对路由选择十分重要,它就是代理ARP。
代理ARP有时也被叫做混杂ARP,详见RFC925和RFC1027,代理ARP被路由器作为向主机表明自身可用的一种手段。例如,主机192.168.12.5/24需要向主机192.168.20.101/24发送数据包,但是它没有配置缺省网关信息,因而也就不知道如何到达路由器。这时它可以向192.168.20.101发送一个ARP请求;本地路由器收到这一请求,并且路由器知道如何到达网络192.168.20.0,因此路由器将回复以上请求,其中把自己的数据链路标识符作为ARP回复数据包中的硬件地址。事实上,路由器欺骗了本地的主机,让它认为路由器的接口就是192.168.20.101的接口。最终所有发向192.168.20.101的数据包都被送往路由器。
图1-15给出了代理ARP的另一种用途。这里特别关注的是地址掩码。路由器配置的掩码是28位掩码(4个子网位的C类地址),而主机配置的是标准的C类地址掩码(24位)。
图1-15 代理ARP实现了子网划分的透明性
其结果是主机并不知道子网的存在。当主机192.168.20.66想发送数据包到192.168.20.25时,它首先将发送ARP请求。这时路由器识别出数据包的目标地址属于另一个子网,因而向请求主机回复自己的硬件地址。这种代理ARP使得子网化网络拓扑结构对主机来说是透明的。
示例1-10所示的ARP高速缓冲暗示了代理ARP的又一用途。注意,有多个IPv4地址映射到单一的MAC标识符;其中IP地址对应着主机,而硬件MAC标识符属于路由器接口。
示例1-10 图1-15中主机192.168.20.66的ARP表显示出多个IPv4地址映射到单一MAC标识符,这说明正在使用代理ARP
在IOS系统中,缺省情况下代理ARP功能是打开的,当然也可以在每个接口上使用命令no ip proxy-arp关闭此功能。
主机偶尔也会使用自己的IPv4地址作为目标地址发送ARP请求。这种ARP请求称为无故ARP,主要有两个用途:
许多IP实现中都没有实现无故ARP功能,但是读者应该知道它的存在。在IOS系统中缺省情况下是关闭的,但可以通过命令ip gratuitous-arps激活它。
代替映射硬件地址到已知IPv4地址,反向ARP(RARP)可以实现IPv4地址到已知硬件地址的映射。某些设备,如无盘工作站在启动时可能不知道自己启动时的IPv4地址。嵌入这些设备固件中的RARP程序可以允许它们发送ARP请求,其中硬件地址为设备的硬件编入地址。RARP服务器将会向这些设备回复相应的IPv4地址。
RARP在很大程度上正在被动态主机配置协议(DHCP)和自举协议(BOOTP)的扩展协议所替代,不同于RARP,这两种协议都可以提供IPv4地址以外的更多信息,而且还可以跨越本地数据链路。
Internet消息控制协议(ICMP)指定了多种消息类型,这些消息的共同目的就是管理网络,详见RFC792。ICMP的消息可以分为错误消息、请求消息和响应消息。图1-16给出了一般的ICMP数据包格式。数据包可以通过类型来标识,许多数据包类型都有多个指定的类型,可以用代码字段来标识它们。表1-6列出了多种ICMP的数据包类型和代码,详见RFC1700。
图1-16 ICMP数据包头包括类型字段,进一步标识某些类型的代码字段和校验和。
剩余的字段依赖于特定类型和代码
表1-6 ICMP数据包类型字段和代码字段
类型 | 代码 | 名称 |
0 | 0 | 回应应答 |
3 | 目的地不可达 | |
0 | 网络不可达 | |
1 | 主机不可达 | |
2 | 协议不可达 | |
3 | 端口不可达 | |
4 | 需要分段和不需要分段标记置位 | |
5 | 源路由失败 | |
6 | 目的网络未知 | |
7 | 目的主机未知 | |
8 | 源主机被隔离 | |
9 | 与目的网络的通信被禁止 | |
10 | 目的主机的通信被禁止 | |
11 | 对请求的服务类型,目的网络不可达 | |
12 | 对请求的服务类型,目的主机不可达 | |
4 | 0 | 源抑制(Source Quench) |
5 | 重定向 | |
0 | 为网络(子网)重定向数据报 | |
1 | 为主机重定向数据报 | |
2 | 为网络和服务类型重定向数据报 | |
3 | 为主机和服务类型重定向数据报 | |
6 | 0 | 选择主机地址 |
8 | 0 | 回应 |
9 | 0 | 路由器通告 |
10 | 0 | 路由器选择 |
11 | 超时 | |
0 | 传输中超出TTL | |
1 | 超出分段重组时间 | |
12 | 参数问题 | |
0 | 指定错误的指针 | |
1 | 缺少需要的选项 | |
2 | 错误长度 | |
13 | 0 | 时间戳 |
14 | 0 | 时间戳回复 |
15 | 0 | 信息请求(废弃) |
16 | 0 | 信息回复(废弃) |
17 | 0 | 地址掩码请求(即将废弃) |
18 | 0 | 地址掩码回复(即将废弃) |
30 | - | 路由跟踪 |
示例1-11和示例1-12给出了协议分析器捕捉到的两种众所周知的ICMP消息——Echo请求和Echo回复,它们常用在ping命令的功能中。
示例1-11 ICMP的Echo消息及其IPv4头部
示例1-12 ICMP的Echo回复消息
虽然大部分ICMP类型都与路由选择功能有关,但是有3个类型特别重要:
示例1-13 使用调试功能debug ip icmp,可以看到路由器向主机10.158.43.25发送了一个重定向消息,通知它到达目的地10.158.40.1的正确网关应该是路由器10.158.43.10
当数据链路上连接多台路由器时,避免数据包重定向的一个窍门是将每一台主机的缺省网关设置为主机自己的IPv4地址。于是主机对任何目的地址都会发送ARP请求,当目的地址不属于本地数据链路时,合适的路由器将通过代理ARP功能回复请求。使用这种策略避免重定向是有争议的,因为重定向会被减少或消除,但是ARP的流量又增加了。
在IOS软件系统中,缺省状态下重定向功能是打开的。在接口上使用命令no ip redirects可以关闭此功能。
TCP/IP协议的主机到主机层的命名恰如其分。尽管网络层负责网络之间的逻辑路径,但主机到主机层是负责两个在完全不同网络[18]上的主机之间的全程逻辑路径。从另一个角度看,主机到主机层向应用提供了一个到协议簇下一层的接口,使应用不必关心它们的数据实际上是如何被传送的。
可以把这种服务比喻为公司的信件收发室。一个包裹被送到收发室,并附有邮寄要求(平信或隔日送到)。提出邮寄要求的人不需要知道或可能不关心实际是怎样邮寄此包裹的。收发室的工作人员将会安排合适的邮寄方式来满足其要求(送邮局邮寄、FedEx、交给骑自行车横穿城镇送快件的人)。
主机到主机层提供两个主要的服务:TCP和UDP。
传输控制协议(TCP),向应用提供了可靠的、面向连接的服务,详见RFC793。换句话说,TCP提供了一个类似于点到点的连接。
点到点连接有两个特点:
TCP提供了一条看似点到点的连接,虽然实际上这条连接并不存在。TCP利用的Internet层可以提供无连接的、尽力而为转发的服务。这类似于邮政服务。一叠信一旦交给邮递员后,谁也不能保证信件将按照原先叠放的顺序依次送达,也不能保证信件都将在同一天送到,甚至不能保证全部送到。邮政服务仅仅能承诺尽最大努力邮寄这些信件。
同样的,Internet层不保证所有的数据包使用相同的路径,因而也不保证数据包到达时仍旧保持发送时的顺序和间隔或者全部到达。
另一方面,电话呼叫是一个面向连接的服务。数据必须顺序、可靠地到达,否则数据就会作废。像电话呼叫一样,TCP首先必须建立连接,然后是传送数据,当数据传送完成后要拆除连接。
在无连接服务之上,TCP使用了3种基础的机制实现面向连接的服务:
TCP在应用层数据上附加了一个报头,报头包括序列号字段和这些机制的其他一些必要信息,如叫做端口号的地址字段,该字段可以标识数据的源和目标应用程序。为了传送数据,应用数据及附加的TCP报头被封装在IP数据包内。图1-17显示了TCP数据报头字段,示例1-14显示了协议分析器获取的TCP报头信息。
图1-17 TCP报头格式
示例1-14 协议分析器显示出的TCP报头
用户数据报协议(UDP)提供了一种无连接、尽力而为传送的数据包转发服务,详见RFC 768。起初,对应用程序宁愿使用不可靠的转发服务,而不用面向连接的TCP服务,感觉很有疑问。然而UDP的优点是不花时间建立连接,直接发送数据。用UDP代替TCP,可以使发送小数据量的应用取得更好的性能优势。
图1-18中给出了UDP的另一个优点:UDP报头长度远远小于TCP报头长度。UDP报头中的源端口和目的端口字段与TCP完全相同;UDP的长度指明了以八位组为单位的整个段长度。校验和包括整个段,但是不同于TCP,在这里,校验和是可选的;当不使用校验和时,此字段全部设置为0。在示例1-15中显示出协议分析器捕捉到的UDP报头。
图1-18 UDP报头格式
示例1-15 协议分析器显示的UDP报头
本章重点讲述了设备的Intenret层(或OSI网络层)的自我标识机制以及Intenret层是怎样映射到网络接口层(OSI数据链路)的。本章还分析了像ARP、ICMP这样的Intenret层协议对路由选择的重要性。下一章将研究IP协议的新版本——IP版本6,它与IPv4的不同之处,以及为什么需要新版本的IP协议的原因。
命令 |
描述 |
---|---|
arp ip-address hardware-address〔alias〕 |
静态地映射IP地址到硬件地址 |
arp timeout seconds |
设置Cisco路由器保留ARP表项的时间值 |
clear arp-cache |
强制从ARP表中删除所有动态表项 |
debug ip icmp |
显示在路由器上出现的ICMP事件 |
ip address ip-address mask〔secondary〕 |
为接口分配IP地址和掩码 |
ip gratuitous-arp |
启动无故ARP特性 |
ip netmask-format{bit-count|decimal|hexadecimal} |
配置路由器,使路由器可以用位计数、点分十进制和十六进制方式显示IP(地址,掩码)对 |
ip proxy-arp |
启用代理ARP |
ip redirects |
启用ICMP重定向功能 |
Baker, F., ed.“Requirements for IP Version 4 Routers,”RFC 1812, June 1995.
这篇文章给出了对要运行IP协议的路由器的要求和建议。
Braden, R., ed.“Requirements for Internet Hosts—Communication Layers,”RFC 1122, October 1989.
RFC 1812的姊妹篇,中心内容是主机。
Comer, D. E. Internetworking with TCP/IP, Vol. 1. Englewood Cliffs, New Jersey: Prentice-Hall; 1991.
这本书,就像Perlman的著作一样,是一本经典书。尽管你不一定要把Comer和Stevens的书都读,但是如果都能阅读的话,对你绝不会有坏处。
Stevens, W. R. TCP/IP Illustrated, Vol. 1. Reading, Massachusetts: Addison-Wesley; 1994.
这是一本关于TCP/IP的好书。Stevens在深入地介绍协议的同时,针对封二上的网络图提供了大量现实网络的细节。
1.TCP/IP协议簇的5个层次是什么?每一层的目的是什么?
2.目前最常用的IP版本是什么?
3.什么是分段?IP报头的什么字段用于分段?
4.IP报头中的TTL字段的用途是什么?TTL过程是如何工作的?
5.什么是首个八位组字节规则?
6.怎样识别点分十进制表示的A类、B类和C类地址?怎样识别二进制表示的地址?
7.什么是地址掩码?它是如何工作的?
8.什么是子网?在IP环境中为什么使用子网?
9.为什么在有类别路由选择环境中子网位不能全部为0或1?
10.什么是ARP?
11.什么是代理ARP?
12.什么是重定向?
13.TCP和UDP的本质区别是什么?
14.TCP提供面向连接服务的机制是什么?
15.为了替代ARP,Novell NetWare用设备的MAC地址作为网络地址中的主机部分。为什么IP不能这样做?
16.UDP通过在无连接服务之上提供无连接服务的目的是什么?
1.首个八位组字节规则指出最高的C类地址是223,而我们知道八位组的最大十进制数是255。因而还有两类地址,一类是D类地址,用于组播,另一类是E类地址,用于实验。其中D类地址的前4位为1110。请问D类地址首个八位组的十进制数的范围是什么?
2.为10.0.0.0选择一个子网掩码以便至少可以划分出16 000个子网,并且每个子网至少拥有700个主机地址。为172.27.0.0选择子网掩码以便至少可以划分出500个子网,并且每个子网至少拥有100个主机地址。
3.如果C类地址有6个子网位,那么可以划分出多个子网?每个子网有多少个主机地址?这样的子网规划有实际用途吗?
4.对地址192.168.147.0进行子网划分,子网掩码为28位,请写出所有子网。试给出每个子网的可用主机地址。
5.对地址192.168.147.0进行子网划分,子网掩码为29位,请写出所有子网。试给出每个子网的可用主机地址。
6.对地址172.16.0.0进行子网划分,子网掩码为20位,试给出每个子网的可用主机地址(地址按照最低到最高顺序给出)。
1.根据以下主机地址和子网掩码,试找出每个地址所属的子网,并且找出该子网中的广播地址和可用主机地址的范围:
10.14.87.60/19
172.25.0.235/27
172.25.16.37/25
2.请问接口上配置IP 地址192.168.13.175,掩码255.255.255.240,会有问题吗?如果有,问题是什么?
[1] 除了少数例外,OSI协议簇本身已经成为Internet历史早期的遗留产物。当前OSI协议对于网络技术的贡献看来主要是在对学习网络的学生讲述模块化的协议簇时,可以引用它的参考模型进行说明等有限的用途。当然,IS-IS路由选择协议依然广泛地应用在大型服务提供商和运营商网络中。
[2] BGP是一个应用层的协议,因为它使用TCP端口传送它的消息;而RIP协议也是应用层协议的原因是因为使用UDP接口传递它的消息。其他的路由选择协议如OSPF,称为Internet层的协议是因为它们直接在IP数据包中封装它们的消息。
[3] K.Nichols、S.Blake、F.Baker和D.Black,“Definition of the Differentiated Services Field (DS Field)in the IPv4 and IPv6 Headers”,RFC 2474,1998年12月。
[4] K.Ramakrishnan,“The Addition of Explicit Congestion Notification (ECN)to IP,”RFC3168,2001年9月。
[5] 被分段的数据包不会在数据链路的另一端被重组,而是一直保持分段状态,直至到达最终目的地时才会被重组。
[6] 为了使13位长的分段偏移字段可以表示的最大数据包长度为65 535字节,所以使用8个八位组作为本字段的单位。
[7] 正如读者将在第2章中所读到的,在IPv6报头中等价的字段已经重新命名为Hop Limit,以便更加确切地反映它的真正用途。
[8] 点分十进制表示法只用于IPv4地址。在第2章读者将会看到,IPv6地址的表示法完全不同。
[9] 设备使用环回地址(典型的是127.0.0.1)向自己发送流量。发送到该地址的数据将会被直接送回给发送进程,而不会离开此设备。
[10] 注意,223并没有用完第一个八位组中所有可用的数。参见本章最后的配置练习1。
[11] 负责管理和分配IP地址的高级管理机构是亚洲的APNIC、北美的ARIN、中美与南美州的LACNIC,以及EMEA的RIPE。
[12] 事实上,这个地址决不会被分配,因为它属于私有的保留地址;本书中所用到的大多数地址都是保留地址,见RFC1918。保留地址包括:10.0.0.0-10.255.255.255、 172.16.0.0-172.31.255.255和192.168.0.0-192.168.255.255。
[13] 1700万个数据链路看上去很多,但是你要考虑到,一个中等规模的企业就可能有许多数据链路。
[14] 所有主机的IP广播地址是所有位全为1:255.255.255.255。特定子网的广播地址是所有主机位全为1;例如,子网172.21.1.0的广播地址是172.21.1.255。最后,对于所有子网的所有主机来说,广播地址是子网为和主机位均为1:172.21.255.255。
[15] 例如,NetWare把设备的MAC地址作为网络层地址的主机部分,这是一种明智之举。
[16] 类似于IP的广播地址,MAC的广播地址也是所有位全部为1:ffff.ffff.ffff。
[17] 在整个TCP/IP协议簇中各字段使用的所有号码都来源于这里:J.Postel和J.Reynolds,“Assigned Numbers,”RFC1700,1994年10月。这本大型文档(230页)是一本很有价值的参考文献,但目前有点过时了。现在有关号码分配的最新列表可以在www.iana.org 上查到。
[18] 类似的,主机到主机层也可以看作在传输层之上,功能上等同于OSI的会话层,在两个跨网络的应用之间提供逻辑的、端到端的路径。
本章包括以下主题:
在网络最初开始发展,还未最终发展成为我们现在所称的Internet时,那时的网络还仅仅只限于学术和研究领域。而且,当时在Vint Cerf和Bob Kahn创建有关这些网络的TCP/IP协议簇的时候,更是没有人会预料到Internet能发展为今天这样。在当时看来,所设计的32位地址空间可以提供大约43亿个地址,这看上去好像是不可能耗尽的。
但是,当那些在学院里就使用网络的孩子们到了“现实的世界中”时,他们自身就很欣赏基于开放标准上的对等网络创造出的种种可能。从而,越来越多的有价值的网络应用不断地涌现出来;公司连接到某个公共网络的价值也日益得到重视,并开始促成一个商用的Internet网络。在所有这些发生的同时,桌面计算机的使用也变得普及起来,不再是仅仅在办公室使用,更引人注目地是,计算机的使用也在家庭普及开来。但是,那些早期的家庭计算机还没有普遍到把调制解调器作为计算机通用的附属配件,因为那时很少有家庭计算机用户能够意识到个人计算机连接到一个公共网络上的价值和好处。
随着万维网(World Wide Web)的出现,这种情况开始发生改变。突然间,对于非技术领域的用户,轻松地获取和共享信息极大地提高了他们把桌面计算机作为工具的价值。结果,不到20年的时间,Internet已经变成了我们通信、商务活动以及学习的途径和手段。Internet使我们的世界变得更小,同时也对世界政治和经济产生了意义深远的影响。
随着“Internet的大家庭”变得越来越大,它的大小和差异性都呈现出爆炸性的增长,同时也出现了平常令人非常讨厌的东西,例如垃圾邮件、病毒,等等。这样就产生了一个比较严重的技术性问题需要考虑:原来认为可以提供所谓无穷无尽多的IPv4地址现在看来显然已经很有限了。
早在20世纪90年代初期,人们就意识到IPv4地址可能消耗殆尽的问题,当时各方面的专家预测显示,如果IPv4地址的分配按照目前的增长率继续下去,那么在未来短短几年间就将耗尽所有的地址空间。于是,人们就提出了一个新的IP地址版本来解决这个问题,以前在开发阶段这个新的IP地址版本被称为IP下一代版本(或者称为IPng),而现在一般称为IP协议第六版(或称为IPv6)。但是众所周知,发展一种新的标准需要时间逐步部署,因此,在发展新标准的过程中还需要一种解决IPv4地址耗尽问题的短期方案。
这种短期的解决方案就是网络地址转换(Network Address Translation——NAT),它允许多台主机共享一个或较少的公用IP地址。在NAT设备上,相对外部公共网络的内部网络使用私有IP地址,私有IP地址的使用规则在RFC1918(请求注释)中有详细的描述。读者后面会注意到,在本书的大多数例子中都会使用这种私有IP地址。NAT技术在减缓IPv4地址耗尽问题方面显然非常成功,并在大多数网络设计中已经成为一个标准部分。因而,至今仍然有很多人对发展IP协议新版本的必要性提出质疑。但是,NAT技术的广泛使用把原来具有开放、透明、对等特点的Internet变成了看上去更像一个具有客户-服务器(Client-Server)结构的网络的巨大集合。而用户则只在外围连接到Internet的“边缘层”,Internet向他们提供服务。用户很少对Internet的整体资源作出贡献。更多的从某种经济的角度看,Internet的用户仅仅成为了消费者,而不是生产者。
虽然大多数IPv6协议标准在多年前就已经完成了,但对从IPv4到IPv6协议迁移的巨大兴趣也只是最近才显现出来。这种日益重视使用IPv6协议的背后来自于两个基本的推动力。第一个基本的推动力是对使用诸如移动IP协议(Mobile IP)、服务质量保证、端到端的安全、网格计算(grid computing),以及点到点网络互连等核心概念的新型应用的先见之明。NAT技术遏制了这些领域的创新,因而摒弃NAT技术的惟一手段就是提供充足的并且易于使用的公共IP地址。
促进IPv6协议发展的第二个基本推动力就是拥有众多人口的国家快速的现代化发展,例如中国和印度。一个引人注目的统计数字显示,目前剩余的未分配的IPv4地址数目几乎和中国的人口一样多:大约还有13亿个地址。随着中国国家Internet网络基础设施的急剧扩展,在不久的将来,仅中国就会对现有已经十分紧张的IPv4地址池带来难以忍受的压力。在印度,其人口也接近于中国的人口,不得不继续保留一个具有4~5层NAT技术的网络层次架构,以支持对IP地址的需求。
IPv6协议使用128位的地址替代32位的IPv4地址,这样大约可以产生340万亿亿亿亿(3.4×1038)个可用的地址。在可预见的未来,这个地址数目将可以满足公共IP地址的需求,也可以解决上面讨论的两个基本推动力需要的地址需求。[1]
IPv6地址与IPv4地址的不同之处不仅仅在于它们的地址长度不同,而在更多的方面都有所不同。快捷地表示它们的“速记”方式也是不同的,它们的表示格式差别非常大,而且它们的功能组织也是不同的。本节我们将为读者介绍这些不同之处。
读者一定已经了解32位的IPv4地址的表示方式了,IPv4地址被分割为4个8位段,其中每个8位段的数字大小在0~255之间,并且每个8位段之间使用英文符号句点“.”来分开,因此有时也使用术语“点分十进制表示法”来专指IPv4地址的这种表示法。
而128位的IPv6地址则被分割成8个16位段来表示,其中每个16位段书写为大小在0x0000~0xFFFF之间的十六进制的数字表示,并且每个16位段之间使用英文符号冒号“:”来分开。例如,下面就是一个IPv6地址的书写方式:
3ffe:1944:0100:000a:0000:00bc:2500:0d0b
要想记住更多一些像这样表示的地址实际上是几乎不可能的,当然书写这些地址也不是一件令人愉快的事情。幸运地是,有两条规则可以用来简化IPv6地址书写的大小。第一条规则是:
任何一个16位段中起始的0不必写出来;任何一个16位段如果少于4个十六进制的数字,就认为忽略书写的数字是起始的0。
在前面提到的地址例子中,第3、4、5、6和8个分段都包含有起始的0。利用这个地址压缩简化规则,该地址可以书写为:
3ffe:1944:100:a:0:bc:2500:d0b
这里要注意的是,只有起始的0才可以被忽略掉;末尾的0是不能忽略的,因为这样做会使16位分段变得不确定,你无法确切地判断所省略的0是在所写的数字之前还是在其之后。
另外,还有一个值得注意的地方是,上述的地址例子中的第5个分段全部是0,并且被书写为单个0。事实上,有许多IPv6地址中具有一长串的0。举例如下:
ff02:0000:0000:0000:0000:0000:0000:0005
这个地址可以简写为以下形式:
ff02:0:0:0:0:0:0:5
然而,利用第二个规则可以进一步地简化这个地址的书写格式:
任何由全0组成的1个或多个16位段的单个连续的字符串都可以用一个双冒号“::”来表示。
利用这条规则,上面例子中的地址可以表示成如下格式:
ff02::5
使用这样的方式书写上面这样的地址显然可以增加很多便利。但是在这里要注意的是,这条规则强调的是仅仅对于单个连续不间断的全0字符串分段部分能够用一个双冒号“::”来表示,在一个IPv6地址中使用多于一个以上的双冒号会引起含混不清。下面举一个这样的地址例子作为说明:
2001:0d02:0000:0000:0014:0000:0000:0095
对于上面这个地址,以下两种地址的缩写方式都被认为是正确的,因为它们都只使用了一次双冒号:
2001:d02::14:0:0:95
2001:d02:0:0:14::95
但是,请读者注意,下面这个缩写方式是不正确的,因为它使用了两次双冒号:
2001:d02::14::95
之所以认为上面这个缩写方式是错误的,是因为它中间的两个全0字符串的长度是含混不清的,从而无法确定它们的长度;它可以表示成下面的任何一种可能的IPv6地址:
2001:0d02:0000:0000:0014:0000:0000:0095
2001:0d02:0000:0000:0000:0014:0000:0095
2001:0d02:0000:0014:0000:0000:0000:0095
不像IPv4协议的前缀(即地址的网络部分)可以通过点分十进制或十六进制地址掩码标识,或可以通过位计数(bitcount)来标识,IPv6协议的前缀始终通过位计数的方式来标识。更确切地说,通过在IPv6地址后面加一个斜线“/”,随后再跟一个十进制的数字来标识一个IPv6地址的起始位有多少位是前缀位。举一个例子,下面这个地址的前缀就是起始的64位:
3ffe:1944:100:a::bc:2500:d0b/64
当读者需要书写一个IPv6地址的前缀时,也可以使用和IPv4地址一样的书写方式将所有的主机位设置为0。例如:
3ffe:1944:100:a::/64
一个由全0组成的IPv6地址能够被简单地写成一个双冒号。在本书中,存在两种实例使用了全0的地址。第一个实例就是缺省地址,这将在第12章中讨论,在那里缺省地址表示为全0的形式,并且它的前缀长度也是0:
::/0
第二个使用全0的IPv6地址的实例是未指定地址(unspecified address)。未指定地址使用在某些邻居发现协议过程中,邻居发现协议将在本章后面的章节中讲述。一个未指定地址就像一个填充器,用来标识一个还未确定的实际IPv6地址。在书写一个未指定地址的时候要注意,它与缺省地址的书写方式是有区别的,它们的前缀长度不同:
::/128
IPv6地址存在以下三种类型:
和IPv4相比,IPv6地址有一个重要的不同,IPv6地址协议中没有广播地址。但是,IPv6地址协议提供了一个包含“全部节点”的多播地址,用来实现与IPv4地址协议中广播地址同样的目的。
单播地址用来表示单台设备的地址。一个全球单播地址是指这个单播地址是全球惟一的。IPv6单播地址的通用格式如图2-1所示。该格式在RFC3587中有详细地描述,并取代和简化了早期的格式版本,早期的格式将IPv6单播地址分成了顶级聚合(Top Level Aggregator,TLA)、次级聚合(Next-Level Aggregator,NLA)和其他字段。但是,读者应该了解的是,这个被取代的格式其实相对来说是最近才被替代的,因而,读者在一些书籍和资料中可能仍然会碰到对这个旧的IPv6地址格式的描述。
图2-1 IPv6通用的单播地址格式
地址的主机部分被称作接口ID(Interface ID)。之所以取这个名字是因为一台主机可以拥有不止一个的IPv6接口,因而使用这样的地址标识主机的一个接口比标识一台主机本身更加准确。但是,它的精确性也就仅仅到此为止:单个接口也能够拥有多个IPv6地址,并且能够拥有一个附加的IPv4的地址,在这样的实例中,接口ID仅仅表示该接口的几个标识符的其中一个。
除了长度不同外,IPv6地址与IPv4地址协议之间最显著的不同就是子网标识符的位置不同。IPv6地址的子网标识符的位置是地址的网络域的一部分,而不是该地址的主机域的一部分。在IPv4地址分类体系结构的传统概念中,一个地址的子网部分来自于该地址的主机部分,减少了地址的主机位。结果是,IPv4地址的主机部分不仅仅使它的分类产生变化,而且导致用于子网标识的位数产生变化。
使用地址的网络部分作为IPv6子网ID的一个直接的好处就是,所有IPv6地址的接口ID都有大小一致的位数,这就大大地简化了地址的解析复杂度。而且,使用地址的网络部分作为子网ID,会产生一个更加清楚的分工,功能更加清晰:网络部分提供了一台设备到下行专用数据链路的定位,而主机部分提供这条数据链路上该设备的标识。
除了极少数的例外,全球IPv6地址的接口ID都是64位二进制位的长度。同样,除了极少数的例外,子网ID字段都是16位二进制位(如图2-2所示)。一个16位的子网ID字段可以提供65 536个不同的子网。使用固定长度大小的子网ID看起来好像有些浪费,因为在大多数实例中远没有使用到这么大容量的子网数。但是,考虑到使用IPv6地址空间的总长度和容易分配、设计、管理以及解析地址的好处,使用固定长度大小的子网ID所带来的浪费也是可接受的。
图2-2 全球单播IPv6地址的标准字段大小
Internet地址授权委员会(Internet Assigned Numbers Authority,IANA)和地区Internet注册机构(Regional Internet Registries,RIR)[2]通常把长度为/32或/35的IPv6前缀分配给本地Internet注册机构(Local Internet Registries,LIR)。然后,本地Internet注册机构LIR——通常是大型的Internet服务提供商(ISP),他们再把更长的前缀分配给他们各自的客户。在大多数的实例中,本地Internet注册机构LIR分配的前缀长度都是/48。正如前面所提及的,有一些例外的情况,LIR也可能会分配不同长度的前缀:
IPv6地址起始的一些二进制位指明了该地址的类型。例如,目前所有的全球单播地址的前3位是001。因此,识别全球单播地址的十六进制表示是相当容易的:所有的全球单播地址都是以2或3开头的,这根据全球路由选择前缀的第4位的值而定。举一个例子说明,当前指定分配给6Bone(公共IPv6研究网络,the public IPv6 research network)使用的前缀开始于3ffe,而目前由RIR分配的IPv6地址则开始于2001。
二进制的数字001预期可以充分满足在未来一段时间内全球单播地址的需要。而其他的一些二进制位的组合则分配用来定义其他的地址类型,其中大多数前导位的组合都是保留的。表2-1列出了目前已经分配的前导位的组合,在后面的章节中将会陆续介绍一些其他主要的IPv6地址类型。
表2-1 IPv6地址类型的高位数字组合
地址类型 |
高位数字(二进制) |
高位数字(十六进制) |
---|---|---|
未指定 |
00…0 |
::/128 |
环回地址 |
00…1 |
::1/128 |
多播地址 |
11111111 |
FF00::/8 |
链路本地单播地址 |
1111111010 |
FE80::/10 |
地区本地单播地址(目前存在争议) |
1111111011 |
FEC0::/10 |
全球单播地址(当前分配的) |
001 |
2xxx::/4或者3xxx::/4 |
保留的类型(未来全球单播地址的分配) |
其他所有的 |
当我们谈论全球单播地址的时候,我们就认为这个地址是全球范围使用的。也就是说,这样的地址是全球惟一的,并且能够在全球范围内被路由而无需进行更改。
IPv6也拥有链路本地单播地址(link-local unicast address),这种地址是使用范围限定在单条链路上的地址。它的惟一性是仅仅限于所在的链路,并且相同的地址也可能存在于另一条链路上,因此这样的地址离开所在的链路是不可路由的。正如读者在表2-1中所看到的,链路本地单播地址的起始10位永远是1111111010(FE80::/10)。
读者在本章后面的章节中将会看到,链路本地单播地址在像邻居发现协议等功能中是很有用的,邻居发现协议只能在单条链路上进行通信,这在后面的章节中会讲述。链路本地单播地址也允许链路上的设备直接创建IPv6地址和该链路上的其他设备进行通信,而不必给它们分配全球前缀,或者说它们无需知道所在链路的全球前缀。在2.5.3小节中将会讲述在这种情形下如何使用链路本地前缀。
除了链路本地单播地址外,IPv6协议最初还定义了一个地区本地单播地址。地区本地单播地址(site-local unicast address)是指仅仅在一个给定的地区区域内该地址是惟一的。在其他地区区域内的设备可以使用相同的地址。因此,一个地区本地单播地址只能在分配该地址的那个地区区域内是可路由的。在IPv6协议中的地区本地地址在功能上和RFC1918中定义的私有IPv4地址有些类似。
地区本地地址的支持者举出这样几个应用。一个非常突出的应用就是,对于那些即使在使用IPv6地址时也希望使用NAT技术的网络人员来说,是为了维持他们自己的地址架构独立于他们的服务提供商。另外,地区本地地址也是几个被提议的IPv6多归路机制的关键。
但是,IETF(Internet工程任务组)的IPv6工作组发现地区本地单播地址也带来了一些困难。一种明显的困难就是这样一个事实:地区区域的定义是含糊的,因为对于不同的网络管理者来说地区的含义是不同的。另一个问题是,当这样的地址被错误地“泄漏到”网络管理者设定的地区范围边界之外时,也像RFC1918定义的IPv4地址一样会涉及到一些管理上的困难。其他一些潜在的问题包括给应用程序和路由器增加了复杂性,因为它们必须识别和复制这些地区本地地址。基于以上这些考虑,并经过一些激烈的争论后,结果是,IPv6工作组在RFC3879中不赞成使用地区本地地址。为了给那些认为地区本地地址有很多优点的人一些信心,又引入了另外一个计划,它具有类似于“比链路本地地址的范围大一些,而比全球地址的范围小一些”的特点,但是到撰写本书时为止还未见到这样一种替代的计划。
如表2-1所示,地区本地单播地址的起始10位是1111111011(FEC0::/10)。
一个任意播地址(Anycast address,也可称为任播地址或泛播地址)表示的更像一种服务,而不是一台设备,并且相同的地址可以驻留在提供相同服务的一台或多台设备中。如图2-3所示,某些服务是由3台服务器提供的,但却是通过IPv6地址3ffe:205:1100::15来进行该服务的所有通告的。
接收到包含该地址通告的路由器不会知道是由3台不同的设备通告给它的。相反,路由器会假定有3条路由到达相同的目的地,并会选择一条代价最低的路由。如图2-3所示,这条路由是到达服务器C的,它的代价是20。
图2-3 一个任意播地址表示的是一种服务,它可能是多台设备
使用任意播地址的好处就是,路由器总是选择到达“最近的”或“代价最低的”服务器的路由。[3]因此,提供一些通用服务的服务器能够通过一个大型的网络进行传播,并且流量可以由本地传送到最近的服务器,这样就可以使网络中的流量模型变得更有效。而且,如果其中一台服务器变得不可用时,路由器能够把路由指向下一台最近的服务器。举例来说,如图2-3所示,如果服务器C因为网络或服务器本身出现故障而变得不可用了,那么路由器就会选择到达服务器A的路径,因为到达服务器A是倒数第二个代价最低的路由。从路由器的角度来看,它选择的是到达同一个目的地最优的路由。
任意播地址仅是根据它们提供的服务功能而定义的,而不是根据它们的格式,而且理论上来说可能是任何范围内的任何一个IPv6单播地址。但是,在RFC 2526中定义了一个保留的任意播地址的格式。任意播地址在IPv4协议的网络中已经使用了一段时间,但是在IPv6协议中它们的定义才被正式化。
多播地址标识的不是一台设备,而是一组设备——一个多播组(multicast group,或称为多播群)。发送给一个多播组的数据包可以由单台设备发起。因此,一个多播数据包通常包括一个单播地址作为它的源地址,一个多播地址作为它的目的地址。在一个数据包中,多播地址从来不会作为源地址出现。
一个多播组的成员可能只有一台单个的设备,也可能甚至是该网络上所有的设备。事实上,IPv6协议并不像IPv4协议那样有一个保留的广播地址,而是有一个保留的包含所有节点的多播组,实际上做相同的事情:所有接收它的设备都是属于该多播组。
多点传送实际上是IPv6协议的一个基本的操作,特别是对于即插即用特性的一些功能,例如路由器发现和地址自动配置等,这些功能是邻居发现协议的一部分,邻居发现协议将在本章后面讲述。
IPv6多播地址的格式如图2-4所示。多播地址起始的8位总是全1,并且后跟的4位被指定作为标记位。这些标记位的前3位目前没有使用,全部设置为0。第4位用来指出这个地址是一个永久的、公认的地址(设为0),还是一个管理分配使用的暂时性的地址(设为1)。接下来的4位数字表示该地址的范围,如表2-2所示。表2-3中显示了几个保留的、公认的IPv6多播地址,所有这些地址都属于链路本地的范围。由于多播组总是一组独立的节点,因而在多播地址中的子网字段是不需要的,或者说是没有意义的。而最后的112位用来作为组ID(Group ID),标识各个不同的多播组。目前的用法是设置前面的80位为0,而只使用后面的32位。
图2-4 IPv6多播地址的格式
表2-2 多播地址的范围
范围字段的值 |
范围 |
---|---|
0x0 |
保留 |
0x1 |
节点本地(Node-Local) |
0x2 |
链路本地 |
0x5 |
地区本地 |
0x8 |
组织本地(Organizaion Local) |
0xE |
全球的 |
0xF |
保留 |
表2-3公认的IPv6多播地址举例
地址 |
多播组 |
---|---|
FF02::1 |
所有的节点 |
FF02::2 |
所有的路由器 |
FF02::5 |
OSPFv3路由器 |
FF02::6 |
OSPFv3指定路由器 |
FF02::9 |
RIPng路由器 |
FF02::A |
EIGRP路由器 |
FF02::B |
移动代理(Mobile Agents) |
FF02::C |
DHCP服务器/中继代理 |
FF02::D |
所有的PIM路由器 |
有几种转换技术——将IPv4地址的网络转换成IPv6地址的技术,或者另外一种让两者共存的技术——要求IPv4地址在IPv6地址环境中进行通信。这些不同的技术详细说明了IPv4地址如何嵌入到IPv6地址中的细节,以及如何实现在128位的IPv6地址中寻找32位的IPv4地址的技术。但是,读者也会发现,多数技术使用惟一的格式来表示它们的地址,以便允许读者识别嵌入的IPv4地址。例如,一个嵌入了IPv4地址10.23.1.5的IPv6地址是:
FE80::5EFE:10.23.1.5 (一个ISATAP地址)
::FFFF:10.23.1.5和::FFFF:0:10.23.1.5(SIIT地址)
FEC0:0:0:1::10.23.1.5(TRT地址)
在上述的每个例子中,IPv4地址都是位于IPv6地址的最后32位,并使用点分十进制表示法表示。
其他使用嵌入IPv4地址的转换技术都不是使用点分十进制表示,而是把IPv4地址转换成十六进制编码表示。例如,6to4技术就是使用十六进制表示。地址10.23.1.5在十六进制中的表示是0A17:0105,所以嵌入了地址10.23.1.5的一个6to4前缀表示为:
2002:0A17:0105::/48
本卷书的内容并不涵盖这些转换技术,所以读者在本书中不太可能会看到这些地址表示方式。在这里之所以提到它们,仅仅是因为读者如果从事IPv6协议方面的工作时很可能会遇到像这样的地址。
IPv6包头(Paeket Header)的格式如图2-5所示。这和IPv4的数据包头部有些明显的相像,也有些或明显的或细微的不同之处,IPv4的数据包头部请参见前面章节中的图1-2所示。
图2-5 IPv6的报头
在这里也请读者注意,尽管IPv4的总长度字段是16位的,但是IPv6的有效载荷长度字段却是20位。这意味着该字段能够指定更长的有效载荷(1 048 575字节,相对IPv4中只有65 535字节)。因此,IPv6数据包本身在理论上来说具有传送更大的有效载荷的能力。
在IPv6报头中,很明显缺少的一个字段是IPv4报头中包含的校验和字段。在现代传输介质的可靠性全面提高的今天——当然无线传输或许是例外——由于上层协议通常携带它们自己的错误校验和恢复机制,IPv6报头本身的校验和就体现不出太多的价值了,因而就被去掉了。
对比图2-5中的IPv6报头和图1-2中的IPv4报头,读者可以看出,虽然源地址和目的地址字段的长度都是报头的4倍,但是IPv6报头本身的长度并不比IPv4报头长:IPv6报头长度为40字节,而IPv4报头最小长度为20字节。如果IPv4的可选项字段也用来进行扩展应用(虽然这不常见),那么IPv4报头的长度实际上比IPv6报头大。
读者会注意到,除了可选项字段,其他的字段并不是很常用到,例如那些与分段有关的字段,从而在IPv6报头里就去掉了那些字段。因此,给定了固定长度并且排除了所有不携带每个数据包转发时所必要信息的字段,IPv6报头变得更加简洁和有效。
但是,如果我们需要使用这些IP特性的某个可选项,例如分段、源路由选择或认证,我们又该怎么做呢?于是就在IPv6协议中,提供了一项可选的功能——扩展报头(extension header),在需要提供这些功能时可以添加在报头之后。例如,如果需要使用源路由选择、分段和认证等可选功能,那么就可以把它们各自需要增加的功能信息加载到3个扩展报头当中,就像图2-6所显示的那样。因为这些报头,IPv6数据包可以在以下两个方面提高效率:
数据包仅仅需要传送各自数据包所需要的信息,不需要传送用不到的字段。
可以通过定义新的扩展报头添加到IPv6数据包中来增加新的可选功能。
每一个扩展报头都像IPv6报头一样,有一个下一报头字段。因此,每一个报头都会告知是哪一个报头跟在它的后面。表2-4中显示了当前定义的扩展报头和它们下一报头的值。例如,如图2-7所示,IPv6报头中下一报头字段的值表明它的下一个报头是一个路由选择扩展报头(43),这个报头的下一报头字段表示它的下一个报头是一个分段扩展报头(44),依此类推。最后一个扩展报头AH表示它的下一个报头是一个TCP报头(协议号为6)。
图2-6 扩展报头允许IPv6数据包传送该数据包需要的所有信息,但传送的是该数据包仅仅需要传送的信息
表2-4 下一报头的值
报头 |
下一报头的值 |
---|---|
逐跳可选项 |
0 |
路由选择 |
43 |
分段 |
44 |
封装安全有效载荷(ESP) |
50 |
认证报头(AH) |
51 |
目的地可选项 |
60 |
TCP/IP协议 |
由协议定义的协议号的值(例如TCP=6,UDP=17,OSPF=89,等等) |
没有下一报头 |
59 |
图2-7 IPv6报头中的下一报头字段和每一个扩展报头指定的跟在其后的报头
在RFC 1883中描述了每一个扩展报头的格式。但是概括来说,每个扩展报头的功能如下:
如果使用扩展报头的话,在RFC 1883中也规定了它们应该出现的顺序。这里严格规定,如果使用逐跳可选项的话,它必须直接跟在IPv6报头的后面,以便于它能够被必须处理它的传输节点很容易的发现。建议的扩展报头顺序如下:
1.IPv6报头。
2.逐跳可选项。
3.目的地可选项(只有在路由选择报头中指定的中间路由器才必须处理这个报头)。
4.路由选择。
5.分段。
6.认证。
7.封装安全有效载荷。
8.目的地可选项(只有最后的目的节点必须处理这个报头)。
9.上层报头。
正像IPv4一样,IPv6也需要一个控制协议来交换与处理错误和信息的消息。并且和IPv4一样,它也使用ICMP来实现这一功能。但是在IPv6中使用ICMP和在IPv4中使用ICMP并不一样。在IPv4协议中ICMP使用的协议号是1,而在IPv6协议中ICMPv6使用的下一报头的值为58。
ICMPv6(Internet消息控制协议第六版)是在RFC 2463中规定的。在RFC中定义的很多功能都和IPv4中ICMP的定义相同;但是,在ICMPv6中也有很多ICMP消息意义并不相同,例如源抑制(Source Quench)和时间戳(Timestamp)消息。
比较图2-8中显示的ICMPv6报头和图1-28显示的ICMP报头,读者能够看到它们基本上是相同的。并且ICMPv6像ICMP一样使用一组类型与代码值的组合来标识一般的类型和它们的子类型。在RFC 1885中给出了这些值的定义,如表2-5中所列。
图2-8 ICMPv6报头的格式
表2-5 ICMPv6消息的类型域和代码域
类型 | 代码 | 消息 |
1 | 目的地不可达 | |
0 | 没有到达目的地的路由 | |
1 | 和目的地的通信被管理员禁止 | |
2 | 不是邻居 | |
3 | 地址不可达 | |
4 | 端口不可达 | |
2 | 0 | 数据包长度太大 |
3 | 超时 | |
0 | 在传输时超出跳数限制 | |
1 | 分片的重组时间超时 | |
4 | 参数问题 | |
0 | 遇到错误的报头字段 | |
1 | 遇到不可识别的下一报头类型 | |
2 | 遇到不可识别的IPv6选项 | |
128 | 0 | ECHO请求 |
129 | 0 | ECHO答复 |
130 | 0 | 组成员请求 |
131 | 0 | 组成员报告 |
132 | 0 | 组成员减少 |
ICMPv6协议除了基本的错误和信息控制功能外,还包括一些使用ICMPv6消息的机制。例如,在前面章节里提到的路径MTU发现机制会发送长度越来越大的数据包到目的节点。当一个给定的数据包长度超过到达目的节点的路径上最小的MTU时,该数据包将被丢弃,并发送一个数据包长度太大的消息给源地址,从而源地址节点就可以知道这条路径上最小的MTU大小。和IPv4一样,Echo请求和Echo答复消息用于Ping的功能当中。
然而,ICMPv6除了基本的错误和信息消息外,还使用了一组单独的由基本的IPv6协议ICMPv6消息:邻居发现协议,这将在下面讲述。
IPv6协议除了它显著地增加了地址空间外,一个最显著的特征就是它的即插即用特性。邻居发现协议(Neighbor Discovery Protocol,NDP)就是使用以下的功能来实现这些即插即用特性的协议:
NDP消息通常应该在链路本地的范围内收发,因此,封装NDP消息的数据包也始终使用IPv6链路本地地址,或者链路本地范围内的多播地址。为了增加更进一层的安全性,承载所有NDP消息的IPv6数据包的跳数限制为255。如果所收到的数据包中有跳数限制的值小于255的,那么就说明这个数据包最少已经经过了一台路由器,因而该数据包将被丢弃。这种做法可以阻止NDP受到来自不与本地链路相连的源节点的攻击或欺骗。
NDP是在RFC 2461中定义的,为了完成某些功能,它使用ICMPv6协议来交换一些必要的消息,具体来说,在RFC 2461中详细说明了以下5个新的ICMPv6消息:
如图2-9所示,图中显示了路由器通告消息的格式。它的ICMPv6类型是134,代码是0。封装这个RA消息的IPv6数据包的源地址总是始发这个数据包的接口的IPv6链路本地地址。假如这个RA消息周期性地发送,它的目的地址就是所有节点的多播地址(FF02::1),或者如果这个RA消息是为了响应一台路由器请求消息,则它的目的地址是发起请求的节点的链路本地地址。
图2-9 路由器通告消息的格式
跳数限制(Hop Limit)——如果设定了跳数限制字段的值,那么链路上的节点将在它始发到链路上的所有数据包里都设置该值。如果这台路由器没有指定跳数限制,那么该字段设置为全0。
M——是管理地址的配置标记。如果设置了该位,始发路由器就会利用DHCPv6协议来告诉链路上的主机使用有状态地址自动配置。如果不设置该位,链路上的主机应该使用无状态地址自动配置。地址自动配置将在本章后面的章节中讲述。
O——是其他的有状态配置标记。当设置该位时,始发路由器就会告诉所在链路上的主机使用DHCPv6协议来获取其他的链路信息。M标记和O标记可以一起使用。例如,不设置M标记但设置O标记,那么路由器将会告诉链路上的主机使用无状态地址自动配置,但对于其他的配置参数则不考虑DHCPv6服务器的存在。
路由器生存时间(Router Lifetime)——只有在始发路由器是一台缺省路由器时,该字段才设置为非0的值。如果是这种情况,则该字段指定为该缺省路由器的存活时间,以秒为单位,它的最大值为18.2h。
可达时间(Reachable Time)——是指用于实现NDP协议中邻居不可达性检测功能的字段。当一个节点确认它的邻居是可到达的后,可达时间会指定一个时间值,在该时间内,这个节点假定它的邻居是可达的,以毫秒为单位。
重传计时(Retransmit Timer)——用于实现NDP协议里有关地址解析和邻居不可达性检测功能的字段。它指定了重传的邻居请求消息之间的最小时间,以毫秒为单位。
在路由器通告消息的可选项字段里携带的可能选项包括以下内容:
如图2-10所示,图中说明了路由器请求消息的格式。路由器请求消息的ICMPv6类型值为133,而代码值为0。封装路由器请求消息的IPv6数据包的源地址,要么是始发该消息的接口所分配的IPv6地址,要么是一个用“::”(全部为0)表示的未指定地址,这种情况出现在没有分配地址的情况(在发起的主机节点刚刚开始进行地址自动配置时会出现没有地址的情况)。目的地址是所有路由器多播地址(FF02::2)。
图2-10 路由器请求消息的格式
这里的可选项字段包括了始发该消息接口的链路层地址,如果可以知道的话。但是,如果封装该数据包的源地址是未指定的,那么就不一定包括源链路层地址,例如在地址自动配置期间始发主机正在请求路由器的时候。
在图2-11中,显示了邻居请求消息的格式。邻居请求消息的ICMPv6类型值为135,而代码值为0。封装邻居请求消息的IPv6数据包的源地址要么是始发该消息的接口所分配的IPv6地址,要么是一个用“::”(全部为0)表示的未指定地址,这种情况出现在为地址冲突检测而发送的邻居请求消息的时候。目的地址是对应于目标地址的一个被请求节点的多播地址,或者就是目标地址。
图2-11 邻居请求消息的格式
目标地址(Target Address)——是指请求目标的IPv6地址。目标地址永远不可能是一个多播地址。
邻居请求消息的可选项字段可以包括始发该请求消息的接口的链路层地址。
如图2-12所示,图中显示了邻居通告消息数据包的格式。邻居通告消息数据包的ICMPv6类型值为136,而代码值同样为0。封装邻居通告消息的IPv6数据包的源地址总是由始发该消息的接口所分配的(或者自动分配的)IPv6地址。目的地址要么是包含该通告消息所要答复的邻居请求数据包的源地址,要么是所有节点的多播地址(FF02::1)。
图2-12 邻居通告消息的格式
R——是路由器标记。如果设置了该位,表示始发该消息的节点是一台路由器。这个位字段用于在邻居可达性检测期间检查已经变为主机的路由器。
S——是一个请求标记。在为答复一个邻居请求消息而发送的邻居通告消息中设置该位。
O——过载标记。当设置该位时,它表示邻居通告消息中的信息超出了任何现有邻居的缓存条目,需要更新所缓存的链路层地址。当该位没有被设置时,说明邻居通告消息没有超出现有邻居的缓存条目。
目标地址——如果为了响应一个邻居请求而发送的邻居通告,那么目标地址就是邻居请求消息中的目标地址字段。如果邻居通告消息是未请求的(也就是说,发送通告始发节点的链路层地址的变化),那么目标地址就是始发节点的地址。
邻居通告消息的可选项字段可包含目标链路层地址——也就是说,是始发邻居通告消息节点的链路层地址。
如图2-13所示,图中显示了一个重定向消息的格式。重定向消息的ICMPv6类型值为137,而代码值同样为0。封装重定向消息的IPv6数据包的源地址总是始发该消息的接口的IPv6链路本地地址。而它的目的地址总是触发重定向的数据包的源地址。
目标地址——是指更好的第一跳地址——通常是链路上另一台路由器的链路本地地址。
目的地址——是指被重定向到目标地址的IPv6目的地址。
重定向消息的可选项字段包括目标节点的链路层地址,这和触发该重定向的报头大小相同,不会使它的数据包长度超过1 280字节。
所有以上5种类型的消息中的可选项字段,无论包含什么信息,都是由一个或多个类型/长度/数值(TLV)这3个参数组合构成的。如图2-14所示,每一个TLV都是由一个8位的类型字段指定在数值字段中携带的信息的类型,一个8位的长度字段指定该数值字段的长度大小(用8位组作为单位,即字节数),以及一个长度可变的数值字段组成。
图2-13 重定向消息的格式
图2-14 用于NDP消息的可选项字段的TLV的格式
在表2-6中显示了可选的数值和它们相对应的类型号。本章并不讲述各个数值字段的格式,有关数值字段的详细描述,读者可以参考RFC 2461。
表2-6 数值字段和相应的类型
类型 |
数值 |
---|---|
1 |
源链路层地址 |
2 |
目标链路层地址 |
3 |
前缀信息 |
4 |
重定向的报头 |
5 |
MTU |
路由器通过在相连的链路上周期性地发送路由器通告消息,表明它的存在,并通过路由器通告消息通告所配置的所有参数。大概用到路由器消息最多的链路就是广播链路了,例如以太网,链路上的主机可以收到路由器通告消息,因而可以学到有关链路的必要信息。
在RFC 2461中规定,路由器通告消息发送的周期是4~1800s之间,缺省值为600s。同时也规定了路由器通告消息通告的最小周期缺省为200s。 这些通告将在最大值和最小值之间波动以防止链路上的同步。
一些未经请求的路由器通告消息的源地址是发送该消息的路由器接口的链路本地IPv6地址,而目的地址是所有节点的多播地址(FF02::1)。
在Cisco公司的路由器上,只要使用命令ipv6 unicast-routing使IPv6有效,Cisco路由器就可以在以太网和FDDI接口上自动地发送路由器通告消息。缺省的间隔值是200s,并且该值可以通过命令ipv6 nd ra-interval进行改变。缺省条件下,所传送的路由器通告消息的路由器生存时间是1800s,并可以通过命令ipv6 nd ra-lifetime进行改变。如果读者不希望链路上的某台路由器作为缺省路由器,就可以使用该命令将该路由器的生存时间设置为0。路由器通告消息的可达时间缺省为0(意味着是未指定的),并可以通过命令ipv6 nd reachable-time进行改变。缺省条件下,重传计时字段设置为0ms(未指定的),并可以通过命令ipv6 nd ns-interval进行改变。M标记与O标记字段的值可以分别通过命令ipv6 nd managed-config-flag与ipv6 nd other-config-flag来设定。如果读者根本不希望某个接口传送路由器通告消息,可以通过命令ipv6 nd suppress-ra使其无效。
在缺省的情况下,Cisco路由器在路由器通告消息中包含了始发该消息的接口配置的所有IPv6前缀。可以通过命令ipv6 nd prefix来控制前缀的通告,以及与这些前缀相关的参数。
刚刚连接到某个链路接口的主机需要等待一个路由器通告消息,以便能够发现链路上的路由器和学习到链路的参数,显然,要等待200s的时间显得过长了。因此,当链路上的一台主机开始激活时,就会发送一个路由器请求消息去请求立即得到一个路由器通告消息。这个路由器请求消息的源地址可以是未指定的地址(::),也可以是该主机的链路本地IPv6地址。它的目的地址则始终是所有路由器的多播地址(FF02::2)。
当一台路由器收到一条路由器请求消息时,它就会发送(有一个5s的延时)一条路由器通告消息作为响应。如果触发某个路由器通告消息的路由器请求消息的源地址是一台主机的链路本地地址,那么这条路由器通告消息就会使用它的链路本地地址以单播方式被传送给该主机。如果路由器请求消息的源地址未指定,那么它所请求的路由器通告消息就会以多播方式被传送给所有的节点地址。
当一台主机收到一条路由器通告消息时,它就会将这台路由器添加到它的缺省路由器列表中(除非这条路由器通告消息指定它的路由器生存时间为0而不能作为缺省路由器使用)。如果一台主机在它的缺省路由器列表中具有多台路由器条目,那么主机就应该明确地给出如何选定一个缺省路由器的方法。它要么在整个缺省路由器列表中依次轮询,要么选择和保持单台路由器作为缺省路由。当出现与主机所选择的不同的缺省路由时,不管上述两种情况的哪一种,重定向功能对于用来更新主机的缺省路由都是重要的。
当一台IPv6的主机第一次连接到链路上时,它能够自我配置其自己的接口地址。这个过程的第一步是确定地址的64位接口ID部分。对于广播型的接口(大多数主机是这种情况),使用一种称为MAC-to-EUI64转换法的机制。简单地讲,这个机制采用接口的48位介质存取控制(MAC)地址——通常认为它是全球惟一的,在这个MAC地址中间插入一个保留的16位数值0xFFFE,并把它的全局/本地(Universal/Local,U/L)位翻转设置为1(全局的,事实上是指IEEE指定),这样就把它转换成了一个64位的接口ID。
在图2-15中演示了这个转换过程,图中被转换的地址是0000:0B0A:2D51。为了更易于理解所发生的变化,在图中把MAC地址表示成二进制格式。第一步,把MAC地址从中间的位置分开成两个24位的对等部分,并在这两个24位对等部分之间插入0xFFFE。这样这个MAC地址就变成了64位的长度。接着,把原来MAC地址中的U/L位——始终是第7位——从0翻转为1。最后得到的结果就是一个有效的64位接口ID,即0200:0BFF:FE0A:2D51。
图2-15 MAC到EUI64转换法用来基于接口的48位MAC地址创建一个64位的接口ID
当然,这个接口ID也仅仅是一个IPv6地址的一半,还需要一个64位的前缀。读者回想一下表2-1中链路本地前缀是一个保留的、公认的数值0xFF80::/10。使用它作为一个完整的64位前缀(0xFF80::/64),再加上转换导出的接口ID,这样就构成了一个完整的IPv6地址,可以用来和同一链路上其他设备进行通信。例如,把链路本地前缀和图2-15中转换导出的接口ID组合在一起就得到了一个链路本地IPv6地址:FF80::0200:0BFF:FE0A:2D51。下面显示了一个链路本地地址的例子,在该例中链路地址来自于一台Macintosh OS X主机的以太网接口“en1”。利用链路本地前缀FF80::/10和MAC到EUI64转换法,它的IPv6接口不用借助任何其他设备的帮助就可以导出自己的链路本地地址:
如果一台主机仅仅需要和所在链路上的设备通信,那么它自动配置的链路本地地址就已经足够了。但是如果主机需要和链路以外的设备进行通信,那么它就需要一个更大范围的地址——通常是一个全球IPv6地址。这可以通过两种途径获取该地址:有状态或无状态的地址自动配置。
如果一台主机使用有状态地址自动配置方式,它将会借助DHCPv6服务器来获取必要的地址信息。它要么根据预先的配置去查找DHCPv6服务器,要么由收到的可能设置了M标记的路由器通告消息来告诉它使用DHCPv6服务器。DHCPv6协议在RFC 3315中描述,它与IPv4的DHCP协议在最终结果上没有太多的不同。
更有趣的是无状态的自动配置。这是一个非常简单的过程,主机从它所收到的路由器通告消息中获取一个或多个链路前缀,然后加上它先前确定的接口ID,这样就得到了一个全球惟一的IPv6地址。举例来说,假设图2-15中的主机收到了一个路由器通告消息通告的前缀为3FFE:1104:404:1::/64,把这个前缀加上它的接口ID就构成了它的全球地址:3FFE:1104:404:1:0200:0BFF:FE0A:2D51。
虽然利用MAC地址转换导出一个接口ID的方法,大多数情况下通常可以保证在任何范围下得到一个惟一的地址,但是确保地址的惟一性无疑是明智的。所以不管一台设备是如何获取一个地址的,在使用这个地址之前都必须进行地址冲突检测。地址冲突检测不考虑地址是通过有状态或无状态配置方式获取的,还是人工静态配置获取的。这个规则只有一个例外情况就是任意播地址,因为定义的任意播地址可以出现在不止一台的设备上。在这里存在这样一个假设:如果一个链路本地地址具有通过MAC到EUI64转换法导出的接口ID,通过了地址冲突检测并被认为是惟一的,那么其他使用相同的接口ID的地址也被认为是惟一的,而不需要重新执行地址冲突检测。
已经获取一个新地址的节点会把这个新的地址归类为临时状态的地址。在地址冲突检测操作没有完成并确认链路上没有其他节点使用这个地址之前,该地址不能被使用。这个节点会发送一个把目标地址字段设置为该地址的邻居请求消息来验证。邻居请求消息的源地址是未指定的地址,而它的目的地址是被请求节点的多播地址。
一个被请求节点的多播地址由前缀FF02:0:0:0:0:1:FF00::/104前导,加上目标地址的最后24位组成。举例来说,对于图2-15中导出的接口ID,这里被请求节点的多播地址是FF02::1:FF0A:2D51。这样做的原因是如果一个节点自动配置了多个接口地址,它所有地址的最后24位都应该是相同的。因此,一个带有被请求节点多播地址的邻居请求消息应该匹配它所有的接口地址。更重要的是,使用被请求节点的多播地址可以确保在两个节点试图同时对同一个地址执行地址冲突检测操作的时候,它们可以互相检测到。
如果一个节点收到一个邻居请求消息,并且它的目标地址与该节点所分配的其中一个地址匹配,它就会发送一个目标地址和目的地址都为试探地址的邻居通告消息。发起这个邻居请求消息的节点就会知道这个试探地址是冲突的,并且不能使用。
读者在第1章中已经了解到,当一个IPv4节点希望和本地链路上的另一个IPv4节点通信时,它必须首先发现目的节点的链路层地址(或称为数据链路地址);然后这个地址被作为封装IP数据包到那个节点的数据帧的目的地址。举例来说,一个节点可能希望发送一个数据包到examplehost.com,DNS的查询会返回地址3FFE:521:2400:15:211:24FF:FE23:334E,发送端节点这时必须发现链路层地址用作本地链路帧的目的地址。正如前面章节所讨论的,IPv4协议使用ARP获取这个地址,而IPv6则使用NDP获取这个地址。
当一个节点检验由DNS返回的IPv6地址的前缀后,它就可以判断出目的节点是它所在的本地链路上的邻居,还是一个本地链路以外的节点并因此需要通过缺省路由器才能可达。如果是属于后一种情况,这个节点应该已经知道来自路由器通告消息的缺省路由器的链路层地址。但是,如果目的节点位于本地链路上,那么节点就会首先查找邻居缓存看一下是否已经学到该地址。IPv6协议中的邻居缓存与IPv4协议中的ARP缓存非常类似,它记录了网络层的地址和与之相关联的链路层地址。下面显示了一个微软WindowsXP操作系统主机的邻居缓存。这个邻居缓存保存了主机已知的IPv6地址和与它们相对应的链路层地址:
如果一个地址不在邻居缓存中,它也显示在表中但被标记成不完全的(Incomplete),这表示正在进行该地址的地址解析处理。这样,主机会发送一个邻居请求消息到与目标节点相关的被请求节点的多播地址。邻居请求消息应该包含源链路层可选项(类型1),这样被请求的节点就会了解到请求节点的链路层地址,并因此知道发送作为答复的邻居通告消息到哪一个节点。如果在路由器通告消息中包含了不为0的值,那么根据指定的时间间隔可以发送多个邻居请求消息。如果一个路由器通告消息中的重传计时字段的值为未指定的(0),那么邻居请求消息将会每1 000ms重传一次,直到收到一个邻居通告消息为止。如果发送了3个邻居请求消息后,还是没有收到来自被请求节点的邻居通告消息,那么邻居地址解析就会失败,并会为每一个排队等待传送到目前还未知的目的地的数据包返回一个类型1/代码3(目的地不可达/地址不可达)的ICMP消息。
假如被请求的节点存在并且邻居请求消息是有效的,那么它将答复一个邻居通告消息。这个邻居通告消息的目标地址字段设置为触发该邻居通告的那个邻居请求消息的目标地址字段的值。直到接收到回应的邻居通告消息,发起请求的节点才能够将目标节点的链路层地址添加到邻居缓存的条目中,并把该条目从不完全的(Incomplete)状态更改成可达的(Reachable)状态。
在Cisco路由器上,可以通过命令show ipv6 neighbors来查看邻居缓存,参见示例2-1。
示例2-1 在Cisco路由器上,可以通过命令show ipv6 neighbors来显示邻居缓存
无状态地址自动配置在涉及到以下的一些情况时会产生一种安全问题:即使一台设备从一个子网移到另一个子网,或者从一个主网络转移到另一个主网络,它的接口ID也始终保持不变。如果它的接口ID保持不变,那么它就能够被追踪。至少,这成为了一个私密的问题。例如,假设读者正在使用IPv6的地址和其所在公司的网络相连。记录和分析来自网络某部分的数据包就能够通过不变的接口ID来识别读者的身份。而且,你的同事通过进一步分析前置在你的接口ID前的不同前缀,推断出任何时候你所在的位置:在公司工作,在家里,旅行,或者任何活动。更为严重的是,他们可以利用这些追踪以及保存有关你的活动和位置的记录,来进行犯罪交易。
在RFC 3041中,通过定义IPv6私有地址来解决该安全问题。私有地址就是通过利用伪随机数字算法生成的接口ID。接口ID大约一天变化一次(或根据所配置的周期变化),也会在节点获取一个新的IPv6地址时改变。这一点非常重要,也符合合理的保密要求。
当然,一个经常变化的地址对于可达性而言是不实际的。希望与你通信的节点,以及DNS服务器必须通过一个或一些静态地址了解你所在位置。因此,标准的无状态配置的IPv6地址保留了你的“公共”地址;任何一个需要向你发送数据包的节点都使用这个地址作为目的地址。但当你发送返回的数据包时,你使用的却是私有地址。这有点像你家里的主叫ID(Caller ID),但它会阻止你的号码显示在其他人的主叫ID上。你能够看到是谁正在呼叫你,但是,当你呼叫其他人的时候他们却不能看到你的号码。
下面显示了分配给一台微软Windows XP系统的地址。在这里,有两个公共的IPv6地址分配给这台机器的接口,读者可以看到它们的前缀虽然不同,但它们的由MAC到EUI64转换得到的接口ID却是相同的。可以通过插入到地址中间的0xFFFE来容易地识别出公共接口ID。但是,对于这两个公共地址,也有一个私有地址(Windows的标签是作为“anonymous”),这些私有地址是通过在随机生成的接口ID前加上路由器通告消息发现的IPv6前缀生成的。公共和私有的(这里称为“anonymous”)地址一起用来确保主机的隐匿并同时维持主机的可达性:
在前面的章节里讨论邻居地址解析时,已经提到了标记为Incomplete或Reachable的邻居缓存条目。事实上,一个邻居缓存条目可以具有以下5种状态:
对于邻居可达性的确认,一般可通过以下两种方法来确认:
邻居不可达性的检测不仅仅要确认从邻居到本地节点一方的可达性,而且还要确认从本地节点到邻居方向的可达性,确保双向的可达性。基于这个原因,一个未经请求的路由器通告消息或邻居通告消息,不能改变邻居缓存条目的状态到Reachable;所收到的消息仅仅可以表明从始发节点到本地节点的单向可达性。只有收到一个传输层消息的远程响应消息(例如一个TCP数据包的ACK),或者收到一个响应请求消息的路由器通告消息或邻居通告消息后,才能确认双向的可达性。
讲述本章和前面一章的目的是为了阐明基于两个版本的IP协议的基础概念。理解IP地址的基本概念和有关IP的基础知识可以作为下一步掌握IP路由选择知识的基础。本书后面的章节将开始研究一台路由器能够成功地和精确地转发数据包到达它的目的地所需要的信息。
1.一个IPv6地址的长度是多少?
2.怎样表示一个IPv6地址?
3.用来压缩和简化IP地址表示的两条规则是什么?
4.为什么在一个IPv6地址里使用多个双冒号是不允许的?
5.IPv6地址::/0和::/128有什么不同之处?
6.在单播IPv6地址中,用来指定主机的部分是什么?它的长度是多少?
7.一个单播IPv6地址的子网ID部分的长度是多少?
8.假设一个IPv6地址的起始10位是FF80::/10,那么它是什么类型的地址?
9.3FFE:204:100:90::1是什么地址类型?
10.什么是任意播地址?
11.什么是多播地址?
12.一个IPv6报头的长度是多少?
13.在IPv6报头中设置流标签字段的目的是什么?
14.在IPv4报头中,什么字段和IPv6的下一报头字段相对应的?
15.在IPv4报头中,什么字段和IPv6的跳数限制字段相对应的?
16.在IPv6的下一报头字段中,有哪些方面像IPv4的协议号字段?又有哪些地方不同?
17.怎样扩展报头以便使IPv6的数据包更加富有效率?
18.ICMPv6中下一报头的值是什么?
19.IPv4的分段和IPv6的分段有哪些重要的不同之处?
20.用于邻居发现协议的5种ICMPv6消息是什么?
21.在一个路由器通告消息中,M标记和O标记的用途是什么?
22.在一个路由器通告消息中,可达时间字段的用途是什么?
23.在一个路由器通告消息中,重传计时字段的用途是什么?
24.在一个路由器通告消息中,如果它的路由器生存时间字段被设置为0代表什么意思?
25.在一个邻居通告消息中,S标记的用途和作用是什么?
26.有状态地址自动配置和无状态地址自动配置有什么不同?
27.MAC到EUI64转换使用哪两个步骤可以导出一个接口ID?
28.在一台设备获取一个单播IPv6地址时,它必须执行地址冲突检测操作,但是有一个例外情况,这个例外情况是什么?
29.前缀FF02:0:0:0:0:1:FF00::/104表示什么意思?
30.在IPv6中,使用什么代替ARP和ARP缓存?
31.什么是私有地址?
32.在一个邻居缓存中,Incomplete状态的条目表示什么意思?
33.在一个邻居缓存中,Probe状态的条目表示什么意思?
34.邻居不可达性检测使用哪两种方法来确认一个邻居双向的可达性?
[1] 考虑到在IPv4地址分配时所没有预见到的情况——当时IPv4所拥有的43亿个地址被认为可以无限的提供给所有的实际需求,再也不会有人认为IPv6协议所提供的几乎不可思议的巨大地址空间是不可耗尽的了。
[2] 在写本书时,共有5个RIR机构:RIPE(Réseaux IP Européens)——服务于欧洲、中东地区和中亚地区;LACNIC(拉丁美洲和加勒比海Internet地址注册机构,Latin American and Caribbean Internet Address Registry )——服务于中美、南美以及加勒比海地区;ARIN(美国Internet编号注册机构,American Registry for Internet Numbers)——服务于北美地区和部分加勒比海地区;AfriNIC——服务于非洲地区;而APNIC(亚太地区网络信息中心,Asia Pacific Network Information Centre)——则服务于亚洲和太平洋地区的国家。
[3] 路由器在到达同一个目的地的多条路由中选择路由的方法将在第4章中讲述。