转发和选路
路由器的主要作用:便是将数据报从入链路转发到出链路。
网络层的作用是:将分组从一台发送主机移动到一台接收主机。为此需要两种重要的网络层功能:
转发:将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。
选路:分组从源到目的地时,决定端到端路径的网络范围的进程。
每台路由器都具有一张转发表(forwarding table):路由器通过检查到达分组首部中的一个字段的值,然后使该值在路由器转发表中索引查询,查询的结果就是分组将被转发的路由器的链路接口。分组首部的值可能是该分组的目的地址或者该分组所连接的指示。
虚电路和数据报网络:
网络层也有无连接服务与面向连接服务,但是与运输层有差异:
<1>网络层中,这些服务是由网络层向运输层提供的主机到主机的服务。在运输层中,这些服务则是运输层向应用层提供的进程到进程的服务。
<2>在迄今为止的所有主要的计算机网络体系结构中,网络层提供了主机到主机的无连接服务,或者主机到主机的连接服务,而不同时提供两种。仅在网络层提供连接服务的计算机网络被称为:虚电路(Virtual-Circuit,VC)网络;仅在网络层提供连接服务的计算机网络称为:数据报网络(datagram network)
<3>在运输层提供的面向连接服务与在网络层实现连接服务是根本不同的,运输层面向连接服务是位于网络边缘的端系统中实现的,网络层连接服务除了在端系统中实现之外,也在位于网络核心的路由器中实现。
虚电路网络:
在网络层使用链接,这些网络链接被称为虚电路。一条虚电路(VC)的组成如下:
<1>源和目的主机之间的路径(即一系列链路和路由器)
<2>VC号,沿着该路径的每段链路一个号码。
<3>沿着改路径的每台路由器中的转发表项
属于一条虚电路的分组将在它的首部携带一个VC号码,又因为一条虚电路在每条链路上可能具有不同的VC号,所以每台中间路由器必须用一个新的VC号代替每个传输分组的VC号,该新的VC号从转发表获得。
分组通过某路由器,该路由器怎样决定VC号的更换呢?
对于虚拟电路网络,每台路由器的转发表包括了VC的转换。
网络层虚电路的建立与运输层的连接建立之间有一个细微但很重要的区别:运输层的连接建立仅涉及两个端系统,在运输层链接建立期间,两个端系统独自决定运输层连接的参数(如初始序号与流量控制窗口大小)。虽然两个端系统已经知道该运输层连接,但是网络中的路由器对这些完全不知情。
另一方面,对于虚电路网络层,沿两个端系统之间路径上的路由器都要参与虚电路的建立,且每台路由器都完全知道经过他的所有虚电路。
数据报网络:
随着分组从源向目的地传输,它通过一系列路由器,每个路由器都是用该分组的目的地址来转发该分组。特别地,每台路由器都有一个将目的地址映射到链路接口的转发表;当分组到达路由器时,该路由器使用该分组的目的地址在该转发表中查找适当的输出链路接口,然后,路由器有意地将该分组向该叔叔出链路接口转发。
路由器使用分组的目的地址 与转发表的表项进行匹配;路由器采用最长前缀匹配规则(longest prefix matching rule),即当有多个匹配项时,在该表中寻找最长的匹配项,并向与最长前缀匹配的链路接口转发该分组。
路由器工作原理:
交换结构速率(switching fabric speed):交换结构能够从输入端口到输出端口移动分组的速率。
网际协议:因特网中的转发和编址:
因特网的网络层有三个主要的组件:
第一:组件是IP协议,第二:选路组件,它决定数据报从源到目的地所流经的路径。(转发分组的转发表和选路协议),第三:报告数据报中的差错和对某些网络信息请求进行相应的设施。
数据报:网络层的分组叫数据报。
数据报格式:
版本号(version):路由器可确定如何解释IP数据报的剩余部分,不同的IP版本使用不同的数据报格式。IPv4/IPv6两个IP版本。
首部长度(IHL):由于头部长度不固定,所以IHL用来表明该头部有多长。IHL包含4个字节
服务类型(Type of service):用于区分不同类型的IP数据报。
数据报长度(Total length):这是IP数据报的总长度(首部加上数据)。
标识/标志/片偏移(Identification/flags/Fragment offset):这三个字段与所谓IP分片有关。但是IPv6不允许在路由器上分片。
寿命(Time to live, TTL):确保数据报不会永远在网络中循环,每当数据报经过一台路由器时,该字段的值减1.若TTL字段减为0,则该数据报必须丢弃。
协议(Protocol):该字段仅在一个IP数据报到达其最终目的地时才会用到,该字段值指明了IP数据报的数据部分应交给哪个运输层协议。
首部检验和(Header checksum):首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。首部检验和是这样计算的:将首部中的每两个字节当作一个数,用反码对这些数求和,将该和的反码存放到检验和字段中,路由器要对每个收到的IP数据报计算其首部检验和,再根据数据报首部中携带的检验和与计算得到的检验和判断是否一致,来检查是否出错。路由器一般会丢弃错误的数据报。注意:每台路由器都必须重新计算检验和并存放在原处,因为TTL字段以及选项字段可能会改变。
源和目的IP地址(Sourse address/Destination address):当源主机产生一个数据报时,它在源IP字段中插入它的IP地址,在目的IP字段中插入其最终目的地址。通常源主机经DNS查找目的地址。
选项(Option):选项字段允许IP首部被扩展。
数据(Data):有效载荷。
IP数据报分片:不是所有的链路层协议都能承载相同长度的网络层分组。有的协议能承载大数据报,而有的协议只能承载小分组。一个链路层帧能承载的最大数据量叫做最大传输单元(MTU),因为每个IP数据报封装在链路层帧中,再从一台路由器运输到下一台路由器,故链路层协议MTU严格限制着IP数据报的长度。
当链路的MTU比IP数据报长度小时,怎么办?
解决的办法就是将IP数据报中的数据分片成两个或更多个较小的数据报,用单独的链路层帧封装这些较小的IP数据报,然后向输出链路上发送这些帧,这些较小的数据报叫做片(fragment)。
TCP/UDP都希望从网络层收到完整的未分片的报文,那么片到达目的地运输层以前需要被重新组装,那么数据包的重组是放在端系统中还是放到网络路由器中呢?
IPv4的设计者将数据报的重新组装放到端系统中,而不是路由器中!
那么目的主机从相同的源接收到一系列的数据报时,那么它怎么判断这些数据报是否是原来较大的数据报的片呢?如何确定最后一片呢?如何拼接形成初始数据报呢?
IPv4的设计者将标识/标志/片偏移字段放在IP数据报中。当创建一个数据报时,发送主机为该数据报设置源和目的地址的同时加上标识号。发送主机每发送一个数据报,通常会将标识号加1,当一台路由器需要将一个数据报分片时,形成的每个片,附加上初始数据报的源地址/目的地址与标识号。当目的地从同一台发送主机收到一系列数据报时,他可以检查数据报的标识号以确定那些数据报是同一较大数据报的片。由于IP是一个不靠谱的服务,一个或多个片
可能永远到达不了目的地,因此,为了让目的主机绝对相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为0,而所有其他片的标志也被设置为1。另外,为了让目的主机确定一个片是否丢失(且能按正确的顺序重新组装片),用偏移字段指定片应放在初始IP数据报的哪个位置。
在目的地,数据报的数据仅当在IP层已经完全重构为初始IP数据报时,才被传递给目的运输层。如果有一个或多个片没有达到目的地,则该不完整的数据报被丢弃且不会交给运输层。但是,若运输层正在使用TCP,则TCP将通过让发送端重传数据报中的数据而恢复丢失的片。