20140927142231_6249
栏目导航
www.1883.cm
www.1883.cm > www.1883.cm > 文章
为了供给更靠得住的传输办事
发布时间:2019-09-06  浏览次数:

  方式,正在这种体例下的使用法式取和谈栈内核处于用一个历程中,用户法式通过回调的体例被和谈栈挪用,以取得和谈栈中的数据,基于回调机制的使用法式会使得整个代码的矫捷性加大。另一方面,利用这种体例编程需要间接取内核交互,所以编程难度较大,对法式设想人员的要求较高。正在后面读者会看到,基于回调机制的法式编写体例也存正在着一些缺陷,使其不适合正在大型使用法式的开辟中利用。三、节制块操做函数

  最初需要沉点申明的是,节制块中的最初两个字段具有很主要的感化,它们是用户法式取和谈栈内核进行通信的纽带,正在后面其他两品种型的 API 函数能够看到,API 函数的实现机制都需基于这两个字段

  从图中能够看出,因为前两个节制块中记实了毗连两边的地址和端标语消息,所以它们处于毗连形态;而最初一个节制块只记实了当地 IP 地址和端标语,它处于非毗连形态。若此时 UDP 领受到一个目标端标语为 4321 的数据报,则内核函数会从链表起始处 udp_pcbs 起头查找整个链表,以找到具有当地端口为 4321 的节制块,这里为第二个节制块。当找到该节制块后,节制块的 recv 字段指向的函数 proc2 会被挪用以处置报文数据,传送进 proc2 的参数包含了脚够的消息,用户法式编写的环节就正在于若何处置这些消息。

  正在用户数据报的倡议端(凡是做为客户机),凡是会将目标端标语填写为办事器上某个熟知的端口,对源端标语字段的填写则是可选的,若是客户端期望办事器为本人前往数据,则必需填写源端标语字段,办事器会正在收到的报文中提取到这个源端标语,并正在前往数据时利用到。

  源代码用布局体 udp_hdr 定义了 UDP 报文首部中的各个字段,首部布局如图 122 所示。

  。UDP 和谈的端口分派方式能够分为两大类,第一种是一些地方授权机构曾经明白功能的端标语,称之为

  每台从机都包含了一组称为和谈端口的笼统目标点,每个和谈端口用一个正整数来标记,正在TCP/IP 和谈簇中,端标语范畴为 0~65535,历程能够绑定到某一个端标语上,UDP 报文需要正在其内部指出该报文该当递交的目标端标语,如许,绑定到相关端标语的历程将最终获得数据报文。

  若是晦气用校验和,能够间接将该字段填入 0,之所以能够晦气用校验和,是由于正在某些特殊场所,例如正在高靠得住性的局域网中利用 UDP 时,削减校验和的计较能添加 UDP 的处置速度。正在以太网的底层物理帧领受过程中,凡是会对整个数据帧进行 CRC 校验,因而,数据报犯错的可能性已被降到最低。

  按照领受到的报文查找 UDP节制块,然后挪用注册的用户函数处置报文数据,若是用户注册的函数为空,则响应的报文会被间接删除,这种环境下,没有任何错误会被演讲给源从机;当查找不到对应的节制块时,UDP 会向源从机前往一个 ICMP 端口不成达差错演讲报文。

  16 位的总长度字段定义了用户数据报的总长度,包罗首部长度和数据区长度,以字节为单元。UDP数据区的数据最多只能有 65507 字节(65535-8-20),由于我们正在 IP 数据报首部时,IP 首部中的总长度字段也为 16 位,UDP 要利用 IP 层来传送数据报,所以其数据长度也必需满脚 IP 首部中的长度要求。

  系统为每一个毗连分派一个 UDP 节制块,并把它们组织正在一个全局的链表上,当 UDP 层收到IP 层递交的报文时,会去遍历这个链表,找出取报文首部消息婚配的节制块,并挪用节制块中注册的函数最终完成报文的处置。定义 UDP 节制块时,会用到了 IP 层中定义的一个宏,先看看这个宏的布局。

  从代码的实现角度讲,UDP 和谈的代码量很是小,对于小型嵌入式设备来说,正在局域网中利用 UDP 来实现通信仍是很合适的。

  起首,这里的不靠得住定义仍是要按照具体利用来的,正在现正在的高靠得住性、低时延的局域网下,利用 UDP 和谈呈现传输错误的可能性很小,但利用 UDP 却能够带来数据递交效率和处置速度的提拔,由于它省去了毗连成立、数据确认、流量节制等一系列过程。

  用户历程利用 UDP 来传送数据时,UDP 和谈会正在数据前加上首部构成 UDP 报文,并交给 IP和谈来发送,而 IP 层将报文封拆正在 IP 数据报中并交给底层发送,正在底层,IP 数据报会被封拆正在物理数据帧中。因而,一份用户数据正在被发送时,履历了三次封拆过程,如图 121 所示。

  第一,为两个通信的历程供给毗连机制,即传输层将如何去识别两个正正在通信的历程,当从机的传输层从 IP 层获得一个数据报时,它将利用何种体例把数据递交给最终的使用法式?正在传输层中,这是通过端标语来完成的;

  用户法式正在初始化一个节制块时,需要正在该字段注册自定义的报文处置函数,正在内核领受到报文并婚配到某个节制块后,通过函数指针 recv 来回挪用户自定义的处置函数,如许就最终完成了报文向用户法式的递交 。

  该函数素质是设置节制块的 local_port 和 local_ip 字段,并把节制块插手到链表 udp_pcbs 中,这里涉及一个沉绑定的问题,即若是节制块曾经正在链表汇中,申明曾经对其进行过绑定工做,这里就只是从头点窜 local_port 和 local_ip 字段,并不需要再进行插入链表操做。4、毗连节制块

  ,next 字段就是用来形成链表的。UDP 和谈实现的素质是对链表udp_pcbs 上各个 UDP 节制块的操做。第一个标记该节制块能否进行校验和的计较,当 flags 的无校验位(位 0)为 1 时,暗示正在发送报文时不计较首部中的校验和字段,如许的话正在报文发送时,校验和字段间接置 0 就能够了。第二个标记该节制块能否处于毗连形态(位 2),当某个节制块处于毗连形态时,暗示它内部曾经完整地记实了关于通信两边的 IP 地址和端标语消息。

  参数 port 暗示发送该报文的源从机上的端标语,用户使用法式该当合理地利用这些参数传进来的值完成对报文中数据的处置。

  源文件 udp.h 和 udp.c 中包含了取 UDP 和谈实现相关的所无数据布局和函数,这节来看看 UDP有哪些主要数据布局。

  任何想利用 UDP 办事的使用法式都必需具有一个节制块,并把节制块绑定到响应的端标语上,正在领受报文时,端标语将做为报文起点选择的独一根据。正在内存池中为 UDP 节制块申请一个

  (wellknown port assignment),这些端标语取实现某些上层和谈的功能亲近相关;第二种端口分派方式称为动态绑定(dynamic binding),这品种型的端标语称为短暂端标语。办事器历程必需绑定到一个熟知的端标语上,这个端标语是通信两边事先都晓得的,客户端历程能够间接往该端标语上发送数据,如许数据就能准确达到目标从机上的办事器法式了。UDP 中常见的熟知端标语及其感化如表 121 所示,供给相关功能的办事器历程必需绑定到对应的端标语上 。

  需要指出的是,虽然宏 IP_PCB 中定义了良多字段,可是被利用最多的只要前两个字段,即当地 IP 地址(源 IP 地址)和远端 IP 地址(目标 IP 地址)。最初,的代码还定义了一个布局体 ip_pcb,这里称它为 IP 节制块,它由宏 IP_PCB 包含的各个字段构成。

  UDP 称为用户数据报和谈,是一种无毗连的、不靠得住的传输和谈,它只正在初级程度上实现了上述的传输层功能。UDP 只是简单地完成数据从一个历程到另一个历程的交付,它没有供给任何流量节制机制,收到的报文也没有确认;正在差错节制上,UDP 只供给了一种简单的差错节制方式,即校验和计较,当 UDP 收到的报文校验和计较不成功时,它将丢弃掉这个报文。

  第二,传输层该当供给数据传送办事,正在数据发送端,传输层将用户数据进行拆卸、编号,将数据朋分成可运输的单位,然后顺次递交给 IP 层发送出去。领受端传输层期待属于统一使用法式的所无数据单位达到,对它们进行差错校验,最初将整个数据交付给使用法式;

  最初一个字段 recv_arg 的感化就很较着了,它能够用来指向一个用户自定义的数据消息,正在回调recv指向的函数时,recv_arg会做为函数的第一参数。

  除此之外,UDP 也经常正在那些对轻细数据差错不的使用中被利用到,例如及时视频传输、收集电线、端口

  如图 122 展现了一份 UDP 报文的具体布局,UDP 首部很简单,它由四个 16 位字段构成,别离指出了该用户数据报从哪个端口来、要到哪个端口去、总长度和校验和。

  当做为办事器法式时,必需手动为节制块绑定一个熟知端标语,当做为客户端法式时,手绑定端标语并不是必需的,此时,正在取办事器通信前,UDP 会从动为节制块绑定一个短暂端标语。端标语绑定的素质就是设置节制块中的

  UDP 和TCP 都属于传输层和谈,前面的 IP 和谈只能完成数据报正在互联网中各从机之间的递交,IP 和谈中,数据报的目标地是某一台从机,而不是从机上的某个使用法式。

  第三,为了供给更靠得住的传输办事,传输层还该当供给流量节制机制,例如数据简直认、沉传等,以数据正在两个使用法式之间递交的无效性。

  正在领受端,物理收集先领受到数据帧,然后逐层地将数据递交给上层和谈,每一层都正在向上层递交前往除掉一个首部。正在 UDP 层,它将从 IP 层获得 UDP 报文,UDP 和谈会按照该报文首部的目标端口字段将报文递交给用户历程,绑定到这个目标端口的历程将获得报文中的数据。

  和remote_port的设置。只要绑定了当地 IP 地址和端标语,以及远端 IP 地址和端标语的节制块才会处于毗连形态。

  还有几个节制块操做函数,正在使用法式的编写过程中也经常用到,它们的代码和功能都很简单,如下所示:

  当 UDP 领受到一个报文时,会遍历链表 udp_pcbs 上的所有节制块,查抄此中的当地端标语取报文首部中的目标端标语能否婚配,并将报文递交给婚配成功的节制块处置。

  另一方面,客户端法式也必需利用一个端标语来标识本人,这个端标语能够正在答应范畴内随机的拔取(短暂端标语),但最好不要利用熟知端标语,客户端能够正在报文中照顾这个端标语,办事器历程通过这个端标语就能向客户端历程前往数据 。

  IP 和谈供给了正在各台从机之间传送数据报的功能,可是各个从机并不是数据报中数据的最终目标地,数据的最终目标地该当是从机上的某个特定使用法式。那么IP层怎样样将数据报递交给各个使用法式呢?这就是传输层和谈的功能了,TCP/IP和谈分层中,典型的传输层和谈有UDP和TCP两种。UDP为两个使用法式供给了简单的数据交互体例,有着很高的数据递交效率,有着普遍的使用。另一方面,UDP也是实现多种出名上层使用和谈的根本,例如DNS、DHCP、IGMP、SNMP等和谈都利用UDP传送和谈数据。Anyway,本章中将涉及的学问点如下: