目录

一、协议简介

二、协议间报文封装与拆封

三、LWIP简介

四、Lwip文件说明

4.1)如何获取LWIP源码文件

4.2)LWIP文件说明

lwip目录

src目录

core目录

4.3)查看lwip的说明文档

五、LWIP的三种编程接口

5.1) RAW/Callback API

5.2)NETCONN API

5.3)SOCKET API


一、协议简介

互联网的本质是数字通信,任何数字通信都离不开通信协议的制定,任何通信设备只有按照约定的、统一的方式封装和解析数据才能够实现收发双方的通信交互。互联网通信所要遵守的众多协议被统称位TCP/IP。

TCP/IP是一个协议族,是一个多层协议系统,每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。。对于开发人员听到最多就是就是应用层协议,比如HTTP、FTP、MQTT等。

TCP/IP是一个庞大的协议族,是众多协议的结合,这些协议按照功能可以划分为不同的层次,某些协议的实现要依赖于其它协议。依据这种依赖关系可以将协议进行分层,低层协议为相邻的上层协议提供服务,是上层协议得以实现的基础。

TCP/IP分层如下图所示:

物理层(PHY):规定了传输信号所需要的物理电平、介质特征。

链路层(MAC):规定了数据帧能被网卡接收的条件,最常见的方式就是利用网卡的MAC地址,发送方会在欲发送的数据帧的首部加上接收方网卡的MAC地址信息,接收方只有监听到属于自己的MAC地址信息后,才会去接收并处理该数据。

网络层:每台设备网络都应该有自己的网络地址,网络层规定了主机的网络地址该如何定义,以及如何在网络地址和MAC地址之间进行映射,及ARP协议。

传输层:网络层实现了数据包在主机之间的传递,而每一台主机内部可能运行着多个网络程序,传输层的功能就是区分数据包是属于哪一个应用程序的,可以说传输层实现了数据包端到端的传递,另外,数据包在传输过程中可能出现丢包、乱序、和重复的现象,网络层并没有提供应对这些错误的机制,而传输层可以解决这些问题,如TCP协议。

应用层:应用层以下的工作实现了数据的传递工作,应用层则决定了你如何应用和处理这些数据,之所以会有这么多的应用层协议,因为互联网中传输数据的种类很多,差异很大,应用场景也十分多样。

二、协议间报文封装与拆封

当用户发送数据时,数据会向下进行一层一层的封装,首先先将应用层数据向下交给传输层,这是应用层的操作,接下来传输层会在数据的前面加上传输层的首部,然后向下交给网络层。同样的网络层也会在数据前面加上网络层首部,完后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部,然后将数据交给网卡。最后网卡将数据转换为物理链路上的电平信号,数据就这样被发送到网络中了,数据发发送的过程可以概况为TCP/IP的个层协议对数据进行封装的过程,如下图所示:

当设备的网卡接收到某个数据包后,会将其放在网卡的接收缓冲区中,并告知TCP/IP内核,然后TCP/IP内核就开始工作,它会将数据从接收缓冲区中取出,并逐层解析数据包中协议首部信息,并最终将数据交给某个应用程序,数据接收的过程与发送的过程正好相反,可以概括为TCP/IP的各层协议对数据进行解析的过程。

三、LWIP简介

lwip(Light Weight IP),轻量级TCP/IP协议,是瑞典计算机科学院的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈,LWIP设计的初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈。实现的重点是保持TCP协议的主要功能的基础上减少对RAM的占用。此外LWIP既可以移植到操作系统上运行,也可以在无操系统的情况下运行。

LWIP主要有以下特性:

1.支持ARP协议(以太网地址解析协议)

2.支持ICMP协议(控制报文协议),用于网络的调与维护

3.支持IGMP协议(互联网组管理协议),可以实现多包数据的接收

4.支持UDP协议(用户数据报协议)

5.支持TCP协议(传输控制协议)

6.支持PPP协议(点对点通信协议),支持PPPoE

7.支持DNS域名解析

8.支持DHCP协议,动态分配IP地址

9.支持IP协议,包括IPv4,IPv6协议,支持IP分片和重装功能,多网络接口下的数据包转发

10.支持SNMP协议(简单网络管理协议)

11.支持AUTOIP,自动IP地址配置

12.提供专门的内部回调接口(Raw API),用于提高应用程序性能

13.提供可供选择的Socket API、NETCONN API(在多线程情况下使用)

四、Lwip文件说明

4.1)如何获取LWIP源码文件

http://savannah.nongnu.org/projects/lwip/

这个主页简单的介绍了一下LWIP,然后给了许多链接,这里我们只关注两个地方。

点击“project homepage”,会得到一个网页,这个网页可以看成是lwip的官网说明文档,我们可以通过这个网页获得关于lwip的很多信息,包括LWIP的使用注意、数据的拷贝、系统的初始化流程等。点击后的内容如下图所示:

点击“Download Area”,会得到一个网页,通过这个网页,我们可以下载到LWIP所有的版本源代码包和contrib包(里面是移植和应用LWIP的一些demo,即应用实例),点击每一个红色字体的资源链接,浏览器就会开启一个ftp连接,帮助你下载想要的文件到电脑中。Download Area的内容如下所示:

另外还有一些“.sig”后缀的文件,这是数字签名,大家忽略就好。

4.2)LWIP文件说明

lwip目录

打开lwip2.1.3文件夹如下图所示

该目录下的内容为:

①  CHANGELOG :文件记录了 LwIP 在版本升级过程中源代码发生的变化。

②  COPYING :文件记录了 LwIP 这个开源软件的 license。一个软件开源,不代表你 能无限制地使用它,你需要在使用它的过程中遵守一定的规则,这些规则就是 license。大 家可以用记事本打开这个 COPYING 文件看看它的内容。开源软件的 license 有很多种,LwIP 的属于 BSD License。LwIP 的开源程度是很高的,你几乎可以无限制地使用它。

③  FILES :文件用于介绍当前目录下的目录信息。

④  README :文件对 LwIP 进行了一个简单的介绍。

⑤  UPGRADING: 文件记录了 LwIP 每个大版本的更新,会对用户使用和移植 LwIP 造成的影响。所谓大版本更新指的是:1.3.x - 1.4.x – 2.0.x – 2.1.x。小版本更新,比如 2.0.1 – 2.0.2 – 2.0.3,这个过程只是一些 bug 的修复和性能的改善,不会对用户的使用造成影响。 用户只要将原有工程的目录中与 LwIP 相关的旧版本文件替换成新版本的文件,重新编译, 就能直接使用。

⑥  doc :文件夹里面是关于 LwIP 的一些文档,可以看成是应用和移植 LwIP 的指南。 但是这些文档比较零散,不成体系,而且纯文本阅读起来很费劲,阅读意义不是很大。

⑦  test :文件夹里面是测试 LwIP 内核性能的源码,将它们和 LwIP 源码加入到工程中 一起编译,调用它们提供的函数,可以获得许多与 LwIP 内核性能有关的指标。这种内核 性能测试功能,只有非常专业的人士才用的到。

⑧  src: 文件夹里面就是我们最关心的 LwIP 源码文件,下面会详细讲解

src目录

打开src文件夹如下图所示:

该目录下的内容为:

①  api :文件夹里面装的是 NETCONN API 和 Socket API 相关的源文件,只有在操作系统的 环境中,才能被编译。

②  apps :文件夹里面装的是应用程序的源文件,包括常见的应用程序,如 httpd、mqtt、 tftp、sntp、snmp 等。

③  core: 文件夹里面是 LwIP 的内核源文件,后续会详细讲解。

④  include :文件夹里面是 LwIP 所有模块对应的头文件。

⑤  netif :文件夹里面是与网卡移植有关的文件,这些文件为我们移植网卡提供了模板,我 们可以直接使用。

