计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。
由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-3"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。
本文主要内容:
网络层主要负责把运输层产生的报文段(TCP)或用户数据报(UDP)封装成分组或包进行传送。
在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报。
在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。 争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?针对这一点,有两种观点:
1:让网络负责可靠交付
2:网络提供数据报服务
这种观点认为,应借助于电信网的成功经验,让网络负责可靠交付,计算机网络应模仿电信网络,使用面向连接的通信方式。 通信之前先建立虚电路 (Virtual Circuit),以保证双方通信所需的一切网络资源。 如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点,不丢失、不重复,如图1-1所示:
虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接。 请注意,电路交换的电话通信是先建立了一条真正的连接。 因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样。
互联网的先驱者提出了一种崭新的网络设计思路。 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。 网络在发送分组时不需要先建立连接。每一个分组(即 IP 数据报)独立发送,与其前后的分组无关(不进行编号)。 网络层不提供服务质量的承诺。即所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限,如图1-2所示:
由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。 如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责可靠交付(包括差错处理、流量控制等) 。 采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。 互连网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性。
对比的方面 | 虚电路服务 | 数据报服务 |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不需要 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组都有终点的完整地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立选择路由进行转发 |
当结点出故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达终点 | 到达终点时不一定按发送顺序 |
端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。 与 IP 协议配套使用的还有三个协议:
图2-1画出了这三种协议与网际协议IP的关系:
可以看到,在网络层中,ARP画在最下面,因为IP经常要使用这个协议,ICMP和IGMP画在这一层的上部,因为他们要使用IP协议。这三个协议在后面会做介绍。由于网际协议IP是用来使互联起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层常常被称为网际层或IP层。使用网际层是为了强调这是由很多网络构成的互联网络。
在介绍网际协议IP之前,必须先了解一下什么是虚拟互联网络。
将网络互连并能够互相通信,会遇到许多问题需要解决,如:
没有一种单一的网络能够适应所有用户的需求,要将异构的网络互相连接起来,需要使用一些中间设备。 中间设备又称为中间系统或中继 (relay)系统。 有以下五种不同的中间设备:
当中继系统是转发器或网桥时,一般并不称之为网络互连,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。 网关由于比较复杂,目前使用得较少。 网络互连都是指用路由器进行网络互连和路由选择,路由器其实就是一台专用计算机,用来在互联网中进行路由选择。由于历史的原因,许多有关 TCP/IP 的文献将网络层使用的路由器称为网关。
可能很多读者觉得这里的**“网络互连"和"网络扩大”**很抽象,我们来举个例子:
如图2-2(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都是用相应的网际协议IP,因此可以把互连以后的计算机网络看成如图2-2(b)所示的一个虚拟互联网络。所谓虚拟互联网络也就是逻辑互联网络,他的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络,这种使用IP协议的互联网络可简称为IP网。使用IP网的好处是当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议,等等)。如果在这种覆盖全球的Ip网的上层使用Tcp协议,那么就是现在的互联网(Internet)。
当很多异构网络通过路由器互连起来时,如果所有的网络都使用相同的IP协议,那在网络层讨论问题就显得很方便。现在用一个例子来说明。
在图4-4所示的互联网中的源主机H1,要把一个IP数据报发送给目的主机H2。根据分组交换的存储转发概念,主机H1,先要查找自己的路由表,看目的主机是否在本网络上。如是,则不需要经过任何路由器而是直接交付,任务就完成了。如不是,则须把IP数据报发送给某个路由器(图中的R1)。R1在査找自己的路由表后,知道应当数据报转发给R2进行间接交付。这样一直转发下去,最后由路由器R5知道自己是和H2 接在同一个网络上,不需要再使用别的路由器转发了,于是就把数据报直接交付目的主机H2。图中画出了源主机、目的主机以及各路由器的协议栈。我们注意到,主机的协议栈有五层,但路由器的协议栈只有下三层。图中还画出了数据在各协议栈中流动的方向(用红色线表示)。我们还可注意到,在R4和R5之间使用了卫星链路,而R5所连接的是个无局域网。在R1到R4之间的三个网络则可以是任意类型的网络。总之,这里强调的是互联网可以由多种异构网络互连组成。如果我们只从网络层考虑问题,那么IP数据报就可以想象是在网络层中传送,其传送的路径就如图2-4所示:
这样就不必画出许多完整的协议栈,使问题的描述更加简单。有了虚拟互连网络的概念后,我们再讨论在这样的虚拟网络上如何寻址。
在 TCP/IP 体系中,IP 地址是一个最基本的概念。
我们把整个互联网看成为一个单一的、抽象的网络, IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。 IP 地址现在由**互联网名字和数字分配机构ICANN (Internet Corporation for Assigned Names and Numbers)**进行分配。
IP地址的编址方法共经历过了三个历史阶段:
本节只讨论最基本的分类的IP地址,后两种将在下一节"划分子网和构造超网"讨论。
所谓的"分类的IP地址"就是将IP地址划分为若干个固定类。 每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。 主机号在它前面的网络号所指明的网络范围内必须是唯一的。 由此可见,一个 IP 地址在整个互联网范围内是唯一的,这种两级的IP地址可以记为:
I P 地 址 : : = { < 网 络 号 > , < 主 机 号 > } IP地址::=\{<网络号>,<主机号>\} IP地址::={<网络号>,<主机号>}
式(1)中的 : : = ::= ::=表示**“定义为”,图2-5给出了各种IP地址的网络号字段和主机号字段,这里的A类、B类、C类地址都是单播地址(一对一通信)**,是最常用的。
从上图可以看到:
点分十进制记法:
易知A、B、C、D、E类地址的高8位分别为:
把Ip地址分为A、B、C三个类别的原因:
各种网络的差异很大,有的网络拥有很多主机,而有的网络的主机则很少,把IP地址划分为A、B、C类是为了更好地满足不同用户的要求,当某个单位申请到一个IP地址时,实际上是获得了具有同样网络号的一块地址,其中具体的各台主机号则由该单位自行分配,只要做到在该单位管辖的范围内无重复的主机号即可。
网络 类别 | 最大可指派 的网络数 | 第一个可指派的 网络号 | 最后一个可指派的 网络号 | 每个网络中 最大主机数 |
---|---|---|---|---|
A | $126 (2^7– 2) $ | 1 | 126 | 16777214 |
B | 16383 ( 2 14 – 1 ) 16383 (2^{14} – 1) 16383(214–1) | 128.1 | 191.255 | 65534 |
C | $ 2097151 (2^{21}– 1)$ | 192.0.1 | 223.255.255 | 254 |
一般不适用的特殊IP地址:
网络号 | 主机号 | 源地址 使用 | 目的地址 使用 | 代表的意思 |
---|---|---|---|---|
0 | 0 | 可以 | 不可 | 在本网络上的本主机(见 6.6 节 DHCP 协议) |
0 | host-id | 可以 | 不可 | 在本网络上的某台主机 host-id |
全 1 | 全 1 | 不可 | 可以 | 只在本网络上进行广播(各路由器均不转发) |
net-id | 全 1 | 不可 | 可以 | 对 net-id 上的所有主机进行广播 |
127 | 非全 0 或全 1 的任何数 | 可以 | 可以 | 用于本地软件环回测试 |
IP地址的一些重要特点:
IP 地址是一种分等级的地址结构。分两个等级的好处是:
第一,IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口。 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机 (multihomed host)。 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
互联网中的IP地址:
在同一个局域网上的主机或路由器的 IP 地址中的网络号必须是一样的。 图2-7中的网络号就是 IP 地址中的 net-id。
如图2-8所示,路由器总是具有两个或两个以上的IP地址,路由器的每一个接口都有一个不同网络号的IP地址。
两个路由器直接相连的接口处,可指明也可不指明IP地址,如指明IP地址,则这一段连线就构成了一种只包含一段线路的特殊“网络” ,现在常不指明IP地址。
IP 地址与硬件地址是不同的地址。 从层次的角度看, 硬件地址(或物理地址)是数据链路层和物理层使用的地址。 IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(称 IP 地址是逻辑地址是因为 IP 地址是用软件实现的),IP 地址放在 IP 数据报的首部,而硬件地址则放在 MAC 帧的首部。如图2-9所示。
这里需要注意这几点:
通信时我们主要使用了两个地址: IP 地址(网络层地址)和 MAC 地址(数据链路层地址),那么当我们知道 IP地址,如何知道器MAC地址呢?ARP协议就是为了解决这个问题而存在的。
如图2-10,ARP协议的作用是从网络层使用的 IP 地址,解析出在数据链路层使用的硬件地址。
不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。 每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表,这个映射表的每一行格式如下:
< I P a d d r e s s ; M A C a d d r e s s ; T T L > < IP address;MAC address;TTL > <IPaddress;MACaddress;TTL>
其中TTL (Time To Live)为地址映射有效时间 。
ARP请求的过程如图2-11所示,当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址:
如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。
如没有, ARP 进程在本局域网上广播发送一个 ARP 请求分组。收到 ARP 响应分组后,将得到的 IP 地址到硬件地址的映射写入 ARP 高速缓存。
ARP请求分组:包含发送方硬件地址 - 发送方 IP 地址 - 目标方硬件地址(未知时填 0) -目标方 IP 地址。
本地广播 ARP 请求(路由器不转发ARP请求)。
ARP 响应分组:包含发送方硬件地址 - 发送方 IP地址 - 目标方硬件地址 - 目标方 IP 地址。
ARP 分组封装在物理网络的帧中传输。
注意:
既然我们最终通信还是要使用硬件地址,为什么要引入IP地址,为什么不能直接使用硬件地址进行网络通信呢?
由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。 IP 编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个唯一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用 ARP 的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。 因此,在虚拟的 IP 网络上用 IP 地址进行通信给广大的计算机用户带来了很大的方便。
如图2-11,一个 IP 数据报由首部和数据两部分组成。 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的,首部的固定部分的后面是一些可选字段,其长度是可变的。
IP 数据报首部的固定部分中的各字段:
版本——占 4 位,指 IP 协议的版本。 目前的 IP 协议版本号为 4 (即 IPv4)。
首部长度——占 4 位,可表示的最大十进制数值是15 个单位(一个单位为 4 字节), 因此 IP 的首部长度的最大值是 60 字节。
区分服务——占 8 位,用来获得更好的服务。 在旧标准中叫做服务类型,但实际上一直未被使用过。 1998 年这个字段改名为区分服务。 只有在使用区分服务(DiffServ)时,这个字段才起作用。 在一般的情况下都不使用这个字段
总长度——占 16 位,指首部和数据之和的长度, 单位为字节,因此数据报的最大长度为 65535 字节。 总长度必须不超过最大传送单元MTU。
标识(identification) ——占 16 位, 它是一个计数器,用来产生 IP 数据报的标识,相同的标识使分片后的各数据报片最后能正确地重装为原来的数据报。
标志(flag) ——占 3 位,目前只有前两位有意义。
片偏移——占13 位,指出:较长的分组在分片后某片在原分组中的相对位置。 片偏移以 8 个字节为偏移单位。
例题:一数据报的总长度为 3820 字节,其数据部分的长度为 3800 字节(使用固定首部),需要分片为长度不超过 1420 字节的数据报片。 因固定首部长度为 20 字节,因此每个数据报片的数据部分长度不能超过 1400 字节。 于是分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。 原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。
IP 数据报首部中与分片有关的字段中的数值:
总长度 标识 MF DF 片偏移 原始数据报 3820 12345 0 0 0 数据报片1 1420 12345 1 0 0 数据报片2 1420 12345 1 0 175 数据报片3 1020 12345 0 0 350
生存时间——占8位,生存时间的英文缩写是TTL(Time to line),目的是为了防止无法提交的数据报无限制地在互联网中兜圈子(例如从路由器R1到路由器R2,再有路由器R2到路由器R1),从而浪费计算机资源。刚开始TTL的单位是时间,每经历一个路由器就将TTL的值减去在路由器中所消耗的一段时间,后来由于网络越来越快,就将TTL的单位设为跳数,每经过一个路由器就减1.
协议——占8 位,指出此数据报携带的数据使用何种协议, 以便目的主机的 IP 层将数据部分上交给上层的对应协议进行处理。协议字段指出应将数据部分交给哪一个进程
如上图所示,IP 协议支持多种协议,IP 数据报可以封装多种协议 PDU**。
首部检验和——占16 位,只检验数据报的首部, 不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法:
如上图所示,检验过程为:
在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。
接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。
注意这里提到的**"反码求和"的过程是:从低位到高位逐列进行计算。0和0相加是0,0和1相加是1,1和1相加是0,但要产生一个进位1**,加到下一列。若最高位相加后产生进位,则最后得到的结果要加1.请注意,**反码(onc’scomplement)和补码(two’scomplement)**是不一样的,
源地址和目的地址都各占 4 字节
IP 首部的可变部分就是一个选项字段(可选),用来支持排错、测量以及安全等措施,内容很丰富。 选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。 实际上这些选项很少被使用。
注意:互联网所有的分组转发都是基于目的主机所在的网络
假设:有四个 A 类网络通过三个路由器连接在一起,每一个网络上都可能有成千上万个主机。 可以想象,若按目的主机号来制作路由表,每一个路由表就有 4 万个项目,即 4 万行(每一行对应于一台主机),则所得出的路由表就会过于庞大。 若按主机所在的网络地址来制作路由表,那么每一个路由器中的路由表就只包含 4 个项目(每一行对应于一个网络),这样就可使路由表大大简化。
在路由表中,对每一条路由,最主要的是**(目的网络地址,下一跳地址)**
根据目的网络地址就能确定下一跳路由器,这样做的结果是:
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由,这种路由叫做特定主机路由。 采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由,在对网络的连接或路由表进行排错时,指明到某一台主机的特殊路由就十分有用。
路由器还可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。 这种转发方式在一个网络只有很少的对外连接时是很有用的。 默认路由在主机发送 IP 数据报时往往更能显示出它的好处。 如果一个主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。
例如,在图2-13的互联网中,连接在网络N1上的任何一台路主机中的路由表中只需要3个项目即可:
像上图中路由表中的**“直接"和"默认"字符在实际的路由表中是用"0.0.0.0”**表示的。
必须注意:
IP 数据报的首部中没有地方可以用来指明**“下一跳路由器的 IP 地址”。 当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件**。 网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。
路由表没有给分组指明到某个网络的完整路径。路由表指出,到某个网络应当先到某个路由器(即下一跳路由器)。在到达下一跳路由器后,再继续查找其路由表,知道再下一步应当到哪一个路由器。这样一步一步地查找下去,直到最后到达目的网络。
在 ARPANET 的早期,IP 地址的设计确实不够合理:
IP 地址空间的利用率有时很低。
有的单位申请到一个B类地址网络,但是所连接的主机并不多,但是又不愿意申请一个足够用的C类地址网络,理由是考虑到今后可能的发展,这样就造成了IP地址的浪费。
给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
两级的 IP 地址不够灵活。
有时一个单位需要紧急在新的地点马上开通一个新的网络,但是在申请到一个新的IP地址之前,新增加的网是不可能连接到互联网上工作的。所以我们希望有一种办法可以使一个单位灵活地增加本单位的网络,而不必实现到互联网管理机构去申请新的网络号。原先的2级IP地址无法做到这一点。
从 1985 年起在 IP 地址中又增加了一个**“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址**。 这种做法叫做划分子网 (subnetting) 。 划分子网已成为互联网的正式标准协议。
划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。 从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位,如图3-1所示:
所以这样IP地址的格式就变为了:
I P 地 址 : : = < 网 络 号 > , < 子 网 号 > , < 主 机 号 > IP地址 ::= {<网络号>, <子网号>, <主机号>} IP地址::=<网络号>,<子网号>,<主机号>
凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。 然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网,最后就将 IP 数据报直接交付目的主机。
如图3-2所示,划分子网知识把IP地址的主机号部分再进行划分,而不改变IP地址原来的网络号,划分子网纯属一个单位内部的事情,对外部网络透明,对外仍然表现为没有划分子网的一个网络。
划分子网之后有个问题就是,如图3-2,假定现在有一个数据报,其目的地址是145.13.3.10,已经达到了路由器R1,那么这个路由器如何把它转发到子网145.13.3.0呢?
我们知道,从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。 因此需要使用子网掩码,使用子网掩码 (subnet mask) 可以找出 IP 地址中的子网部分。
规则:
子网掩码长度 = 32 位
子网掩码左边部分的一连串 1,对应于网络号和子网号
子网掩码右边部分的一连串 0,对应于主机号
如图3-3所示,子网掩码要解决的就是找到网络号,对于两级IP地址,其网络号为前16位(如图3-2(a)所示),对于三级IP地址,其网络号为前24位(如图3-2©所示),子网掩码和IP地址一样一共有32位,原理就是,如果是两级IP地址,子网掩码的前16位为1,后16位为0,如果是三级IP地址,子网掩码前24位为1,后8位为0,这样做的好处是, 拿到一个IP地址之后,只需要将IP地址与本路由器的子网掩码**“按位向与”**,得到的结果一定是网络号(因为主机号与的对象是0,与完之后的结果一定也是0),这样就得到了网络号。
那么还有一个问题就是,在不划分子网的时候是否还需要子网掩码?答案是肯定的,因为路由器并不能自动判断当前IP是否划分子网了啊,他只能对所有来的IP都用子网掩码进行按位向与,这样其实也利于查找网络号,如果是两级IP,路由器不再需要查找改地址的类别位,直接使用子网掩码就能提取出来网络号,所以,如果一个网络没有进行子网划分,那么该网络的子网掩码就使用默认子网掩码,很明显,各类IP的默认子网掩码为:
子网掩码是一个网络或一个子网的重要属性,路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。
子网划分有固定长度子网和变长子网两种子网划分方法。 在采用固定长度子网时,所划分的所有子网的子网掩码都是相同的。 虽然根据已成为互联网标准协议的 RFC 950 文档,子网号不能为全 1 或全 0,但随着无分类域间路由选择 CIDR 的广泛使用,现在全 1 和全 0 的子网号也可以使用了,但一定要谨慎使用,确认你的路由器所用的路由选择软件是否支持全 0 或全 1 的子网号这种较新的用法。 划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。
需要注意的是同一个IP和不同的子网掩码计算后得出的网络号可能是相同的,因为如果IP地址的某一位是0,那么不管子网号的对应为是0还是1,计算的结果的对应为都是0,也就是说两个子网掩码计算得到的网络号是一样的。
但是两个可以计算得到同样网络号的子网掩码也只是针对特定IP来说的,两个子网掩码的实际效果并不同。
在不划分子网的两级 IP 地址下,从 IP 地址得出网络地址是个很简单的事。 但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。 因此分组转发的算法也必须做相应的改动,步骤如下:
例题:
如图3-4,有三个子网,两个路由器,以及路由器R1中的部分路由表,现在源主机H1向目的主机H2发送分组,试讨论分组转发过程。
【解】
划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在 1992 年互联网仍然面临三个必须尽早解决的问题:
1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码,使用变长子网掩码 VLSM (Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率, 在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。
无分类的两级编址的记法是:
即:
I P 地 址 : : = { < 网 络 前 缀 > , < 主 机 号 > } IP地址 ::= \{<网络前缀>, <主机号>\} IP地址::={<网络前缀>,<主机号>}
CIDR 使用**“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址后面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数**),例如: 220.78.168.0/24。
CIDR 把网络前缀都相同的连续的 IP 地址组成**“CIDR 地址块”**。
128.14.32.0/20 表示的地址块共有$ 2^{12}$ 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。 这个地址块的起始地址是 128.14.32.0, 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
128.14.32.0/20 地址块的最小地址:128.14.32.0, 128.14.32.0/20 地址块的最大地址:128.14.47.255 ,即主机号从全0到全1.
全 0 和全 1 的主机号地址一般不使用。
一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由,路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能,路由聚合也称为构成超网 (supernetting)。 CIDR 虽然不使用子网了,但仍然使用**“掩码”这一名词(但不叫子网掩码**), 对于 /20 地址块,它的掩码是 20 个连续的 1, 斜线记法中的数字就是掩码中1的个数。
10.0.0.0/10 可简写为 10/10,也就是把点分十进制中低位连续的 0 省略。
10.0.0.0/10 隐含地指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0。此掩码可表示为:
前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址,这些 C 类地址合起来就构成了超网。 CIDR 地址块中的地址数一定是 2 的整数次幂,网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长。
CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。
使用 CIDR 时,路由表中的每个项目由**“网络前缀”和“下一跳地址”组成,在查找路由表时可能会得到不止一个匹配结果,应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。 网络前缀越长,其地址块就越小,因而路由就越具体 (more specific)** 。
最长前缀匹配又称为最长匹配或最佳匹配。
举例:
某个上属ISP地址块为206.0.64.0/18的大学,该大学分到地址块为:206.0.68.0/22,这个大学里的计算机系分到的地址块为:206.0.71.128/25,假定计算机系希望ISP收到属于自己的数据报后直接发送给自己而不要经过大学的路由器,那么在ISP的路由器的路由表中就至少要有以下两个项目:206.0.68.0/22(大学)、206.0.71.128/25(计算机系),现在假定ISP收到一个数据报,其目的IP地址D=206.0.71.130,把D和其路由表中的两个项目的掩码逐位相与:
那么根据最长前缀匹配原则,就算206.0.68.0/22匹配成功,最终ISP的路由器也会将本数据报转发给206.0.71.128/25,因为206.0.71.128/25匹配器到的地址更加具体。
当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。 为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。 IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址, 为了提高二叉线索的查找速度,广泛使用了各种压缩技术。
从二叉线索的根节点自顶向下的深度最多有 32 层,每一层对应于IP地址中的一位。
一个IP地址存入二叉线索的规则很简单,先检查IP地址左边的第一位,如为 0,则第一层的节点就在根节点的左下方,如为 1,则在右下方,然后再检查地址的第二位,构造出第二层的节点,依此类推,直到唯一前缀的最后一位。
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol), ICMP 是互联网的标准协议, ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。 但 ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。
ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去,ICMP报文格式如图3-5所示:
ICMP 报文的种类有两种:
ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型、代码和检验和。接着的 4 个字节的内容与 ICMP 的类型有关。
ICMP差错报告报文有4种:
终点不可达
当路由器或主机不能交付数据报时就向源主点发送终点不可达报文
时间超过
- 当路由器收到生存时间为零的报文时,除了丢弃该报文,还要向源点发送时间超过报文
- 当终点在预先规定的时间内不能收到一个数据报的全部数据时,就把收到的数据报片都丢弃,并向源点发送时间超过报文
参数问题
当路路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该报文,并向源点发送参数问题报文
改变路由(重定向)(Redirect)
路由器把改变路由报文发给主机,让主机知道下次应该直接把数据报发送给另外的路由器(可通过更好的路由)
所有的ICMP差错报文中的数据字段都具有相同的格式,如图3-6所示,把收到的进行差错报告的IP数据报首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的(端口的作用将在写一篇运输层讲解)。整个ICMP报文作为IP数据报的数据字段发送给源点。
不应发送ICMP 差错报告报文的几种情况:
有2种:
PING (Packet InterNet Groper) 用来测试两个主机之间的连通性。 PING 使用了 ICMP 回送请求与回送回答报文。 PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或UDP。
在 Windows 操作系统中这个命令是 tracert。 用来跟踪一个分组从源点到终点的路径。 它利用 IP 数据报中的 TTL 字段和 ICMP 时间超过差错报告报文实现对从源点到终点的路径的跟踪。
算法必须是正确的和完整的。
算法在计算上应简单。
算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。
算法应具有稳定性。
算法应是公平的。
算法应是最佳的。
不存在一种绝对的最佳路由算法。 所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 实际的路由选择算法,应尽可能接近于理想的算法。 路由选择是个非常复杂的问题 它是网络中的所有结点共同协调工作的结果。 路由选择的环境往往是不断变化的,而这种变化有时无法事先知道。
倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则路由算法只有两大类:
互联网采用分层次的路由选择协议。这是因为:
为此,可以把整个互联网划分成许多较小的自治系统(autonomous system),一般记为AS。
自治系统 AS 的定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS之间的路由。 现在对自治系统 AS 的定义是强调下面的事实:尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。
互联网的两大类路由选择协议:
自治系统之间的路由选择也叫做域间路由选择 (interdomain routing),在自治系统内部的路由选择叫做域内路由选择 (intradomain routing) 。
互联网的早期 RFC 文档中未使用**“路由器”而是使用“网关”这一名词。但是在新的 RFC 文档中又使用了“路由器”这一名词。应当把这两个术语当作同义词**。
路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。 RIP 是一种分布式的、基于距离向量的路由选择协议。 RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。
"距离"的定义:
从一个路由器到直接连接的网络的距离定义为 1, 从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。 RIP 协议中的**“距离”也称为“跳数”(hop count),因为每经过一个路由器**,跳数就加 1。 这里的**“距离”实际上指的是“最短距离”**。
RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”, RIP 允许一条路径最多只能包含 15 个路由器。 “距离”的最大值为 16 时即相当于不可达,可见 RIP 只适用于小型互联网。 RIP 不能在两个网络之间同时使用多条路由,RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由,即选择最短的,不一定是最快的。
路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为 1),它的路由表是空的,接着,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息,但经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
RIP 协议的收敛 (convergence) 过程较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。
路由表中最主要的信息是:到某个网络的距离(即最短距离),以及经过的下一跳地址。路由表更新的原则是找出每个目的网络的最短距离,这种更新算法又称为距离向量算法。
路由器收到**相邻路由器(相邻路由器的地址为 X)**的一个 RIP 报文:
距离向量算法的基础就是 Bellman-Ford 算法(或 Ford-Fulkerson 算法)。 这种算法的要点是这样的: 设X是结点 A 到 B 的最短路径上的一个结点,若把路径 A→B 拆成两段路径 A→X 和 X→B,则每一段路径 A→X 和 X→B 也都分别是结点 A 到 X 和结点 X 到 B 的最短路径。
光看概念困死了,需要一个栗子清醒一下:
已知路由器 R6 有表4-1所示的路由表。现在收到相邻路由器 R4 发来的路由更新信息,如表4-2所示。试更新路由器 R6 的路由表。
目的网络 | 距离 | 下一跳路由器 |
---|---|---|
Net2 | 3 | R4 |
Net3 | 4 | R5 |
… | … | … |
目的网络 | 距离 | 下一跳路由器 |
---|---|---|
Net1 | 3 | R1 |
Net2 | 4 | R2 |
Net3 | 1 | 直接交付 |
首先将收到的报文中的所有项目(R4的路由表)的下一跳字段改为R4,距离字段加1,修改后如下表:
目的网络 | 距离 | 下一跳路由器 |
---|---|---|
Net1 | 4 | R4 |
Net2 | 5 | R4 |
Net3 | 2 | R4 |
然后:
第一行在表4-1中没有,因此将这一行添加到表4-1中。
第二行在表4-1中有,且下一跳路由器也是R4,因此要更新(距离增大了,应该将3更新为5).
第三行在表4-1中有,但下一跳路由器不同,于是就要比较距离,新的路由信息中的距离是2,比原来的4小,所以更新原路由表的这一行的下一跳路由器为R4,距离为2。
至此,路由表更新完毕,更新之后的R6的路由表如下表所示:
目的网络 | 距离 | 下一跳路由器 |
---|---|---|
Net1 | 4 | R4 |
Net2 | 5 | R4 |
Net3 | 2 | R4 |
… | … | … |
现在比较新的RIP版本是1998年公布的RIP2,RIP2 报文由首部和路由部分组成。
RIP2 报文中的路由部分由若干个路由信息组成,每个路由信息需要用 20 个字节,地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息, 再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是 4+20 x25=504 字节。如超过,必须再用一个 RIP 报文来传送。
RIP2 具有简单的鉴别功能,若使用鉴别功能,则将原来写入第一个路由信息(20 个字节)的位置用作鉴别。 在鉴别数据之后才写入路由信息,但这时最多只能再放入 24 个路由信息。
RIP 协议特点:好消息传播得快,坏消息传播得慢,即当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器。
举个栗子说明:
如图4-3,设三个网络通过两个路由器互连起来,并且都已建立了各自的路由表。图中路由器交换的信息只给出了我们感兴趣的一行内容。路由器R1中的“1,1,直接"表示"到网1的距离是1,直接交付",路由器R2中的“1,2,R1”表示"到网1的距离是2,下一跳经过R1“。现在假定路由器R1到网1的链路出了故障,R1无法到达网1,于是路由器R1把到网的距离改为16(表示到网1不可达),因而在R1的路由表中的相应项目变为”1,16,直接",但是,很可能要经过30秒钟后R1才把更新信息发送给R2,然而R2可能已经先把自己的路由表发送给了R1其中有”1, 2,R1“这一项,R1收到R2的更新报文后,误认为可经过R2到达网1,于是把收到的路由信息”1,2,R1“修改为”1,3,R2“,表明我到网1的距离是3,下一跳经过R2,并把更新后的信息发送给R2。同理,R2接着又更新自己的路由表为”114,R1“,以为"我到网1距离是4,下一跳经过R1,这样的更新一直继续下去,直到R1和R2到网1的距离都增大到16时,R1和R2才知道原来网1是不可达的。RIP协议的这一特点叫做好消息传播得快,而坏消息传播得慢。网络出故障的传播时间往往需要较长的时间(例如数分钟),这是RIP的一个主要缺点。
优点:
实现简单,开销较小。
缺点:
RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
“坏消息传播得慢”,使更新过程的收敛时间过长。
**开放最短路径优先 OSPF (Open Shortest Path First)**是为克服 RIP 的缺点在 1989 年开发出来的。 OSPF 的原理很简单,但实现起来却较复杂。
“开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的, “最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法 SPF ,采用分布式的链路状态协议 (link state protocol)。
注意:OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。
OSPF的3个要点:
链路状态数据库 (link-state database):
由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。 这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。 OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。 OSPF 的更新过程收敛得快是其重要优点。
OSPF 的区域 (area):
为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫做区域。 每一个区域都有一个 32 位的区域标识符(用点分十进制表示)。 区域也不能太大,在一个区域内的路由器最好不超过 200 个。划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。 在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。 OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域 (backbone area),主干区域的路由器称为主干路由器, 非主干区域的路由器叫区域边界路由器,主干区域的标识符规定为0.0.0.0。主干区域的作用是用来连通其他在下层的区域。
如图4-4所示,R6为连接本自治系统与其他自治系统的路由器,而其所属的区域随之称为主干区域。
OSPF 不用 UDP 而是直接用 IP 数据报传送, OSPF 构成的数据报很短,这样做可减少路由信息的通信量。 数据报很短的另一好处是可以不必将长的数据报分片传送,因为分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。
OSPF的特点:
OSPF让每一个路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。摘要信息主要就是指出有哪些路由器的链路状态信息(以及其序号)已经写入了数据库。经过与相邻路由器交换数据库描述分组后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这种分组交换,全网同步的链路数据库就建立了。图4-5给出了OSPF的基本操作,说明了两个路由器需要交换各种类型的分组。
在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路状态,OSPF使用的是可靠的洪泛法,其要点见图4-6所示。设路由器R用洪泛法发出链路状态更新分组,图中用一些小的箭头表示更新分组。第一次先发给相邻的三个路由器,这三个路由器将收到的分组再进行转发时,要将其上游路由器除外。可靠的洪泛法是在收到更新分组后要发送确认(收到重复的更新分组只需要发送一次确认),图中的空心箭头表示确认分组。
OSPF的其他特点:
BGP 是不同自治系统的路由器之间交换路由信息的协议。
互联网的规模太大,使得自治系统之间路由选择非常困难,对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。 当一条路径通过几个不同 AS 时,要想对这样的路径计算出有意义的代价是不太可能的。 比较合理的做法是在 AS 之间交换**“可达性”**信息。 自
治系统之间的路由选择必须考虑有关策略。 因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
BGP 发言人:
每一个自治系统的管理员要选择至少一个路由器作为该自治系统的**“ BGP 发言人” (BGP speaker)** 。 一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。每一个BGP发言人除了必须运行BGP协议之外,还必须运行该自治系统的内部网关协议,如OSPF或RIP。
一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。 使用 TCP 连接能提供可靠的服务,也简化了路由选择协议。 使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站(neighbor)或对等站(peer)。
BGP 所交换的网络可达性的信息就是要到达某个网络所要经过的一系列 AS。 当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由。
图4-8给出了一个BGP发言人交换路径向量的例子,自治系统 AS2 的 BGP 发言人通知主干网 AS1 的 BGP 发言人:“要到达网络 N1、 N2、N3 和 N4 可经过 AS2。”,主干网在收到这个通知后,就发出通知:"要到达网络 N1、 N2、N3 和 N4 可沿路径(AS1,AS2) ",主干网还可发出通知:“要到达网络 N5、N6 和 N7 可沿路径(AS1, AS3)。”
从上面的讨论可以看出,BGP 协议交换路由信息的结点数量级是自治系统数的量级,这要比这些自治系统中的网络数少很多,每一个自治系统中 BGP 发言人(或边界路由器)的数目是很少的,这样就使得自治系统之间的路由选择不致过分复杂。
BGP协议的特点:
BGP的4种报文:
若两个邻站属于两个不同AS,而其中一个邻站打算和另一个邻站定期地交换路由信息,这就应当有一个商谈的过程(因为很可能对方路由器的负荷已很重因而不愿意再加重负担)。因此,一开始向邻站进行商谈时就必须发送OPEN报文。如果邻站接受这种邻站关系,就用KEEPALTVE报文响应。这样,两个BGP发言人的邻站关系就建立了。一旦邻站关系建立了,就要继续维持这种关系。双方中的每一方都需要确信对方是存在的,且一直在保持这种邻站关系。为此,这两个BGP发言人彼此要周期性地交换KEEPALIVE报文(一般每隔30秒)。KEEPALIVE报文只有19字节长(只用BGP报文的通用首部),因此不会造成网络上太大的开销。UPDATE报文是BGP协议的核心内容。BGP发言人可以用UPDATE报文撤销它以前曾经通知过的路由,也可以宣布增加新的路由。撤销路由可以一次撤销许多条,但增加新路由时,毎个更新报文只能增加一条。
BGP可以很容易地解决距离向量路由选择算法中的"坏消息传播得慢"这一问题。当某个路由器或链路出故障时,由于BGP发言人可以从不止一个邻站获得路由信息,因此很容易选择出新的路由。距离向量算法往往不能给出正确的选择,是因为这些算法不能指出哪些邻站到目的站的路由是独立的。
图4-9给出了BGP报文的格式。四种类型的BGP报文具有同样的通用首部,其长度为19字节。通用首部分为三个字段。**标记(marker)**字段为16字节长,用来鉴别收到的BGP报文(这是假定将来有人会发明出合理的鉴别方案)。当不使用鉴别时,标记字段要置为全1。长度字段指出包括通用首部在内的整个BGP报文以字节为单位的长度,最小值是19,最大值是4096。类型字段的值为1到4,分别对应于上述四种BGP报文中的一种。
OPEN报文共有6个字段,即版本(1字节,现在的值是4)、本自治系统号(2字节,使用全球唯一的16位自治系统号,由ICANN地区登记机构分配)、保持时间(2字节,以秒计算的保持为邻站关系的时间)、BGP标识符(4字节,通常就是该路由器的IP地址)、可选参数长度(1字节)和可选参数。
UPDATE报文共有5个字段,即不可行路由长度(2字节,指明下一个字段的长度)、撤销的路由(列出所有要撤销的路由)、路径属性总长度(2字节,指明下一个字段的长度)、路径属性(定义在这个报文中增加的路径的属性)和网络层可达性信息NLRI(Network Layer Reachability Information)。最后这个字段定义发出此报文的网络,包括网络前缀的位数、IP地址前缀。KEEPALIVE报文只有BGP的19字节长的通用首部。
NOTIFICATION报文有3个字段,即差错代码(1字节)、差错子代码(1字节)和差错数据(给出有关差错的诊断信息)。
在讨论完路由选择之后,我们再来介绍路由器的构成。
路由器是一种典型的网络层设备,是互联网中的关键设备。
路由器的主要作用是:
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。 下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。 路由器的转发分组正是网络层的主要工作。
如图4-10,整个的路由器结构可划分为两大部分:
路由选择部分
也叫做控制部分,其核心构件是路由选择处理机。
路由选择部分路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
分组转发部分
由三部分组成:
- 交换结构 (switching fabric):又称为交换组织,其作用是根据转发表 (forwarding table) 对分组进行处理。
- 一组输入端口
- 一组输出端口
(请注意:这里的端口就是硬件接口)
“转发”(forwarding) 就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去。
“路由选择”(routing) 则是按照分布式算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由。 路由表是根据路由选择算法得出的,而转发表是从路由表得出的。 在讨论路由选择的原理时,往往不去区分转发表和路由表的区别。
如图4-11所示,路由器的输入端口里面装有物理层、数据链路层和网络层的处理模块。 数据链路层剥去帧首部和尾部后,将分组送到网络层的队列中排队等待处理,这会产生一定的时延。 输入端口中的查找和转发功能在路由器的交换功能中是最重要的。
如图4-12所示,输出端口里面装有物理层、数据链路层和网络层的处理模块。 输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。 在网络层的处理模块中设有一个缓冲区(队列)。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中。 数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因。
交换结构是路由器的关键构件, 正是这个交换结构把分组从一个输入端口转移到某个合适的输出端口。 实现交换有多种方法,如图4-13所示,常用交换方法有三种:
通过存储器
通过总线
通过纵横交换结构
(1) 当路由器的某个输入端口收到一个分组时,就用中断方式通知路由选择处理机。然后分组就从输入端口复制到存储器中。
(2) 路由器处理机从分组首部提取目的地址,查找路由表,再将分组复制到合适的输出端口的缓存中。
(3) 若存储器的带宽(读或写)为每秒 M 个分组,那么路由器的交换速率(即分组从输入端口传送到输出端口的速率)一定小于 M/2。
(1) 数据报从输入端口通过共享的总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。
(2) 因为每一个要转发的分组都要通过这一条总线,因此路由器的转发带宽就受总线速率的限制。
(3) 现代的技术已经可以将总线的带宽提高到每秒吉比特的速率,因此许多的路由器产品都采用这种通过总线的交换方式。
(1) 这种交换结构常称为互连网络 (interconnection network)。
(2) 它有 2N 条总线,可以使 N 个输入端口和 N 个输出端口相连接。
(3) 当输入端口收到一个分组时,就将它发送到与该输入端口相连的水平总线上。
(4) 若通向所要转发的输出端口的垂直总线是空闲的,则在这个结点将垂直总线与水平总线接通,然后将该分组转发到这个输出端口。
(5) 但若该垂直总线已被占用(有另一个分组正在转发到同一个输出端口),则后到达的分组就被阻塞,必须在输入端口排队。
IP 是互联网的核心协议, 互联网经过几十年的飞速发展,到 2011 年 2 月,IPv4 的 32 位地址已经耗尽。 ISP 已经不能再申请到新的 IP 地址块了。 我国在 2014 – 2015 年也逐步停止了向新用户和应用分配 IPv4 地址, 解决 IP 地址耗尽的根本措施就是采用具有更大地址空间的新版本的 IP,即 IPv6。
IPv6 仍支持无连接的传送,但将协议数据单元 PDU 称为分组。为方便起见,本文仍采用数据报这一名词。 所引进的主要变化如下:
IPv6数据报的一般形式:
IPv6 数据报由两大部分组成:
![image-20190512192432652](/Users/dmrfcoder/Library/Application Support/typora-user-images/image-20190512192432652.png)
IPv6 将首部长度变为固定的 40 字节,称为基本首部。 把首部中不必要的功能取消了,使得 IPv6 首部的字段数减少到只有 8 个。 IPv6 对首部中的某些字段进行了如下的更改:
如图5-2所示,IPv6的基本首部又以下部分组成:
版本(version)—— 4 位。它指明了协议的版本,对 IPv6 该字段总是 6。
通信量类(traffic class)—— 8 位。这是为了区分不同的 IPv6 数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。
流标号(flow label)—— 20 位。 “流”是互联网络上从特定源点到特定终点的一系列数据报, “流”所经过的路径上的路由器都保证指明的服务质量。所有属于同一个流的数据报都具有同样的流标号。
有效载荷长度(payload length)—— 16 位。它指明 IPv6 数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内),其最大值是 64 KB。
下一个首部(next header)—— 8 位。它相当于 IPv4 的协议字段或可选字段。
跳数限制(hop limit)—— 8 位。源站在数据报发出时即设定跳数限制。路由器在转发数据报时将跳数限制字段中的值减 1。当跳数限制的值为零时,就要将此数据报丢弃。
源地址—— 128 位。是数据报的发送站的 IP 地址。
目的地址—— 128 位。是数据报的接收站的 IP 地址。
IPv6 把原来 IPv4 首部中选项的功能都放在扩展首部中,并将扩展首部留给路径两端的源站和目的站的主机来处理。 数据报途中经过的路由器都不处理这些扩展首部(只有一个首部例外,即逐跳选项扩展首部)。 这样就大大提高了路由器的处理效率。
在 RFC 2460 中定义了六种扩展首部:
IPv6 数据报的目的地址可以是以下三种基本类型地址之一:
IPv6 将实现 IPv6 的主机和路由器均称为结点, 一个结点就可能有多个与链路相连的接口。 IPv6 地址是分配给结点上面的接口的, 一个接口可以有多个单播地址, 其中的任何一个地址都可以当作到达该结点的目的地址,即一个结点接口的单播地址可用来唯一地标志该结点。
在 IPv6 中,每个地址占 128 位,地址空间大于 3.4 × 1038 。 为了使地址再稍简洁些,IPv6 使用冒号十六进制记法(colon hexadecimal notation, 简写为 colon hex)。 每个 16 位的值用十六进制值表示,各值之间用冒号分隔。例如: 68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
, 在十六进制记法中,允许把数字前面的 0 省略。例如把 0000 中的前三个 0 省略,写成 1 个 0。
零压缩:
冒号十六进制记法可以允许零压缩 (zero compression),即一连串连续的零可以为一对冒号所取代。 FF05:0:0:0:0:0:0:B3
可压缩为: FF05::B3
注意:在任一地址中只能使用一次零压缩。
冒号十六进制记法可结合使用点分十进制记法的后缀,这种结合在 IPv4 向 IPv6 的转换阶段特别有用。 例如:0:0:0:0:0:0:128.10.2.1
再使用零压缩即可得出: ::128.10.2.1
CIDR 的斜线表示法仍然可用。 例如:60 位的前缀 12AB00000000CD3
可记为: 12AB:0000:0000:CD30:0000:0000:0000:0000/60
或 12AB::CD30:0:0:0:0/60 (零压缩)
或 12AB:0:0:CD30::/60 (零压缩)
地址类型 | 二进制前缀 |
---|---|
未指明地址 | 00…0(128位),可记为::/128 |
环回地址 | 00…1(128位),可记为 ::1/128 |
多播地址 | 11111111(8位),可记为FF00::/8 |
本地链路单播地址 | 1111111010(10位),可记为 **FE80::/10 |
全球单播地址 | (除上述四种外,所有其他的二进制前缀) |
未指明地址
这是 16 字节的全 0 地址,可缩写为两个冒号“::”。 这个地址只能为还没有配置到一个标准的 IP 地址的主机当作源地址使用。 这类地址仅此一个。
环回地址
即 0:0:0:0:0:0:0:1(记为 ::1)。 作用和 IPv4 的环回地址一样。 这类地址也是仅此一个。
多播地址
功能和 IPv4 的一样。 这类地址占 IPv6 地址总数的 1/256。
本地链路单播地址 (Link-Local Unicast Address)
有些单位的网络使用 TCP/IP 协议,但并没有连接到互联网上。连接在这样的网络上的主机都可以使用这种本地地址进行通信,但不能和互联网上的其他主机通信。 这类地址占 IPv6 地址总数的 1/1024。
全球单播地址
IPv6 的这一类单播地址是使用得最多的一类。 曾提出过多种方案来进一步划分这 128 位的单播地址。 根据 2006 年发布的草案标准 RFC 4291 的建议, IPv6 单播地址的划分方法非常灵活。
向 IPv6 过渡只能采用逐步演进的办法,同时,还必须使新安装的 IPv6 系统能够向后兼容:IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由。
两种向 IPv6 过渡的策略:
双协议栈 (dual stack) 是指在完全过渡到 IPv6 之前,使一部分主机(或路由器)装有两个协议栈,一个 IPv4 和一个 IPv6。 双协议栈的主机(或路由器)记为 IPv6/IPv4,表明它同时具有两种 IP 地址:一个 IPv6 地址和一个 IPv4 地址。 双协议栈主机在和 IPv6 主机通信时是采用 IPv6 地址,而和 IPv4 主机通信时就采用 IPv4 地址。 根据 DNS 返回的地址类型可以确定使用 IPv4 地址还是 IPv6 地址。
在 IPv6 数据报要进入 IPv4 网络时,把 IPv6 数据报封装成为 IPv4 数据报,整个的 IPv6 数据报变成了 IPv4 数据报的数据部分。 当 IPv4 数据报离开 IPv4 网络中的隧道时,再把数据部分(即原来的 IPv6 数据报)交给主机的 IPv6 协议栈。
IPv6 也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。 因此 IPv6 也需要使用 ICMP 来反馈一些差错信息。新的版本称为 ICMPv6。
地址解析协议 ARP 和网际组管理协议 IGMP 协议的功能都已被合并到 ICMPv6 中。
CMPv6 是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信。 ICMPv6 还增加了几个定义报文的功能及含义的其他协议。
IP 多播 (multicast,以前曾译为组播) 已成为互联网的一个热门课题。 目的:更好地支持一对多通信。 一对多通信:一个源点发送到许多个终点。 例如,实时信息的交付(如新闻、股市行情等),软件更新,交互式会议及其他多媒体通信。