




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、、简要历史、TCP/IP协议族简介编址物理地址逻辑地址端口地址分层数据包介绍 231 以太网帧ARP报文格式233 IP数据报格式ICMP报文格式IGMP报文格式236UDP用户数据报首部格式 237TCP报文段格式2 分层协i讲解ARP和 RARPIP 协议ICMP 协议网际组管理协议(IGMP)245用户数据报(UDP)传输控制协议(、TCP)、UIP处理流程3X Bit经 层次结构1 实现设备驱动与 UIP对榜需要的7个榜口稗序,字义在 uip.h: 应用层要调用的函数,包括一叱宏定义与函数,定义在 uip.h: UIP中所用到的丰要结构体 uip的初始化与配置函数 Uip的主程序循环主
2、要的处理函数 uip process。再来分析 UIP UDP SEND CONN主要处理 UDP报文的发送: 接下来,分析 UIP POLL REQUEST对定时器期满白处理流程 UIP TIMER又UIP UDP TIMER的处理流程原始套接字和原始线程 一、 简要历史1973年,ARPANE核心组成员Vint Cerf和Bob Kahn发表了一篇里程碑论文,阐述了 实现分组的端到端交付的协议。这篇关于传输控制协议( TCP的论文包括:封装、数据 报,以及网关的功能。后来,TCP被划分为两个协议:传输控制协议(TCB和网际互联协议(IP)。IP处理数据报的路由选择,而TCP负责高层的一些功
3、能, 如分段、重装和差错检测。这个用来进行网际互联的协议后来就 被称为TCP/IR二、TCP/IP协议族简介TCP/IP协议族由5层组成:物理层、数据链路层、网络层、运输层和应用层。前四层与OSI模型的前四层相对应,提供物理标准、网络接口、网际互联、以及运输功能。而应用层与OSI模型中最高的三层相对应。TCP/IP协议族中的各层包含了一些相对独立的协议。在物理层和数据链路层,TCP/IP并没有定义任何协议。在网络层 TCP/IP支持网际互联协议(IP),而IP又由四个支撑协议组成:ARR RARR ICMP和IGMP。在传统上,TCP/IP协议族在运输层有两个运输协议:TCP和UDP,然而现在
4、已经设计出一个新的运输层协议SCTP以满足新的应用的需要。IP是主机到主机的协议,即把分组从一个物理设备交付到另 一个物理设备。UDP和TCP是运输机协议,负责把报文从一个进程(运行着的程序)交付到另一个进程。编址使用TCP/IP协议的互联网使用 3个等级的地址:物理(链路)地址、逻辑(IP)地址以及端口地址。 每一种地址属于 TCP/IP体系结构中的特定层。物理地址物理地址也叫链路地址, 是结点的地址, 由它所在的局域网或广域网定义。 物理地址包含在数据链路层使用的帧中。以太网的地址是6 字节( 48 位)长,通常用十六进制记法,如: 07:01:02:01:2C:4B 。以太网的地址共 3
5、 种:单播、多播和广播。在单播地址中的第一个字节的最低位0 ;在多播地址中的第一个字节的最低位是 1。广播地址是48 个 1 。逻辑地址因特网的逻辑地址是32 位地址,可以用来标志连接在因特网上的每个主机。在因特网上没有两个主机有相同的IP地址。同样,逻辑地址也可以是单播地址、多播地址和广播地址。Internet 被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32 位的 IP 地址划分成网络号和主机号两部分, 网络号相同的各主机位于同一网段, 相互间可以直接通信, 网络号不同 的主机之间通信则需要通过路由器转发。把所有 IP 地址分为五类,如下图 1 所示:图 2-1A 类到
6、B 类到C 类到D 类到E 类到在分类编址的 A类、B类、C类地址中,IP地址可划分为net-id (网络标识)和host-id (主机标识)。 对于 A 类地址, 1 字节定义 net-id 而 3 字节定义 host-id 。对于 B 类地址, 2 字节定义 net-id , 2 字节定 义host-id。对于C类地址,3字节定义net-id而1字节定义host-id。D类地址和E类地址不划分 net-id 和 host-id 。网络地址是一个地址块的第一个地址, 向因特网的其余部分定义这个网络。 路由器就是根据网络地址来选择分组的路由。 若给出网络地址, 我们就能够找出这个地址的类别、
7、地址块以及这个地址块的地 址范围。这种划分方案有很大的局限性,它对网络的划分是flat 的而不是层级结构(hierarchical) 的。 Internet上的每个路由器都必须掌握所有网络的信息,随着大量C类网络的出现,路由器需要检索的路由表越来越庞大,负担越来越重。于是提出了新的划分方案,称为 CIDR( Classless Interdomain Routing)。网络号和主机号的划分需要用一个额外的子网掩码( subnet mask)来表示,而不能由IP地址本身 的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,因此称为Classless的。这样,多个子网
8、就可以汇总( summarize)成一个Internet上的网络。IP 地址与子网掩码做与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围。 IP 地址 和子网掩码还有一种更简洁的表示方法,例如 /24,表示IP地址为,子网掩码的 高24位是1,也就是。 目的地址为,表示本网络内部广播,路由器不转发这样的广播数据包。目的地址的主机号为全 1,表示广播至某个网络的所有主机,例如目的地址表示广播至网络(假设子网掩码为) 。端口地址计算机是多进程设备, 即可以在同一时间运行多个进程。 因特网通信的最终目的是使一个进程能够和另一个进程通信。 为了能够同时发生这些事情, 需要有一种方法对
9、不同的进程打上标号, 就是说这些 进程需要地址。在TCP/IP体系结构中,给一个进程指派的标号叫做端口地址。TCP/IP中的端口地址是16位长,通常用 10 进制数表示。2.3. 分层数据包介绍1.1.4 以太网帧目的地址( DA)源地址(SA)类型数据图 2-2DA字段有6字节,是下一站的物理地址(也叫 MAC地址)。SA 字段有 6 字节,是前一站的物理地址。类型字段有三种值,分别对应携带从上层协议封装起来的数据。它的最小长度是IP、 ARP、 RARP。46 字节,最大长度是1500字节。ARP、RARP的数据包长度不够 46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元
10、(MTU ) ,如果一个数据包从以太网路由到链路上,CRC数据包的长度大于链路的 MTU 了,则需要对数据包进行分片差错检测信息, 4 字节。ARP 报文格式图 2-3如上图 3 所示,硬件类型协议类型硬件长度协议长度操作发送端硬件地址发送端协议地址目标硬件地址ARP分组的格式如下:16位字段,用来定义运行ARP的链路层网络的类型。以太网是类型1。16位字段,指要转换的地址类型。0 x0800位IP地址。8 位字段,定义以字节为单位的物理地址长度。对以太网这个值为 6 。8 位字段,定义以字节为单位的逻辑地址长度。对IPv4 协议这个值是4。16位字段,定义分组的类型。为 1表示ARP请求,为
11、2表示ARP应答。可变长度字段,定义发送端的物理地址。定义发送端的逻辑地址。定义目标的物理地址。对于ARP请求报文,这个字段是 全0,因为发送端不知道目标的物理地址。目标协议地址定义目标的逻辑(如,IP)地址。IP 数据报格式图 2-4如上图4所示,IP数据报的结构包括:版本(VER)首部长度(HLEN)这个4位字段定义IP协议的版本。这个4位字段定义IP首1队总长度,以4字节为单位计算。当没有选项时,首部长度是20 字节,这个字段的值是5( 5*4=20 ) 。当选项字段位最大值时,这个字段的值是15 ( 15*4=60 )。服务类型(DS)总长度TOS位是4位子字段,共有 5种不向的服务类
12、型。这个 16 位字段定义了以 字节 计的数据报总长度(首部加上数据) 。要找出上层传来的数据长度, 可以从总长度减去首部长度。 总长度字段是16 位, 因此IP数据报的长度限制是65535 (216- 1)字节。标识 (Identification)这个16位字段与源IP地址一起唯一地定义这个数据报。IP协议使用一个 计数器 来标志数据报, 当 IP 协议 发送 数据时,就把这个计数器的当前值复制 到标识字段中, 并加 1 。当数据报被分片 时,标识字段的值就复制 到所有的分片中。换言之, 所有的分片具有相同的标识号 ,即原始数据报的标识号。在终点重装数据报时,终点就知道所有具有相同标识号的
13、分片必须组装成一个数据报。标志 ( Flags)3 位字段。 第一位保留。 第二位为不分片位, 为 1 表示不对数据报进行分片;为 0 表示在需要时对数据报进行分片。第三位为分片位,为 1 表示这个数据报不是最后的分片,在其后还有分片;为 0 表示这个数据报是最后的分片。分片偏移 (Fragment Offset) 这个 13 位字段表示该分片在整个数据报中的相对位置,以 8生存时间(TTL)节 为度量单位。用来控制数据报所通过的最大路由跳数,这个生存时间的单位不是秒,而是协议跳 ( hop)。这个8位字段定义使用IP层服务的高层协议。如:TCR UDP、ICMP和IGMP检验和等。IP分组中
14、的检验和只在首部而不在数据部分进行。因为,所有将数据封装在源地址IP数据报中的高层协议,都有覆盖整个分组的检验和;其次,每经过一个路由器,IP数据报的首1范就要改变一次,但数据部分不变。因此检验和只对发 生变化的部分进行检验。这个32位字段定义源点的IP地址。在IP数据报从源主机发送到目的主机的目的地址时间内,这个字段必须保持不变。这个 32 位字段定义了终点的 IP 地址。在 IP 数据报从源主机发送到目的主机的时间内,这个字段必须保持不变。ICMP 报文格式类型8位字段,定义ICMP报文的类型。ICMP报文的类型有:终点不可达、源点抑制、超时、参数问题、改变路由、回送请求或回答、时间戳请求
15、或回答、地址掩码请求或回答、路由器询问和通告。代码8 位字段,指明了发送这个特定报文类型的原因。检验和 (icmpchksum) 16位字段。在ICMP 中,检验和的计算覆盖了整个报文(首部和数据) 。ICMP回送请求或回答报文头格式如下图5所示:图 2-5ICMP终点不可达报文头格式如下图6所示:图 2-6ICMP超时报文头格式如下图7所示:图 2-7IGMP 报文格式图 2-8类型8 位字段,定义了查询、成员关系报告、退出报告三种报文类型,类型值分别为0 x11 、 0 x16 、 0 x17 。最大响应时间8 位字段,定义了查询必须在多长时间内回答。它的值以十分之一秒位单位。在查询报文中
16、这个值不是零,但在其他两种报文中则置为零。检验和16 位字段,检验和在8 字节的报文上计算。组地址在一般查询报文中这个字段的值为0 ,在特殊查询报文、成员关系报告报文以及退出报告报文中定义groupid(组多播地址)。UDP 用户数据报首部格式图 2-9UDP数据报格式如上图9所示。用户数据报有8 个字节的固定首部。源端口号16 位字段,定义源主机上运行的进程所使用的端口号。目的端口号16 位字段,定义目的主机上运行的进程使用的端口号。长度16 位字段,定义了用户数据报的总长度,首部加上数据。检验和16位字段,UDP的检验和包括三部分:伪首部、UDP首部以及从应用层来的数据。位首部是 IP 分
17、组的首部的一部分,包括:源IP 地址、目的 IP 地址、 8 位协议和16位UDP总长度。位首部可以保证在IP首部受到损伤时,用户数据报可以交付到正确的主机。 协议字段的加入, 可以确保这个分组是属于UDP 而不是属于TCP。TCP 报文段格式如上图 10 所示,源端口地址目的端口地址序号2-10TCP报文段的结构包括:这个16 位字段定义发送报文段的应用程序端口号。这个16 位字段定义了接收该报文段的应用程序端口号。为了保证连通性,这个32 位字段定义了指派给本报文段第一个数据字节的一个号。要发送的每一个字节都要编号。序号告诉终点,这个序列中的哪一个字节是报文段中的第一个字节。 在连接建立时
18、, 每一方使用随机数产生器产生初始序号 ( ISN) 。确认号32位字段,定义了报文段接收端期望从对方接收的下一个序号。如果报文段的接收端成功地发送了对方发来的序号x,它就把确认号定义为 x+1。首部长度(tcpoffset)4位字段,指出TCP首部共有多少个4字节字。即TCP数据在IP数据中的偏移大小。同IP首部长度,可以在 5至15之间。保留位该6位字段留待今后使用。控制/标志位该字段定义了 6种不同的控制位或标志,在同一时间可设置一位或多位标志。表2-1 控制字段各标志说明(从高位到低位)窗口值该字段定义接收方必须维持的窗口值(以字节为单位)。注意,该字段是16位长,因此窗口值的最大长度
19、为 65535字节。这个值由接收端来确定,发送端必须服从 接收端的决定。检验和这个16位字段包含检验和,TCP使用检验和是强制性的。紧急指针当紧急标志位置位时, 这个16位字段才有效,这时的报文段中包括紧急数据。紧急指针定义了一个数,把这个数加到序号上就得出报文段数据部分中最后一个紧 急字节。选项包括无操作(NOP)、最大报文段长度(MSS)、窗口扩大因子、时间戳等。2.4.分层协议讲解总的来说,TCP/IP协议的多路选择过程可以表示为下图2-11 :图 2-11ARP 和 RARP地址解析协议ARP在任何时候,当主机或路由器有数据报要发送给另一个主机或路由器时,它必须有接收端的逻辑(IP)地
20、址。但是ip数据报必须封装成帧才能通过物理网络。这就表示,发送端必须有接收端的物理地址, 因此需要有从逻辑地址到物理地址的映射。地址解析协议(ARP)用来把IP地址与其物理地址联系起来。任何时候当主机或路由器需要找出这个网络上的另一个主机或路由器的物理地址时,它就发送ARP查询分组。这个分组包括发送端的物理地址和IP地址,以及接收端的IP地址。因为发送端不知道接收端的物理地址,查询就在网络上广播。例如,数据包要发送给IP地址为的主机,过程如下:源主机发出ARP请求,询问“I地址是的主机的硬件地址是多少”,并将这个请求广播到本地网段 (以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF示
21、广播),目的主机接收到广播的 ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。ARP报文格式如前所述。ARP软件包由5个构件组成:高速缓存表:每台主机都维护一个 ARP高速缓存表,由于高速缓存表的空间非常有限,所以缓存表中的表项有过期时间(一般为 20 分钟) ,如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。队列 :队列用来在ARP试图解析硬件地址时保留IP分组。输出模块把未解析的分组发送到相应的队列,输入模块从一个队列中拿走一个分组,并连同解析出的物理地址一同发送给数据链路
22、层来传输。输出模块 :输出模块从IP软件等待IP分组。输出模块检查高速缓存表,寻找是否有某个项目对应于这个分组 的目的IP地址。这个IP分组的目的IP地址必须与这个项目的协议地址相匹配。输入模块 :输入模块一直等待,直到有ARP分组到达。检查高速缓存表,寻找对应这个ARP分组的项目。输入模块设置这个项目的超时时间TIME-OUT。若队列为空,则从相应队列中把分组一个接一个地取出,连同其硬件地址一起交给数据链路层来处理。高速缓存控制模块:负责维护高速缓存表, 它周期性地逐项检查高速缓存表, 判断有哪些项目到期, 哪些队列需要撤销。逆地址解析协议RARP当一个主机知道自己的物理地址时,RARP可用
23、来找出其逻辑地址。每一个主机或路由器都被指派一个或多个逻辑地址,这些地址与机器的物理地址无关。要创建IP数据报,主机或路由器要知道它自己的IP地址。可以使用 RARPB议从物理地址得到逻辑地址。知道物理地址后,先创建 RARP请求,并在本地网络上广播。在本地网络上的另一个机器知道所 有的IP地址,它就用 RARP回答来响应。请求的机器必须运行RAR吟户程序;而响应的机器必须运行RARP服务器程序。IP 协议IP数据报的格式如前所述。IP是不可靠的无连接协议,负责源点到终点的交付。在 IP 层的分组叫做数据报。数据链路层有自己的帧格式,在这个格式中有一个字段是“数据字段最大长度” 。当数据报封装
24、成帧时,数据报的总长度必须小于这个数据字段最大长度(MTU) 。对数据报进行分割,叫做分片。源站通常不对IP分组进行分片。运输层会进行分片工作,把数据划分成 IP 和在使用的数据链路层都可能接纳的大小。数据报在到达终点之前可以经过多次分片,可以被源主机或在其路径上任何路由器进行分片。然而数据报的重组却只能在目的主机上进行。在 IP 分组中的检验和只在首部而不在数据部分心进行。因为,首先所有将数据封装在IP 数据报中的高层协议,都有覆盖整个分组的检验和;其次,每经过一个路由器,IP数据报的首部就要改变一次,但数据部分不变。因此检验和只对发生变化的部分进行检验。IP 软件包包括8 个构件 :首部添
25、加模块、处理模块、转发模块、分片模块、重装模块、路由表、MTU 表以及重装表,还有输入和输出队列。首部添加模块,从高层协议接收数据(连同其IP地址),添加IP首部后,把数据封装成IP数据报。处理模块, 从一个接口或从首部添加模块接收数据报, 首先检查数据报是否为回环地址, 还是这个 分组已到达最后终点。输入队列把从数据链路层或从高层协议发来的数据存放起来。输出队列把要发送到数据链路层或高层协议的数据报存放起来, 处理模块从中取出数据报, 分片和 重装模块则把这个数据报加入输出队列中。路由表是在转发模块中使用的,用来确定分组的下一跳地址。分片模块从转发模块接收IP数据报。转发模块给出IP数据报、
26、下一站的IP地址。以及发送这个数据报所必须通过的接口号。分片模块使用 MTU 表以便找出对于特定接口的最大传送单元 MTU 。若数据 报的长度大于 MTU,则分片模块对数据报进行分片,为每一个分片添加首部,并把它们发送到ARP软件包进行地址解析和交付。重装模块从处理模块接收已到达最终目的地的数据报分片。 重装模块将未分片的数据报看成是属于仅有一个分片的数据报。 使用重装表找出一个分片是属于哪一个数据报, 将属于同一个数据报的各分片 进行排序,并在所有分片到达时把它们重新组装成一个数据报。ICMP 协议IP协议没有差错报告或差错纠正机制和管理查询机制。网际控制报文协议(ICMP)就是为了补偿这两
27、个缺点而设计的。它是配合 IP协议使用的。ICMP 本身是网络层协议,但是它的报文不是如设想的那样直接传送给数据链路层,而是首先要封装成IP数据报,再传送给下一层。在 IP 数据报中的协议字段值是1 就表示其 IP 数据是 ICMP 报文。ICMP 报文类型如下表2-2 所示:表 2-2 ICMP 报文类型ICMP 报文分为两大类:差错报告报文和查询报文。报文格式如前所述。差错报告报文差错报告报文报告当路由器或主机在处理IP数据报时可能遇到的一些问题。ICMP不能纠错,只能报告差错,差错纠正留给高层协议去做。ICMP总是使用源IP地址把差错报文发送给数据报的源点。一共有 5 种差错可处理:终点
28、不可达、源点抑制、超时、参数问题以及改变路由。终点不可达报文当路由器不能够给数据报找到路由或主机不能够交付数据报时, 就丢弃这个数据报, 然后这个路由 器或主机就向发出这个数据报的源主机发回终点不可达报文。源点抑制ICMP的源点抑制报文就是为了给IP增加一种流量控制而设计的。当路由器或主机因拥塞而丢弃数据报时,它就向数据报的发送端发送源点抑制报文。目的有二:第一,通知源点,数据报已被丢弃。第二,它警告源点,在路径中的某处出现了拥塞,因而源点需放慢发送过程。注意,必须为每一个丢弃的数据报向源点发送源点抑制报文。超时超时有两种情况: 第一, 当路由器接收到生存时间字段值为零的数据报时, 就丢弃这个
29、数据报,并向源点发送超时报文; 第二, 当最后的终点在规定时间内没有收到所有的分片时, 就丢弃已收到的分片,并向源点发送超时报文。参数问题如果路由器或主机在数据报的首部中发现任何二义性, 或在数据报的某个字段中缺少了某个值, 就丢弃这个数据报,并发送参数问题报文。改变路由路由器的路由选择是动态的, 而主机为了提高效率, 通常使用静态路由选择。 当主机开始连网工作时,其路由表中的项目数很有限。它通常只知道默认路由器这一个路由器的IP地址,因此主机有可能会把某个数据报发送给一个错误的路由器。 此时, 收到这个数据报的路由器会把数据报转发给正确的路由器,并向主机发送改变路由报文,以更新主机中的路由表
30、。查询报文查询报文都是成对出现的。在这种类型的ICMP报文中,一个结点发送报文,然后由目的结点用特定的格式进行回答。回送请求和回答报文为诊断目的而设计的。主机或路由器可以发送回送请求报文给另一个主机或路由器。 收到回送请求报文的主机或路由器产生回送回答报文,并将其返回给原来的发送者。回送请求和回答报文可用来确定是否在IP这级能够通信。还可由主机使用,以检查另一个主机是否可达。在用户级,调用分组因特网搜寻器( ping )命令可做到这点。时间戳请求和回答两个机器可使用时间戳请求和回答来确定IP数据报在这两个机器之间来往所需的往返时间。地址掩码请求和回答主机通过向局域网上的路由器发送地址掩码请求报
31、文来获得自己的掩码。 若主机知道这个路由器的地址,则直接将请求发送给该路由器,若主机不知道,则广播这个请求报文。路由器收到地址掩码请求报文,就以地址掩码回答报文进行响应,向主机提供所需的掩码。路由询问和通告主机若想把数据发送给另一个网络上的主机,就需要知道连接到该网络上的路由器的地址。此外,这个主机还需要知道这些路由器是否正常工作。就可以通告路由询问和通告报文。主机把路由器询问报文进行广播, 收到询问的路由器就使用路由通告报文广播其路由选择信息。 路由器发送通告报文时,不仅通告自己的存在,而且通告了它所知道的所有在这个网络上的路由器。在 ICMP 中,检验和的计算覆盖了整个报文(首部和数据)
32、。网际组管理协议( IGMP)网际组管理协议(IGMP)是与多播有关的一个必要的但不是充分的协议。IGMP并不是多播路由选择协议, 而是个管理组成员关系的协议。 每当主机需要加入或离开某个特定的多播群组时, 该协议允许 该主机去通知邻近的路由器。该协议只用在主机与路由器之间的网络上。而且, 协议只把计算机 (不是应用进程)定义为群组成 员。如果在一个给定计算机上有多个进程要加入到一个多播群组, 计算机必须要把接收到的每个数据报复制多个副本给每个进程。只有当最后一个进程离开群组时,计算机才利用 IGMP 通知本地的路由器,表明它不再是群组的成员了。 IGMPv2 有 3 种报文类型:查询、成员关
33、系报告和退出报告。IGMP 可分为两个阶段:第一阶段:当某个主机加入新的多播组时,该主机应向组播组的多播地址发送一个IGMP 报文,声明自己要成为该组的成员。本地的多播路由器收到 IGMP 报文后,将组成员关系转发给因特网上的其他多播路由器。第二阶段:因为组成员关系是动态的,因此本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还连续是组的成员。 只要对某个组有一个主机响应, 那么多播路由器就认为这个组是活跃的。 但一个组在经过多次的探询后仍然没有一个主机响应, 则多播路由器就认为本网络上的主机已经都离开这个组了因此就不再将该组的成员关系转发给其他的多播路由器。IGMP 报文
34、格式如前所述。IGMP 协议的优点:主机和多播路由器的所有通信使用IP多播,只要有可能,携带IGMP报文的数据报都使用硬件多播来传送。多播路由器在探询组成员关系时, 只需要对所有多播组只发一个查询, 而不是对每一个组发送一个查询,默认 125S一次。用户数据报( UDP )UDP数据报的格式如前所述。UDP位于应用层和IP层之间,作为应用程序和网络操作的中介物。IP是负责在计算机级的通信(主机到主机的通信),作为网络层协议,IP只能把报文交付给目的主机。但是,这是一种不完整的交付。这个报文还必须送交到正确的进程。UDP就是负责把报文交付给适当的进程。完成进程到进程的通信最常用的方法是通过客户-
35、服务器范例。在本地主机上叫做客户的进程主动发起请求,远程主机上叫做服务器的进程被动地等待、接收和应答请求。客户端的IP地址和端口号唯一标识了该主机上的客户端进程,服务器的IP地址和端口号唯一标识了该主机上的服务端进。由于客户端是主动发起请求的一方,它必须知道服务器的IP地址和服务进程的端口号,所以,一些常见的网络协议有默认的服务器端口。TCP/IP协议族中,端口号是在 065535之间的整数。ICANN把端口号划分为 3个范围:熟知端口号、注 册端口号和动态(或专用)端口号。熟知端口范围从01023;注册端口范围从102449151 ;动态端口范围从4915265535.已知UDP需要两个标识
36、符,即IP地址和端口号,各用在一端以建立一条连接。一个IP地址和一个端口号合起来叫做套接字地址。这些信息是IP首部和UDP首部的一部分。UDP提供物连接服务,即 UDP发出的每一个用户数据报都是独立的数据报,每一个用户数据报可 以走不同的路径到达目的进行。UDP缺少流量控制和差错控制。要从一个进程把报文发送到另一个进程, UDP 协议就要把报文进行封装和拆装。 封装 当进程有报文要通过 UDP发送时,它就把这个报文连同一对套接字地址以及数据的长度传递给UDP,加上UDP首部后,UDP把用户数据报连同套接字地址一起传递给IP。IP加上自己的首部,在协议字段使用值17,指出该数据是从 UDP协议来
37、的。再将IP数据报传递给数据链路层,数据链路层收到 IP数 据报后, 再加上自己的首部传递给物理层。 物理层将这些位编码为电信号或光信号, 把它发送到远程机 器。 拆装报文到达目的主机时,物理层对信号解码,将它变为位, 传递给数据链路层。数据链路层使用这个首部(和尾部)检查数据。若无差错,则去掉首部和尾部,并把数据报传递给IP。 IP 软件进行检查,若无差错,就剥去首部,把用户数据报连同发送端和接收端的IP地址一起传递给 UDP。UDP使用检验和对整个用户数据报进行检查。 若无差错则剥去首部, 把应用数据传递给接收进程。 在需要回答收到的报 文时,应把发送端的套接字地址一起传递给接收进程。UD
38、P 软件包共包括5 个构件:一个控制块表、若干个输入队列、一个控制块模块、一个输入模块和一个输出模块。在UDP 中,队列是与端口相关联在一起的。这里的实现只创建与每一个进程相关联的输入队列,而不创建输出队列。控制块表UDP控制块表来记录打开的端口。表中的每一个项目有最小的4个字段:状态(FREE IN-USE)、进程ID、端口号以及相应的队列号。输入队列使用了一组输入队列,每一个对应于一个进程。控制块模块负责管理控制块表。 当进程启动时, 它就从操作系统请求得到一个端口号。 操作系统把熟知端口号指派给服务器,而把短暂端口号指派给客户。进程把进程ID 和端口号传递给控制块模块,以便在表中为这个进
39、程创建一个项目。这个模块不创建队列。队列数字段值为零。输入模块输入模块从IP接收用户数据报。它查找控制块表,查找具有和这个用户数据报同样端口号的项目。若找到这样的项目, 模块就利用这项目中的信息把这个数据放入队列。 若未找到这样的项目, 它就产生ICMP “端口不可达”报文,并丢弃这个项目。输出模块负责创建和发送用户数据报。传输控制协议(TCP)TCP叫做面向连接的、可靠的运输协议。它提供进程到进程、全双工和面向连接的服务。TCP使用滑动窗口机制实现流量控制,来避免接收端因数据过多而过载;使用差错控制来提供可靠的服务。两个设备之间使用 TCP软件传送的数据单元叫做报文段,它有2060字节的首部
40、,首部后面是来自应用程序的数据。首部结构如前所述。TCP 连接TCP的连接通常包括3个阶段:连接建立、数据传送和连接终止。连接建立需要三向握手:客户发送第一个报文段,SYN报文段,在这个报文段中只有 SYN标志位置1.这个报文段的作用是使序号同步。SYN报文段是控制报文段,不携带任何数据,但是消耗一个序号。当数据传送开始时,每发送一个字节,序号应该加1. 在接收端可以根据序号排出数据包的正确顺序,也可以发现丢包的情况。服务器发送第二个报文段,SYN+AC府艮文段,有两个标志位置1 (SYN和ACK)。服务器使用这个报文段同步初始序号,以便从服务器向客户发送字节。使用ACK确认已从客户端收到了S
41、YN报文段,确认号为客户端发送SYN报文段序号值加1.客户发送第三个报文 ACK,确认号为服务器发送报文段的序号值加1。该报文段的序号与 SYN报文段使用的序号一样。ACK报文段如果不携带数据就不消耗序号。 连接建立后,数据开始双向传送:在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中, 发出数据包给对方之后,只有收到对方应答的 ACK段才知道该数据包确实发到了对方,可以从发送缓冲区中释放掉了,如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后 TCP协议自动将发送缓冲区中的数据包重发。以上情况只描述了最简单的
42、一问一答的情景,事实上TCP协议为应用层提供了全双工 (full-duplex)的服务,双方都可以主动甚至同时给对方发送数据。如果通讯过程只能采用一问一答的方式,收和发两个方向不能同时传输,在同一时间只允许一个方向的数据传输,则称为“半双工(half-duplex) ”,假设某种面向连接的协议是半双工的,则只需要一套序号就够了,不需要通讯双方各自维护一套序号了。 参加交换数据的双方中的任何一方都可以关闭连接,连接终止的四向握手:在正常情况下,客户机 TCP接收到客户进程发来的关闭命令后,就发送第一个报文段一一把 FIN位置1。如果FIN报文段不携带数据,它消耗一个序号。同时更改状态为FIN_W
43、AIT_1,关闭应用程序进程。 服务器TCP在收到这个FIN报文段后,向自己对应的进程发送一个文件结束符EOF,同时更改状态为CLOSE_WAIT并发送第二个报文段一一ACK以证实从客户端收到了 FIN报文段。如果 不携带数据,客户端接到 ACK后状态更改为FIN_WAIT_2。 服务器关闭应用程序进程,更改状态为LAST_ACK并发送第三个报文段一一FIN,若不携带数据,FIN消耗一个序号。 客户TCP接收到FIN后,更改状态为 TIME-WAIT,同时发送最后一个报文段一一ACK,证实从TCP服务器收到了一个 FIN报文段,该报文段的确认号等于从服务器发送的FIN报文段的序号加1。除上述的
44、情况外,建立连接时,客户端和服务器端可以同时打开;关闭连接时,可以同时关闭或者进行三向握手。TCP的状态机转换图如下所示:图 2-12TCP的各种状态如下表 2所示:表2-3 TCP的各种状态1.1.16.2 流量控制:如果发送端发送的速度较快, 接收端接收到数据后处理的速度较慢, 而接收缓冲区的大小是固定的,就会丢失数据。TCP协议通过滑动窗口( Sliding Window) ”机制解决这一问题。TCP在接收缓存上定义一个窗口,TCP发送数据的多少由滑动窗口协议定义。为了完成流量控制,TCP使用滑动窗口协议。两个主机为向外通信(发送数据)各使用一个窗口,这个接收窗口覆盖了缓存的一部分。 这
45、个窗口有两个沿:一个在左边, 另一个在右边。 这个窗口叫做滑动窗口,因为左沿和右沿都可以滑动。窗口可以展开、 合拢或缩回,这三种活动受接收端而不是发送端的控制(取决与网络上的拥塞状态) ,发送端必须听从接收端的命令。一般, 窗口缩回必须避免。TCP的滑动窗口是面向字节的,窗口大小取决于接收窗口( rwnd)和拥塞窗口( cwnd)中的较小 值。接收端在一段时间内不愿意从发送端接收任何数据时,可以发送rwnd 为 0 的报文段来暂时关闭窗口,此时发送端窗口大小并非真正地缩回,而是暂停发送数据,直到一个新的通告收到为止。1.1.16.3 差错控制:差错控制由检验和、确认和超时来处理。受损伤的和重复
46、的报文段要重传,重复的报文段要丢弃。数据可能不按序到达,接收端TCP把它们暂时存储下来,但TCP保证交付给进程的报文段都是按序的。重传发生在:当重传超时(RT。计时器时间到,或已到达 3个重复的ACK报文段。TCP使用拥塞机制来避免和检测网络中的拥塞。在拥塞控制中使用曼开始(指数增大)、拥塞避免(加法增大)和拥塞检测(乘法减小)等策略。TCP在运行中使用4个计时器(重传计时器、持久计时器、保活计时器和时间等待计时器)。三、UIP处理流程简介uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保留了网络通信必须使用的协议,设计重点放在了 ARP/ IP/ICMP/UDP/TC也
47、些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。由于 uIP 协议栈专门为嵌入式系统而设计,它具有如下的优点:代码非常少,其协议栈代码不到6K;占用的内存数非常少, RAM 占用仅几百字节;其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。支持多个主动连接和被动连接并发;通用性强,移植起来基本不用修改就可以通过;对数据的处理采用轮循机制,不需要操作系统的支持。图3-1UIP协议栈硬件驱动层次结构uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从
48、而增加了协议的通用性。uIP协议栈与系统底层和高层应用之间的关系如图11所示:应用层应用程序1.1.17实现设备驱动与UIP对接需要的7个接口程序,定义在uip.h :#define uip_input()uip_process(UIP_DATA)#define uip_periodic(conn) do uip_conn = &uip_connsconn; uip_process(UIP_TIMER); while (0)#define uip_conn_active(conn) (uip_connsconn.tcpstateflags != UIP_CLOSED)#define uip_p
49、eriodic_conn(conn) do uip_conn = conn; uip_process(UIP_TIMER); while (0)#define uip_poll_conn(conn) do uip_conn = conn; uip_process(UIP_POLL_REQUEST); while (0)#define uip_udp_periodic(conn) do uip_udp_conn = &uip_udp_connsconn; uip_process(UIP_UDP_TIMER); while (0)#define uip_udp_periodic_conn(conn
50、) do uip_udp_conn = conn; uip_process(UIP_UDP_TIMER); while (0) 还有一个变量,在接口中要用到:u8_t uip_bufUIP_BUFSIZE+2;对以上接口进行详细介绍:#define uip_input()处理输入数据包。当设备从网络上接收到数据包时调用此函数。在调用此函数之前,应将接收到的数据包内容存入uip_buf 缓冲区,并将其长度赋给uip_len.以太网内使用的uip需要用到ARP协议,因此在调用此函数之前先调用uip的ARP代码。此函数返回时,如果系统有数据要输出,会直接将数据存入uip_buf,并将其长度值赋给 u
51、ip_len。如果没有数据要发送,则 uip_len 值为 0.使用举例如下:uip_len = tapdev_read(uip_buf);if(uip_len 0) if(BUF-type = htons(UIP_ETHTYPE_IP) uip_arp_ipin();uip_input();if(uip_len 0) uip_arp_out();tapdev_send(uip_buf,uip_len);else if(BUF-type = htons(UIP_ETHTYPE_ARP) uip_arp_arpin();if(uip_len 0) tapdev_send(uip_buf,uip_
52、len); #define uip_periodic(conn)周期性的处理一个连接,需用到该连接的连接号, conn 为将要轮询的连接号。该函数又一个uip的TCP连接进行一些必要的周期性处理(如定时器、轮询等),它应该在周期性uip 定时器期满消息到来时被调用。每一个连接都应该调用该函数,不论连接是否打开。该函数返回时, 若缓冲区内有需要被发送出去的数据包等待处理, 就将 uip_len 的值置为大于零的 数。以太网内使用的uip需要用到ARP协议,因此在调用驱动程序之前先调用uip的ARP代码uip_arp_out() ,再调用设备驱动程序将数据包发送出去。使用举例如下:for(uint
53、32_t i = 0; i 0) uip_arp_out();tapdev_send(uip_buf,uip_len);#define uip_conn_active(conn)#define uip_periodic_conn(conn)对一个连接进行周期性处理,需用到指向该连接结构体的指针。该函数与 uip_periodic 执行的操作是相同的,不同之处在于传入的参数是一个指向 uip_conn 结构 体的指针。此函数可用于对某个连接强制进行周期性处理。#define uip_poll_conn(conn)请求对特定连接进行轮询。该函数功能与uip_periodic() 相同,但是不执行任
54、何定时器处理。通过轮询从应用程序得到新数据。#define uip_udp_periodic(conn)周期性处理连接号指定的连接。此函数基本上与uip_periodic()相同,区别在于这里处理的是UDP连接。其调用方式也与uip_periodic()类似:for(i = 0; i 0) uip_arp_out(); tapdev_send();#define uip_udp_periodic_conn(conn)周期性处理一个UDP 连接,需用到指向该连接结构体的指针。此函数功能与uip_periodic_conn() 相同,只是用来处理的是UDP 连接。u8_t uip_bufUIP_B
55、UFSIZE+2;uip 数据包缓冲区, 长度固定 。Uip_buf 数组用于存放接收、发送的数据包。设备驱动程序应将接收到的数据放入缓冲区。发送数据时,设备驱动程序从缓冲区中读取链路层的首部和TCP/IP首部。链路层头的大小在UIP_LLH_LEN中定义。注: 应用程序数据无需放入这个缓冲区中,而是需要设备驱动程序从 uip_appdata 指针所指的地方读取数据。u16_t uip_len;全局变量, uip_buf 缓冲区中数据包的长度。当网络设备驱动调用 uip 输入函数时, uip_len 要被设为传入数据包的大小。当发送数据包时,设备驱动程序通过这个变量来确定要发送的数据包的大小。
56、1.1.18 应用层要调用的函数,包括一些宏定义与函数,定义在uip.h :宏定义:#define uip_outstanding(conn) (conn)-len)#define uip_datalen()#define uip_urgdatalen()#define uip_close()#define uip_abort()#define uip_stop()#define uip_stopped(conn)#define uip_restart()uip_lenuip_urglen(uip_flags = UIP_CLOSE)(uip_flags = UIP_ABORT)(uip_co
57、nn-tcpstateflags |= UIP_STOPPED)(conn)-tcpstateflags & UIP_STOPPED)do uip_flags |= UIP_NEWDATA; uip_conn-tcpstateflags &= UIP_STOPPED; while(0)#define uip_udpconnection() (uip_conn = NULL)#define uip_newdata() (uip_flags & UIP_NEWDATA)#define uip_acked() (uip_flags & UIP_ACKDATA)#define uip_connecte
58、d() (uip_flags & UIP_CONNECTED)#define uip_closed()#define uip_aborted()#define uip_timedout()#define uip_rexmit()#define uip_poll()#define uip_initialmss()#define uip_mss()(uip_flags & UIP_CLOSE)(uip_flags & UIP_ABORT)(uip_flags & UIP_TIMEDOUT)(uip_flags & UIP_REXMIT)(uip_flags & UIP_POLL)(uip_conn
59、-initialmss)(uip_conn-mss)#define uip_udp_remove(conn) (conn)-lport = 0#define uip_udp_bind(conn, port) (conn)-lport = port#define uip_udp_send(len) uip_send(char *)uip_appdata, len)函数:void uip_listen(u16_t port);void uip_unlisten(u16_t port);struct uip_conn *uip_connect(uip_ipaddr_t *ripaddr, u16_t
60、 port);void uip_send(const void *data, int len);struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport);对以上函数进行详细介绍:#define uip_outstanding(conn)检查一个连接是否有特殊的(例如,未答复的)数据。conn 为指向该连接结构体的指针。#define uip_datalen()uip_appdata缓冲区中,当前可用的传入数据的长度。必须先调用uip_data()查明是否有当前可用的传入数据。#define uip_urgdatal
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 法律文书格式审查员考试试卷及答案
- 咖啡烘焙师笔试试题及答案
- 2025年公路养护检测设备项目发展计划
- 2025年上门美甲项目发展计划
- 锦州市“三支一扶”计划人员招募笔试真题2024
- 山东烟台中农大研究院招聘笔试真题2024
- 2025年江苏省外事办公室下属事业单位招聘考试笔试试题【答案】
- 2025年宁夏回族自治区公安厅下属事业单位招聘考试笔试试题【答案】
- 2025年输液输血类产品项目合作计划书
- 项目管理手册
- 学霸提优第四单元《我们讲文明》重难点梳理 课件
- 安徽青硕建设有限公司招聘笔试真题2024
- 公司适用法律法规标准清单2025年08月更新
- 2025年4月自考00077金融市场学试题
- 国家开放大学机考答案 5个人与团队管理2025-06-21
- 大庆师范学院《跳高》2023-2024学年第一学期期末试卷
- 2025年广元市中考语文试卷真题(含标准答案)
- 幸福与健康课件
- 幼儿弱视防治指南
- 2025人教英语初中七年级下册期末测试卷(含答案)
- 窗帘实施方案(3篇)
评论
0/150
提交评论