计算机网络原理(TCP/IP协议五):Internet协议

  • IPv4和IPv6头部
  • IPv6扩展头部
  • IP转发
  • 移动IP
  • IP数据报的主机处理

 一、IPv4和IPv6头部

IP是TCP/IP协议族中的核心协议,所有TCP、UDP、ICMP、IGMP数据都通过IP数据报传输。IP提供一种尽力而为、无连接的数据包交付服务。“尽力而为”的含义是不保证IP数据报能成功的到达目的地。虽然IP不是简单的丢弃所有不必要流量,但它不对自己尝试交付的数据提供保证。当某些错误发生时,比如一台路由器临时用尽缓冲区,IP提供一个简单的错误处理方法:丢弃一些数据。任何可靠性必须有上层提供,例如TCP。IPv4和IPv6都是用尽力而为的基本交付模式。

然后是“无连接”意味者IP不维护网络单元中数据报相关的任何连接状态信息,每个数据报独立于其他数据报来处理,这也意味着IP数据报可不按顺序交付,如果一个主机向同一目的地发送两个连续的数据报,每个数据报可以独立路由,通告不同路径,并且可能到达的顺序并不是发送端当初发送的顺序。

此外,IP数据报也可能发送其他问题,它们可能在传输过程中被复制,可能改变内容从而导致错误,所以在上层的一些协议需要处理这些潜在的问题,以便提供无差错的交付。

1.1IPv4和IPv6的报文结构

IPv4数据报的首部大小是可变的,而IPv6的首部大小是固定的40字节,下面来看具体字段的解析:

版本:用于指定IP协议的不同版本,IPv4为4,IPv6为6。IPv4和IPv6除了版本字段位置相同其他都不同,因此,这两个协议不能直接互操作,主机或路由必须分别处理IPv4或IPv6(或两者,称为双栈)。

Internet头部长度(IHL):用来表示IPv4首部中32位字的数量,包括任何选项。由于它是一个4位的字段,所以IPv4首部被限制为15个32位字,即60字节。

服务类型(ToS):用于指定通信类型,前6位(DS字段)被称为区分服务字段,后2位(ECN)是显示拥塞通知字段或指示位,不同类型的数据报。例如时实数据报(如用于IP电话应用)与非时实流量(如FTP)。拥塞通知和指示位可以提供特定的等级服务,由网络管理员对路由器确定和配置策略。

总长度:即数据报长度,单位字节,通过这个字段和IHL可以确定IPv4的数据报的数据部分从哪里开始,以及数据的长度。IPv4数据报的最大长度(包括首部)为65535字节,IPv6的最大长度被限制为64KB,IPv6还支持一个超长度数据报选项,它理论上单个分组可支持4GB最大长度。一般情况下数据报很少超过1500字节,该长度能使得IP数据报能被最大容量的以太网帧的载荷字段承载。以太网会将短帧填充到最小长度(64字节),虽然以太网最小有效载荷为46字节,但一个IPv4数据报也可能更小(20字节),如果没有总长度字段,IPv4实现将无法知道一个46字节的以太网帧是一个IP数据报,还是经过填充的IP数据报。另外主机不需要接收大于576字节的IPv4数据报,很多UDP协议传输数据的应用程序限制521字节大小的数据,以避免576字节的IPv4限制。

标识:发送主机在每次发送数据报时都将一个内部计数器加1,并将该计数器值复制到IPv4标识字段,它与另外两个字段标志和分片共同作用于分组分片的相关操作,在后期的IP分片相关博客中会有详细的介绍。

生存期(TTL):用于设置一个数据报可经过的路由器数量的上限,用来确保数据报不会永远在网络中循环。发送方将它初识化为某个值([RFC1122]建议为64,但128或255也不少见),每台路由器在转发数据报时将该值减1,当这个字段的值到达0时,该数据报被丢弃,并使用一个ICMP消息通知发送方。

协议:用于表示数据报有效载荷部分的数据类型,也就是运输层的协议。当数据报到达目的地时,用于确定交由上层哪个运输层协议处理,例如TCP、UDP等。

头部校验和:用于帮助路由器检测收到的IP数据报中的首部比特错误,注意它仅仅用于检验首部比特,而不是整个报文的比特。而且这个字段只在IPv4中有,在IPv6中没有这个字段。将首部中的每2字节当作一个数,用反码算术对这些数求和,具体见后面的详细介绍。

源和目的IP地址:当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段中插入期最终目的地址,通常源主机通过DNS查找来决定目的地址。

上面介绍了IPv4以及与IPv6共用的首部字段,下面再来看看IPv6的扩展首部字段:

流标签:用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权,或者它能够用来对某些应用(比如IP语音)的数据报给出更高的优先权,以优于来自其他应用(比如SMTP电子邮件)的数据报。

负载长度:即有效载荷长度,该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量。

下一个头部:该字段标识数据报中的内容需要交付给哪个协议(例如TCP或UDP),这个跟IPv4的协议字段功能是一样的。

跳数限制:转发数据包的每条路由器将对该字段的内容减一,如果跳数限制计数达到0则丢弃该数据报,与IPv4的生存期(TTL)字段功能一样。

1.2Internet校验和

IPv4头部校验和与之前在链路层介绍的循环冗余检测CRC不同,为了给输出的数据报计算IPv4校验和,首先将数据报的校验和设置为0,IPv4对首部计算16位二进制反码和,这个16位二进制反码和被存储在校验和字段中。二进制反码加法可通过(循环进位加法)实现:当使用传统(二进制补码)加法产生一个进位时,这个进位以二进制1加在高位。当一个IPv4数据报被接收时,对整个头部计算出一个校验和,包括校验和字段自身的值,假设这个数据报没有错计算出的校验和值为0(值FFFF的反码)。用下面的例子来详细解析:

假设某个IPv4数据报头为:E3 4F 23 96 44 27 99 F3 [00 00],括号中的值就是校验和。

校验和初始值被设置为0,如示例;

然后,以16比特为单位,两两相加,那么上面的示例可得:E34F+2396+4427+99F3=1E4FF;

如果计算结果大于0xFFFF,则将,高16为加到低16位上,对于上面的结果,即为0xE4FF+1=E500;

然后,将该值取反,即为~(E500)=1AFF,这个值就是发送方发送报文中的校验和字段的值;

当解决方受到数据报以后,如果数据报正常,那么它的数据报头应该是:E3 4F 23 96 44 27 99 F3 1A FF。

此时,前面16字节的内容不变,等于E500,然后将E500与刚刚计算的校验和1AFF相加;

如果结果为FFFF,那么该数据报正常,没有错误。

1.3DS字段和ECN(即服务类型ToS字节或IPv6流量类别)

在Internet协议中,也可以说是路由在转发数据报时可能并不会单纯的按照先到现转发的方式来提供服务,而可能是服务类型来决定转发的优先级,这要具体看网络管理员对路由的配置策略。
DS字段中的数字称为分区服务代码点(DSCP),在通常情况下,如果数据报拥有一个分配的DSCP,该数据报在通过网络基础设施交付过程中会保持不变。但是,某些策略可能导致一个数据报中的DSCP在交付过程中改变,也就是说在交付过程中可能因为网络基础设施提供者的服务策略,对数据报的DS字段值进行修改。
当数据报通过一台具有内部排队流量的路由器时,头部中的2位ECN位用于为数据报标记拥塞标识符,也就是说当路由器具备ECN感知能力的路由器会在转发分组时设置这两位。这种功能设计的作用是当分组被目的节点收到时,有些协议(TCP)会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可在路由器因为过载而被迫丢弃流量之前缓解拥塞。

ToS服务类型的字段结构及其提供的功能和服务
尽管原来的ToS(服务类型)没有被广泛的支持,但DS字段结构仍然提供了一些对它们的兼容能力,而且DS字段在某种程度上延续并改进了ToS的相关功能,下面先来了解ToS的结构:

优先级子字段用于表示哪些分组具有更高的优先级。D、T、R子字段分别用于表示延时、吞吐量、可靠性,如果这些字段值为1,分别表示低延时、高吞吐量、高可靠性。

优先级的取值范围是000(常规)~111(网络控制),表示优先级依次递增,它们都基于一个称为多级优先与抢占(MLPP)的方案,下面是ToS的优先级子字段各个值得具体优先级别:

简单的来说优先级的值越大,数据报被转发的优先顺序越高,路由器就会越先转发它。DTR则是路由器描述它的传输性能,优先级子字段的值决定路由器转发的顺序,DTR被用于上层(传输层)的拥塞控制。

DS字段与ECN字段的结构及其提供的功能和服务

在定义DS字段时,优先级的值已定义在[RFC2474]中,以提供有效的兼容性。6位DS字段保存DSCP,提供对64个代码点的支持。特定DSCP值可通知路由器对接收的数据报进行转发或特殊处理。不同类型的转发处理表示为每跳行为(PHB),因此DSCP值可有效通知路由器哪种PHB被用于数据报。DSCP的默认值通常为0,对应常规的尽力而为的Internet流量。64个可能的DSCP值分为不同的用途,下面先来看DS字段和ECN的结构:

这里重点来关注DSCP,即SD字段的6位,其中5位是标准的,表示当接收的数据报应转发时,可以由一台兼容内部排队的路由器按照其优先级别进行处理(即PHB)。DSCP值被分为三个池,包括:标准的优先级别、实验/本地用途的(EXP/LU)优先级别、最终打算标准化的实验/本地用途的(*)优先级别,下面是它们的具体格式:

通过上面的代码点前缀就可以区分数据报的采用的是什么标准的转发优先级,但这一般不是我们需要关注的,首先要了解的DS字段如何兼容之前的ToS(服务类型)的优先级,在前面的ToS中介绍过它的优先级由前3位决定,在DS中采用xxx000形式的代码点来支持之前ToS的部分优先级字段,至于兼容哪些优先级可以具体参考[RFC0791]。

然后再来看DSCP标准的优先级和流量类别的具体代码点(二进制值):

默认(BE):000 000,表示位尽力而为的优先级,可以说它是优先级最低的,也是一个特殊的CS,即ToS中的优先级子字段000也是优先级最低的;

类选择器(CS):aaa 000,用于兼容ToS的优先级子字段。

确保转发(AF):aaa bb0,DSCP标准定义的优先级类型;

加速转发(EF):101 110,DSCP标准定义的用于承载语音的流量,因为语音要求低延迟,低丢包率,是仅次于协议报文的最重要的报文,可以说它也是一种特殊的AF;

这里我们需要重点关注的是确保转发(AF)的流量类别,但需要注意的这里确保转发并不是一定保证数据报会被转发,而是相对默认000000而言它有两个机制来确保转发,一个是转发优先级由五个代码点前三位决定,另一个是丢弃优先级由五个代码点后两位决定,因为第六个代码点是用来表示标准策略的。

DS字段的优先级(DSCP优先级):由前三位二进制就可以产生七个优先级别,因为000是默认的尽力而为,所以从001~111只有七个级别,二进制数值越大表示的优先级越高,最先被转发。即111的优先级最高,但它当前还没有被准化,而是作为预留级别。

DS字段的丢弃优先级(DSCP丢弃优先级):由后两位二进制可以产生4个优先级别,00~11可以表示4个级别,二进制值越大表示优先级越高,相对前三位相同的转发优先级,丢弃优先级的二进制值越大,越先被丢弃。(但这种丢弃肯定是相对默认的000000服务类别要可靠一些,最先被丢弃的肯定是默认000000的数据报)。

有这些不同的转发优先级和丢弃优先级就组成了不同的DS服务类型,转发级别越高丢弃级别越低的服务的费用也就有不同的差别,具体要看服务提供商(ISP)的服务而定。而另一方面,不同的服务类型一般也用来支持不同的数据流,在七个转发优先级和默认共八个应用类型:7预留(111)、6预留(110)、5语音(101)、4视频会议(100)、3呼叫信号(011)、2高优先级数据(010)、1中优先级数据(001)、0尽力服务数据(000),一般服务提供商就会基于不同的应用类型来提供流量服务,结合丢弃级别就会产生不同的服务资费标准,下面是不同的标准服务类型和对应的DS字段值以及相关描述:

1.4IP选项

IP支持一些可供数据报选择的选项,在IPv4初期阶段Internet规模很小,来自恶意用户的威胁关注较少。由于IPv4头部大小的限制以及相关安全问题,在IPv6中,大部分选项已被删除或改变,不再是IPv6基本头部的一部分,而被放在IPv6头部之后的一个或多个扩展头部中。IP路由器接收到一个包含选项的数据报,通常需要对数据报进行特殊处理。在某些情况下,尽管IPv6路由器可以处理扩展头部,但很多头部被设计为仅由终端主机处理。在路由器中,带选项或扩展的数据报不会像普通数据报那样被快速转发。

1.4.1IPv4的选项

关于IPv4的选项可以在相关描述性的RFC中找到,这个完整的列表会被定期更新,并可在[IPPARAM]中在线查看。选项的范围总是以32位为界,如果字符不够用0填充,这确保IPv4头部始终是32位的倍数(IHL字段的要求)。如果选项存在,它在IPv4分组中紧跟在基本IPv4头部之后。

选项标识(8位):选项由一个8位的类型字段标识,这个字段被细分为3个子字段:

复制(1位):当值为0时表示仅在第一个分片中复制,当值为1时表示复制到所有分片;

类别(2位):00表示数据报控制、01表示保留、10表示排错和管理、11表示保留。

编号(5位):各种选项的编号,用5位表示,比如00000是选项结束的编号、00001是无操作的选项(用于填充)的编号、00011是不严格的源路由(发送方列出分组转发时遍历的路由器"航点",不严格表示可以包含其他航点)的编号、00100是时间戳(用于记录分组的源和目的地的日期和时间)的编号、00111是记录路由(在分组的头部记录经过的路由器)的编号、01001是严格路由(发送方列出分组转发时遍历的路由器“航点”,严格表示所有航点都要按顺序遍历)的编号。关于更多选项的编号可以参考[IPPARAM]相关选项文档。

选项的长度字段(8位):表示选项的总长度,大部分选项的总长度是可变的,但是单字节不需要长度字段,单字节只有两个编号分别为00000的选项结束和00001的无操作选项,其他选项都需要长度字段;

选项的值:即记录选项相对应的一些数据,这在以后的具体网络相关博客中介绍。

 二、IPv6扩展头部

2.1IPv6扩展头部

在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加的扩展头部实现。IPv6中的扩展头部仅由终端主机处理,仅有一个例外是在分组经过每个路由器中处理的选项,这个选项就是逐跳选项(HOPOPT)。

扩展头部和更高层协议头部与IPv6头部链接起来构成级联头部,每个头部中的下一个头部字段表示紧跟着的头部的类型(即下一个头部的协议类型),下面是一些常见的IPv6的级联头部结构:

下一个头部字段的可能值定义在[IP6PARAM]中,下面是IPv6下一个头部字段值可能表示看展头部或其他协议头部:

在下一个头部中,除了逐跳选项(HOPOPT)的被指强制要求按照顺序必须跟在IPv6的头部后面,其他下一个头部的顺序是建议性的。除了“目的地选项”可以使用两次以外,其他头部都只能使用一次,第一次是指包含在IPv6头部中的目的IPv6地址,第二次是(位置8)关于数据报的最终目的地。

2.2IPv6选项

在2.1中介绍了IPv6的扩展头部的结构,这里再来了解具体的选项,包括逐跳选项、目的地选项、路由、分片、移动等选项的具体报文格式及工作原理,封装安全载荷、认证、ICMPv6会在以后的相关博客中介绍。

2.2.1逐跳选项(H)与目的地选项(D)

前面介绍过逐跳选项是唯一由分组经过每个路由器处理的选项,且逐跳选项必须跟在IPv6的头部后面。逐跳选项和目的地选项头部出现可以超过一次,这些选项均被编码为类型-长度-值(TLV)集合,TLV结构如下面的格式:

TLV结构的长度为2字节(不包括选项数据),后面是可变长度的数据字节,第一个字节包括3个子字段,当5位的类型子字段无法由选项识别时,第一个子字段给出了一个IPv6节点尝试执行的动作。

动作:IPv6的TLV选项类型的2个高序位,表示如果这个选项没有被识别时,一个IPv6节点是转发还是丢弃该数据报,以及是否向发送方返回一个消息,提示这个数据报的处理结果,下面的具体的动作值和解析:

00:跳过选项,继续处理;

01:丢弃这个数据报(沉默);

10:丢弃这个数据报,并向源地址发送一个“ICMPv6参数问题”消息;

11:与10相同,但仅在分组的目的地不是组播时,发送这个ICMPv6消息。这是因为一个发往组播目的地的数据报中包括一个未知选项,那么大量节点将生成返回源节点的流量,这种情况就可以使用11这个动作来避免。

动作子字段的灵活性在开发新的选项时有用,一个新的选项可携带在一个数据报中,并被那些无法理解它的路由器所忽略,这样有助于促进新选项的增量部署。

Chg:当选项数据可能在数据报转发过程中改变时,改变位(Chg)设置为1。

下面是逐跳选项与目的地选项的头部类型以及字段值的列表

填充1与填充N:由于IPv6选项需要与8字节的偏移量对齐,因此较小的选项用0填充到长度为8字节。因为有的时候扩展头部的选项数据并不是固定的,需要填充的长度要根据前面选项与8字节长度对齐的差n作为基数,然后再减去填充N的头部字段2字节长度,就是要填充的长度。为什么要减去2字节看前面的TLV结构就很容易理解了,选项类型占用8位、选项长度字段占用8位,即选项头部2字节,所以实际填充长度就是n-2字节。而填充1实际只有选项类型字段,它没有选项长度和值,实际上类似IPv4选项编号00000的选项一样就用来表示选项结束,因为这个选项的选项类型所有位本来都是0,刚好8位。

