1 介绍
近几年来,对计算机互连及装备有无线联网设备的计算机的兴趣越来越流行。计算机和日常设备越来越无缝集成在一起并且价格也在下降。同时无线网络技术,如蓝牙和IEEE 802。11b无线局域网也相继出现。这将在很多领域如健康保健,安全,保险,运输及处理产业等引发更多令人振奋的前景。小设备如传感器等能接入一些已经存在的网络基础设施如全球因特网,也能在任何地方被监测到。
互联网技术已经被证实足够灵活的适应过去几十年来不断变化的网络环境。互联网技术起初是在如ARPANET的慢速网络上发展起来的,但它现在却运行在大量的连接技术及许多不同特征的带宽和比特错误率上。由于大量使用互联网技术的应用已被广泛应用,在不久的无线网络中使用现有互联网技术有很大的益处。同时,全球互联网的巨大互联性是个很大的激励。
由于小设备如传感器经常被要求小型且便宜,网络协议的实现必须处理受限制的计算资源及内存。这篇文章描述了一个成为lwIP的小TCP/IP协议栈的设计及实现,它足够小便于在最小限度的系统中使用。
文章的安排如下:2,3和4部分给出了lwIP协议栈的概要,第5部分描述了操作系统仿真层,第6部分描述了内存及缓冲区管理,第7部分介绍了lwIP网络层的抽象接口,第8,9和10部分描述了IP,UDP和TCP协议的实现,第11,12部分描述了怎样使用lwIP及API介绍,第13,14部分分析了实现,最后,第15部分提供了lwIP API的使用手册,并且第17,18部分给出了几个代码实例。
2 协议分层
TCP/IP协议族设计成分层模式,每个协议层解决不同的通信问题。分层思想主导了协议实现的设计,各个协议能被分开实现。以一种严格分层的方式实现协议导致了这么一种情况:协议层之间的通信降低了总体的性能。为了克服这个问题,一个协议的某些方面应当被其他协议所了解。必须小心,那样只有重要的信息在协议层间共享。
许多的TCP/IP实现都严格区分开应用层及其底下的协议层,不管这些层是否可以或多或少的交叉实现。在许多操作系统中,这些底层的协议被实现为操作系统内核的一部分,而只提供给应用层进程一些通信调用点。应用程序只知道TCP/IP实现的一个抽象方式,网络通信同进程间通信或文件I/O的差异很少。这样实现的原因是应用程序不会意识到底层使用缓冲区的机制,它不能使用该信息拒绝经常使用数据的缓冲区。同时,当应用程序发送数据时,该数据必须在被网络代码执行前从应用进程内存空间复制到内部缓冲区。
在最小限度系统上的操作系统通常不会维护内核及应用进程之间的严格界限保护。这就允许通过共享内存在应用层及底层协议间使用更为灵活的通信机制。特别地,应用层能意识到底层使用缓冲区的机制。因此应用程序能更高效地重用这些缓冲区。同时,由于应用进程可以使用网络层代码同样的内存,应用进程能直接读写那些内部缓冲区,因此也节省了复制的代价。
3 概要
正如许多其他的TCP/IP实现一样,已有的分层协议设计给lwIP的设计实现提供了向导。每个协议实现了自己的模块,以一些函数做为进入该协议的入口。尽管大多数协议被分开实现,但有些层却违背了这个思想,为的是上面提到的在处理速度及内存使用上提高性能。例如,当要验证到达的TCP报文段检验和,或者当要分组转发(demultiplexing)一个报文段时,TCP模块必须知道该报文段的源IP地址和目的IP地址。TCP模块清楚IP头部结构,因此能自己析取出所需的信息,而不是通过函数调用来传递这些地址。
lwIP包含好几个模块,除了那些实现TCP/IP协议族(IP,ICMP,UDP,TCP)的模块外,也实现了其他一些支持的模块。这些支持的模块包括操作系统仿真层(在第5部分描述),缓冲及内存管理子系统(在第6部分描述),网络接口函数(在第7部分描述),和计算检验和的函数。lwIP在第12部分也描述了一个抽象的API。
4 进程模型
一个协议实现的进程模型是这样描述的:系统被分开为不同的进程。一种已经被用于实现通信协议的进程模型是让每个进程作为一个独立的进程运行。在这种模型中,协议分层是严格的,并且协议层间的通信接口也被严格定义。尽管这种方法有其优点,如协议能在运行是加入进来,清楚代码且容易调试,它也有些缺点。前面提到过,严格分层并不是实现协议的最好方法。同时,更重要的是,层间交互会引起上下文切换。对一个到达的TCP报文段意味着三个上下文切换,从网络接口层的设备驱动,到IP进程,再到TCP进程,最后才到应用进程。大多数操作系统的上下文切换是相当昂贵的。
另一个通常的方法是让通信协议驻留在操作系统的内核中。在这种内核级实现通信协议的情况下,应用进程通过系统调用和这些协议进行通信。这些通信协议并不严格区分彼此,反而会使用某些技术来跨过协议分分层。
lwIP使用了进程模型。在这个模型中,所有的协议驻留在单一的进程中,显然和操作系统内核是分开的。应用进程可以驻留在lwIP进程中,也可以在分开的不同进程中。应用程序和TCP/IP协议栈之间的通信有两种:一个是当应用程序和lwIP共享一个进程时可以通过函数调用;另一种是使用一个更为抽象的API。
让lwIP实现为用户空间的进程而不是驻留操作系统内核有其优缺点。主要优点是这种实现在不同操作系统间是可移植的。因为lwIP被设计为运行在小的操作系统上,这些操作系统不支持交换进出进程和虚拟内存,所以由不得不等待磁盘操作(假如部分lwIP进程被交换出到磁盘中)引起的延迟不再是个问题。在有机会服务一个请求前必须等待一定的调度这仍然是个问题,但在lwIP的设计中并没有什么去排除将来会在操作系统内核中实现。
5 操作系统仿真层
为了使lwIP可移植,操作系统特定函数调用及数据结构并没直接在代码中使用。当需要这样的函数时,操作系统仿真层就被使用。操作系统仿真层向操作系统服务提供了统一的接口,这些服务有定时器,进程同步,消息传递机制,等等。原理上,要移植lwIP到其他操作系统时,只需实现该特定操作系统的仿真层就可以了。
操作系统仿真层提供了一个功能性定时器让TCP使用。该定时器是一个时间间隔至少200ms的一次性定时,它在定时结束时将调用一个已注册的函数。
信号量是进程同步机制的唯一一个实现。即使下层的操作系统并不提供信号量实现,它也能由其他的同步原语如临界变量或锁机制实现。
消息传递的实现是一个抽象为“邮箱”的简单机制。一个邮箱有两种操作:邮递和收取。邮递操作不会阻塞该进程,而邮递给一个邮箱的信息会由操作系统仿真层列入队列,直到另外的进程收取该信息。即使下层操作系统不支持邮箱机制,它也能容易地由信号量实现。
(待续)