
计算机网络_9_LwIP及其网络编程应用实例.ppt
106页第九章第九章LwIP及其网络编程应用实例及其网络编程应用实例LwIP介绍介绍nLwIP(LightWeightInternetProtocol)是瑞典计算机科学院(SwedishInstituteofComputerScience)的AdamDunkels等人开发的一套用于嵌入式系统的开源TCP/IP协议栈nLwIP的含义是轻型的含义是轻型IP协议,其实现的协议,其实现的重点是在保持重点是在保持TCP协议主要功能的基础协议主要功能的基础上减少对上减少对RAM的占用,这使得的占用,这使得LwIP协协议栈非常适合在小型嵌入式系统中使用议栈非常适合在小型嵌入式系统中使用LwIP介绍nLwIP的版本较多,较新的版本通常完善或增加了的版本较多,较新的版本通常完善或增加了LwIP的功能nLwIP有如下特点:有如下特点:nIP:支持多网络接口下的IP转发nARP:支持ARP协议nICMP:支持ICMP协议nUDP:支持UDP协议nTCP:支持TCP协议,包括拥塞控制、RTT估算和快速恢复/快速重传nRawAPI:提供专门的内部回调函数,以提高应用性能nSocketAPI:可选的Berkeley-likesocketAPInLwIP的较新版本还提供对以下功能或协议的支持:nIPfragment:IP分片nDNS:域名解析nSNMP:简单网络管理协议nDHCP:动态主机配置协议nPPP:点对点协议nIPv6LwIP源码的文件组织源码的文件组织nLwIP文件目录的组织结构如图所示,其源代码全部位于目录src下。
nsrc目录下一般有目录下一般有5个子目录个子目录nLwIP提供的api子目录子目录、core子目录子目录、include子目录子目录和netif子目录子目录n需用户自己创建的arch目录目录LwIP源码的文件组织源码的文件组织n每个子目录包含的某一类相关的文件,简要说明如下:napi目录目录n应用程序接口文件narch目录目录n与硬件和OS有关的文件,包括网络驱动、移植需要修改的文件ncore目录目录nLwIP的核心代码,包括ICMP、IP、UDP、TCP等协议的实现等ninclude目录目录nLwIP的包含文件nnetif目录目录nARP协议和LwIP网络设备驱动程序的模板,提供了网络接口驱动程序的基本框架LwIP的软件体系结构的软件体系结构nLwIP的协议层次的协议层次:nLwIP也是以也是以4层层TCP/IP模型为参照来实现模型为参照来实现TCP/IP协协议族的n每一个协议作为一个模块被实现,同时还提供了几个函数作为协议的入口点nLwIP并没有严格地按照分层的方式实现协议族并没有严格地按照分层的方式实现协议族n实际上实际上LwIP使用的是一种比较松散的通讯机制,通过使用的是一种比较松散的通讯机制,通过共享内存的方式实现应用层与底层协议族之间的通讯。
共享内存的方式实现应用层与底层协议族之间的通讯nLwIP拥有独特的缓冲机制独特的缓冲机制,使得各层次可以更加有效的重复使用缓冲区nLwIP尽量避免内存复制,避免了内存复制产生的性能损失LwIP的软件体系结构的软件体系结构n与与LwIP的协议层次相匹配,的协议层次相匹配,LwIP采用模块化设计的方法实现采用模块化设计的方法实现nTCP/IP协议的实现模块协议的实现模块n如ARP、IP、ICMP、UDP、TCP等n许多相关支持模块许多相关支持模块n这些支持模块包括操作系统模拟层、缓冲与内存管理子系统、网络接口函数等LwIP的进程模型的进程模型nTCP/IP协议族的进程模型指的是采用何种方法把系统分成不同的进程指的是采用何种方法把系统分成不同的进程n常见的进程模型有两种:常见的进程模型有两种:n每一个协议作为一个独立的进程n协议栈作为一个内核只占据一个进程n第一种模型第一种模型必须符合协议的每一层,协议层之间通过指定的方式进行通讯n优点较明显,即每一种协议都可以独立参与到系统运行中,其实现的代码也比较简单,整个协议栈的层次脉络清晰,便于理解和调试n缺点也是显而易见的,即数据跨层传递时不得不产生进程切换以及内存复制。
这一缺点极大影响了系统的整体性能,尤其对于嵌入式系统来说更是不能忍受的n第二种模型第二种模型将协议栈驻留在操作系统内核中,应用程序通过系统调用与协议栈进行通讯n这种设计可以使用交叉协议分层技术,各层协议不必严格划分n这种进程模型的缺点是层次不清,给理解增加了难度LwIP的进程模型的进程模型nLwIP则采用一种比较灵活的设计方法则采用一种比较灵活的设计方法n它可以将所有的协议驻留在一个进程,以便独立于操作系统内核之外n应用程序既可以驻留在LwIP的进程中,也可以使用一个单独的进程n它也可以根据协议层次结构创建多个进程,但各个进程之间只传送尽可能少的必要信息,而没有引入额外的内存复制nLwIP在协议层之间切换时,一般只传递数据缓冲区的地址,让需要处理数据的协议层自己去提取LwIP的函数调用关系的函数调用关系n为了尽量避免不必要的内存复制,为了尽量避免不必要的内存复制,LwIP更多的是采用更多的是采用一种基于回调函数的设计方法一种基于回调函数的设计方法n当数据需要处理或跨层传递时,通常是通过调用事先已定义好的回调函数来完成有关操作n优点是大大提高了LwIP的整体性能;缺点是使得LwIP的整个软件体系显得略微复杂,尤其是函数之间的调用关系更为繁琐。
n为了理清LwIP的函数调用关系,从两个不同的方向对这一问题进行分析:n从不同的协议层出发,横向分析各个层次内的调用关系;n从几种典型的协议模块出发,纵向分析各模块的跨层调用关系整体调用关系整体调用关系n图给出了图给出了LwIP的整体调的整体调用关系,基本上涵盖了用关系,基本上涵盖了LwIP的主要功能模块和的主要功能模块和绝大部分的函数调用绝大部分的函数调用n图中只标注了对图中只标注了对LwIP的的整个软件体系起着重要整个软件体系起着重要支撑作用的主干函数支撑作用的主干函数协议层内的调用协议层内的调用nTCP/IP协议栈是按功能层组织的,每一层都为上一层提供协议栈是按功能层组织的,每一层都为上一层提供服务,并使用下一层提供的服务服务,并使用下一层提供的服务n在在4层层TCP/IP模型中,从下至上依次是网络接口层、网际模型中,从下至上依次是网络接口层、网际层、运输层和应用层层、运输层和应用层n(1)网络接口层)网络接口层n网络接口层是较高协议与局域网接口的地方n当主机通过查询或者中断方式得知网络芯片接收到数据帧时,LwIP协议栈对该数据帧进行解码,并判断数据帧的协议类型:n如果是IP协议,则将该帧传递给上层(网际层)的ip_input()函数进行处理;n如果是ARP协议,则直接传给本层的arp_input()函数,该函数根据需要决定是否调用arp_replay()进行ARP应答。
n当上层有数据需要通过网络接口层进行发送时,当前网络接口的输出函数netif-output()将会被调用,以完成真正的数据发送过程协议层内的调用协议层内的调用协议层内的调用协议层内的调用n(2)网际层)网际层n网际层负责网间寻址(IP地址)、数据封装、路由选择、错误处理和诊断等n典型协议有IP协议和ICMP协议n当从下层(网络接口层)接收到当从下层(网络接口层)接收到IP数据报时,调用数据报时,调用ip_input()函数进行处理函数进行处理n根据IP数据报的协议字段,LwIP决定将该数据报传给上层(运输层)还是传给本层n如果IP净荷中承载的是ICMP协议,则本层的icmp_input()函数将会调用n当不论是上层还是本层有数据需要从网际层发送出去时nLwIP将会调用将会调用ip_output()发送数据,或者先调用发送数据,或者先调用ip_route()找到一个合适的网络接口再调用找到一个合适的网络接口再调用ip_output_if()发送数据发送数据n实际上ip_output()也是通过先调用ip_route()再调用ip_output_if()来实现的协议层内的调用协议层内的调用协议层内的调用协议层内的调用n(3)运输层)运输层n运输层负责在网际设备之间运输数据,以可靠或不可靠运输层负责在网际设备之间运输数据,以可靠或不可靠的方式进行。
的方式进行nTCP和UDPn当下层(网际层)有数据传给运输层时当下层(网际层)有数据传给运输层时nLwIP会根据数据类型的不同(是TCP还是UDP)调用该层的tcp_input()或者udp_input()n经过一定处理后,LwIP将数据由tcp_receive()或udp_input()提交给上层(应用层),一般会调用事先注册的接收函数n当上层需要发送数据时当上层需要发送数据时nLwIP选择调用tcp_write()或者udp_send()对数据进行处理n最后通过tcp_output()或udp_send()将数据交给下层协议层内的调用协议层内的调用协议层内的调用协议层内的调用n(4)应用层)应用层n用户的应用运行在应用层,该层使用户可以根据自己的需要对数据进行处理n用户需要发送数据时用户需要发送数据时n由LwIP根据数据类型(TCP或UDP)调用下层(运输层)对应的发送函数n应用层并不需要直接关注数据是怎样发送出去的n用户接收的数据一般由LwIP调用下层的接收函数送达,此后用户可以根据实际情况实现应用程序典型模块的跨层调用典型模块的跨层调用n对于某一个协议来说对于某一个协议来说n它一般只隶属于某一个层次(ARP除外)。
n但往往会有其它层次调用该协议的有关函数n而该协议一般也会主动调用其它层次的有关函数n(1)IP模块模块nLwIP的较早期版本实现了的较早期版本实现了IP层大部分的基本功能,能够发送、层大部分的基本功能,能够发送、接收以及转发信息包接收以及转发信息包n接收信息包由网络设备驱动调用接收信息包由网络设备驱动调用ip_input()函数开始处理函数开始处理n完成对IP版本字段及包头长度的初始完整性检查n同时还要计算和验证包头校验和n函数检查目的地址是否与网络接口的IP地址相符以确定信息包是否到达预定主机n如果一个到达的信息包被发现已经到达了目的主机,则由协议字段来决定信息包应该传送到哪一个上层协议典型模块的跨层调用典型模块的跨层调用n外发的信息包由外发的信息包由ip_output()函数处理,该函数使用函数处理,该函数使用ip_route()函数查找适当的网络接口来传送信息包函数查找适当的网络接口来传送信息包n当外发的网络接口确定后,信息包传给以外发网络接口为参数的ip_output_if()函数n所有的IP包头字段被填充,并且计算IP包头校验和nIP信息包的源及目标地址作为参数被传递给ip_output_if()函数。
n传输层协议UDP与TCP在计算传输层校验和的时候需要拥有目标IP地址,因此一些传输层函数可能会直接直接调用ip_route()函数确定接口n这样这些函数在外发数据前就没有必要再对网络接口链表进行检索,而是直接调用ip_output_if()函数外发数据典型模块的跨层调用典型模块的跨层调用n如果没有网络接口的地址与到达的信息包如果没有网络接口的地址与到达的信息包的目标地址相同,信息包应该被转发的目标地址相同,信息包应该被转发n由ip_forward()函数完成nTTL字段值被减少,当减为0的时候,将会给IP信息包的最初发送者发送ICMP错误信息,并抛弃该信息包n因为IP包头被改变,因此需要调整IP包头校验和n最后,信息包被转发到适当的网络接口典型模块的跨层调用典型模块的跨层调用n(2)ICMP模块模块nICMP信息包由信息包由ip_input()函数收到后,转交给函数收到后,转交给icmp_input()函数对函数对ICMP包头解码,然后进行适当的动作包头解码,然后进行适当的动作n如果需要对回送请求进行应答,则调用。