超大有效载荷:这个选项的字段内容和值就不多做解释了,基于前面的TLV结构和表格中参数很容易理解,这个选项用来标注当前IPv6数据报为一个超大有效载荷的数据报,即数据报的有效载荷大于65535字节,称为超大报文。这个选项定义的超大报文无法用最大传输单元(MTU)小于64KB的链路连接的节点来实现,超大有效载荷选项提供了一个32位的字段,用于携带有效载荷在65535~4294967295字节之间的数据报。当一个用于传输的超大报文形成时,其正常负载长度字段被设置为0,TCP协议使用负载长度计算校验和,必须使用来自选项的长度值,而不是基本头部中的长度字段。

隧道封装限制:隧道是指将一个协议封装在另一个协议中,在前面链路层的点到点协议(PPP)中有介绍,隧道可以嵌套,从这个意义上说,一条隧道中的数据包本身也可以采用递归方式封装在另一条隧道中。在发送一个IP数据报时,发送者通常无法控制最终用于封装的隧道层,发送者可使用这个选项设置一个限制,一台路由器打算将一个IPv6数据报封装在另一条隧道中,它首先检查隧道封装限制选项是否存在并置位。如果这个限制选项值为0时,该数据报被丢弃,并将一个“IPMPv6参数问题”消息发送到数据报源端(即之前的隧道入口点)。如果限制选项的值不为0,该数据报可进行隧道封装,但新形成(封装)的IPv6数据报必须包括一个隧道封装限制选项,其值比封装之前的数据报中的封装限制选项值减1。实际上,封装限制行动类似于IPv4的TTL和IPv6的跳数限制字段,只不过采用隧道封装层次代替转发跳步。

路由器警告:指出数据报包含需要路由器处理的信息,它与IPv4的路由器警告选项的目的相同[RTAOPTS]给出了这个选项的当前设置值。

快速启动(QS):这个选项跟[RFC4782]定义的TCP/IP实验性“快速启动”程序配合使用,它适用于IPv4和IPv6,但目前建议仅用于专用网络,而不是全球性的Internet。选项包括发送者需要的以比特/秒为单位的传输速率的编码值、QS TTL值和一些额外信息。如果沿途的路由器认为可以接受所需的速率,在这种情况下它们将递减QS TTL,并在转发数据包时保持所需的速率不变。如果路由器不同意(即仅支持的速率较低),它将该速率减小到一个可接受的速率。如果路由器不能识别QS选项,他将不递减QS TTL,接收方将向发送方提供反馈,包括收到的数据报的IPv4 TTL或IPv6跳数限制字段和自己的QS TTL之间的差异,以及获得的速率可能被沿途的尤其所调整。这个信息被发送放用于确定发送速率。对于TTL值进行比较的目的是确保沿途每台路由器产于QS谈判,如果发现任何路由器递减IPv4 TTL(或IPv4跳数限制)字段,但没有修改QS TTL值,则说明它没有启用QS。

CALIPSO:用于某些专用网络中支持通用体系结构标签IPv6安全选项(CALIPSO)[RFC5570]。它提供了一种数据报做标记的方法,包括一个安全级别标识符和一些额外的信息,需要注意的是,它用于多级安全网络环境(例如政府、军队、银行),其中所有数据的安全级别必须以某种形式的标签注明。

家乡地址:当使用IPv6移动选项时,这个选项保存发送数据报的IPv6节点的“家乡”地址。移动IP规定了IP节点的一系列处理过程,这些节点可能改变自己的网络节点,同时不会断开自己的高层网络连接。如果家乡地址选项存在,包含它的目的地址选项头部必须出现在路由头部之后,并且在分片、认证和ESP头部之前(如果这些头部也存在)。

2.2.2路由头部

IPv6路由头部为发送方提供了一种IPv6数据报控制机制,以控制(至少部分控制)数据报通过网络的路径。目前,路由扩展头部有两个不同版本,分别称为类型0(RH0)和类型2(RH2)。RH0处于安全方面的考虑已被否决[RFC5095],RH2被定义为与移动IP共同使用。为了更好的理解路由头部,这里先投论RH0,然后研究它为什么被放弃,至于RH2在后面的移动IP中介绍,下面是RH0的路由扩展头部结构图:

目前已经废弃的路由头部类型0(RH0)涵盖了IPv4的宽松和严格源路由和记录路由选项,它在数据报转发时由发送方构造,其中包括转发路径上的IPv6节点地址,每个地址可以指定为一个宽松或严格的地址,一个严格的地址必须经过一个IPv6跳步到达,而一个宽松的地址可能经过一个或多个其他跳步到达。在IPv6基本头部中,目的IP地址字段修改为包含数据转发的下一个转发地址。

路由类型标识:对于RH0的路由类型标识符为0,对于RH2该标识符为2;

剩余部分:表示还有多少段路由需要处理,也就是到达最终目的地之前仍需访问的中间节点数;

在路由头部字段和路由地址值之间有一个32位的保留地址块,由发送方设置为0,并由接收方忽略。在数据转发时,这些地址不能是IPv6组播地址。并且在IPv6中路由头部在转发过程中不会处理,直至目的IP地址字段中包含的地址所在的节点。这时,剩余部分字段用于确定来自地址向量的下一跳地址,并将该地址与IPv6头部中的目的IP地址字段交换。因此,这个数据报转发过程中,剩余部分字段将会变得越来越小。下面是一个路由转发过程的路由头部与IP头部目的地址的交换示图:

在上图中可以看到数据报的源地址一直是S,目的地地址在经过不同的路由节点时会被路由头部中的下一个节点地址替换,并且表示中间节点数的剩余部分字段(Left)值也随着路由节点递减。

