当前位置: 首页 > news >正文

西宁高端企业网站建设公司名称大全免费取名

西宁高端企业网站建设,公司名称大全免费取名,国外网站 国内访问速度,房产网签合同平台首先来几个标准参考#xff1a; RFC 3561 RFC 3561 中文翻译 一个博客 挺好的另一个博客 事件#xff1f; 字段长度#xff1f; 事件驱动 各种定时器 状态转移图#xff1f; AODV协议 基本概念 AODV#xff08;Ad hoc On-Demand Distance Vector#xff09;是一种基于…首先来几个标准参考 RFC 3561 RFC 3561 中文翻译 一个博客 挺好的另一个博客 事件 字段长度 事件驱动 各种定时器 状态转移图 AODV协议 基本概念 AODVAd hoc On-Demand Distance Vector是一种基于距离向量路由算法的自适应路由协议用于无线自组织网络MANET中的路由选择。AODV 协议的实现流程如下 节点广播 RREQRoute Request消息当节点需要发送数据包到某个目的地时它会广播一个 RREQ 消息来查找到达目的地的路由。这个 RREQ 消息包含源节点地址、目的节点地址和一个唯一的序列号以防止消息循环。 节点响应 RREQ 消息当一个节点收到 RREQ 消息时它会检查自己的路由表如果没有到达目的地的路由则向其邻居节点转发 RREQ 消息。如果节点已经有到达目的地的路由则向源节点发送 RREPRoute Reply消息。 节点广播 RREP 消息当目的节点收到 RREQ 消息时它会向源节点发送 RREP 消息其中包含到达源节点的最短路径。每个节点在转发 RREP 消息之前都会将其缓存起来以便以后使用。 节点维护路由表每个节点都会维护一个路由表用于存储到达其他节点的路由信息。每当一个节点收到一个 RREP 消息时它会更新自己的路由表并向其邻居节点广播更新的路由信息。 节点周期性发送 HELLO 消息节点会周期性地发送 HELLO 消息以检测邻居节点是否仍然存在。如果一个节点连续几次未收到邻居节点的 HELLO 消息则认为该节点已经离线并更新其路由表。 AODV 协议的主要优点是其适应性和效率。由于 AODV 协议仅在需要时才会建立路由因此它可以有效地减少网络中的控制流量。此外AODV 协议具有自适应性可以根据网络拓扑和流量负载动态调整路由。 AODV 协议的核心思想是通过按需路由方式来减少网络中的路由开销。当源节点需要向目的节点发送数据时它会向周围节点发出路由请求RREQ。如果某个节点知道如何到达目的节点它会向源节点发出路由响应RREP。源节点将使用路由响应中的信息来向目的节点发送数据。在这个过程中每个节点会维护一张路由表记录到达目的节点的最短路径和下一跳节点。 AODV 协议的一些实现细节 路由请求RREQ 当源节点需要向目的节点发送数据时它会向周围节点发出路由请求RREQ。每个节点将检查自己的路由表来查找到达目的节点的最短路径。如果找到了节点将向源节点发送路由响应否则节点将广播路由请求。 路由请求包括 RREQ ID、目的 ID、目的序列号、源 ID、源序列号、跳数和洪泛标识。洪泛标识用于避免重复转发路由请求每个节点只能转发一次具有相同 RREQ ID 的路由请求。 路由响应RREP 如果某个节点知道如何到达目的节点它会向源节点发出路由响应RREP。路由响应包含源节点的地址、目的节点的地址、目的节点的序列号和到达目的节点的最短路径。源节点将使用路由响应中的信息来向目的节点发送数据。 路由响应包括目的 ID、目的序列号、源 ID、序列号、跳数和路径。路径描述了到达目的节点的最短路径包括每个节点的地址和序列号。 路由维护 每个节点都会维护一张路由表记录到达目的节点的最短路径和下一跳节点。节点还会周期性地发送心跳Hello消息来保持与周围节点的连接。如果某个节点无法与下一跳节点通信它会向源节点发送路由错误RERR消息通知源节点重新计算路径。 序列号 为了防止路由环路和路由不稳定AODV 协议使用序列号来标识每个节点和每个路由。每个节点都具有唯一的序列号每个路由的序列号递增。当节点收到路由响应时它将比较目的节点的序列号和自己的路由表中的序列号如果目的节点的序列号更大则更新路由表中的信息。 如何解决环路问题 AODV协议使用了两种方法来避免路由环路的问题分别是序列号和反向路径检查。 序列号 AODV协议引入了序列号的概念用于标识每个节点和每个路由。每个节点都具有唯一的序列号每个路由的序列号递增。当一个节点收到路由请求或路由响应时它会比较消息中的序列号和自己的路由表中的序列号。如果消息中的序列号较大则说明该消息是更新的节点会更新自己的路由表如果消息中的序列号较小则说明该消息已经过期节点会丢弃该消息。 反向路径检查 当一个节点转发路由请求时它会将自己的地址添加到请求的路由记录中。当一个节点收到路由响应时它会检查响应中的路由记录以确定响应是否经过了自己。如果响应经过了自己则说明存在路由环路节点会丢弃该响应。 通过使用反向路径检查AODV协议可以及时发现路由环路避免数据包在环路中循环。另外如果某个节点收到了一个来自下一跳节点的数据包但是该数据包不是该节点向下一跳节点发送的则说明存在路由环路该节点会向源节点发送路由错误消息通知源节点重新计算路径。 代码整体框架 如此长的代码必须提纲挈领地先了解基本架构再进行具体地逐函数的了解 主要功能 报文类的定义(RREQ、RREP、RERR等),用于封装和解析AODV控制报文。 路由表和寻路队列的管理用于维护和查找路由信息。 定时器的实现,用于路由发现、路由维护等定时功能。 控制报文(如RREQ、RREP、RERR等)的创建、转发和处理。 Hello报文的生成和处理,用于邻居发现和链路检测。 本地链路管理,用于检测和响应链路断开。 数据包转发和路由错误处理。 事件驱动的架构,通过事件队列实现异步处理。 参数配置,支持启用不同的机制如本地链路修复、扩展环搜索等。 统计信息收集,用于计算延迟、跳数等性能指标。 模块接口定义,与外部协议交互。 主要函数与数据结构大致信息 1. 整体理解 报文类有BaseMessage、RREQ、RREP、RERR、MyBusiness这些类实现了各种AODV控制报文和业务报文的封装包含报文的定义、解析和组装功能。具体而言 BaseMessage是基类定义了报文的公共字段如类型、源地址、目的地址等。RREQ类封装了路由请求报文包含跳数、请求id等AODV特有字段。RREP类封装了路由回复报文。RERR类封装了路由错误报文。MyBusiness类封装了业务数据报文。 以上这些类通过操作报文字段实现了报文的组装和解析功能。 2. 事件类 MyEvent 封装了一个事件,包含事件处理函数、触发时间、数据等。主要用于事件驱动框架。 // 抽象事件的构造函数 MyEvent::MyEvent(event_func_t f, void* d) :time(-1), handler(f), data(d), id(-1) {}bool MyEvent::operator(const MyEvent t) const {if (this-time t.time) {return true;}return t.time this-time this-id t.id; }bool MyEvent::operator(const MyEvent t)const {return t.time this-time t.handler this-handler t.data this-data; }定义了一个名为MyEvent的类该类表示一个抽象事件。该类包含一个构造函数和两个运算符重载。 构造函数MyEvent接受两个参数一个是函数指针表示事件d 处理函数另一个是void指针可以存储事件处理函数需要的数据。构造函数还初始化了类的一些成员变量包括时间戳、事件处理函数、事件数据和事件ID。 运算符重载了小于号()和等于号()。其中小于号根据事件的时间戳和ID比较事件的先后顺序用于在事件队列中排序等于号判断两个事件对象是否相等如果它们的时间戳、事件处理函数和事件数据都相等则认为它们相等。这两个是利用了C面向对象的重载特性方便了后续对事件队列的操作。 3. 路由表类rt_table_t 保存一条路由表项,包含目的地址、下一跳、跳数等信息。 rt_table_t::rt_table_t(int dest_addr, int next, int hops, unsigned int seqno,bool _state, int _flags) :dest(dest_addr), nx_hop(next), hcnt(hops), dest_seq(seqno),//lifetime(-1), state(_state), flags(_flags),rt_timer_timeout(nullptr, nullptr),hello_timer_timeout(nullptr, nullptr) {}dest目的地址nx_hop下一跳地址hcnt跳数dest_seq目的地址的序列号state状态标志flags路由表项的标志rt_timer_timeout指向路由表定时器超时处理函数的函数指针和函数参数的指针hello_timer_timeout指向hello定时器超时处理函数的函数指针和函数参数的指针 4. 寻路队列类seek_list_t 保存一个寻路请求相关信息,包含目的地址、序列号、寻路计时器等。 5. 事件队列相关函数 eq_insert/eq_erase/eq_set_time/eq_reset_time 用于向事件队列中添加/删除/设置/重置事件。eq_pop 执行队首事件的处理函数eq_front_time() 返回队首事件的发生时间msg_delete 用于释放报文占用的内存。AodvOutputBuf_push/OutputBuf_push/clear 向发送/接收缓冲区添加业务或者清空缓冲区。packet_queue_clear/ packet_queue_add 数据包发送缓存队列清空或者添加消息。packet_queue_set_verdict 对队列里所有包的处理工作因为当某些包可以发送的时候还是要及时把它发出去的。这个函数比较重要需要仔细看看 packet_queue_set_verdict 函数设置一个对队列里所有包的处理工作。接受三个参数 dest目标地址verdict处理结果可以是PQ_SEND或PQ_DROP分别表示发送或丢弃该数据包curtime当前时间用于计算数据包在队列中的等待时间 局部变量包括count计数器用于记录处理了多少个数据包pkt_queue_size队列长度用于遍历整个队列rt指向目标地址对应的路由表项的指针如果没有对应的路由表项则为nullptr 函数的主要功能是遍历一个数据包队列将其中等待目标地址的数据包进行处理如为他们查找路由等。具体实现如下 首先判断如果要发送数据包却没有对应的路由表项则返回-1表示异常。 然后循环遍历整个数据包队列从队列头开始处理每个数据包。对于每个数据包首先判断它在队列中等待的时间是否超过了最大等待时间如果超过了则释放该数据包的内存并继续处理下一个数据包。 如果这个数据包不是等待目标地址的数据包则将其放回队列中并继续处理下一个数据包。 如果这个数据包是等待目标地址的数据包且处理结果为丢弃则释放该数据包的内存并继续处理下一个数据包。 如果这个数据包是等待目标地址的数据包且处理结果为发送则根据目标地址查找路由表找到下一跳地址并设置该数据包的源地址为本节点ID下一跳地址为路由表中找到的地址。如果该数据包是最后一个数据包即没有下一跳地址则更新本节点的最后转发数据包时间。如果没有使用二层协议则释放该数据包的内存如果使用了二层协议则将该数据包放入输出缓冲区中。 最后如果目标地址对应的路由表项存在且有效并且处理结果为发送则更新该路由表项和下一跳路由表项的超时时间。 函数返回值是处理了多少个数据包。 6. 定时器相关函数 route_discovery_timeout 处理路由发现请求超时的定时器的回调函数。实际上是实现了协议的部分功能有些定时器与状态机混用的隐患。 函数输入参数 arg指向seek_list_t类型结构的指针该结构记录了路由请求的相关信息curtime当前时间 函数的主要功能是处理路由请求的超时情况。如果路由请求还未达到最大重试次数则重新发送路由请求并更新超时时间。如果路由请求达到了最大重试次数则表示无法找到目标节点的路由从seek_list中删除该请求并尝试使用本地修复机制进行修复。 局部变量 seek_entry指向seek_list_t类型结构的指针该结构记录了路由请求的相关信息rt指向目标节点的路由表项的指针repair_rt指向要修复的路由表项的指针flooding_flage泛洪标志用于区分路由请求和路由响应消息ttl路由请求消息的TTL值 首先判断seek_entry是否为空如果为空则直接返回。然后从seek_entry中获取TTL值和重试次数如果重试次数还未达到最大值则根据不同的情况更新TTL和超时时间并重新发送路由请求消息。如果重试次数已经达到最大值则无法找到目标节点的路由从seek_list中删除该请求并尝试使用本地修复机制进行修复。 在重新发送路由请求消息之前如果目标节点的路由表项存在且其删除时间与当前时间的差小于两倍的网络遍历时间则更新该路由表项的删除时间。 最后如果seek_entry已经达到最大重试次数则从seek_list中删除该请求并尝试使用本地修复机制进行修复。在尝试本地修复之前先查找目标节点的路由表项如果存在并且其状态为需要修复则调用local_repair_timeout函数进行本地修复。 route_expire_timeout 处理路由表项过期的定时器的回调函数。 arg指向rt_table_t类型结构的指针该结构记录了路由表项的信息curtime当前时间 函数的主要功能是处理路由表项的过期情况。如果该路由表项只有一个相邻节点并且没有接收到该节点的Hello消息则认为该相邻节点已经离开需要进行链路断开处理否则将该路由表项标记为无效并清空其前驱节点列表。 首先判断路由表是否为空如果为空则直接返回。接着判断该路由表项的相邻节点个数hcnt是否为1如果是则说明该路由表项只有一个相邻节点并且没有接收到该节点的Hello消息即该相邻节点已经离开需要进行链路断开处理。在链路断开处理中调用neighbo_link_break函数来删除该相邻节点同时更新该节点的前驱节点列表。 如果hcnt不为1则将该路由表项标记为无效并清空其前驱节点列表。在标记为无效时调用rt_table_invalidate函数来设置路由表项的状态为无效并更新其超时时间在清空前驱节点列表时调用precursor_list_destroy函数来删除前驱节点列表中的所有节点。 route_delete_timeout 路由删除定时器 如果路由表项指针 rt 为空则直接返回。 如果路由表项指针 rt 不为空则调用函数 rt_table_delete(rt) 删除该路由表项。 通过定时器函数删除过期的路由表项以保证路由表中只保存最新的可用路由信息。 local_repair_timeout 本地修复定时器函数 指向路由表项的指针 rt指向 RERRRoute Error数据包的指针 rerr。如果路由表项指针 rt 为空则直接返回。将 RERR 目的地址 rerr_dest 初始化为广播将路由表项中的 RT_REPAIR 标志位清零。如果路由表项中的前驱节点数量不为 0 调用函数 rerr_create 创建一个 RERR 数据包包含目的地址、目的序列号以及当前时间等信息。如果路由表项中的前驱节点数量为 1则将 RERR 目的地址设置为该前驱节点地址。将 RERR 数据包发送。 调用函数 precursor_list_destroy 销毁路由表项中的前驱节点列表。将路由表项中的 rt_timer_timeout.handler 成员函数设置为 route_delete_timeout。调用函数 rt_table_update_timeout 更新该路由表项的定时器将其设置为 DELETE_PERIOD路由删除周期以便在该周期后删除该路由表项。 发生路由故障时通过本地修复机制对该路由进行修复以维护路由表中的正确信息。创建一个 RERR 数据包并发送出去同时将路由表项设置为待删除状态并在一段时间后删除该路由。 hello_timeout hello 定时器函数 如果路由表项指针 rt 为空则直接返回。如果路由表项指针 rt 不为空并且该路由表项状态为 VALID即有效状态则执行以下操作 如果启用了局部修复机制 local_repair并且该路由表项的 hop count 值小于等于最大修复 TTLMAX_REPAIR_TTL则将该路由表项的标志位设置为 RT_REPAIR表示该路由表项需要进行修复。调用函数 neighbo_link_break(rt, curtime)将该路由表项中与邻居节点相关的信息进行处理将其标记为失效状态。 通过定时器函数检查邻居节点是否还处于活动状态并对失效的邻居节点进行相应的处理以维护路由表中的正确信息。 echo_timeout 7. 路由表相关函数 rt_table_clear 路由表清空rt_table_insert_gatewayrt_table_insert_gatewayrt_table_update_gateway 添加新表项rt_table_update_timeoutrt_table_update_route_timeoutsrt_table_findrt_table_invalidatert_table_delete 8. 寻路队列相关函数 seek_list_insert_gateway/remove/find/clear 用于向寻路队列中添加、删除和查找条目。 9. 控制报文处理 rreq相关 rrep相关 rrer相关 10. Hello报文相关函数 用于生成、转发和处理Hello报文,实现邻居发现和链路检测。 11. 本地链路管理函数 neighbor_add 处理接收到的报文,更新邻居表。neighbo_link_break 检测链路断开,生成RERR。 12. 业务报文处理 business_process 处理最终到达的业务报文。genBusiness_opt 生成业务报文后的处理。recvMessage 将input中的函数注册成为事件processMessage 报文处理函数。重要 13. 模块接口函数 process 接收外部信息,交给内部处理。getAODVrt_table 输出当前的路由表。subNet_rt_table_insert 在网关处添加子网路由表项。 事件驱动 事件驱动思想的整体代码架构 当有业务数据需要发送时,首先查找路由表。如果有可用路由,则直接封装报文转发。 如果没有可用路由,则将数据包缓存,并通过route_discovery发起路由请求RREQ。 RREQ通过网络泛洪,当到达目的地或中间节点有新的可用路由时,会触发响应RREP。 源节点收到RREP后就获得了路由取出缓存的数据包并发送。 整个过程中需要使用seek_list进行路由请求的发起和监控。 路由表中的路由都有超时时间超时后会失效。 Hello报文定期发送用于探测链路状态。 链路断开时协议定义了在一定时间内可以通过local_repair尝试进行局部修复。 局部修复失败后通过neighbo_link_break检测到链路断开发送RERR通知其他节点。其他节点收到RERR会使相关路由失效。 新进入的节点通过接收业务报文和Hello报文学习邻居和本地链路信息。不会“主动地”探索网络拓扑。 业务数据报文通过process和genBusiness_opt函数进行转发。 模块接口将外部消息转入内部输入队列,内部输出转移出模块。 void AODV::process() 核心函数用于生成各类型事件。对于每个节点来说看不到其它节点的事件只需要关心自己的各种到达业务、控制报文。 void AODV::process(std::vectorstd::string RT_send, const std::vectorstd::string RT_recv,const std::queueBusiness BusinessBufferInter, bool isGateway) {// 将数据转移到inputfromBusinessBufToInput(BusinessBufferInter); // 网关接收到的跨网业务fromRTrecvBufToInput(RT_recv);// 处理input中的数据recvMessage();while (!events.empty() eq_front_time() this-timer * SLOT_LEN){eq_pop();}// 将处理过程中生成的数据转移到RT_sendfromOutputToRTSendBuf(RT_send);this-timer; }“将数据转移到input”部分是在将数据打包成业务。 recvMessage()是接收 我们再看while中的判断!events.empty()是为了将事件队列全部轮一遍这个process()每时隙运行一次eq_front_time() this-timer * SLOT_LEN是为了判断运行总时间是否超过了时隙如果超过了就暂停。eq_pop()就是将里面的事件一个一个处理了。 最后fromOutputToRTSendBuf(RT_send) 虽然不是最标准的状态机事件驱动但是也算是核心的架构如同汽车的发动机一般这个while循环一圈一圈的转动驱动着整个工程的运行。 void AODV::fromBusinessBufToInput() void AODV::fromBusinessBufToInput(const std::queueBusiness BusinessBuffer) {if (BusinessBuffer.empty())return;std::queueBusiness tmpBufferBusinessBuffer;while(tmpBuffer.size()){Business bs tmpBuffer.front();tmpBuffer.pop();int src_msg bs._sr;double recvtime bs._arrtime;double gentime bs._gentime;for (auto dest_msg : bs._dr){MyBusiness* mbs new MyBusiness(INIT_ADDR, INIT_ADDR, gentime, recvtime, dest_msg, src_msg);this-input.push(mbs);}} }函数目的将 BusinessBuffer 中的每个 Business 对象转换为 MyBusiness 对象并将它们添加到 input 队列中。 首先检查 BusinessBuffer 是否为空。再将 BusinessBuffer 复制到一个临时队列 tmpBuffer 中。然后对tmpBuffer 中的每个 Business 对象 bs将其源地址 _sr、到达时间 _arrtime 和生成时间 _gentime 分别赋值给变量。接着对于 bs 中的每个目标地址 _dr创建一个 MyBusiness 对象 mbs并将其添加到 input 队列中。 整个函数大量运用了stl库中的操作这个可以了解下。
http://www.zqtcl.cn/news/611465/