lwip内核是由一系列模块组合而成的,这些模块包括:TCP/IP协议栈的各种协议、内存管理模块、数据包管理模块、网卡管理模块、网卡接口模块、基础功能类模块、API模块。每个模块是由相关的几个源文件和头文件组成的,通过头文件对外声明一些函数、宏、数据类型,使得其它模块可以方便地调用此模块的功能。而构成每个模块的文件都被组织在include目录中,而源文件则根据类型被分散地组织在api、apps、core、netif目录中。

core目录

core存放的是LWIP的内核源文件,打开如下图所示:

接下来我们逐一介绍这些源文件的功能:

ipv4:文件夹里面是与IPv4模块相关的源文件,它实现了IPv4协议规定的对数据包的各种操作。ipv4文件夹中还包括一些并非属于IP协议,但会受IP协议影响的协议源文件包括DHCP、ARP、ICMP、IGMP。

ipv6:文件夹里面是与IPv6模块相关的源文件,它实现了IPV6协议规定的对数据包的各种操作。IPv6文件夹中还包括一些并非属于IP协议,但会受IP协议影响的协议源文件,包括DHCP、ARP、ICMP、IGMP。

altcp.c、altcp_alloc、altcp_tcp.c等文件是应用程序分层TCP连接API,从TCPIP线程使用,是一个抽象层,可以模拟应用程序的tcp回调API。

def.c文件定义了一些基础类函数,比如主机序和网络字节序的转换、字符串的查找和比较、整数转换为字符串等,这些函数会被LWIP内核的很多模块所调用。在include 目录里面的def.h文件对外声明了def.c所实现的函数,同时定义了许多宏,能实现一些基础操作,比如取最大值、最小值、数值长度等。

dns.c文件实现了域名的解析的功能,有了它,用户就可以在知道服务器域名的情况下,获得该服务器的IP地址。很多时候我们只记得服务器域名而不记得服务器IP地址,例如“”www.baidu.com“这就是一个域名,通过dns功能,我们就可以得到服务器域名对应的IP地址,这给用户使用带来了很大的方便。

inet_chksum.c问价提供了LWIP所需的校验和功能,在IP、UDP、TCP协议的实现中,需要计算校验和。

init.c文件对LWIP用户宏配置进行了检查,会将配置错误和不合理的地方,通过编译器的#error和#waring功能表示出来。另外,init.c定义了lwip_init初始化函数,这个函数会依次对lwip的各个模块进行初始化。

ip.c文件实现了IP协议相关的函数,但是只封装了ipv4和ipv6文件夹中的函数

mem.c文件实现了动态内存池管理机制,使得lwip内核的各个模块可以灵活的申请和释放内存。

memp.c文件实现了静态内存堆管理机制,使得lwip内核的各个模块可以快速的申请和释放内存。

netif.c文件实现了网卡的操作,比如注册/删除网卡、使能/禁能网卡、设置网卡IP地址等。netif与include目录中的netif文件公用构成了lwip的netif模块,它对网卡进行了抽象,使得LWIP内核可以方便的管理多个特性各异的物理网卡。

pbuf.c文件实现了lwip网络数据包的各种操作。网络数据包在lwip内核中以pbuf结构体的形式存在,这提高了lwip内核对数据包的处理效率,以及提高了数据包在各层之间的传递效率。

raw.c实现了一个传输层协议的框架,我们可以在它的基础上修改和添加代码,实现自定义的传输层协议,与UDP/TCP作为传输层协议。但有时,底层网络开发人员会嫌UDP的可靠性太差,或者TCP虽然可靠性强,但是很耗费时间和内存,他们需要根据实际需求,平衡利弊,定义自己的传输层协议。

stat.c文件实现了lwip内核的统计功能,使用户可以实时的查看lwip内核对网络数据包的处理情况。

sys.c文件和sys.h文件构成了LWIP的sys模块,它提供了与临界区相关的操作

tcp.c、tcp_in.c和tcp_out.c文件实现了TCP协议,包括对TCP连接的操作、对TCP数据包的输入输出操作和TCP定时器,它们和include目录中名称带tcp的头文件共同构成了LWIP的TCP模块。

timeouts.c定义了LWIP内核的超时处理机制。LWIP内核中多个模块的实现需要借助超时处理机制,包括ARP表项的时间统计、IP分片报文的重装、TCP的各种定时器、实现各种应用层协议需要的超时处理。

udp.c文件实现了UDP协议,包括对UDP连接的操作和UDP数据包的操作。

4.3)查看lwip的说明文档

我们一般点击左侧的”Modules“,查看模块相关的说明,以及例子。如下图所示

还有一些用户常用的API函数,也是可以在"Modules"中找到。

还有应用层相关的说明可以在"Application"中找到,数据结构相关的可以在”Data Structures“中查看详细说明。

五、LWIP的三种编程接口

Lwip提供了三种编程接口,分别为RAW/Callback API 、NETCONN API、SOCKET API。它们的易用性从左到右依次提高,而执行效率从左到右依次降低。

5.1) RAW/Callback API

RAW/Callback API 是指内核回调型的API,这在许多通信协议的C语言实现中都有所应用。对于从来没有接触过回调式编程的人来说,可能理解起来比较困难。

RAW/Callback API 是LWIP的一大特色,在没有操作系统支持的裸机环境中,只能使用这种API进行开发,同时这种API也可以应用在操作系统环境中。这里先简要说明一下”回调“的概念。你新建了一个TCP或者UDP的连接,你想等它接收到数据后去处理它们,这时你需要把处理该数据的操作封装成一个函数,然后将这个函数的指针注册到LWIP内核中,LWIP内核会在需要的时候去检测该链接是有接收到数据,如果接收到数据,内核会在第一时间调用注册的函数,这个或称被称为回调。这个注册的函数被称为”回调函数“。这个回调函数中封装着你想要的业务逻辑,在这个函数中,你可以自由的处理接收到的数据,也可以发送任何数据,也就是说这个回调函数就是你的应用程序。

在回调编程中,LWIP内核把数据交给应用程序的过程就是一次简单的函数调用,这里是非常节省时间和空间资源的。每一个回调函数实际上就是一次简单的C函数,这个函数在TCP/IP内核中被调用。每一个回调函数都作为一个参数传递给当前TCP或UDP连接。而且,为了能够保存程序的特定状态,可以向回调函数传递一个指定的状态,并且这个指定的状态是独立于TCP/IP协议栈的。

在有操作系统的环境中,如果使用RAW/Callback API,用户的应用程序就以回调函数的形式成为了内核代码的一部分,用户的应用程序和内核程序会处于同一个线程中,这就省去了任务间通信和切换任务的开销了。

简单来说,RAW/Callback API 的优点有两个:

(1)可以在没有操作系统的环境中使用

(2)在有操作系统的环境中使用,对比另两种API,可以提高应用程序的效率、节省内存的开销。

RAW/Callback API 的优点是显著的,但是缺点也是显著的;

(1)基于回调函数开发应用程序的思维过于复杂。利用回调函数去实现复杂的业务程序时,会很麻烦,而且代码的可读性比较差。

(2)在操作系统环境中,应用程序代码和内核代码处于同一线程,虽然能够节省任务间通信和切换任务的开销,但是相应的,应用程序的执行会制约内核程序的执行,不同的应用程序之间也会相互制约。在应用程序执行过程中,内核程序将不可能得到运行,这会影响到网络数据包的处理效率。如果应用程序占用的时间过长,而且碰巧这时又有大量的数据包到达,由于内核代码长期得不到执行,网卡接收缓存的数据包就持续积累,到时候很可能因为满载而丢弃一些数据包,而造成丢包的现象,

5.2)NETCONN API