根据上面对路由头部的介绍,可以看到RH0很不安全,所以它已经被[RFC5095]废弃了,因为RH0这种将路由节点地址全部记录在路由头部中,而且RH0允许在路由头部的多个位置指定相同地址,很容易被用于增加DoS攻击。这可能导致流量在一条特定路径上的两台或多台主机或路由之间重复转发,大量的流量负载可能在网络中沿着特定路径创建,与相同路径上的其他流量竞争带宽而造成干扰。因此RH0目前已过时,IPv6唯一支持的路由头部是RH2。RH2与RH0基本相当,区别在于它只容纳一个地址,而且路由类型字段中使用的值不同,关于RH2在后面的移动IP中介绍。

2.2.3分片头部

分片头部用于IPv6源节点项目地发送一个大于路径MTU的数据报,对于路径MTU以及如何确定它这是运输层要处理的内容,但1280字节是整个网络中针对IPv6定义的链路层最小MTU。在IPv4中,如果数据报大小超过下一跳MTU,任何主机或路由器可将数据报分片,IPv4头部中第二个32位字段表示分片信息。在IPv6中,仅数据报的发送者可以执行分片操作,在这种情况下需要添加一个分片头部,IPv6分片头部的信息与IPv4头部中的相同,只不过标识符字段是32位,而不是IPv4中采用的16位,这个更大的字段提供了在网络中容纳更多分片的能力,下面是IPv6的分片头部结构:

下面来逐个了解分片头部的各个字段:

分片偏移量:有效载荷在原始数据报中以8字节为单位的偏移量,第一个分片偏移量为0;

Res:在书中只描述了这个字段的值为0,且会被接收端忽略(后期深入了解相关内容后再来补充);

M:表示当前分片是否是数据报的最后一片,最后一个分片的M字段设置为0;

标识符:用于表示分片属于哪个数据报,具体这个标识符的计算属于运输层的内容;

 三、IP转发

如果目的地是直接相连的主机或共享网络(例如以太网),IP数据报直接发送到目的地,不需要或者不使用用路由器。否则,主机将数据报发送到一台路由器(称为默认路由器),由该路由器将数据报交付到目的地,这个简单的方案适用于大多数主机配置。

这里更多来讨论复杂情况下转发IP数据报,首先,当多数主机既可配置为路由器,也可配置为主机,很多家庭网络使用一台连接到Internet的PC作为路由器(也可能是防火墙),主机与路由器处理IP数据报的区别在于:主机不转发那些不由它生成的数据报,而路由器则相反。

在整个方案中,IP协议可接收一个数据报,他可来自同一主机的其他协议(TCP、UDP等),也可来自一个网络接口。IP层包括一些位于内存中的信息,通常称为路由表或转发表,每次转发一个数据报时需要从其中查找信息,当一个网络接口收到一个数据报时,IP模块首先检查目的地址是否为自己的IP地址(与自己的某个网络接口相关的IP地址),或是它可以接收其流量的一些其他地址,例如IP广播或组播地址。如果是自己可以接收的数据报,则将该数据报交给IPv4头部协议字段或IPv6头部的下一个头部字段指定的协议模块。如果数据报的目的地不是本地IP模块使用的IP地址,那么有两种可能:①如果IP层配置为一台路由器,则转发该数据报(也就是作为一个输出数据报处理);②数据报被默默丢弃。在某些情况下ICMP消息可能发送回源节点,以表明发生了一个错误。

3.1转发表

首先来看路由表或转发表的每个条目包含的字段信息:

目的地:它是一个32位字段(或128位字段,用于IPv6),用于与一个掩码操作结果相匹配。针对有目的地的“默认路由”的情况,目的地可简单设置为0;对于仅描述一个目的地的“主机路由”的情况,目的地可设置为完整长度的IP地址;

掩码:它是一个32位字段(或128位字段,用于IPv6),用作数据报目的IP地址按位与操作的掩码,其中的目的IP地址是要在转发表中查找的地址,掩码结果与转发表条目中多个目的地的进行比较;

下一跳:它是下一个IP实体(路由器或主机)的32位IPv4地址或128位IPv6地址,数据报将被转发到该地址。下一跳实体通常在一个网络中由执行转发查找的系统所共享,这意味着它们共享同一网络前缀;

接口:它包含一个由IP层使用的标识符,以确定将数据报发送到下一跳的网络接口。例如,它可能是一台主机的802.11无线接口、一个有线的以太网接口或一个与串行端口相关联的PPP接口。如果转发系统也是IP数据报的发送,该字段用于选择数据数据报的源IP地址;

IP转发逐跳进行,从路由表的字段信息可以看到,路由器和主机不包括到任何目的地的完整转发路径(除了那些直接相连的主机或路由器的目的地)。IP转发只提供数据报发送的下一跳实体的IP地址,它假设下一跳比执行转发的系统“更接近”目的地,并且吓一跳路由器与执行转发的系统直接连接(即共享同一网络前缀),它通常也假设与下一跳实体之间没有“环路”,数据报不会在网络中循环,知道其TTL或跳数限制到期。由一个或多个路由协议来确保路由表正确,其中包括RIP、OSPF、BGP、IS-IS,更多可以参考[DC05]。

3.2IP转发行动

当一台主机或路由器中的IP层需要向下跳的路由器或主机发送一个数据报时,它首先检查数据报中的目的IP地址(D),在转发表中使用该值D来执行最长前缀匹配算法:

①在表中搜索具有以下属性的所有条目:(D^mj)=dj,其中mj是索引为j的转发条目ej的掩码字段值,dj是转发条目ej的目的地字段值。详细收索匹配过程是,目的地的IP地址D与每个转发表条目中的掩码(mj)执行按位与,并将该结果与同一转发条目中的目的地中的目的IP地址(dj)比较,如果满足这个属性,该条目(这里为ej)与目的IP地址相“匹配”。当进行匹配时,该算法查看这个条目的索引(这里为j),以及在掩码mj中有多少位设置为1,设置为1的位数越多,说明匹配得“越好”。

