首页 理论教育 Contiki物联网操作系统输入处理

Contiki物联网操作系统输入处理

时间:2023-11-20 理论教育 版权反馈
【摘要】:图10-3uIP协议输入处理然后检查分组中的源地址和目的地址,丢弃含有非法IP 源地址的分组,例如源地址是广播或多播地址的分组。目的IP 地址与该节点的IP 地址中的一个相匹配的分组将会被进一步处理,IPv4 和IPv6 的处理代码不同。

Contiki物联网操作系统输入处理

通信设备驱动程序接收到来自网络的数据分组时,它会调用uIP协议输入处理函数,将该数据分组发送给uIP 协议,uIP 协议的输入处理代码将解析该数据分组首部,并且判断是否应该激活应用程序,如果需要激活应用程序,uIP协议会将应用数据发送给应用程序。

uIP协议的输入处理在IP分组首部开始,从上到下解析数据分组首部,输入处理模块的流程如图10-3所示,Contiki操作系统中该过程的实现代码参见程序文件uip.c 中定义的uip_process()函数。uIP 协议输入处理代码首先检查IP 分组首部的第一个字节,以便判断接收到的分组是否是IP 分组,另外判断IP 协议的版本是否与uIP 协议能够处理的IP 协议版本相匹配,uIP 协议当前可以处理IPv4和IPv6数据,但是一次只能处理一种。

确定数据分组具有合适的IP 版本首部后,uIP 协议检查该IP 首部的有效性,uIP 协议比较该IP 首部中记录的长度和从下层接收到的该数据分组的长度,如果IP 首部中记录的长度比缓冲区中的数据分组的长度更长,认为该分组出错而丢弃。如果缓冲区中的数据分组长度比IP 首部记录的长度更长,那么认为该数据分组是正确的,即使分组中存在垃圾数据,uIP协议也会继续处理该分组。对于IPv4,还需要检查IPv4 分组首部的分片标识,如果该分组是IP 分片,会复制数据分组到分片重组缓存区。如果接收到的分片与分片缓存区中的分片正好能够重组为一个完整的IP 分组,把该重组的IP 分组当作接收到的IP 分组并且继续进行输入处理。对于IPv6,IP 分片重组作为扩展首部处理的一部分执行,具体的分片重组代码参见uip.c中的函数uip_reass()。

图10-3 uIP协议输入处理

然后检查分组中的源地址和目的地址,丢弃含有非法IP 源地址的分组,例如源地址是广播或多播地址的分组。目的IP 地址与该节点的任何IP 地址不匹配的分组也会被丢弃或者转交给uIP 协议分组转发模块。uIP 协议分组转发模块根据目的IP 地址,可能将分组转发给下跳邻居节点。目的IP 地址与该节点的IP 地址中的一个相匹配的分组将会被进一步处理,IPv4 和IPv6 的处理代码不同。对于IPv4,需要计算IP 分组首部校验和,以确保匹配;IPv6 首部没有定义校验和,uIP协议检查分组中存在的首部扩展部分并且予以处理,如果uIP 协议发现IPv6 扩展首部中有错误,就会生成一个ICMPv6 错误信息并发送给发送者。

如果uIP协议对收到的分组通过了以上验证,会把该分组转交给正确的传输层协议。uIP 协议支持三种传输层协议:ICMP、UDP 和TCP。严格来说,ICMP协议并不是传输层协议,但在uIP协议中作为传输层协议实现。

对数据分组的处理方式取决于它的上层协议,TCP 协议是uIP协议实现的最复杂协议,UDP 协议的处理非常简单。对IPv4而言,ICMP 协议的处理很简单,但对IPv6而言,要复杂一些。

1.ICMP输入处理

对于IPv4 协议,ICMP 协议处理只需实现一种功能,即响应接收到的ICMP echo消息。当节点接收到ICMP echo消息时,通过发送ICMP echo应答消息作为回复,该应答消息包含ICMP echo消息中的数据的副本,使用大多数通用操作系统中都有的“ping”程序发送ICMP echo 消息。ping 程序发送ICMP echo消息的目的是检查指定的IP节点是否在线并且测量到该节点的往返时延,当ping 程序接收到与之前发送的ICMP echo 消息相匹配的ICMP echo 应答消息时,该程序将在屏幕上输出往返时延。

IPv6 协议的ICMP 处理比IPv4 处理要复杂,因为ICMP 在IPv6 中有更加重要的作用,除了echo 功能外,IPv6 中的ICMP 还被用于邻居发现、路由器发现,重复地址检测和其他机制,uIP 协议支持ICMP 邻居请求消息、邻居广告消息、路由器请求消息和路由器广告消息,uIP 协议也支持IPv6 中使用ICMP邻居请求消息执行重复地址检测的功能。ICMP输入处理的代码参见uip.c中函数uip_process()的icmp_input节。

2.UDP输入处理(www.xing528.com)

Contiki 系统uip.c 中函数uip_process()的udp_input 节实现了UDP 输入处理过程。输入处理代码首先重新计算UDP 校验和以确保分组有效,然后它使用分组中的UDP端口号来查找应该接收数据的应用程序。uIP协议有一张记录应用程序和它们使用的UDP 端口号的列表,通过提供远程终端的IP 地址和UDP端口号,或者让这两个值为空,应用程序可以指定远程终端。远程IP 地址和UDP 端口号值为空的应用程序会接收到达应用程序UDP 端口的所有分组,否则,仅仅来自指定IP 地址和UDP 端口号的数据分组会被发送给该应用程序。uIP UDP的连接表示如下所示:

3.TCP输入处理

TCP协议是uIP协议中最复杂的协议实现,然而,这种实现仍比其他IP协议栈中的TCP 实现简单得多,如BSD UNIX 协议栈,这是因为uIP TCP 模块仅仅执行标准规范和主机与主机交互需要的必不可少的机制,优化uIP是为了适合于内存受限设备而不是为了追求高性能,uIP TCP的实现没有使用其他IP协议栈中实现的几种性能优化机制。

TCP输入处理的实现代码参见uip.c中函数uip_input()的tcp_input节。可以看出,TCP输入处理从验证TCP校验和开始,TCP校验和在TCP首部、应用数据和IP 首部的部分上计算,验证完TCP 校验和后,在活动的TCP 连接上检查该分组的TCP 端口号,如果分组与任何当前连接不匹配,并且如果接收到的分组设置了TCP SYN 时,uIP协议会检查侦听TCP端口的列表,如果该分组既不是给一个活动连接的分组也不是为侦听端口的TCP SYN 分组,uIP会向发送该分组的IP地址发送TCP RST分组。

如果接收到的分组是用于侦听连接的TCP SYN 分组,uIP 协议在活动TCP连接表中创建新条目并写入接收到的TCP SYN 分组中记录的正确TCP序列号,如果TCP SYN 分组包含TCP最大报文段长度(MMS)选项,uIP协议记住在这条连接上能够发送的报文的最大长度MSS,然后,uIP协议生成设置了ACK标记的TCP SYN分组并把它发送给远程终端。

如果接收到的分组是要发送给活动连接的,uIP协议首先要保证接收到的分片的TCP 序列号是uIP 协议期望的序列号,如果序列号比期望的序列号大,表明已经丢失了分组,在这种情况下,uIP协议会丢弃这个分组,远程终端会在随后的某个时间重传丢失分组。

验证TCP 序列号后,uIP 执行往返时延(RTT)估计机制,uIP 协议执行RTT 估计的目的是为重传定时器设置一个合适的值,根据RTT 的大小设置重传定时器值的大小。uIP 通过为每个TCP 连接保持一个计数器来实现RTT 估计,计数器作为uIP 协议定期处理的一部分而递增,当一个TCP 分组到达时,uIP 协议使用计数器的值作为分组RTT 的估计值。接着,根据TCP 连接的状态,uIP采取不同的措施,如果TCP连接已经建立,那么激活应用程序并且传递接收到的TCP 分组中的应用数据,应用程序使用该数据并且可能生成应答消息并由uIP协议发送给远程终端。如果接收到的分组的目的TCP连接处于将要被打开或关闭的状态,TCP 连接会按照TCP 规范切换状态。当TCP 连接被打开或者关闭时,uIP通过调用该事件通知事件的应用程序。根据TCP连接状态,应用程序会选择发送数据来响应该事件,然后该分组被uIP的输出处理程序处理。TCP连接状态表示如下所示:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