正如许多其他的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的一次性定时,它在定时结束时将调用一个已注册的函数。