在操作系统环境中,可以使用NETCONN API 或者 Socket API 进行网络应用程序的开发。

NETCONN API是基于操作系统的IPC机制(即信号量和邮箱机制)实现的,它的设计将LWIP内核代码和网络应用程序分离成了独立的线程。如此一来,LWIP内核线程就只是负责数据包的TCP/IP封装和拆封,而不用进行数据的应用层处理,大大提高了系统对网络数据包的处理效率。

前面提到,使用RAW/Callback API会造成内核程序和网络应用程序、不同网络应用程序之间的相互制约,如果使用NETCONN API 或者Socket API,这种制约将不复存在。在操作系统环境中,LWIP内核会被实现为一个独立的线程,名为tcpip_thread,使用NETCONN API 或者 Socket API的应用程序处在不同的线程中,我们可以根据任务的重要性,分配不同的优先级给这些线程,从而保证重要任务的时效性,分配优先级的原则具体见表格

NETCONN API 使用了操作系统的IPC机制,对网络连接进行了抽线,用户可以像操作文件一样操作网络连接(打开/关闭、读/写数据)。但是NETCONN API并不如操作文件的API那样简单易用。比如NETCONN API的读数据API,用户获得的是一个特殊的数据结构netbuf,用户如果想要使用好它就要对内核的pbuf和netbuf结构体有所了解,我们会在后续进行讲解。NETCONN API之所以采用这种设计,就是为了避免数据包在内核程序和应用程序之间发生拷贝,从而降低程序运行效率。当然,用户如果不在数据递交时的效率问题,也可以把netbuf中的数据取出来拷贝到一个数组中,然后去处理这个数组。

简单来说,NETCONN API的优缺点是:

(1)相较于RAW/Callback API,NETCONN API 简化了编程工作,使用户可以按照操作文件的方式来操作网络连接。但是,内核程序和网络程序之间的数据包传递,需要依靠操作系统的信号量和邮箱机制完成,这需要耗费更多的时间和内存,另外还加上任务切换的时间,效率低。

(2)相较于Socket API ,NETCONN API 避免了内核程序和网络程序之间的数据拷贝,提高了数据传递的效率。但是,NETCONN API 的易用性不如Sockst API 好,他需要用户对LWIP内核所使用的数据结构有一定的了解。

5.3)SOCKET API

Socket ,翻译过来是套接字,它是对网络的高级抽象,使得用户可以像操作文件一样操作网络连接。他十分易用,Socket已经成为了网络编程的标准。在不同的操作系统中,运行着不同的TCP/IP协议,但是它只要实现了Socket的接口,那么Socket编写的网络应用程序就能在其中运行。所以Socket编写的网络应用程序具有很好的移植性。

不同的系统有自己的一套socket接口。Windows系统中支持的是WinSock,UNIX/Linux 系统支持的是BSD Socket,它们虽然风格不一致,但是大同小异,如果想要移植不同操作系统的网络应用程序到使用LWIP的系统中,需要注意。

相较于NETCONN API,Socket API具有更好的易用性。使用Socket API编写的程序可读性好,便于维护,也便于移植到其他操作系统中。Socket API 在内核程序和应用程序之间存在数据拷贝,所以数据的传递效率会差于NETCONN API。另外,lwip的Socket API 是基于NETCONN API 实现的,所以效率上不如前者。

以太网学习(2)-- 网络协议简介相关推荐

  1. 网络编程:网络协议简介

    这是张富涛的第10篇原创 网络编程:网络协议简介 网络协议在网络编程中是一个比较神秘的概念,今天就由我们揭开它神秘的面纱吧. 1. 什么是网络协议? 网络协议是指对于网络中传输的数据格式的规定.在计算 ...

  2. 组播学习之——IGMP协议简介

    CSDN文章转载地址 组播学习之--IGMP协议简介 IGMP 是Internet Group Management Protocol(互联网组管理协议)的简称.它是TCP/IP 协议族中负责IP 组 ...

  3. 【视频】海康摄像头、NVR网络协议简介

    [目录]郭老二博文之:图像视频汇总 1.软硬件整体架构 2.涉及的网络协议 3.协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现.激活.修改网络参数.忘记密码等: SDK:4200.系 ...

  4. DP/eDP协议学习--协议简介

    最近一段时间由于项目接触到该协议,该协议不像HDMI,USB资料那么多,虽然应用还是很广泛的,但是生态不是很好.自己看了一段时间的协议,想着记录下来大家一起讨论学习. 1综述 eDP(Embedded ...

  5. 服务器网络协议是什么,介绍网络协议,什么是网络协议三要素?

    网络的复杂性取决于人们对它的需求.那么在这当中,最为重要的就是网络协议了.那么什么是网络协议?相信很多人都会疑惑,下面给大家介绍网络协议是什么以及网络协议的三要素是什么的基础知识,不懂的朋友可以通过本 ...

  6. 使用Wireshark工具分析网络协议

    0x00 Wireshark简介 Wireshark是一个网络封包分析软件.网络封包分析软件的功能是抓取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直 ...

  7. 计算机网络基础知识总结之网络协议

    计算机网络学习的核心内容就是网络协议的学习.网络协议是为在计算机网络中进行数据交换而建立的规则.标准或者说是约定的集合.因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的 ...

  8. 网络协议分析工具Ethereal的使用

    大学时计算机网络课的实验报告,当时提不起兴趣,今天看来还挺有用的.可以学习下怎样抓数据包,然后分析程序的通信协议. 一:学习使用网络协议分析工具Ethereal的方法,并用它来分析一些协议. 实验步骤 ...

  9. 使用wireshark抓包并进行网络协议分析

    前言 今天想通过抓包实验,巩固一下所学习的网络协议.同时,在知识点上会加上以前遇到的一些问题.这次实验并不是对所有的网络协议都进行分析,而是从下面这个问题出发(面试常被问).从这一过程中复习学过的网络 ...

最新文章

  1. Python练习-循环及切片-2018.11.27
  2. java程序设计试题_《Java语言程序设计》期末考试模拟试题——填空题和编程题...
  3. Spring.NET实用技巧3——NHibernate分布式事务(上)
  4. 站立会议(11月19日)
  5. python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...
  6. 导致自然语言理解的困难的主要因素是什么?
  7. 提升windows 2000的启动速度
  8. 一起玩转LiteOS组件:Pixman
  9. IDEA Maven 聚合项目(多模块)搭建--最精简
  10. SQLyog客户端使用教程
  11. Win8.1和Win10各自的优势
  12. STATA面板数据模型进行Hausman检验
  13. mysql按照设置向导mysqlinstanceconfig.exe启动失败
  14. ROS自主导航学习———ROS通信机制
  15. TelephonyTesgistry
  16. window操作系统下的句柄机制说明
  17. 同步通讯和异步通讯的区别
  18. 全面解析jQuery $(document).ready()和JavaScript onload事件
  19. 一个好用的android图片压缩工具类
  20. 从零打造Android课程表(安卓开发初体验)

热门文章

  1. 包含第k元素LIS(dp)
  2. 哎呦,这个社会和时代是怎么了呢???
  3. 2019计算机学院年会主持稿,2019学校元旦联欢晚会主持词(开场白+结尾)
  4. 雅马哈音乐会钢琴-e-Instruments Session Keys Grand Y Kontakt
  5. 《Python程序设计与算法基础教程(第二版)》江红 余青松 课后选择题 课后填空题答案
  6. 【贵阳市公积金相关问题】
  7. 关于FIN_WAIT2
  8. 城市交通拥堵问题matlab,城市交通拥堵问题的分析与治理
  9. appcan.frame.open打开的浮空窗口页面不开启弹动的情况下,也会有微微的滑动bug...
  10. 黑盒测试和白盒测试优点和缺点