网络层提供的两种服务
在计算机网络领域,网络层应该向运输层提供怎样的服务(面向连接还是无连接)曾引起了长期的争论,争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统
电信网的成功经验让网络负责可靠交付
- 面向连接的通信方式
- 建立虚电路(Virtual Circuit),以保证双方通信所需的一切网络资源
- 如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点
虚电路是逻辑连接
只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,并不是真正建立了一条物理连接。
请注意,电路交换的电话通信是先建立了一条真正的连接。因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样。
因特网采用的设计思路
- 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务
- 网络在发送分组时不需要先建立连接。每一个分组(即IP数据报)独立发送,与其前后的分组无关(不进行编号)
- 网络层不提供服务质量的承诺,即所传输的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传输的时限
尽最大努力交付的好处
- 由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)
- 如果主机(端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层来负责(包括差错处理,流量控制等)
- 采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用
- 因特网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性
数据报服务
网际协议IP
网际协议IP是TCP/IP体系中两个最主要的协议之一,与IP协议配套使用的还有三个协议
- 地址解析协议ARP (Address Resolution Protocol)
- 网际控制报文协议ICMP(Internet Control Message Protocol)
- 网际组管理协议IGMP(Internet Group Management Protocol)
虚拟互连网络
互连在一起的网络要进行通信,会遇到许多问题要解决
网络互连要使用一些中间设备
中间设备又称为中间系统或中继系统
- 物理层中继系统 转发器
- 数据链路层中继系统 网桥或桥接器
- 网络层中继系统 路由器
- 网桥和路由器的混合物 桥路由
- 网络层以上的中继系统 网关
网络互连使用路由器
- 当中继系统是转发器或网桥时,一般并不称之为网络互连,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。
- 网关由于比较复杂,目前使用的较少
- 互联网都是指用路由器进行互连的网络
- 由于历史原因,许多有关TCP/IP的文献将网络层使用的路由器称为网关
虚拟互连网络的意义
- 所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络从用户看起来好像是一个统一的网络。
- 使用IP协议的虚拟互连网络可简称为IP网
- 使用虚拟互联网络的好处是:当互联网上的主机进行通信时,就好像在一个网络上通信一样,而看不见互连的各具体网络异构细节
如果我们只从网络层考虑问题,那么IP数据报就可以想象是在网络层中传送。
分类的IP地址
IP地址及其表示方法
- 我们把整个因特网看成为一个单一的抽象的网络。IP地址就是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围是唯一的32位的标识符。
- IP地址现在由因特网名字与号码指派公司进行分配
IP地址的编制方法
- 分类的IP地址,这是最基本的编制方法,在1981年就通过了相应的标准协议
- 子网的划分,这是对最基本的编制方法的改进,其标准[RFC 950]在1985年通过的
- 构成超网,这是比较新的无分类编制方法。1993年后很快就得到推广应用
分类IP地址
每一类地址都由两个固定长度的字段组成,其中一个 字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是**主机号 host-id
**,它标志该主机(或路由器)
可以记为
IP地址中的网络号字段和主机号字段
- A类、B类、C类地址的网络号字段分别为1,2,3字节长,而在网络号字段的最前面有1-3位的类别位,其数值分别规定为0,10,和110。
- D类地址用于多播(一对多通信)
- E类地址保留为以后用
点分十进制记法
常用的三种类别的IP地址
IP地址的一些重要特点
- IP地址是一种分等级的地址结构,分两级的好处是
- IP地址管理机构在分配IP地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便的IP地址的管理
- 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目大幅度减小,从而减少了路由表所占的存储空间。
- 实际上IP地址是标志一个主机(或路由器)和一条链路的接口
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号net-id必须是不同的。这种主机称为多归属主机
- 由于一个路由器至少应当连接到两个网络(这样它才能将IP数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的IP地址
- 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有相同的网络号 net-id
- 所有分配到网络号net-id的网络,范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
观察上图
- 在同一局域网上的主机或路由器的IP地址中的网络号必须一样
- 路由器总是具有两个或两个以上的IP地址,路由器的每一个接口都有一个不同网络号的IP地址
- 两个路由器直接相连的接口处,可指明也可不指名IP地址。如指明IP地址,则这一段连线就构成了一种只包含一段线路的特殊网络,现在常不指名IP地址
IP地址与硬件地址
比较重要的一点是要区别IP地址与硬件地址的区别
从层次的角度来看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上使用的地址,是一种逻辑地址(称IP地址是逻辑地址是因为IP地址是用 软件实现的)
从不同层次上来看IP地址和硬件地址
需要注意一下几点
- 在IP层抽象的互联网上只能看见IP数据报
- 虽然在IP数据报首部有源站IP地址,但路由器只根据目的站的IP地址的网络号进行路由选择
- 在具体的物理网络的链路层只能看见MAC帧而看不见IP数据报
- IP层抽象的互联网屏蔽了下面很复杂的细节。只要我们在网络层上讨论问题,就能使用统一的、抽象的IP地址研究主机和主机或路由器之间的通信
地址解析协议
- 不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。
- 每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
- 当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。
ARP高速缓存的作用
- 为了减少网络上的通信量,主机 A 在发送其 ARP 请求分组时,就将自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。
- 当主机 B 收到 A 的 ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。这对主机 B 以后向 A 发送数据报时就更方便了
ARP应当注意的是
- ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
- 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
- 从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。
- 只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。
使用ARP的四种典型情况
- 发送方是主机,要把IP数据报发送到本网络上的另一个主机。这时用ARP找到目的主机的硬件地址。
- 发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用ARP找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
- 发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用ARP找到目的主机的硬件地址。
- 发送方是路由器,要把 IP 数据报转发到另一个网络上的一个主机。这时用ARP 找到本网络上另一个路由器的硬件地址。剩下的工作由这个路由器来完成。
为什么我们不直接使用硬件地址进行通信
- 由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。
- 连接到因特网的主机都拥有统一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为调用 ARP 来寻找某个路由器或主机的硬件地址都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
IP数据报的格式
各字段
版本 - 占4位,指IP协议的版本(IPv4)
首部长度 - 占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位字(一个32位字长是4字节)。因此长度字段的最小值是5(二进制的0101),相当于IP首部长度为54 = 20字节,而当首部长度为1111时(即十进制的15),首部长度就达到最大值15个32位字长,即60字节。当IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用,但这样做是为了尽量减少开销。最常用的首部长度就是20字节(0101)这时不使用任何选项。(然而并没有介绍它是干啥的*)
区分服务 - 占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过。1998年这个字段改名为区分服务。只有在使用区分服务(DiffServ)时,这个字段才起作用。在一般情况下都不使用这个字段
总长度 - 占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节。总长度必须不超过最大传送单元MTU。
标识(identification) - 占16位,它是一个计数器,用来产生数据报的标识
标志(flag) - 占3位,目前只有前两位有意义,标志字段的最低位是MF(More Fragment)。MF = 1 表示后面还有分片。MF = 0表示最后一个分片标志字段中间的一位是DF(Don't Fragment)。只有当DF = 0时才允许分片。
-
片偏移(13位)指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以8个字节为偏移单位。
IP数据报分片
生存时间(8位)记为TTL(Time To Live)数据报在网络中可通过路由数的最大值
-
协议(8位)字段指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理过程
-
首部检验和(16位)字段只检验数据报的首部不检验数据部分,这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间,标志,片偏移等都可能发生变化),不检验数据部分可以减少计算的工作量,为了进一步减少计算检验和的工作量,这里不采用CRC检验码而采用简单的计算方法:在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃,详情见下图片:
源地址/目的地址 各占32位
IP数据报首部的可变部分
- IP首部的可变部分就是一个选项字段,用来支持排错、测量及安全等措施,内容很丰富
- 选项字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目
- 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。
- 实际上这些选项很少被使用。
IP数据报转发分组的流程
有四个A类网络通过三个路由器连接在一起,每个网络上都可能有成千上万个主机。可以想象,若按目的主机号来制作路由表,则所得出的路由表就会过于庞大。丹若按主机所在的网络地址来制作路由表,那么每一个路由器中的路由表就只包含四个项目。这样可以大大简化路由表。
使用这样的简化图,我们可以不用关心某个网络内部的具体拓扑结构及连接在该网络上有多少台计算机,他还强调了在互联网上转发分组时,是从一个路由器转发到下一个路由器。
查找路由表
根据目的网络地址就能确定下一跳路由器,这一点做的结果是:
- IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)
- 只有到达最后一个路由器时,才试图向目的主机进行交付
特定主机路由器
虽然因特网所有分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即对特定的目的主机指明一个路由。这种路由叫做特定主机路由,采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。
默认路由
- 路由器还可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。
- 这种转发方式在一个网络只有很少的对外连接时是很有用的。
- 默认路由在主机发送 IP 数据报时往往更能显示出它的好处。
- 如果一个主机连接在一个小网络上,而这个网络只用一个路由器和因特网连接,那么在这种情况下使用默认路由是非常合适的。
必须强调指出
IP 数据报的首部中没有地方可以用来指明“下一跳路由器的 IP 地址”,当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的** MAC 帧的首部,然后根据这个硬件地址**找到下一跳路由器。
分组转发算法
(1) 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。
(2) 若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行(3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
(4) 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行(5)。
(5) 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6) 报告转发分组出错。
划分子网和构成超网
划分子网
从两级IP地址到三级IP地址
在 ARPANET 的早期,IP 地址的设计确实不够合理。
- IP 地址空间的利用率有时很低。
- 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
- 两级的 IP 地址不够灵活。
三级IP地址
从 1985 年起在 IP 地址中又增加了一个“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址。这种做法叫作划分子网(subnetting) 。划分子网已成为因特网的正式标准协议。
划分子网的基本思路
- 划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。
- 从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
- 凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。
- 然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。
- 最后就将 IP 数据报直接交付目的主机。
划分子网后变成了三级结构
- 当没有划分子网时,IP 地址是两级结构。
- 划分子网后 IP 地址就变成了三级结构。
- 划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id。
子网掩码
- 从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。
- 使用子网掩码(subnet mask)可以找出 IP 地址中的子网部分。
IP地址的各字段和子网掩码
请注意现在子网号为3的网络的网络地址是145.13.3.0(既不是原来两级的IP地址的网络地址145.13.0.0,也不是简单的子网号3),为了使路由器能很方便的从数据报中的目的IP地址中提取所要找的子网的网络地址,路由器就要使用三级IP地址的子网掩码(如上图,三级IP地址的子网掩码),它也是32位,由一串1和跟随的一串0组成。子网掩码中的1对应于IP地址中原来二级地址中的16位网络号加上新增加的8位子网号,而子网掩码中的0对应于现在的8位主机号。虽然RFC文档中没有规定子网掩码中的一串1必须是连续的,但却极力推荐在子网掩码中选用连续的1,以避免发生错误
IP地址 AND 子网掩码 = 网络地址
不管有没有划分子网,只要把子网掩码和IP地址进行逐位相与运算,就立即得出网络地址来,这样路由器处理到来的分组时可以采用相同的算法。
归纳下上述的要点,从网络145.13.0.0外面看,这就是一个普通的B类网络,但进入这个网络后(即到了路由器),就看到了还有许多网络(即划分了子网后的许多网络),其网络地址为145.13.x.0(这里x可以表示不同的数值),而这些网络的子网掩码都是24个连1跟上8个连0。总之,在这个网络的内外,看到的网络是不同的
为了更便于查路由表,现在因特网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码,默认子网掩码中1的位置和IP地址中的网络号字段正好相对应。因此,若用默认子网掩码和某个不划分子网的IP地址逐位相与,就应当能够得出该IP地址的网络地址来,这样做可以不用查找该地址的类别位就能知道这是哪一类的IP地址 (书上原话 没懂 !!!!)
默认子网掩码
子网掩码是一个重要属性
- 子网掩码是一个网络或一个子网的重要属性。
- 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
- 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
- 若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。
P137有一个表格写B类子网划分选择(使用固定长度子网)
例题
使用子网掩码的分组转发过程
- 在不划分子网的两级 IP 地址下,从 IP 地址得出网络地址是个很简单的事。
- 但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。
- 因此分组转发的算法也必须做相应的改动。
算法
有一个例题请见教材P139
无分类编址CIDR(无分类域间路由选择)
网络前缀
划分子网在一定程度上缓解了因特网在发展中遇到的困难。然而在 1992 年因特网仍然面临三个必须尽早解决的问题,这就是:
- B 类地址在 1992 年已分配了近一半,眼看就要在 1994 年 3 月全部分配完毕!
- 因特网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
- 整个 IPv4 的地址空间最终将全部耗尽。
IP地址问题的演进
- 1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用**变长子网掩码 VLSM **(Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率。
- 在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。
CIDR最主要的特点
- CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
- CIDR使用各种长度的网络前缀(network-prefix)来代替分类地址中的网络号和子网号。
- IP 地址从三级编址(使用子网掩码)又回到了两级编址。
无分类的两级编址
无分类的两级编址的记法是:
CIDR 还使用斜线记法(slash notation),它又称为CIDR记法,即在 IP 地址后面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。
为了更方便的进行路由选择,CIDR使用32位的地址掩码,地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。例如/20地址块的地址掩码是:11111111 11111111 11110000 00000000 20个连续的1,斜线记法中,斜线后面的数字就是地址掩码中1的个数
CIDR地址块
- 128.14.32.0/20 表示的地址块共有 2^12 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位[一共32位])。
- 这个地址块的起始地址是 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 的主机号地址一般不使用。
路由聚合(route aggregation)
- 一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。
- 路由聚合也称为构成超网(supernetting)。
- CIDR 虽然不使用子网了,但仍然使用“掩码”这一名词。
- 对于 /20 地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中1的个数。
CIDR记法的其他形式
构成超网
- 前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。
- 这些 C 类地址合起来就构成了超网。
- CIDR 地址块中的地址数一定是 2 的整数次幂。
- 网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长。
CIDR地址块划分举例
这个 ISP 共有 64 个 C 类网络。如果不采用 CIDR 技术,则在与该 ISP 的路由器交换路由信息的每一个路由器的路由表中,就需要有 64 个项目。但采用地址聚合后,只需用路由聚合后的 1 个项目 206.0.64.0/18 就能找到该 ISP。
// 这里还没太懂.... 就是共有多少个几类网络那里
最长前缀匹配
- 使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。
- 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配(longest-prefix matching)。
- 网络前缀越长,其地址块就越小,因而路由就越具体(more specific) 。
- 最长前缀匹配又称为最长匹配或最佳匹配。
使用二叉线索树查找路由表
- 当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。
- 为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索(binary trie)。
- IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。
- 为了提高二叉线索的查找速度,广泛使用了各种压缩技术。
用5个前缀构成的二叉线索
所谓唯一前缀就是在表中所有的IP地址中,该前缀是唯一的,这样就可以用这些唯一前缀来构造二叉线索,在进行查找时只要能够和唯一前缀相匹配就行了。
从上至下来查找
网际控制报文协议ICMP
- 为了提高 IP 数据报交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)。
- ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
- ICMP 不是高层协议,而是 IP 层的协议。
- ICMP 报文作为** IP 层数据报**的数据,加上数据报的首部,组成 IP 数据报发送出去。
报文格式
ICMP报文的种类
- ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。
- ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型、代码和检验和。接着的 4 个字节的内容与 ICMP 的类型有关。
ICMP差错报告报文共有5种
- 终点不可达
当路由器或主机不能交付数据报时就向源点发送终点不可达报文 - 源点抑制(Source quench)
当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢 - 时间超过
当路由器收到生存时间为0的数据报时,除了丢弃该数据报外,还要向源点发送时间超过报文,当终点在预定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文 - 参数问题
当路由器或目的主机收到的数据报首部有的字段的值不正确时,就丢弃该数据报,并向源点发送时间超过报文 - 改变路由(重定向)(Redirect)
路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器(可通过更好的路由)
ICMP差错报告报文的数据字段的内容
不应发送ICMP差错报文的几种情况
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
- 对具有多播地址的数据报都不发送 ICMP 差错报告报文。
- 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。
ICMP询问报文
- 回送请求和回答
ICMP回送请求报文使由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态 - 时间戳请求和回答
ICMP时间戳请求报文是请求某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当时是哪一共有多少秒,时间戳请求与回答可用来进行时钟同步和测量时间。
ICMP的应用举例
- PING 用来测试两个主机之间的连通性。
- PING 使用了 ICMP 回送请求与回送回答报文。
- PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或UDP。
具体命令行命令见 P149
因特网的路由选择协议
有关路由选择协议的几个基本概念
理想路由算法
- 算法必须是正确的和完整的。
- 算法在计算上应简单。
- 算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。
- 算法应具有稳定性。
- 算法应是公平的。
- 算法应是最佳的。
关于最佳路由
- 不存在一种绝对的最佳路由算法。
- 所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。
- 实际的路由选择算法,应尽可能接近于理想的算法。
- 路由选择是个非常复杂的问题
- 它是网络中的所有结点共同协调工作的结果。
- 路由选择的环境往往是不断变化的,而这种变化有时无法事先知道。
从路由算法的自适应性考虑
- 静态路由选择策略——即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
- 动态路由选择策略——即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。
分层次的路由选择协议
- 因特网采用分层次的路由选择协议。
- 因特网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使因特网的通信链路饱和。
- 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到因特网上。
自治系统AS(Autonomous System)
- 自治系统 AS 的定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS之间的路由。
- 现在对自治系统 AS 的定义是强调下面的事实:尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。
因特网有两大路由选择协议
- 内部网关协议 IGP (Interior Gateway Protocol) 即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,如 RIP 和 OSPF 协议。
- 外部网关协议EGP (External Gateway Protocol) 若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。在外部网关协议中目前使用最多的是 BGP-4。
自治系统和内部网关协议、外部网关协议
这里要指出两点
- 因特网的早期 RFC 文档中未使用“路由器”而是使用“网关”这一名词。但是在新的 RFC 文档中又使用了“路由器”这一名词。应当把这两个属于当作同义词。
- IGP 和 EGP 是协议类别的名称。但 RFC 在使用 EGP 这个名词时出现了一点混乱,因为最早的一个外部网关协议的协议名字正好也是 EGP。因此在遇到名词 EGP 时,应弄清它是指旧的协议 EGP 还是指外部网关协议 EGP 这个类别。
因特网的路由选择协议
- 内部网关协议 IGP:具体的协议有多种,如 RIP 和 OSPF 等。
- 外部网关协议 EGP:目前使用的协议就是 BGP。
内部网关协议RIP(Routing Information Protocol/路由信息协议)
工作原理
- 路由信息协议 RIP 是内部网关协议 IGP中最先得到广泛使用的协议。
- RIP 是一种分布式的基于距离向量的路由选择协议。
- RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。
距离的定义
- 从一路由器到直接连接的网络的距离定义为 1。
- 从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。
- RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。
- 这里的“距离”实际上指的是“最短距离”
- RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”。
- RIP 允许一条路径最多只能包含 15 个路由器,“距离”的最大值为16 时即相当于不可达。可见 RIP 只适用于小型互联网。
- RIP 不能在两个网络之间同时使用多条路由。RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
RIP协议的三个要点
- 仅和相邻路由器交换信息。
- 交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
- 按固定的时间间隔交换路由信息,例如,每隔 30 秒。
路由表的建立
- 路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为1)。
- 以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。
- 经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
- RIP 协议的收敛(convergence)过程较快,即在自治系统中所有的结点都得到正确的路由选择信息的过程。
距离向量算法
P154有一道例题
路由器之间交换信息
- RIP协议让互联网中的所有路由器都和自己的相邻路由器不断交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。
- 虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。
RIP2协议的报文格式
RIP2的报文由首部和路由部分组成
- RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
- 路由标记填入自治系统的号码,这是考虑使RIP 有可能收到本自治系统以外的路由选择信息。再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
RIP协议的优缺点
- RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。
- RIP 协议最大的优点就是实现简单,开销较小。
- RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
内部网关协议OSPF(Open Shortest Path Frist/开放最短路径优先)
它是为了克服RIP的缺点在1989年开放出来的
OSPF 协议的基本特点
- “开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。
- “最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法SPF
- OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。
- 是分布式的链路状态协议,而不是像RIP那样的。
三个要点
- 向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法。
- 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。
- “链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。
- 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。
链路状态数据库
- 由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。
- 这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。
- OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF 的更新过程收敛得快是其重要优点。
OSPF的区域(area)
- 为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫作区域。
- 每一个区域都有一个 32 位的区域标识符(用点分十进制表示)。
- 区域也不能太大,在一个区域内的路由器最好不超过 200 个。
划分为两种不同区域
- 划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。
- 在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。
- OSPF 使用层次结构的区域划分。在上层的区域叫作主干区域(backbone area)。主干区域的标识符规定为0.0.0.0。主干区域的作用是用来连通其他在下层的区域。
主干区域的作用是用来连通其他在下层的区域。从其他区域来的信息都由区域边界路由器进行概括。上图中R3,R4,R7都是区域边界路由器,显然每一个区域至少有一个区域边界路由器,在主干区域的路由器叫做主干路由器,如R3,R4,R5,R6,R7,一个主干路由器可以同时是区域边界路由器,如R3,R4,R7,在主干区域还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息。这样的路由器叫做自治系统边界路由器(R6)
OSPF直接用IP数据报传送
- OSPF 不用 UDP 而是直接用 IP 数据报传送。
- OSPF 构成的数据报很短。这样做可减少路由信息的通信量。
- 数据报很短的另一好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。
OSPF的其他特点
- OSPF 对不同的链路可根据 IP 分组的不同服务类型 TOS 而设置成不同的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由。
- 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫作多路径间的负载平衡。
- 所有在 OSPF 路由器之间交换的分组都具有鉴别的功能,这就保证了仅在可信赖的路由器之间交换链路状态信息。
- 支持可变长度的子网划分和无分类编址 CIDR。
- 每一个链路状态都带上一个 32 位的序号,序号越大状态就越新。
OSPF分组
- 版本 当前为2
- 类型 5种类型分组中的一种
- 分组长度 包括OSPF首部在内的分组长度,以字节为单位
- 路由器标识符 标志发送该分组的路由器的接口的IP地址
- 区域标识符 分组属于的区域的标识符
- 检验和 用来检验分组中的差错
- 鉴别类型 目前只有两种。0(不用)和1(口令)
- 鉴别 鉴别类型为0时就填入0,为1时就填入8个字符的口令
OSPF的5种分组类型
- 类型1,问候(Hello)分组,来发现和维持临站的可达性
- 类型2,数据库描述(Database Description)分组,向临站给出自己的链路状态数据库中的所有链路状态项目的摘要信息
- 类型3,链路状态请求(Link State Request)分组,向对方请求发送某些链路状态项目的详细信息
- 类型4,链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态
- 类型5,链路状态确认(Link State Acknowledgment)分组,对链路更新分组的确认
OSPF的基本操作
OSPF使用的是可靠的洪泛法
假设路由器R用洪泛法发出链路状态更新分组。图中的一些小箭头表示更新分组。第一次先发给相邻的三个路由器。这三个路由器将收到的分组再进行转发时,要将其上游路由器除外。可靠的洪泛法是在收到更新分组后要发送确认(收到重复更新的分组只需发送一次确认,图中蓝绿箭头表示确认分组)
OSPF的其他特点
- OSPF 还规定每隔一段时间,如 30 分钟,要刷新一次数据库中的链路状态。
- 由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF 协议要比距离向量协议 RIP 好得多。
- OSPF 没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于 100 ms。
- 若N个路由器连接在一个以太网上,则每个路由器要向其他N-1个路由器发送链路状态信息,因而共有N (N-1)个链路状态要在这个以太网上传送。OSPF协议对这种多点接入局域网采用了指定的路由器的方法,使广播的信息量大大减少。指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息。
外部网关协议BGP
- BGP 是不同自治系统的路由器之间交换路由信息的协议。
- BGP 较新版本是 2006 年 1 月发表的 BGP-4(BGP 第 4 个版本),即 RFC 4271 ~ 4278。
- 可以将 BGP-4 简写为 BGP。
BGP使用的环境与内部网关协议不同的原因
- 因特网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
- 当一条路径通过几个不同 AS 时,要想对这样的路径计算出有意义的代价是不太可能的。
- 比较合理的做法是在 AS 之间交换“可达性”信息。
- 自治系统之间的路由选择必须考虑有关策略。
- 因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
BGP发言人
- 每一个自治系统的管理员要选择至少一个路由器作为该自治系统的**“ BGP 发言人” **。
- 一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。
BGP交换路由信息
- 一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。
- 使用 TCP 连接能提供可靠的服务,也简化了路由选择协议。
- 使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站或对等站。
BGP发言人和自治系统AS的关系
每个BGP发言人除了运行BGP协议外,还必须运行自治系统所使用的内部网关协议,如OSPF或RIP。
AS的连通图举例
- BGP 所交换的网络可达性的信息就是要到达某个网络所要经过的一系列 AS。
- 当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由。
它是树形结构不存在回路
BGP发言人交换路径向量
BGP协议的特点
- BGP 协议交换路由信息的结点数量级是自治系统数的量级,这要比这些自治系统中的网络数少很多。
- 每一个自治系统中 BGP 发言人(或边界路由器)的数目是很少的。这样就使得自治系统之间的路由选择不致过分复杂。
- BGP 支持 CIDR,因此 BGP 的路由表也就应当包括目的网络前缀、下一跳路由器,以及到达该目的网络所要经过的各个自治系统序列。
- 在BGP 刚刚运行时,BGP 的邻站是交换整个的 BGP 路由表。但以后只需要在发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销方面都有好处。
BGP共使用四种报文
- 打开(OPEN)报文,用来与相邻的另一个BGP发言人建立关系。
- 更新(UPDATE)报文,用来发送某一路由的信息,以及列出要撤消的多条路由。
- 保活(KEEPALIVE)报文,用来确认打开报文和周期性地证实邻站关系。
- 通知(NOTIFICATION)报文,用来发送检测到的差错。
在 RFC 2918 中增加了 ROUTE-REFRESH 报文,用来请求对等端重新通告。
BGP报文具有通用的首部
路由器在网际互连中的作用
路由器的结构
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。
典型的路由器结构
下图的方框中的1,2,3分别代表物理层,数据链路层和网络层的处理模块
从图中可以看出,整个路由器结构可以划分为两大部分 路由选择部分和 分组转发部分。
路由选择部分也叫作控制部分,其核心构件是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议(上面的内部/外部...协议)构造出路由表,通常经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
分组转发部分是本节要讨论的问题,它由三部分组成:交换结构、一组输入端口、一组输出端口(这里的端口就指的是硬件接口)
图中的交换结构又称为交换组织,它的作用是根据转发表对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。交换结构本身就是一种网络,但这种网络完全包含在路由器中,因此交换网络可看成是在路由器中的网络
转发和路由器选择的区别
- “转发”(forwarding)就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去,仅仅涉及到一个路由器。
- “路由选择”(routing)则是按照分布式算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由,涉及到很多路由器。
路由表是根据路由选择算法得出的。而转发表是从路由表得出的。
在讨论路由选择的原理时,往往不去区分转发表和路由表的区别
输入端口对线路上收到的分组的处理
数据链路层剥去帧首部和尾部后,将分组送到网络层的队列中排队等待处理,这会产生一定的时延
有一详细的过程请看P167
输出端口将交换结构传送来的分组发送到线路
当交换结构传送过来的分组先进行缓存。数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
分组丢弃
- 若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。
- 路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因。
交换结构
交换结构是路由器的关键构件,正是这个交换结构将分组从一个输入端口转移到某个合适的输出端口。
IP多播
IP多播的基本概念
多播可以明显地减少网络中资源的消耗
IP多播的一些特点
- 多播使用组地址—— IP 使用 D 类地址支持多播。多播地址只能用于目的地址,而不能用于源地址。
- 永久组地址——由因特网号码指派管理局 IANA 负责指派。
- 动态的组成员
- 使用硬件进行多播
在局域网上进行硬件多播
- 因特网号码指派管理局 IANA 拥有的以太网地址块的高 24 位为 00-00-5E。
- 因此 TCP/IP 协议使用的以太网多播地址块的范围是:从 00-00-5E-00-00-00到 00-00-5E-FF-FF-FF
- D 类 IP 地址可供分配的有 28 位,在这 28 位中的前 5 位不能用来构成以太网硬件地址。
D类IP地址与以太网多播地址的映射关系
有一段介绍P171
网际组管理协议IGMP和多播路由选择协议
IP多播需要两种协议
- 为了使路由器知道多播组成员的信息,需要利用网际组管理协议 IGMP (Internet Group Management Protocol)。
- 连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把多播数据报用最小代价传送给所有的组成员。这就需要使用多播路由选择协议。
IGMP使多播路由器知道多播组成员信息
IGMP的本地使用范围
- IGMP 并非在因特网范围内对所有多播组成员进行管理的协议。
- IGMP 不知道 IP 多播组包含的成员数,也不知道这些成员都分布在哪些网络上。
- IGMP 协议是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(严格讲,是主机上的某个进程)参加或退出了某个多播组。
多播路由选择协议比单播路由选择协议复杂的多
- 多播转发必须动态地适应多播组成员的变化(这时网络拓扑并未发生变化)。请注意,单播路由选择通常是在网络拓扑发生变化时才需要更新路由。
- 多播路由器在转发多播数据报时,不能仅仅根据多播数据报中的目的地址,而是还要考虑这个多播数据报从什么地方来和要到什么地方去。
- 多播数据报可以由没有加入多播组的主机发出,也可以通过没有组成员接入的网络。
IGMP是整个网际协议IP的一个组成部分
- 和 ICMP 相似,IGMP 使用 IP 数据报传递其报文(即 IGMP 报文加上 IP 首部构成 IP 数据报),但它也向 IP 提供服务。
- 因此,我们不把 IGMP 看成是一个单独的协议,而是属于整个网际协议 IP 的一个组成部分。
IGMP可分为两个阶段
- 第一阶段:当某个主机加入新的多播组时,该主机应向多播组的多播地址发送IGMP 报文,声明自己要成为该组的成员。本地的多播路由器收到 IGMP 报文后,将组成员关系转发给因特网上的其他多播路由器。
- 第二阶段:因为组成员关系是动态的,因此本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还继续是组的成员。