下一代互联网业务试商用及设备产业化–嵌入式IPv6协议栈(由贾智平教授主持)


IPv6(Internet Protocol version 6, 网际协议版本6)是设计来替代IPv4的下一代网际协议,以克服IPv4面临的地址耗尽问题。IPv6由IETF制定的RFC 2460标准化。除了增大地址空间一劳永逸地解决地址耗尽问题,IPv6还采用了许多新技术以改善互联网的性能,提供了更为强大和灵活的功能支持,同时网络安全也是协议设计考虑的重要因素。

IPv6具有如下的新特点:

  • IPv6采用128位的地址,是IPv4地址长度的4倍,因此,IPv6最多可以提供约3.4*10^38个不同的地址,已经完全足够现在所有的网络设备使用。实际上,根据协议标准,一个网络设备可以有多于一个IPv6地址。
  • IPv6采用了新的无状态地址自动配置机制,网络中的主机无需手动配置网络地址,而可以用自身的链路层地址和从路由器接收到的网络前缀自动生成网络地址。在没有路由器的网络中,主机也可以用链路层地址生成本地网络地址。同时IPv6也通过DHCPv6协议支持有状态的地址配置。
  • IPv6取消了IPv4的广播机制,而代之以多播机制。使用多播机制,节点可以向属于同一个多播组的所有节点发送报文。
  • IPv6紧密集成了网络安全机制,把IPsec协议支持绑定到网际层协议中,作为IPv6基本报头的扩展。这样极大地方便了IPsec协议在网际层的应用,有利于增加网络的安全性。
  • 不同于IPv4,IPv6只有一个定长的基本报头,任何扩展或可选功能都通过扩展报头来实现。这样改变了IPv4可选项影响报头长度的局面,极大地简化了路由器对报头的处理。
  • IPv6在设计之初就考虑了移动性,因此对移动性的支持全面而彻底。在IPv6网络中使用移动节点就像使用固定节点一样方便,IPv6还支持网络移动,即整个子网从一个接入点移动到另一个接入点。

随着网络技术的发展和嵌入式设备的广泛应用,嵌入式设备接入互联网的要求与日俱增。为了满足嵌入式系统对于实时性、资源和能耗的要求,嵌入式网络协议栈必须裁减甚至重新设计以减少代码空间和加快处理速度。为了实现这个目标,涌现了很多嵌入式TCP/IP协议栈的实现,lwIP即是其中的佼佼者。lwIP意即轻量级IP,是瑞典计算机科学院(Swedish Institute of Computer Science)的Adam Dunkles等开发的一套开源TCP/IP协议栈。由于它轻量级的设计和紧凑的代码,尤其适用于资源受限的嵌入式系统。经过适当配置,lwIP只需要几十K的RAM和几十K的ROM就可以运行。即使这样,它还是支持多网络接口转发,精简的ICMP和UDP协议,包含阻塞控制的TCP协议,以及Berkeley风格的接口API等基本功能。

lwIP对IPv4的支持已经相当成熟,但对IPv6的支持仍然处于起步阶段,基本的功能还没有齐备,远远达不到实用要求。在此条件下,我们的项目即致力于在lwIP的框架下实现IPv6支持,这样一方面可以最大限度地利用现有的技术成果,另一方面可以发挥IPv6在网络应用中的技术优势。由于从IPv4到IPv6的改动主要牵涉到网际层的全部功能,也部分牵涉到了上层协议即ICMP协议的功能,因此项目的主要工作即在于用新的IPv6模块在这两个层次替换原有的IPv4模块,而保持其他模块和模块间的接口不变或兼容。同时我们还提出了以下项目目标:

  • 兼容原有的lwIP协议栈,除了IPv4到IPv6协议改变带来的差异外,应用程序不应感觉到模块替换造成的影响。
  • 占用资源少,只需少量的代码空间和运行时内存空间即可正常运行。
  • 实时性高,处理速度快,满足嵌入式应用对实时性的要求。
  • 高度可移植和可裁减,可以在不改动程序源代码的情况下,通过适当配置和增加硬件相关代码把协议栈移植到不同的体系结构和不同型号的网络设备。
  • 高度模块化,程序设计规范、清晰,文档完善。

为了达到以上设计目标,特别是为了满足嵌入式应用对资源的限制,我们不得不对IPv6协议做必要的精简。在项目的起步阶段,我们计划暂不支持IPsec、移动IPv6等高级而复杂的扩展功能,而把重点放在快速可靠的网络通信上面。与项目目标不直接相关的一些次要的协议报文也不得不暂时忽略,只在设计的框架上留下接口,待项目主要目标完成之后再作进一步完善。

程序设计遵循了TCP/IP协议栈分层的协议模型,具体实现采用了模块化的体系结构。在设计模块时参考面向对象的編程思想,每一个模块是独立而完整的实体,模块之间只通过有限的接口函数交换数据。和lwIP兼容的部分即采用lwIP已有的模块和接口。用IPv6模块替换IPv4模块的关键问题在于IPv6采用了不同于IPv4的邻居发现和地址配置机制,相对于IPv4在以太网上的地址解释协议ARP协议,IPv6的地址解析、邻居发现、邻居可达性检测和自动地址配置功能都是在网际层的上层,即通过ICMPv6协议实现的。同时IPv6协议甚至在某些情况下传输层的协议例如TCP协议等也会访问相应的数据结构。综合考虑各方面的因素我们决定把邻居发现和地址配置的逻辑功能用单独的模块实现,而向其他模块提供操作的入口,余下部分原则上一个协议对应一个独立的模块。其中TCP协议、UDP协议和各种链路层协议模块lwIP中已经实现,可以直接使用或稍加修改,因此项目实际需要实现如下5个模块:

  • 邻居发现与地址配置模块。该模块维护邻居发现与地址配置相关的所有内部数据结构,向其他模块提供操作这些数据结构的接口。
  • IP协议模块。该模块负责IPv6报文的发送和接收,报文的解包并递交给上层协议,同时向上层协议提供接口供发送数据使用。调用邻居发现与地址配置模块进行地址解析。
  • ICMP协议模块。该模块负责ICMPv6报文的封装和解包,并根据报文的信息修改邻居和地址相关的数据结构。调用IPv6模块进行报文的实际发送,调用邻居发现与地址配置模块实际修改相关数据结构。
  • 地址处理模块。该模块负责提供所有与IPv6地址比较和转换相关的功能,被上述3个模块调用。
  • 公共函数模块。该模块负责提供数据格式转换,计算和检验数据校验和等公共功能,被所有需要的模块调用。

了解项目详情和获得更多资料,请访问: