网络层主要完成网络寻址(路由选择),网络层涉及的主要设备是路由器,网络层主要的协议为IP、RIP、OSPF、ARP、RARP、ICMP等。
6.3.1 IP协议
IP协议是用来完成许多计算机网络互联起来进行通信的协议,是TCP/IP网络的核心协议,IP协议具有以下特点:
①IP协议的主要功能是完成数据传输,它不关心传输的数据的实际内容,主要是完成IP数据包在互联的网络中传输。
②IP协议提供的是一种无连接的数据传输服务,各个数据包带上完整的地址信息独立地在通信子网中传输,各节点根据数据包携带的地址信息逐节点向目的节点转发,最终到达目的地。可能存在不按顺序达到,需要排序处理。
③IP协议提供尽力传输的服务。它只管将IP数据包传输出去,不对数据包进行差错校验,(但要进行头部校验),IP层协议将数据包的验证任务交给传输层去解决,即传输的可靠性通过上层的TCP协议来保证。
④IP协议处于物理网络和上层主机之间,向下可以面对不同的物理网络,向上则提供统一的数据传输服务,通过建立IP地址和MAC地址的映射,以统一的IP地址面向传输层,实现了网络地址的向上统一。IP协议将底层物理网的数据帧封装成IP包进行传输,以统一的IP数据包面向传输层,实现了数据包的向上统一。IP协议地址的向上统一和数据包的向上统一达到了向上层屏蔽底层网络差异的目的。
由于采取尽力的传输思想,使得传输效率非常高,实现起来也简单,随着底层通信网传输质量的不断提高,IP协议的尽力传输的好处也体现得更加明显。
每个数据报都带有完整的地址信息,从发送节点进入网络后经各节点不断转发,每一个节点收到一个数据报后,根据各节点所存储的路由信息,为该分组选择转发的路径,把数据报原样发送到下一节点。
(1)IP数据包的格式
IP数据包格式如图6-9所示。IP数据包由头部和数据两部分组成,头部又分为定长部分和变长部分。定长部分由20字节组成,变长部分由IP选项组成,IP数据包各字段意义如下:
①版本号:版本号指示当前传输的数据包是IPv4包还是IPv6包,版本号占4比特。在网络中,通信双方使用的IP协议版本必须一致,IPv4的包只能在IPv4网中传输,如果要在IPv6网中传输,需要进行IP转换。IP软件在处理IP数据包时需要检查版本号字段,根据版本号字段决定对IP数据包的处理。
图6-9 IP数据包格式
②头长度:指出IP包头的长度,从而确定包头和数据的界面,指示出什么时候包头结束,数据开始。头长度以4个字节为一个基本单位,不带IP选项部分的包头占20字节,即5个4字节单位的长度。头长度字段占4比特,最大可表达到15,头长度的最大单位为15个4字节,所以IP选项部分不能超过10个4字节单位长度。
③服务类型:使用8比特来表示服务质量和优先级。前3比特优先级从0到7分为8个级别,0为最低优先级,7为最高优先级。当网络出现拥塞时,路由器可以根据数据包设置的优先级别决定首先丢弃哪些数据包。
服务类型的后4比特用于指示服务质量,分别用D、T、R和C表示。D代表传输最小延迟、T代表传输最大吞吐率、R代表传输最大可靠性、C代表最低传输成本。D、T、R和C每次只能设置一个,也就是说,路由设备中只能考虑一个指标,不可能多个指标同时设定,多个参数的设定只能使路由器无所适从,没有意义。
对于数据量大的业务(FTP),需要选择高吞吐率;对于数据量少的业务(Telnet),需要选择低延迟;对于路由和网络管理业务(IGP、SNMP),需要选择高可靠性。最后1个比特是保留比特,目前没有定义。
④总长度:总长度字段占16比特,总长度指示出整个数据包的长度,从而指示包的结束,实现包发送接收的同步。总长度以字节为单位,由于总长度字段占16比特,IP数据包的最大长度可达2的16次方,即65 535个字节。从总长度可以知道整个包的长度,减去包的头部长度就可得到实际数据长度。
数据包的总长度在传输时是非常重要的参数。由于IP网络数据传输是以帧的形式通过底层物理网进行传输的,IP数据包要封装成帧来传输,但是不同物理网络的最大帧的长度是不一样的,底层物理网能够封装的最大数据长度称为该网络的最大传输单元MTU,各种物理网中存在的MTU如下:
以太网——1500字节;
令牌网——4500字节;
FDDI网——4770字节。
如果当前的IP包的数据长度超过了MTU,则底层的物理网将无法封装,碰到这种情况时IP层必须将该IP数据包进一步分段后再传输。
例如,物理网是以太网时,由于以太网的最大传输单元MTU为1500字节,当单个数据包长度大于1500字节时,则需要将该数据包被分解成1500字节的小段,然后封装成IP包进行传输。数据传输中,IP层协议会根据底层面对的物理网络对应计算分段的大小。
⑤标识:标识字段用来标识不同的数据包,每个数据包从源主机端发出时,在标识字段自动加1,当数据包被分段时,每个分段的包仍然要带着这个标识符,以指示这些分段同属一个数据包。TCP/IP中通过标识符和片段偏移量指示同属一个数据包的各不同分段。目的端根据收到的数据包的标识符可以判定收到的分片属于哪个IP数据报,从而完成数据包的重组。
⑥标志:表示该数据包是否被分段,是分段时,还进一步表示是否是最后一个分段到来。
⑦段偏移量:段偏移量占13比特,段偏移量指示出在分段中,该包在原始数据区的偏移量。段偏移量以8字节(64比特)为一个单位计算。每个分段的长度一定是8字节的整数倍。段偏移量为目的端的主机进行各分段的重组装配提高顺序依据。
⑧生存期TTL:生存期字段为8比特,指示该数据包的生存期。由于数据包的转发是经过路由器实现的,当路由器上的路由表出问题,数据包就可能存在不能正确传往目的主机,这样的数据包将在网中不断传输,始终不能到达目的主机,白白消耗网络带宽资源。为了避免这样的情况发生,每个主机在发出数据包时,给每个数据包设置一个生存时间,数据包每经过一个路由器,减去1,当生存时间小于等于0时,数据包仍然没有达到目的端,则视为无法达到数据包,做删除处理。
⑨协议类型:协议类型字段为8比特,协议类型字段指出当前数据包封装的协议,TCP=6、UDP=17、ICMP=1、OSPF=89等。发送方主机的IP协议根据被封装的协议设置协议类型值,目的主机的IP协议根据数据包中的协议类型标识将该数据包分发到传输层相应的协议去处理。例如,协议类型字段指示为TCP,则传输层用TCP协议处理该包,协议类型字段指示为UDP,则传输层用UDP协议处理该包。
⑩头校验码:为了提高传输效率,IP协议不对数据包进行差错校验,IP层协议将数据包差错校验的任务交给传输层去解决,但IP协议对包头部分(不包含源IP地址和目的IP地址)设置了差错校验。
包头的差错校验通过头校验码字段实现。头校验字段为16比特,在数据包发送时,将包头按照算法形成16比特的校验码,填到校验码字段,然后按照路由转发表转发给下一跳路由器,下一跳路由器收到该数据包后,通过校验码进行头部的差错校验。当验证收到的数据包头部是正确的,则该路由器进入路由选择、数据转发。
由于IP协议属于网络层的协议,它实现了一个路由器到下一跳路由器的数据转发处理,在这个过程中发生的差错不可能交到负责端到端的传输层去处理。另一方面IP头部字段在点对点的传输过程中是不断变化的(生存期值、标志和分段偏移量等),只能在各发送路由器节点形成校验数据,在接收路由器节点完成校验,即在相邻节点间进行校验,所以对包头的校验必须在网络层完成。
源IP地址:源IP地址字段为32位,指示发送方的主机的IP地址。
目的IP地址:目的IP地址字段为32位,指示目的主机的IP地址。在IP包的转发过程中,转发路由器会对底层物理网送来的帧进行解封装和再封装,物理地址也会相应地不断发生变化,但IP数据包的源IP地址和目的IP地址却是始终保持不变的。
IP选项:选项字段为可变字段,是在进行传输数据包的同时可选的附带功能,用于控制数据在网络中的传输路径、记录数据包经过的路由器以及获取数据包在传输途中经过的路由器的时间戳以及测试业务等。
填充:选项部分所占字节数不到4个字节的整数倍时,通过填充扩充到4字节。
(2)IP数据包的传输
IP数据包传输在经路由器转发时要经过几个方面的处理:首部校验、路由选择、数据分段及数据转发。
IP协议为了提高传输效率,不对数据进行差错校验,从而减小时间开销,提高传输效率,但IP协议对传输来的IP包进行了包头的差错校验。
计算头校验码的过程如下:将头部的数据按顺序分成多个16比特的小数据块,头部校验码字段初始值设为0,用1的补码对16比特的小数据块进行求和,最后再对结果进行补码便得到头部的校验码。
当该数据包转发到下一跳路由器时,下一跳路由器作为将收到的数据包的头部再分作多个16比特的数据块,用1的补码算法对16比特的数据块进行求和,最后再对结果求补码,若得到的结果为0,就说明收到的头部是正确的。
接收路由器在收到数据包经过校验其头部是正确的后,则将该数据包交去作路由处理,即查找路由表为该数据包找到对应前向网络的输出端口,将该数据包从该输出端口进行转发。
IP协议按照底层物理子网最合适的数据包大小进行数据传输,当该数据包转发的前向网络是MTU较小的网络时,IP协议将数据包分成较小的数据片进行传输,在后面的传输过程中,如果继续碰到同样的问题,还要进一步分段。所以,数据包在从源端到目的端的传输过程中,可能会多次分段。数据包的分段过程如图6-10所示。
图6-10 数据包的分段过程
当数据包被分段时,每个分段都带有头部,分段头部的其他内容与原数据包是一样的,只是标识字段、标志字段以及段偏移量有相应的变化。
标识字段指示出这些数据包是否同属于一个数据包;标志字段指示出当前的分段是不是最后一个分段,即指示出最后一个分段到来;段偏移量指示被分成段的各个小包在大的报文中的位置,偏移量指示出各分段的序号,段偏移量是目的主机组装报文的顺序依据。
例如,一个数据包数据段长度为1480字节,进入MTU为600字节的物理网时需要分段,各分段数据包中的标志段M位为:
第一个分段的偏移量为0,标志段的M位=1,指示出该段不是最后一片;
第二个分段的偏移量为600,标志段的M位=1,指示出该段仍然不是最后一片;
第三个分段的偏移量为示1200,标志段的M=0,指示出该段为最后一片。
报文一旦被分段后,是作为单独的数据单元进行传输的,如果在传输过程中某个单元发生差错,则目标主机将丢弃整个数据包,重新组织传输。
在网络存在多条路径可达目的主机的情况下,分组传输使得所有的分段分组可以选择不同路径传输,具有并行传输和负载分担的优点。从前面讨论可知,分段可以在发送主机和传输路径上的任何一台路由器上进行,而数据包分段后的重组只能是在目标主机上完成。之所以这样做是由于各分段在传输过程中可能会沿不同路径传输,就不可能在某个路由器收齐同一数据报的各个分段,所以路由器无法完成重组,数据包分段后的重组只能是在目标主机上完成。另外,将重组的任务交到主机,可以减少路由器负担,提高通信子网的传输效率。
数据包分段后的重组根据数据包头部中的标识、标志和分段的偏移量来实现。同一标识的数据包属于同一数据报文,通过标志知道最后一个数据包到来,然后将收到数据包按照分段的偏移量进行排序组装,形成完整的数据报文。
6.3.2 RIP路由协议
RIP(Routing Information Protocol)是一个基于距离向量的路由协议,RIP协议规定的“距离向量”为达到网络目的地所经过的路由器数目,即跳数(Hopcount),RIP协议以经过的跳数最少为路由选择依据。
在RIP协议规定,路由器到与它直接相连网络的跳数为0,通过与其直接相连的路由器到达下一个紧邻的网络的跳数为1,其余的以此类推,每多经过一个路由器跳数加1。RIP协议允许的最大跳数为15,当跳数达到16时,即认为距离为无穷远,不可达。由此可见,RIP适用于较小规模的网络。
RIP协议采用主动发送,被动接受的机制来实现路由信息的建立和更新。在网络启动时,路由器拥有的唯一信息是与之直接相连的网络,建立起初始的路由表。在随后的工作中,每个路由器将会周期地主动向与之相连的其他路由器广播自己的路由表信息,各个相邻路由器接收该路由表信息,通过这样的路由表信息交换,最终每个路由器都可获得整网的信息。
RIP协议向相邻路由器广播自己的距离路由表信息是通过UDP协议实现的。RIP每隔30秒定期向所有邻近的路由器广播自己的路由表信息,各相邻路由器收到这个路由表信息时,使用算法计算这出当前的最优路由,更新自己的路由表项,经过每个路由器对自己路由表的定时更新,最终每个路由器都建立了完整的路由表。
当数据包到来时,路由器按照建立的路由表为数据包进行路由选择,完成数据转发。定期的路由更新还使得当网络拓扑发生变化时,路由器会及时更新路由表的路由信息,使路由器按照最新的路由表信息进行路由选择,实现自动适应网络的拓扑变化。
设一个网络采用了RIP路由协议,连接如图6-11所示。网络1(192.168.11.0)、网络2(192.168.12.0)、网络3(192.168.20.0)直接连接在路由器R1上,而网络3(192.168.20.0)、网络4(192.168.21.0)、网络5(192.168.22.0)直接连接在路由器R2上。网络3既连接在路由器R1,也连接在路由器R2上,网络1与网络2和网络4与网络5通过网络3实现了远程的互联。该网络路由表的建立和路由情况如图6-11所示。
图6-11 采用RIP路由协议的网络
(1)直接交付路由关系的建立
在初始情况下,当网络1有数据包发送时,该数据包必然到达路由器R1的E0端口。路由器R1从数据包地址段的源地址学习到网络1发出的包是从端口E0进来,所以网络1是连接在E0端口的,故路由器R1建立了转发的目的网络是网络1(192.168.11.0)时,从E0端口转发,跳数为0,交付情况为直接交付的信息表项。
同样,由于网络2接在路由器R1的E1端口,当网络2有数据包发送时,该数据包必然达到路由器R1的E1端口。路由器学习到网络2发出的包是从端口E1进来,所以网络2是连接在E1端口的,路由器R1建立了转发的目的网络是网络2(192.168.12.0)时,从E1端口转发,跳数为0,交付情况为直接交付的信息表项。
以此类推,由于网络3接在路由器R1的S0端口,路由器R1建立了转发的目的网络是网络3(192.168.20.0)时,从S0端口转发,跳数为0,交付情况为直接交付的信息表项。
所以初始阶段,通过自学习,路由器R1可以建立起与之直接连接的网络1、网络2和网络3的路由表的表项信息。
(2)间接交付路由关系的建立
从图6-11中可以看出,当有数据包从网络1(192.168.11.0)要传给网络4(192.168.21.0)时,该数据包需要从路由器R1的S0端口转发到路由器R2,再从路由器R2的E0端口转发到网络4,显然这种转发属于间接交付情况。由于这种转发需要再经过一个路由器转发才能达到,所以经过的跳数为1。
显然,对于路由器R1,当数据包的目的地址是网络4或网络5时,属于间接交付情况,路由器R1的路由器表也要建立起转发到网络4或网络5的转发路由。该转发路由关系的建立是通过路由器R1与路由器R2定期交换学习到的网络端口关系来实现的。
在以上网络结构中,路由器R1每隔30秒向自己的相邻路由器R2发送自己的路由信息表,路由器R2同样也每隔30秒向路由器R1发送自己的路由信息表。
当路由器R2收到从路由器R1发来的路由表信息时,路由器R2学习到的网络3、网络4、网络5是直接连接在路由器R2上的,数据包要转发给网络4或网络5,需要从路由器R1的S0端口转发给路由器R2,而且转发到路由器R2后该数据包通过直接交付就可转发到目的网络。所以R1路由表中将建立起数据包要传给网络4或网络5属于间接交付,经过的跳数为1,转发的选择的端口应该是路由器R1的S0端口的路由表信息表项。
同样,当路由器R1将学习到的网络1、网络2、网络3是直接连接在路由器R1上的网络端口关系交换给路由器R2时,路由器R2学习到,数据包要转发给网络1或网络2,需要从路由器R2的S1端口转发给路由器R1,而且转发到路由器R1后该数据包通过直接交付就可转发到目的网络。所以R2路由表中将建立起数据包要传给网络1、网络2属于间接交付,经过的跳数为1,转发的选择的端口应该是路由器R1的S0端口的路由表信息表项。路由器R1,路由器R2建立起的完整的路由转发表如图6-11所示。
可以看出,经过定期与相邻路由器交换路由信息,网络上的每一个路由器都最终获得了整网的路由信息,建立起反映整网情况的路由转发表。显然,即使是在网络使用的过程中有网络的接入,使网络拓扑发生了变化,由于路由器的定时更新信息,路由器也能够动态地建立起相应的路由表。
(3)路由器的路由选择与数据转发
在完整的路由表建立起来后,当有数据包要从网络1传给网络2时,网络1的数据包从路由器R1的E0端口送入路由器,路由器R1根据该数据包的目的地址,查找路由表得到网络2是连接在路由器R1的E1端口,属于直接交付情况,路由器R1将该数据包从E1端口转发出去,该数据包到达网络2,到达了目的网络。
当有数据包要从网络1传给网络4时,网络1的数据包从路由器R1的E0端口送入路由器,路由器R1根据路由表查转发路由应选择S0端口转发,于是该数据包从S0端口转发出去,到达网络3,再从网络3连接在路由器R2的S1端口进入路由器R2,从路由器R2的路由表得到目的地址是网络4的数据包应该从E0端口转发出去,该数据包到达网络4,到达了目的网络。
同样,当网络4有数据包要发给网络1时,路由器R2将该数据包通过S1端口转发到网络3,再从网络3连接在路由器R1的S0端口进入路由器R1,从路由器R1的路由表得到目的地址是网络1的数据包应该从E0端口转发出去,于是该数据包从路由器R1的E0端口转发出去,到达了网络4,到达了目的网络。
6.3.3 OSPF路由协议
开放最短路由优先协议OSPF是由IETF(Internet Engineering Task Force)工程任务组开发的基于链路状态的路由协议。“开放”是指OSPF协议是公开发表的协议标准,任何厂家都可以使用。“最短路由优先”是因为使用了荷兰科学家Dijkstra提出的最短路由算法SPF(Shortest Path First)。
(1)OSPF的工作原理
链路状态路由协议是根据距离、链路带宽、时延等链路状态信息综合进行路由选择的路由协议。链路状态路由协议将以上影响因素都折算成一个权值(cost),再根据权值确定最佳路由。
这里的权值指出了从一台路由器经链路传输到另外一台路由器所需要的时间开销,一条路由的时间开销指沿着这条路由到达目的网络的路径上所需要的所有时间开销,OSPF路由选择算法的依据是时间开销最小的路径为最优路径。
OSPF协议采用最短路径优先算法,以自身为根节点计算出一棵最短路径树,在这棵树上,由根节点到各节点的累计开销最小,即由根节点到各节点的路径在整个网络中都是最优的,这样也就获得了由根节点去各个节点的最优路由。
在如图6-12所示的网络中,各链路的cost如图所示,从R2到R4存在路径1和路径2两条路径,但是路径2的累计cost开销小于路径1的累计cost开销,路径2为最优路径。
图6-12 OSPF路由协议的工作原理示意
OSPF路由协议的最优路径选择是通过查找路由器中的路由表完成的。路由表的建立需要通过收集每一个路由器的链路状态信息,建立起一个链路状态数据库,然后根据最短路由算法,计算出每个路由器到目的网络的最短路由,从而建立起路由表。
当路由器初始化或当网络结构发生变化(如增减路由器、链路状态发生变化等)时,路由器会产生链路状态广播数据包LSA(Link-State Advertisement),该数据包里包含本路由器与哪些路由器相邻以及各端口链路的cost信息,也即路由器的链路状态信息。通过各路由器与相邻路由器之间交换链路状态广播数据包LSA,各路由器获得了完整的链路状态信息,建立起了自己的链路状态数据库LSDB(Link State Database)。
完成链路状态数据库LSDB的建立后,各路由器根据建立起的LSDB,运行SPF算法,计算出以自己为根的最短路径,从而建立起自己的路由表,当数据包达到路由器时,路由器根据建立的路由表对达到的数据包进行路由选择。
路由器在建立路由表的过程中,需要与相邻路由器交换链路状态信息,为了减小网络内部的信息交换量,从而减小路由器计算路由信息的复杂度,提高路由器的处理能力。OSPF采用分层路由方式,即将一个自治域系统的网络再分成若干子区域,每个区域内部路由器仅与自己区域内部路由器交换信息,由于每个区域内的路由器只与自己区域内的路由器进行交换,大大减少了网络的信息交换量,提高了路由收敛速度。图6-13为分区示意图。经过分区,区域内部的路由器建立的链路状态数据库也成为相对较小的数据库,这些数据库分别在自己的区域内部进行维护,从而降低了路由器内存和CPU的消耗,提高路由器的处理性能,有利于网络资源的利用。
图6-13 分区示意
(2)OSPF的工作过程
路由协议的工作一般要经过发现邻居、交换信息、计算路由、维护路由几个过程。OSPF协议的工作过程如下:
OSPF启动后,需要寻找网络中可以与自己交换链路状态信息的相邻路由器,这是发现邻居的过程。为了识别每个路由器的身份,OSPF对每个路由器定义了相应的Router ID,该ID是在该区域内唯一标识该路由器的IP地址。网络里的其他路由器都使用该Router ID来标识这台路由器。在OSPF启动后,在单个区域内,区域内部路由器首先向相邻路由器交换各自的信息,每一个路由器发送拥有自己ID信息的Hello包,相邻路由器收到这个包,就将这个包内的ID信息加入自己的Hello包,向相邻路由器发送,如果某路由器收到含有自己ID信息的Hello帧,说明该发来Hell包的路由器是自己的相邻路由器,则根据接收到的端口,建立邻接关系。
建立好邻接关系后,路由器进入交换信息阶段,区域内部路由器和他的邻接路由器之间相互交换链路状态广播数据包LSA。OSPF协议通过泛洪(Flooding)的方法来交换链路状态数据,泛洪是指路由器将其LSA数据包传送给本区域内的所有与其相邻的OSPF路由器,相邻路由器根据其接收到的链路状态信息更新自己的数据库,并将该链路状态信息转送给与其相邻的路由器,直至稳定的一个过程。
当网络重新稳定下来,也可以说OSPF路由协议收敛过程完成后,每个区域的路由器都获得了完整的网络状态信息,并建立起拥有整个网络的链路状态数据库LSDB。
当一个OSPF路由器建立起链路状态数据库LSDB后,OSPF路由器依据链路状态数据库内容,通过SPF算法,计算出每一个目的网络的路径,并将路径存入路由表中,从而完成了路由计算,建立起路由表。
当网络建立起路由表后,路由器就能进行正常的路由选择和数据包转发,但是当网络由于网络扩充或者网络故障使网络链路状态发生变化时,路由器还需进行路由维护,即及时更新路由表信息。
OSPF的路由信息更新过程为:在网络运行过程中,当网络链路状态发生变化时,路由器及时将这种变化通过泛洪方式传递给区域内的所有路由器,各路由器收到该信息时,完成信息更新,重新计算路由,建立起新的路由表。
为了保证链路状态数据库始终与全网的状态保持一致,OSPF还采取定期更新的办法进行路由信息更新,每个路由器每隔30分钟重新收集链路状态信息,重新刷新链路状态数据库,重新计算路由,以保证当前路由是最优路由。关于OSPF协议的实际应用将在后面的章节中继续讨论。
6.3.4 ARP、RARP协议
在TCP/IP网络中,数据包通过通信子网中的路由器实现数据转发,每个路由器为达到的数据包选择路由,找到前往目的网络的对应的端口,然后进行数据包的转发。按照网络的层次体系,数据发送时,发送端的数据包从网络层交给数据链路层封装成数据帧,然后交到物理层完成数据编码发送出去,同样到达接收端后,物理层完成数据编码的接收,恢复成数据,以数据帧的形式交给数据链路层,数据链路层的帧完成帧的接收后,将数据帧解封恢复成IP数据包交给网络层。
在发送、接收过程中,由于网络层的数据包使用IP地址寻址、数据链路层的数据帧使用MAC地址寻址,TCP/IP网络必须在这两种地址间建立映射关系,以便相应的层次完成数据协议单元的地址封装。
在网络中,IP地址与MAC地址的映射关系并不是一成不变的。当主机从一个物理位置移动到另外一个物理位置时,它的IP地址就会发生变化,但它的MAC地址没有发生变化。同样,当主机被更换网卡时,它的IP地址没有发生变化,但是它的MAC地址发生了变化。
在这种变化发生时,IP地址与MAC地址的映射关系也要相应发生变化,通过人为配置来跟踪这种变化,维护这种映射关系对于日益庞大的网络来说是不现实的,所以TCP/IP网络采用专门的协议自动完成建立和维护这种映射关系。
在TCP/IP网络中,IP地址与MAC地址之间的映射称为地址解析,TCP/IP协议专门提供了ARP、RARP两个协议实现这种地址解析。ARP称为地址解析协议,完成从IP地址到MAC地址的映射,即完成在已知IP地址的情况下,获取对应的MAC地址;RARP称为反向地址解析协议,完成从MAC地址到IP地址的映射,即完成在已知MAC地址的情况下,获取对应的IP地址。
(1)地址解析协议ARP
当源主机要向同一子网的目的主机发送数据包时,源主机的IP层需要将IP数据包传给数据链路层进行帧的封装,封装时就需要给出目的主机的MAC地址。如果在源主机还不知目的主机的MAC地址的情况下,就需要通过地址解析协议ARP获得目的主机的MAC地址。
获取目的主机MAC地址的工作过程如下:源主机将通过广播方式发送ARP请求包,该请求包送到网络中所有主机,目的主机收到ARP请求包,发现包中的目的IP地址和自己的地址相符,则发送响应,应答ARP请求,并以单播方式将自己的MAC地址通知源主机。从而使源主机获得了目的主机的MAC地址,完成了从IP地址到MAC地址的解析。其他主机发现包中的目的IP与自己的IP地址不符,则丢弃该包。
源主机在得到目的主机MAC地址的情况下,发送数据包时,源主机使用IP地址和MAC地址完成IP包和数据链路层帧的封装,通过物理层进行数据发送。
在如图6-14所示例子中,目的主机与源主机是在同一子网中的,源主机提出ARP请求是以广播方式发送的。当目的主机与源主机不在同一子网时,由于路由器不会对广播包进行转发,目的主机就收不到该ARP请求,因而不能用ARP确定远端网络中的目的主机MAC地址。
图6-14 ARP的使用
当目的主机与源主机不是在同一子网的情况下,源主机的数据包是经过路由器进行转发的,此时源主机提出的ARP请求也相应地由相邻路由器来响应该ARP请求,相邻的路由器将自己对应的端口MAC地址返回给源主机,源主机使用相邻路由器返回的MAC地址进行帧的封装。在这种情况下,虽然源主机没有直接得到目的主机的MAC地址,但由于后续路由器都一直以这样方式不断向前转发,当数据包到达了目的子网时,与目的子网连接的路由器解析出了目的主机的MAC地址,使数据包最终交付给了目的主机,源主机向目的主机发送数据包的工作同样得到了实现。
显然,如果源主机每次进行数据发送时都要重复以上过程,势必带来较大的处理时间的开销。为了减小解析的时间开销,网络采用了ARP高速缓存来解决这个问题。让网络中的每台主机都维持着一个ARP高速缓存,存放着从网络上解析得到的IP地址与MAC地址的映射关系,即主机第一次发送数据包时,将解析获得的IP地址与MAC地址的影射关系表存放在自己的ARP缓存中,当主机再次需要发送数据包需要IP地址与MAC地址映射关系时,先在ARP缓存查找,有则直接获得,没有才再发ARP请求,解析获取相应的映射关系。
由于存放在ARP高速缓存中的映射关系可能在会因为主机物理位置发生变化或更换网卡导致过时,这样的映射关系拿来使用将发生错误,解决这个问题的办法是给ARP高速缓存中的每一个表项设置一个超时值,如果在给定的超时值该表项都没有被使用过,就重新发送ARP请求建新的映射关系。
(2)ARP地址解析实例
当源主机与目的主机在同一子网中时,ARP过程如下:
①检查本地ARP高速缓存,如果本地ARP高速缓存已经建立该IP地址到MAC地址的映射,则不需要广播ARP请求,直接使用ARP高速缓存中表项给出的MAC地址进行数据链路层帧的封装,封装后从物理层发送出去。如果本地ARP高速缓存没有建立该IP地址到MAC地址的映射,则需要广播ARP请求,源主机发出广播ARP请求包,该ARP请求包中含了源主机IP地址和MAC地址,同时还包含目的主机的IP地址。
②目的主机收到该广播包,以单播方式应答源主机,将目的主机的MAC地址封装在ARP应答数据包中送往源主机。源主机收到应答后,建立起目的主机IP地址与MAC地址的映射关系,并将获得的IP地址与MAC地址的影射关系表存放在ARP缓存中,即更新ARP高速缓存。
当源主机与目的主机位于不同的子网中时(如图6-15所示),ARP过程如下:
图6-15 源主机与目的主机位于不同的子网中时ARP的过程
①源主机根据源主机IP地址、目的IP地址以及掩码可以判断出源主机与目的主机位于不同的子网中,源主机根据其路由表得到去目的主机的下一跳为路由器R1的端口地址(IP3),源主机通过ARP解析得到路由器R1对应在该子网端口数据链路层的MAC(MAC3)地址,然后将要传送给目的主机的数据包用MAC1地址作为源MAC地址,MAC3地址作为目的MAC地址进行数据帧的封装后送给路由器R1。
②路由器R1收到该IP数据包后,根据目的主机IP地址以及自己的路由表确定去往目的主机的下一跳为路由器R2的端口地址(IP5),路由器R1的转发端口地址为IP4,相应的MAC地址为MAC4,路由器R1通过ARP解析得地址为IP5的端口的数据链路层地址为MAC5,然后将要传送给目的主机的数据包用该MAC4作为源MAC地址,MAC5作为目的MAC地址进行数据帧的封装后送给路由器R2。
③当路由器R2收到此数据包后,根据目的主机IP地址以及自己的路由表确定目的主机所在子网已经是直接连接在自己端口IP6上的网络,数据包经过直接交付就可得到达目的主机。此时路由器R2将MAC6作为源MAC地址,通过解析得到目的主机的MAC2地址,将该数据包以MAC6作为源MAC地址,以MAC2作为目的地址进行封装后发送给目的主机。
可以看出,在从源主机IP1发送数据包到目的主机IP2的过程中,由于要经过中间若干路由器的转发,每个路由器的数据包中的源IP地址和目的IP地址是不变化的,发送路由器和接收路由器的MAC地址却是不断在变化的。
(3)反向地址解析协议RARP
反向地址解析协议RARP完成从MAC地址到IP地址的映射,即完成在已知MAC地址的情况下,获取对应的IP地址(如图6-16所示)。
图6-16 RARP的使用
反向地址解析协议被无盘工作站用来获取IP地址。通常主机的IP地址是保存在本地硬盘中的,操作系统在启动时会从本地硬盘找到它,但是当网络工作在无盘工作站时,由于没有硬盘,一旦关机,就会丢掉它的IP地址。
此时无盘工作站是从局域网中的一个主机(RARP服务器)获得自己的IP地址。无盘机启动时,向RARP服务器申报自己的MAC地址,同时向RARP服务器发出逆向地址解析请求,请求获得自己的IP地址。RARP服务器上有人为事先配置好的每台工作站的MAC地址与IP地址的映射表。当收到RARP请求后,从RARP服务器的映射表找出对应的IP地址,发给该工作站。
(4)地址解析报文格式
ARP和RARP都是通过请求和应答报文来完成解析的,TCP/IP中ARP和RARP的请求、应答报文都采用了相同的格式,通过操作类型字段来加以区分。地址解析报文格式如图6-17所示。
图6-17 地址解析报文格式
报文格式中各字段表示如下:
①硬件类型:16比特,指出物理网络类型(以太网=1、令牌网=3);
②协议类型:16比特,指出采用ARP和RARP的协议类型,如IPv4的协议类型号为0800;
③硬件地址长度:8比特,指出物理地址的长度,以字节为单位,以太网的物理地址为6;
④协议地址长度:8比特,指出协议地址的长度,以字节为单位,IPv4的协议地址长度为4字节;
⑤操作类型:指出当前操作是ARP请求,还是ARP响应,以及是RARP请求,还是RARP响应的操作(操作类型=1为ARP请求,操作类型=2为ARP响应,操作类型=3为RARP请求,操作类型=4为RARP响应);
⑥发送方硬件地址和目标硬件地址:硬件地址就是MAC地址,共48位;
⑦发送方IP地址和目标端IP地址:IP地址,共32位。
当前操作是ARP请求时,发送主机在发送方硬件地址和发送方IP地址段填入自己的MAC地址和IP地址,并给出目的主机的IP地址,目的MAC地址段没有填入。ARP请求以广播方式发送;当返回应答时,目的主机变成发送方,目的主机将自己的MAC地址和IP地址放到发送方硬件地址和发送方IP地址字段,将源主机的MAC地址和IP地址放到目标硬件地址和目标IP地址字段。ARP请求以单播方式发送。
6.3.5 ICMP协议
前面谈到,IP层不提供数据的可靠传输控制,TCP/IP在IP层的数据可靠性问题是由IP层的端到端协议来解决,而数据传输以外的其他传输差错和控制问题是由因特网控制报文协议ICMP(Internet Control Message Protocol)来解决的。
ICMP实现的差错和控制主要是目的主机不可达、路由不可达、协议不可达、数据包传输超时和系统拥塞等问题。这类问题都发生在数据包还未达到目的主机,这类问题传输层是无法解决的,这类问题必须由IP层来解决,而处于IP层的IP协议本身并没有一种内在的机制对这类问题进行处理,ICMP协议正是为解决这一类问题而设计。
ICMP协议解决这一类差错的方法是向源主机报告发生差错,并由源主机的高层进行差错的处理。当发生目的主机不可达、路由不可达、协议不可达、数据包传输超时等差错时,由于数据包没有达到目的主机,向目的主机报告显然是不可能的,向中间路由器报告也是不现实的,因为并不清楚差错是那一台路由器引起的差错,显然,ICMP差错报告只有向源主机报告才是可能的。源主机收到差错报告后,对差错的处理也不是由ICMP协议进行处理,而是通过向源主机报告,由源主机的高层进行差错的处理。也就是说,ICMP只报告差错,但不负责纠正错误,纠正错误的工作是留给高层协议去处理。
所以在TCP/IP网络中,IP协议提供数据传输,ICMP提供传输差错控制和拥塞控制,并通过向源主机报告的方式来解决传输差错和控制。
(1)ICMP报文格式
ICMP本身是一个网络层的协议,但是它的报文不是独立地进行传输,ICMP报文是封装在IP数据包中进行传输的,即ICMP报文被封装在IP包的数据段部分。封装的ICMP报文由IP头部、ICMP头部和ICMP报文三部帧成,报文格式如图6-18所示。在IP数据包的包头中,有一协议类型字段,该字段指出当前数据包封装的协议为何协议,值为1就说明当前数据包封装的协议的是一个ICMP报文。
图6-18 ICMP报文格式
ICMP头部由类型字段、代码字段和校验和字段组成。类型字段由8比特组成,用于指示256种不同类型的ICMP报文;如类型字段为3表示“目标不可达”的ICMP报文,类型字段为11表示报告“数据报超时”的ICMP报文;代码字段由8比特组成,用于提供该报文类型的进一步信息;
校验和字段由16比特组成,用于提供整个IP报头的差错校验,与类型、代码相关内容的数据都在ICMP头部后面。
ICMP报文有很多类型,用于不同的目的,但总体可以分为三大类别,即差错报告、控制报文、请求应答报文。差错报告只负责向源主机报告目标不可达,数据包超时和数据包参数错等错误;控制报文总是引起源主机进行相应的处理,如引起源主机进行拥塞控制、重新定向传输路径;请求应答报文是成对使用的,使得请求方能够从对应的路由器或其他主机获取信息。
(2)ICMP报告的主要差错例子
ICMP向源主机报告目标不可达、路由不可达、数据包传输超时和系统拥塞等差错问题。
目标不可达用类型字段为3进行表示,目标不可达又细分为网络不可达、主机不可达、协议不可达、端口不可达等情况,这些不同的情况用不同的代码进行表示。主要有:
网络不可达(代码=0);
主机不可达(代码=1);
协议不可达(代码=2);
端口不可达(代码=3)。
①类型=3、代码=0,代表网络不可达:
如果某路由器收到一个数据包,在转发表中找不到前向路由,则向主机报告网络不可达。如由于某个路由器没有学习到某个网络的转发路径,该路由器收到目的地址是该网络地址的数据包时,该路由器查不到转发路由,此时,该路由器将向源主机发出网络不可达报告,该报告指出数据包中带的网络地址指向的网络不可到达。
②类型=3、代码=1,代表主机不可达:
在路由器找到转发的网络,向该网络转发后,在该网络的主机收到该数据包时,应返回一个相应信息到路由器,如果路由器没有收到相应的应答信息,则向源主机发送主机不可达报告。例如,在主机(服务器)发生故障时,就会发生主机不可达情况,此时路由器就会使用类型=3、代码=1的ICMP报文返回给源主机,报告主机不可达。
③类型=3、代码=2,代表协议不可达:
在数据包到达了目的主机(服务器),但主机(服务器)上没有TCP协议,就会发生协议不可达情况,此时目的主机就会使用类型=3、代码=2的ICMP报文返回给源主机,报告协议不可达。
④类型=3、代码=3,代表端口不可达:
在数据包到达了主机(服务器),通过传输层将数据报提交给应用进程的过程中,如由于主机(服务器)上相应的应用软件没有运行,无法找到对应端口,则发生端口不可达情况,此时主机就会使用类型=3、代码=3的ICMP报文返回给源主机,报告端口不可达。
数据报超时用类型字段为11来表示,此时代码=0代表TTL超时。
在数据包的传输过程中,用IP报头的TTL值指示生存时间,在规定的生存时间数据包还不能达到目的端,认为无法达到。网络中,当路由器收到TTL值=0的数据包时,将丢弃当前的数据包,并产生一个ICMP数据超时报告,并向源主机发送该超时报告。
⑤类型=4、代码=0,代表拥塞报文:
当大量数据包进入路由器或目的主机,超出路由器和目的主机缓冲区的处理能力时,会发生缓冲区溢出,出现拥塞。此时,发现缓冲区溢出的路由器或目的主机将产生一个拥塞报文向源主机报告,源主机在收到该拥塞报文时,按一定的规则降低发往该路由器或目的主机的数据包流量。
⑥类型=5、代码=0,代表对网络重定向:
如果主机向非本地子网传送数据时,TCP/IP会将数据包转发给它的默认网关,(默认路由器),但是如果网络中还存在另一个更好的本地路由器时,ICMP重定向功能会通过ICMP网络重定向报文通知主机改变默认网关,今后将这些数据发送给更好的那个路由器。
⑦类型=15、代码=0,代表信息请求;类型=16、代码=0,代表信息应答:
随着ICMP的发展,ICMP突破了只向源主机报告出错信息的模式,开始使用ICMP请求与应答报文进行主机与路由器间或路由器与路由器间进行交互,ICMP请求与应答报的出现使得TCP/IP网络上任何主机或路由器都可以向其他主机或路由器发送请求并获得应答。通过ICMP的请求、应答报文,网络管理人员、或应用程序可以对网络进行检测,对网络进行故障诊断和控制。
(3)ICMP应用实例
①Ping命令:
Ping命令是ICMP的典型应用,在Windows操作系统中,用Ping命令发送ICMP请求报文并接收ICMP应答报文检测网络的连通性。Ping命令产生的数据报文是IP网络中能够生成和寻址的最小报文。工作原理为,在发送的ICMP请求报文中存放当前时间,接收方收到ICMP请求报文时,它返回一个ICMP报文给源主机;源主机收到ICMP的回应报文后,将回应报文达到的时间减去请求报文的发送时间,就得到往返时间。从而可测出网络是否可达(连通性)以及网络速度情况。
②Tracert命令:
使用Ping命令能达到测试网络的连通性,但却不能测试数据包的传输路径。在网络不通时,也不能了解问题发生在哪个位置。使用Tracert命令可以追踪数据包的传输路径,探测到发生问题的设备。
Tracert命令利用IP协议包中的生存期TTL实现探测网络传输路径。在使用Tracert命令时,源主机的Tracert程序将发送一系列数据包,而且第一个数据包中的TTL值设为1,第二个数据包中的TTL值设为2,第三个数据包的TTL值设为3,等等,当第一个数据包达到第一个路由器时,TTL值被减1,此时TTL=0,数据包被视为无法达到数据包,由ICMP向主机发出一条错误类型为超时的消息,该消息到达主机时,Tracert程序根据发出该消息的路由器的IP地址,得到了传输所经第一个路由器。同样,第二个数据包发出后,也能返回一条ICMP消息,Tracert程序获得传输所经的第二个路由器,以这样的方式,主机可以获得传输所经过的所有路由器的地址,探测到了所有的传输路径。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。