②选择最匹配得条目ek(即掩码mk中最多位为1的条目),并将下一跳字段nk作为转发数据报的下一跳IP地址。

在某些情况下可能有多个条目是匹配的,例如当多个默认路由可用时会发生这种情况(如连接多个ISP时,称为多宿主),在这种情况下协议标准没有规定终端系统的具体行为,而是由具体操作系统的协议实现来决定。通常是简单的选择第一个匹配的结果,更复杂的系统可能尝试在多个路由上平衡负载或拆分流量。

3.3直接交付与间接交付

简单的来理解就是源和目的地主机之间是否有一个中间路由或主机路由,当没有中间的路由节点时,源主机通过自己的路由表获得目的地主机的路由条目,并直接将数据报通过低层交换链路发送给目的主机。而间接交付就是源主机上的路由表不能获得目的主机的路由条目,需要中间的路由器来帮助它将数据报转发到目的主机上。关于这部分内容在后面的网络层-数据平面中详细介绍。

 四、移动IP

移动IP是英特网工程任务组IETF开发的一种技术[RFC3344],该技术使得移动主机在各网络之间漫游时,任然能够保持其原来的IP地址不变。移动IP技术还为英特网中的非移动主机提供了相应的机制,使得它们能够将IP数据报正确的发送到移动主机。

4.1移动IP技术的相关基本概念

归属网络(家乡网络HN):每个移动主机都有一个默认连接的网络或初始申请接入的网络,称为归属网络(Home Network)。

归属地址(家乡地址HoA):移动主机在归属网络中的IP地址在其整个移动通信过程中是始终不变的,因此称为永久地址(Permanent Address)或归属地址(Home Address)。

归属代理(家乡代理HA):在归属网络中,代表移动主机执行移动管理功能的实体称为归属代理(Home Agent)。归属代理通常就是连接归属网络上的路由器,然而它作为代理的特定功能则是在网络层完成的。

外地网络:移动主机当前漫游所在的网络称为外地网络(Foreign Network)或被访问网络(Visited Network)。

外地代理(CA):在外地网络中,帮助移动主机执行移动管理功能的实体称为外地代理(Foreign Agent)。

转交地址(CoA):外地代理通常就是连接在外地网络上的路由器,外地代理会为移动主机提供一个临时使用的术语外地网络的转交地址。

4.2基本模型:双向隧道

上图是一个移动IP基本模型双向隧道的示例结构图,在示例中移动节点MN的HoA和CoA之间关联,称为移动网络(MN)绑定。在这个通信基本模型中移动IP支持节点改变自己的网络连接点,同时保持网络连接操作的能力,移动节点的家乡代理为移动服务转发流量,并对路由加以优化,通过允许移动,以及在通信节点之间直接通信,从而提高路由性能。

基本模型工作在一个MN的CN不使用MIPv6协议的情况下,在整个网络中移动的情况下,这个模型称为网络移动(NEMO[RFC3963])。当MN连接到网络中的一个新位置时,它接收自己的CoA,并向自己的HA发送一个绑定更新消息。这个HA使用一个绑定确认来响应。如果一切顺利,这个MN和CA之间的流量通过MN的HA来路由,并使用一种双向的IPv6分组隧道,称为双向隧道[RFC2473]。这些消息通常使用IPsec的封装安全有效负载(ESP)来保护,这样做可以确保一个HA不会在接收到一个伪造的MN绑定更新时被欺骗。

在这个基本模式中,数据报的传输通讯方式是:

当移动节点向一个英特网上的某个主机发送数据报时:移动节点将数据报通过外地代理将数据报直接发送给目的主机;

当英特网上的某个主机向处于外地网络中的移动节点发送数据报时:该数据报会首先发送给移动节点的家乡代理,家乡代理基于移动节点通过外地代理注册的移动网络绑定信息中的外地代理地址建立的隧道发送给外地代理,外地代理通过报文中的目的地址(即移动节点家乡地址)和基于漫游的移动节点注册的转交地址信息,将数据报发送给移动节点。

简单的来说,在这个模型中移动节点如果进入一个外地网络,它要向外地网络中的外地代理路由注册一个转交地址,作为移动节点在外地网络中的临时通信地址。并且外地代理需要基于移动节点的家乡地址向移动节点的家乡代理发送一个注册信息,通过这个注册信息家乡代理为漫游的移动节点建立一个通信隧道,这个通信隧道可以简单的看作是移动节点的家乡地址与转交地址的映射关系,基于这个映射关系,当家乡代理接收移动节点的数据报时,家乡代理就将数据报转发给转交地址。

4.3路由优化

在前面介绍了基于双向隧道的移动IP服务模式,这种模式在移动节点接收数据时是非常低效的,特别是当给移动节点发送数据报的主机与移动节点很近时,双向隧道会显得很鸡肋。

为了解决这个问题,移动节点和与其通信的主机都在自身设置一个通信代理转发,在双方各自的代理上注册各自的信息,当彼此通信时,双方直接通过彼此的代理向彼此收发数据,而不再通过移动节点的家乡代理转发。

同址转换:移动主机需要运行额外的外地代理软件,外地网络也需要提供相应的机制,是移动主机能够自动获取一个外地网络中的地址作为自己的IP地址和外地代理地址,这个地址被称为同址转交地址。有了这个地址,其他主机就可以直接向移动节点发送数据报了,而不需要再经过移动节点的家乡代理进行转发了。

三角形路由问题解决方法:三角形路由问题就是前面提到的当与移动节点通信的主机与移动节点距离很近时,如果还经过家乡代理转发就会浪费网络带宽资源,同时效率也很低。前面讲过了同址转换,但实际给移动主机发送数据报时还是移动节点的家乡地址,如果只在移动节点的主机上设置一个代理,还不能完全解决问题。解决三角问题,就是在与移动节点通信的其他主机上设置一个代理,通信代理先从家乡代理获取移动节点的转交地址,之后发送给移动主机的IP数据报,都利用转交地址直接通过IP隧道发送给移动节点的主机外地代理,这样就不用再通过移动节点的家乡代理来转发了。

上面这些路由解决方案也被称为路由优化(RO),它实际上涉及很多安全问题,为了解决RO安全问题和可用的方法相当复杂,详细可以参考[RFC6275]和[RFC4866]。

RO的操作实现分为两个部分:一部分涉及注册绑定的建立和维护,另一方面涉及所有绑定建立后的数据交换方法,为了与其他主机建立一个绑定,移动节点必须向每个于其通信的其他主机证明自己的真实身份,这通过一个返回路由程序(RRP)来完成。通过前面的介绍可以知道,RRP不适用双向隧道传输数据,但需要基于双向隧道来建立地址映射关系。

RRP使用以下这些移动消息,它们是IPv6移动扩展头部的子类型:家乡测试初识化(HoT1)、家乡测试(HoT)、转交测试初识化(CoT1)、转交测试(CoT)。这些消息向与移动节点通信的主机验证一个特定移动节点的家乡地址(HoT1和HoT)和转交地址(CoT1和CoT)可到达。参考下面基于RRP的RO通信注册过程示意图来理解:

 五、IP数据报的主机处理

虽然路由器再转发分组时通常不会考虑将哪个IP地址放在分组的源IP地址和目的IP地址字段中,但主机必须考虑它们。应用程序(例如Web浏览器)可能尝试连接一台指定的主机或服务器,它们也可能有多个地址。因此,发送数据报时使用哪个地址(和IP版本)就有问题。这里需要探讨一个更微妙的情况,如果流量到达一个错误的接口(即接收的数据报中存在未配置的目的的地址),是否接收发送到本地IP地址的流量。

5.1主机模式

确定一个单播数据报是否匹配一台主机的IP地址并被处理,它取决于接收系统的主机模式[RFC1122],以及它是否为最相关的多宿主主机。这里存在两种情况:强主机模式和弱主机模式。

强主机模式:只有当目的IP地址与数据报到达的接口配置的IP地址匹配时,才会把数据报交付本地协议栈;

弱主机模式:一个数据报携带的目标地址与它到达的任何接口的任何本地地址匹配,无论它到达哪个网络接口,它都会被接收的协议栈处理。

以上的两种主机模式也适应于发送行为,主要发送的数据报的源IP地址与接口配置地址的主机模式相匹配,该主机就可以将数据报从这个接口发送出去。弱主机模式相对强主机模式存在一些安全问题,例如恶意用户生成一个目的地址的分组,这个分组可能包括伪造("欺骗")的源IP地址,如果Internet将这个分组路由到目标主机,如果目标主机应用程序基于源IP地址的访问控制决策,这样目标主机就可能会跟一个伪造的终端进行通信。

5.2地址选择

当一台主机发送一个IP数据报时,它必须将自己的IP地址写入数据报的源IP地址字段,在它已知多个地址的情况下,数据报的目的地确定一台特定的目的主机。有些情况下源地址是已知的,因为它可以由一个应用程序提供,或者响应同一连接的前一个分组而发送该分组。

在当前IP实现中,数据报的源IP地址和目的IP地址使用的IP地址,是通过一组称为源地址选择程序和目的地址选择程序获得的。从网络发展的历史角度来看,大多数Internet主机只有一个IP地址用于外部通信,因此选择地址并不困难。随着接口可使用多个地址和支持多个地址范围的IPv6的使用,有些程序必须开始用。当两台实现IPv4和IPv6(“双协议栈”主机见[RFC4213])的主机之间通信时,这个情况变得更复杂。地址选择失败可能导致非对称路由、不必要的过滤或丢弃分组。

[RFC3484]给出了IPv6默认地址的选择规则,纯IPv4主机通常不会面临这样复杂的问题,一般情况应用程序可以调用特定的API执行默认操作,但也可能遇到棘手的部署问题[RFC5220]。下面分别来了解默认地址选择规则[RFC3484]和解决棘手的部署问题的源地址地址选择算法及目的地选择算法[RFC5220]:

默认地址选择规则

[RFC3484]中默认规则是优先在相同在相同范围内选择成对的源/目的地址,优先选择更小而不是更大范围以避免在其他地址可用时使用临时地址,以及优先选择具有更长的通用前缀的成对地址。当全球地址有效时,优先选择它而不是临时地址。这个范围也包括“管理覆盖”默认规则的方法,默认选择通过一个策略表来控制,它存在于每台主机中。它是一个最长匹配前缀查找表,类似于IP路由使用的转发表。

假设对于一个地址A,在该表中进行一次查找过程,对A生成一个优先级P(A),以及一个标签L(A)。优先级的数值越大,表示更加偏好;标签用于相似地址类型的分组。例如,如果L(S)=L(D),该算法倾向于使用该对(S,D)作为源/目的地址对,如果没有规定其他策略,[RFC3484]建议使用下表中的策略值:

在这个表或一个管理配置参数在站点中配置的表,用于驱动地址选择算法。函数CPL(A,B)或“通用前缀长度”,是在IPv6地址A和B中从最左边的位开始一个最长通用前缀的位长度。函数S(A)将IPv6地址A的范围映射到一个数值,范围越大,映射的值越大:

如果A是链路范围,B是全球范围,则S(A)<S(B);

函数M(A)将IPv4地址A映射为一个IPv4映射的IPv6地址,由于IPv4地址范围是基于地址自身,因此需要定义以下关系S(M(169.254.xx))=S(M(127.xxx))<S(M(专用地址空间))<S(M(任何其他地址));

如果A地址是一个过期地址,而B是一个首选地址,则∧(A)<∧(B);

如果A是一个家乡地址,则H(A)为真;如果A是一个转交地址,则C(A)为真;

 源地址选择算法

[RFC5220]中源地址选择算法定义了一个源地址的候选集合CS(D),它基于一个特定的目的地址D。这里有一个限制,如果任何D不是任播、组播、未指定地址地址的CS(D),使用符号R(A)表示地址A在集合CS(D)中的等级。A比B的等级更高(即RA(A)值更大),表示R(A)>R(B),意味者优先选择A而不是B作为到达地址D的源地址,表达式R(A)*>R(B)表示在CS(D)中为A分配一个比B更高的等级。符号I(D)表示选择到达目的地D的接口,符号@(i)是分配给接口i的集合。如果A是一个临时地址,T(A)为布尔值true,否则T(A)为false。

以下规则用于为目的地D建立A和B在CS(D)中的局部顺序:

1.优先选择相同地址:if A=D,R(A)*>R(B);if B=D,R(B)*>R(A);

2.优先选择适当范围:if S(A)<S(B) and S(A)<S(D),R(B)*>R(A) else R(A)*>R(B);if S(B)<S(A) and S(B)<S(D),R(A)*>R(B) else R(B)*>R(A);

3.避免过期地址:if S(A)=S(B) ,{if ∧(A)<∧(B),R(B)*>R(A) else R(A)*>R(B)};

4.优先选择家乡地址:if H(A) and C(A) and - (C(B) and H(B)), R(A)*>R(B);if H(B) and C(B) and - (C(A) and H(A)), R(B)*>R(A); if(H(A) and - C(A)) and (- H(B) and C(B)), R(A)*>R(B); if (H(B) and - C(B)) and (-H(A) and C(A)),R(B)*>R(A);

5.优先选择输出接口:if A ∈ @(I(D)) and B ∈ @(I(D)), R(A)*>R((B)); if B ∈ @(I(D)) and A ∈ @(I(D)), R(B)*>R(A);

6.优先选择匹配标签:if L(A)=L(D) and L(B) ≠ L(D), R(A)*>R(B); if L(B) = L(D) and L(A) ≠ L(D), R(B)*>R(A);

7.优先选择非临时地址:if T(B) and -T(A), R(A)*>R(B); if T(A) and -T(B), R(B)*>R(A);

8.使用最长匹配前缀:if CPL(A,D) > CPL(B,D), R(A)*>R(B); if CPL(B,D) > CPL(A,D), R(B)*>R(A)。

局部顺序规则可用于形成CS(D)中所候选地址的全局顺序。Q(D)表示为目的地D选择一个最高等级的源地址,它由目的地地址选择算法来使用。如果Q(D)=∅(空),可能无法为目的地D确定源地址。

关于源地址在复杂情况下的选择每个选择规则基于算法选择合适的地址形成地址集合,按照前面的顺序给出相应的优先级的值,最终匹配地址就跟默认地址选择方式一样了,按照优先级来选择使用。简单的来说就是:优先选择相同地址,优先选择适当范围,避免过期地址,优先选择家乡地址,优先选择输出接口,优先选择匹配标签,优先选择非临时地址,使用最长匹配前缀。

目的地址选择算法

[RFC5220]目的地址选择算法也类似源地址选择的方式,在源地址算法中Q(D)是上面例子中为目的地D选择的源地址。如果目的地B不可达,则令U(B)为布尔值true。E(A)表示采用某些“封装传输”(例如,隧道路由)可到达目的地A。集合SD(S)采用与前面的成对元素A和B相同的结构,那么可以获得以下规则:

1.避免不可用的目的地:if U(B) or Q(B)=∅,R(A)*>R(B); if U(A) or Q(A)=∅, R(B)*>R(A);

2.优先选择匹配范围:if S(A)=S(Q(A) and S(B) ≠ S(Q(B)), R(A)*>R(B);if S(B)=S(Q(B)) and S(A) ≠ S(Q(A)), R(B)*>R(A);

3.避免过期地址:if ∧(Q(A)) < ∧(Q(B)),R(B)*>R(A); if ∧(Q(B))< ∧(Q(A)),R(A)*>R(B);

4.优先选择家乡地址:if H(Q(A)) and C(Q(A)) and - (C(Q(A)) and H(Q(B))), R(A)*>R(B);if (Q(B)) and C(Q(B)) and - (C(Q(A)) and H(Q(A))), R(B)*>R(A); if (H(Q(A)) and - C(Q(A))) and (-H(Q(B)) and C(Q(B))), R(A)*>R(B); if (H(Q(B)) and - C(Q(B))) and (- H(Q(A)) and C(Q(A))), R(B)*>R(A);

5.优先选择匹配标签:if L(Q(A)) = L(A) and L(Q(B)) ≠ L(B),R(A)*>R(B); if L(Q(A)) ≠ L(A) and L(Q(B)) = L(B), R(B)*>R(A);

6.优先选择更高优先级:if P(A)>P(B),R(A)*>R(B); if P(A)<P(B),R(B)*>R(A);

7.优先选择本地传输:if E(A) and -E(B), R(B)*>R(A);if E(B) and - E(A), R(A)*>R(B);

8.优先选择更小范围:if S(A)<S(B),R(A)*>R(B) else R(B)*>R(A);

9.使用最长匹配前缀:if CPL(A, Q(A)) > CPL(B, Q(B)), R(A)*>R(B); if CPL(A,Q(Q)) < CPL(B,Q(B)),R(B)*>R(A);

10.否则保持等级顺序不变;

还是跟源地址选择算法一样,根据不同优先级的算法匹配地址并获得相应的优先级值,然后基于优先级值确定目的地址。目的地址选择的优先级同样跟上面的顺序一样,那么目的地址选择的优先级是:避免不可用的目的地,优先选择匹配范围,避免过期地址,优先选择家乡地址,优先选择匹配标签,优先选择更高优先级,优先选择本地传输,优先选择更小范围,使用最长匹配前缀。

 

posted @ 2022-11-30 21:54  他乡踏雪  阅读(974)  评论(0编辑  收藏  举报