相关文章:

  • 如何解决网站图片打开慢关键词搜索推广排行榜
  • 网站建设销售话建网站需要怎样做
  • 网站排名和什么有关网络推广协议合同范本
  • 湖州房产网站建设南通市城乡和住房建设局网站
  • 郴州建设工程集团招聘信息网站wordpress 橘子皮模板
  • win7搭建网站服务器成都网站建设需多少钱
  • 网站开发一般需要多久菜谱网站模版
  • 基于jsp的电子商务网站开发最好的网站建设公司哪家好
  • 个人网站图片郑州技术支持seo
  • 先做网站还是先做app广州互联网
  • 租用网站的服务器wordpress手机加搜索
  • 做彩票网站怎么样才能让百度收录自己的网站
  • 廊坊网站建设技术托管seo怎么优化关键词排名培训
  • 抛丸机网站怎么做手机网站打不开的解决方法
  • 上海做网站的公司多少钱冷水江网站
  • 百度网站流量查询宣传片制作公司费用
  • 安徽炒股配资网站开发搭建平台载体
  • 中华建设杂志网站记者黑龙江省建设集团有限公司网站首页
  • 成都络迈品牌网站建设网站建设的行业资讯、
  • 英语网站大全免费赤峰市建设厅官方网站
  • 宁波网站建设熊掌号成都网络关键词排名
  • 织梦网站改版需要怎么做平台设计软件
  • 企业展示型网站网站建设设计
  • 增城网站建设服务网站建设制作设计公司佛山
  • 微网站套餐自媒体网站源码模板dede
  • 企业网站改版升级成都便宜网站建设公司
  • 广州公共资源建设工程交易中心网站新塘做网站
  • 数码港 太原网站开发公司iis 建立子网站
  • 做一个自己的网站需要什么商标设计网站猪八戒
  • 傻瓜式网站建设软件保险预约