您好、欢迎来到现金彩票网!
当前位置:九乐棋牌游戏下载 > 网络时间协议 >

物联网高手必备:网络协议栈LwIP

发布时间:2019-07-03 20:20 来源:未知 编辑:admin

  【IT168评论】在物联网设备中,TCP/IP网络协议栈是一个非常重要的软件组成部分,没有TCP/IP网络协议栈,物联网设备就无法连接到互联网中。TCP/IP网络协议协议本身比较复杂。物联网出现之前的TCP/IP实现代码量都非常的庞大。但对于物联网设备来说,内存非常有限,处理器的性能也非常有限,这就需要一个轻量级的TCP/IP网络协议栈来运行,使用非常小的内存,把一些不必要的功能舍弃掉,保留主要的功能。由于这些需求,产生了几种嵌入式的TCP/IP的协议栈,常见的有以下几种:μC/ TCP-IP,LwIP,UIP。

  μC/ TCP-IP是Micrium公司自己的操作系统UC/OS的一个组件,同时支持IPv4和IPv6,支持BSD套接字API,具有最流行的套接字选项。这个协议栈是紧凑,可靠,高性能的TCP / IP协议栈,针对嵌入式系统进行了优化。μC/ TCP-IP完全自主编码,具有高质量,可扩展性和可靠性,可快速配置所需的网络选项,从而最大限度地缩短产品上市时间,MicriumμC/ TCP-IP嵌入式协议栈允许根据设计要求调整内存占用。μC/ TCP-IP可以配置为仅包括系统所需的那些网络组件。未使用组件时,它可以不包含在协议栈中,从而节省宝贵的内存空间。

  LwIP是由瑞典科学研究院的Adam Dunkels开发的一套小型的TCP / IP协议组件,实现的主要目标是减少资源使用,同时仍然具有全面的TCP功能。这使得lwIP适用于具有10Kb字节空闲RAM的嵌入式系统,并且可以容纳大约40Kb的代码ROM。从开始发展到现在LwIP被移植到多个嵌入式操作系统,包括流行的FreeRTOS,还有阿里云的物联网操作系统AliOS Things,华为的物联网操作系统LiteOS等等。

  uIP主要用于8位和16位微控制器的小型嵌入式网络协议栈。最初,uIP 网络协议栈由瑞典计算机科学院的Adam Dunkels 开发,其源代码由C 语言编写,并完全开源。uIP协议栈最大的优势就是短小精悍,Flash和RAM需求小,去掉了完整的TCP/IP 中不常用的功能,简化了通讯流程,但保留了网络通信必须使用的协议,重点放在了IP/TCP/ICMP/UDP/ARP 这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。

  ●IP协议(Internet协议,支持IPv4和IPv6),并且支持多个网络接口的数据包转发。

  ●支持IPv6的邻居发现协议(ND)和无状态地址自动配置。参考标准RFC4861(邻居发现)和RFC 4862(地址自动配置)。

  ●支持UDP(用户数据报协议),包括最新的UDP-lite扩展协议(差错不敏感UDP)

  从这部分看,LwIP支持的功能是非常多的,除了传统的TCPIP,还支持了很多最新的协议(如mDNS,UDP-lite,6LoWPAN等)

  从上图看到,IwIP按照TCP/IP的分层分为4层,分别是链路层,网络层,传输层和应用层。

  ●每个层是一个独立的进程,链路层是一个进程,IP层也是一个进程,传输层是一个进程,这样设计的好处是每一层都非常清楚,代码容易理解,调试也较方便。但这种处理的方法的缺点是当层和层之间传递数据的时候,需要进行上下文的切换和内存拷贝。对于操作系统来说,进程之间的切换和内存拷贝都需要耗费时间,当出现大量的报文进行传输的时候,会导致频繁的切换和内存拷贝,从而转发的效率较低。

  ●TCP IP协议栈在操作系统的内核当中,应用程序通过系统调用来和协议栈进行通讯,这种方式必须实现各个功能的系统调用,相对也比较复杂。

  ●所有的TCP/IP协议的处理都在一个进程之中,每一层之间没有明显的界限,各层都可以访问共享的内存空间,因为各层都可以访问共享内存,就避免了每层之间的内存拷贝带来的性能损失,lwIP协议就是这种实现,为的就是提高传输速度和资源利用率。

  数据包的收发需要基于邮箱和信号量的支持,如果基于操作系统,这些机制操作系统都可以提供,移植起来只需要把基于邮箱和信号的函数加以封装即可,如果是没有操作系统的裸机移植则需要使用中断或者轮询方式实现收发数据,工作量相对要比没有操作系统要大。

  我们用最新的2.1 版本为例,LwIP的文件夹主要有三个,doc,src和test三个目录。

  Doc是存储的帮助文档,和之前的1.4版本的帮助文档的文本文件不同,它使用了doxygen工具根据源代码的注释生成HTML格式的帮助文档。src是LwIP的主要源代码目录,test目录是测试脚本和一些测试协议栈的程序。

  src目录是协议栈的源码目录,包括api、 core、include、netif四个文件夹,其中core是协议栈的核心,include是头文件目录,netif提供了网络接口层的驱动代码,api目录提供了socket、tcp、内存管理的API接口。

  LwIp的源码源文件多达几百个,我们去读源码的时候不能一下子全部读完,我们在读源码时候需要有所重点的去读,才能快速的把握LwIp的精髓。

  core目录则是协议栈的核心,其中tcp.c ip.c,udp.c 则是整个tcp/ip协议栈的核心实现,ip层还分为ipv4和ipv6两个目录,里面有ipv4 ipv6层的的具体实现。mem.c 和memp.c是内存管理的核心实现。

  netif目录是接口部分,最新的2.0版本和原来的1.4版本对以太网部分做了较大改动,ethernetif.c是以太网驱动文件,需要根据具体硬件来进行移植。ethernetif.c文件在1.4版本的是在本目录下,2.0版本则放到用户的目录下。本目录还有其他的接口文件如ppp协议的等。ethernet.c是对以太网报文的抽象出入口函数接口。

  把LwIp移植到具体的网卡上和操作系统上需要一定的工作量,移植LwIp分操作系统移植和非操作系统移植,操作系统移植较为繁琐,我们先讨论非操作系统移植。

  非操作系统移植主要是需要移植ethernetif.c文件。网卡的初始化要放在low_level_init函数内执行。low_level_init函数是配置MAC地址,物理网卡的初始化函数。调用流程如下

  low_level_init设置好物理网卡芯片的参数(mac地址,phy型号,mac接口类型,接收模式,自协商等等),把这些参数写入到网卡芯片的寄存器中。

  物理芯片设置好了后就可以接收和发送数据了,但接收和发送数据函数需要由LwIp的函数来进行封装,否则无法被LwIp处理。

  无操作系统和有操作系统的数据接收方式有所不同,无操作系统的接收入口函数是ethernetif_input,把网卡接收到数据送到LwIp协议栈

http://pa305sprints.com/wangluoshijianxieyi/367.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有