您现在的位置是:首页 >技术杂谈 >讲稿:IP++系列视频教程——4.包头网站首页技术杂谈

讲稿:IP++系列视频教程——4.包头

IP_plus_plus 2025-03-29 00:01:02
简介讲稿:IP++系列视频教程——4.包头

视频

      IP++系列视频教程,第4讲包头。包头的设计是制定协议的基础,良好的包头设计是协议实施的重要前提。本讲我们主要讲基本头,至于扩展头,随后会专门讲解。

      这是IP++的包头格式,下面我逐字段进行介绍。

      先看“头长度”字段,由于IP++地址是可变长度的,而且变化的幅度有可能比较大,所以包头也设计成可变长度的,由头长度字段来指定包头的具体长度,此长度只包括基本头,不包括扩展头。头的实际长度是8加上8乘以2的若干次方。比如头长度值为0,则头的实际长度就是16字节。头长度的最大允许值是4。头长度必须保证能容纳下地址,可以有余量。而且考虑到传输途中可能的长度变化,尽量从一开始就预留出足够的空间。

      扩展头字段用两个bit表示有多少个扩展头。扩展头基本相当于IPv4中选项的升级。关于扩展头以后会专门介绍,这里就不多讲了。

      第一个字节还剩两个bit,分别表示目的地址和源地址的类型,绝对地址则值为0,相对地址则为1。

      接下来的“业务等级”、“报文长度”、“跳数限制”、“协议”与IPv4中的相应字段一样,没有变化。

      接下来的字段都用来表示地址。IP++地址相对于IPv4地址复杂一些,使用了多个字段来表示。下面结合具体的例子来介绍,比如目的地址是这个值,在包头中该如何表示呢?首先要指定是绝对地址还是相对地址,这里是绝对地址,因此“目的地址类型”字段就应该是0。然后要指定起始级数和地址长度,这两项在“目的地址参数”字段中指定,前4比特指定起始级数,这里是0,后4比特指定末端深入了几级,这里深入了1级,相应地,地址长度是8字节。这8个字节的数据存放在“目的地址、源地址”字段的起始位置。源地址的数据接在它后面,也就是从第9个字节开始。“目的地址、源地址”字段是可变长度的,具体长度由头长度字段决定。这个长度要保证能存放下地址数据,可以有余量,多余的部分用0填充。

      我们总结一下IP++包头与IPv4包头的区别。区别主要集中在三方面:取消或移走了一些字段、地址变复杂了、增加了扩展头字段。

      取消了版本和校验,把分片放在扩展头中处理。

      取消了版本字段。不用担心会引起混淆,因为这个字段本来就没什么用。网络层使用什么协议,IPv4、IPv6还是IP++并不是由这个字段指定的。指定协议的普遍规则是由下层包头中的协议字段指定上层协议。网络层协议也是这样,由链路层的协议字段指定,如果值是0x0800则表示是IPv4,如果值是0x86dd则表示是IPv6,如果值是0x0810则表示是IP++。在IP包头中又有网络层协议版本字段,这其实是多余的。在实际的实现,如协议栈中,该字段并没有使用。这个问题是历史的原因造成的。

      实践证明网络层的校验意义不大,因为下层和上层的校验功能已经足够了。因此IP++中取消了校验字段。

      分片会带来一定的性能消耗,而且很多时候这本来是可以规避的,因此将来的目标是尽可能减少分片,当然这不是IP++自己能决定的。

      IP++地址比IPv4地址复杂,使用了多个字段,而且长度是可变的。这也是很好理解的,因为干的活多了。

      IPv4中用选项来实现一些差异化的功能。但由于设计得不够理想,比如长度限制,实际使用得情况并不好。IP++中改用扩展头来实现相应的功能,把分片功能也放在了扩展头中。

      下面来看一个IP++包头的例子。我们对这个包头进行一下解析,看看各字段的情况。

0000:11 00 01 1A 80 06 01 00 01 01 01 02 01 01 01 1C

0010:01 01 01 01 00 00 00 00

      头长度值为1,那么头的实际长度就是8加8乘以2的1次方,等于24字节。

      扩展头数为0。

      目的地址,类型为0,表示是绝对地址;源地址,类型为1,表示是相对地址。

      业务等级为0。

      报文长度011A,转换成10进制是282字节。

      跳数限制,也就是ttl,为128。

      协议号为6,表示上层传输层的协议为TCP。

      后面的字段都用来表示地址。

      目的地址,起始级数为0,末端深入了1级,则地址长度为4乘以1加1,也就是8字节。最终完整的地址就是/#1.1.1.2-1.1.1.28。

      源地址,起始级数为0,末端深入了0级,则地址长度为4乘以0加1,也就是4字节。最终完整的地址就是.#1.1.1.1。

      地址空间没有完全用完,多余的用0填充。

      好。包头就介绍这么多。下一讲介绍扩展头。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。