图解LwIP协议栈运作机制

引言

最近研究了一下FreeRTOS下LwIP协议栈的工作机制,分析报文的发送/接收数据流,以掌握协议栈的整体工作机制,从系统层面去了解该协议栈。所以,这里覆盖LwIP协议栈的大体工作流程,并围绕协议栈,分析与其关联的上下游部分。

此次研究的软硬件相关信息如下:

软件平台:FreeRTOS + LwIP +WLAN驱动 ;

硬件平台:ST MCU + WLAN模块,二者通过SDIO总线通讯。

LwIP是什么

先来了解一下LwIP。

LwIP,英文全称Light Weight IP protocol,是由瑞典计算机科学院(SICS)的Adam Dunkels开发的一个轻量级的开源的TCP/IP协议栈,其重点是在保证TCP/IP协议栈的主要功能的基础上,减少对存储空间资源的需求,一般只需要几十KB的RAM和40KB的ROM空间。它不依赖于操作系统,非常适合应用在低端的嵌入式领域。

LwIP实现的是TCP/IP协议栈,该协议栈想必各位看官都有所了解,为了保持文章的完整性,还是在这里简单的描述一下。

TCP/IP协议栈分为四层,从上到下分别为应用层,传输层,网络层以及为设备间的应用程序通讯提供通路先看下图,以我们使用最频繁的,浏览网页使用的HTTP应用为例:

图解LwIP协议栈运作机制

TCP/IP四层网络模型

发送报文的时候,每一层最主要的工作就是将上一层传递过来的数据和本层的头部封装起来,然后将携带本层头部的数据传递给下一层继续处理;

接收报文的时候则反之,每一层从下一层传递的数据里剥离出本层的头部,并将剩余的数据传递给上一层处理。

当然每一层还有其他很多辅助的工作,如区分报文类型进行不同的处理,提取IP信息并存储,分片报文处理,端口号匹配,各IETF RFC标准的处理等等,这里主要目的是阐述LwIP的整体工作机制,就不一一详述了。

LwIP如何工作起来

啥也不说,先上图:

图解LwIP协议栈运作机制

LwIP工作流程

图中蓝底框处的模块是LwIP部分。ICMP,TCP,UDP报文比较典型,图中也主要以这三种协议的报文为参考进行分析。

网络通讯说到底就是收发数据,那就分别从发报文和收报文两个方向来解读上图,图中蓝色为报文发送路径,绿色为报文接收路径。

1. 报文发送方向

在应用层,待发送数据准备好后,可通过以下两条路径将数据传递给下一层处理:

A. 将报文的处理方式以及报文组装成消息,推送入消息队列。tcpip_thread线程从mbox消息队列中获取消息,并按消息里指定的方法处理消息里给出的数据。该场景主要针对类似ICMP报文。

B. 将报文直接传递给下一层,不经过tcpip_thread线程,主要应用于TCP/UDP报文。

这一点差异体现在图中红虚框A处,对于第二条路径,这部分处理不是在tcpip_thread线程里,而是在主线程里

继续跟踪蓝色路径,报文经过传输层,网络层,链路层以及和WLAN强相关的SDPCM层处理后,将报文推入报文发送队列,并唤醒线程wwd_thread_func从队列中取报文,该线程持续从队列中取报文并将报文经由WLAN芯片发送出去,直到队列为空。

2. 报文接收方向

报文接收方向,这次跟着绿线的路径走。

一次报文的接收由硬件中断触发,比如在这里WLAN模块接收到了数据后触发SDIO中断,该中断负责唤醒wwd_thread_func线程后,就开始从WLAN模块读取原始数据并从中解析出链路层报文,然后组装消息,该消息提供了该报文的处理方式和报文数据。消息组装完成后则推送消息进入mbox消息队列,而线程tcpip_thread则不停地尝试从该消息队列中提取消息。一旦提取到消息就根据消息里提供的方法处理消息提供的报文。

协议栈内部的报文处理方式和发送方向的相反,依序为链路层,网络层,传输层,最后将数据返回给应用层。注意在网络层处理后,分出两条路径,ICMP报文并不需要经过传输层。

所有协议将报文返回给应用层,都是通过应用层挂接的回调函数(即红虚框B处)来实现,但是回调函数可以有两种实现方式

A. 直接将数据返回给应用层;

B. 将应用层数据推送到接收报文队列中,等待应用来取数据。

这么一来,LwIP协议栈结合FreeRTOS总的工作流程就梳理清楚了,其中可能有理解不到位的地方,欢迎一起探讨。


分享到:


相關文章: