数据链路层协议的分析与应用.doc_第1页
数据链路层协议的分析与应用.doc_第2页
数据链路层协议的分析与应用.doc_第3页
数据链路层协议的分析与应用.doc_第4页
数据链路层协议的分析与应用.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据链路层协议的分析与应用 第一章网络协议概述协议就是指一套规则和协定。规定计算机间交换的消息格式和含义的协定就被称之为通信协议,或计算机网络协议。为什么我们要引入通信协议这个概念呢?原因是基本的通信硬件是能够从一点到另一点传送位串的机制。但是,如果光使用纯硬件来进行通信的话,那就好象是用0和1在进行编程一样,非常的不方便。所以为了方便编程人员,联网的计算机使用了复杂的软件,为应用程序提供方便的高层接口。这种软件自动处理大部分的底层通讯细节的问题,使应用程序间的通信变的很容易。因此,大多数的应用程序都要依靠网络软件来通信,并不直接与网络硬件打交道。协议的设计者并不是设计一个单一的,庞大的协议来为所有可能的通信规定完整的细节,而是把通信问题进一步划分为多个子问题,然后再为每个子问题设计各自的协议。为了确保通信系统的有效和高效就必须仔细地划分各个协议。并且确保这些协议之间能够协同工作。这里就提出了协议族的概念。为了能让协议之间更好的协同工作。就必须有一个总体设计规划,而不能孤立地开发每个协议,而是要将协议设计和开发成完整的,协同的集合即协议族。网络协议一般分为不同层次进行开发,每一层负责不同的通信功能。TCP/IP不是仅仅指TCP协议或IP协议,它是一个协议族,即是一组不同层次上的多个协议的一个组合。TCP/IP通常被认为是一个四层协议系统,如下图所示。传输层应用层链路层网络层每一层负责不同的功能:1) 链路层,有时也称作数据链路层或网络接口层,它一般包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。2) 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在T C P / I P协议族中,网络层协议包括I P协议(网际协议),I C M P协议(I n t e r n e t互联网控制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。3 ) 运输层主要为两台主机上的应用程序提供端到端的通信。在T C P / I P协议族中,有两个互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途4 ) 应用层负责处理特定的应用程序细节。在TCP/IP协议族中有很多协议如下图:T C P和U D P是两种最为著名的运输层协议,二者都使用I P作为网络层协议。虽然T C P使用不可靠的I P服务,但它却提供一种可靠的运输层服务。与T C P不同的是,U D P是不可靠的,它不能保证数据报能安全无误地到达最终目的。I P是网络层上的主要协议,同时被T C P和U D P使用。T C P和U D P的每组数据都通过端系统和每个中间路由器中的I P层在互联网中进行传输。在上图中,我们给出了一个直接访问I P的应用程序。这是很少见的,但也是可能的(一些较老的选路协议就是以这种方式来实现的。当然新的运输层协议也有可能使用这种方式)I P层用它来与其他主机或路由器交换错误报文和其他重要信息。A R P(地址解析协议)和R A R P(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换I P层和网络接口层使用的地址。上图中的链路就是指沿着通信路径连接相邻节点的通信信道。因此为了将一个数据报从源主机传输到目的主机,数据报必须通过沿端到端路径上的每段独立的链路传输。通过特定的链路,传输节点将此数据报封装在链路层帧(帧是指链路层协议交换的数据单元)中,并将该帧传输到链路上;接受节点接收该帧并取出数据报。当应用程序用T C P传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如下图所示。T C P传给I P的数据单元称作T C P报文段或简称为T C P段(T C Ps e g m e n t)。I P传给网络接口层的数据单元称作I P数据报(IP datagram)。通过以太网传输的比特流称作帧(Fr a m e )。以太网数据传输是通过广播实现的,将要发送的数据包发往连接在一起的所有主机,包中包含着应该接收数据包主机的正确地址,只有与数据包中目标地址一致的那台主机才能接收。但是,当主机工作监听模式下,无论数据包中的目标地址是什么,只要经过自己网络接口,主机都将接收。数据包接受过程当网络中的两台主机通信的时候,源主机将写有目的的主机地址的数据包发向目的主机。TCP/IP协议中数据包从IP层交给数据链路层,而网络接口是不会识别IP地址的,因此在网络接口数据包又增加了一部分以太帧头的信息。在帧头中有两个域,分别为只有网络接口才能识别的源主机和目的主机的物理地址,这是一个与IP地址相对应的48位的MAC地址。当数据帧到达一台主机的网络接口时,正常情况下,网络接口读入数据帧,如果数据帧中携带的物理地址是自己的或者是广播地址,则将数据帧交给上层协议软件,也就是IP层,否则就将这个帧丢弃。对于每一个到达网络接口的数据帧,都要进行这个过程。然而,当主机工作在监听模式下,所有的数据帧都将被交给上层协议软件处理。链路层协议用来在独立的链路上移动数据报。链路层协议定义了在链路两端的节点之间交互的分组格式,以及当发送和接收分组时这些节点采取的动作。每个链路层帧通常封装了一个网络层的数据报。例如在发送和接收帧时,链路层协议所采取的动作包括差错检测,重传,流量控制和随机访问。链路层协议包括以太网,802.11无线LAN(也被称为Wi-fi),令牌环和PPP:在很多场合下,ATM也能视为链路层协议。例如,一个链路上层协议可能提供,也可能不提供可靠的交付。因此,网络层必须能够在各段链路层提供异构服务的情况下,完成它的端到端的工作。虽然网络层的任务是端到端地将传输层报文从源主机传送到目的主机,而链路层协议的任务是节点到节点地将网络层的数据报传送路径中的单段链路。链路层的一个重要特点就是数据报在路径的不同链路上可能由不同链路层协议处理。例如,数据报在第一段链路上可能由以太网处理,在最后一段链路上可能由PPP处理,在中间的所有链路上由广域链路层协议处理。需要注意的是,不同的链路层协议提供的服务可能是不同的。数据链路层协议提供的服务主要有:1. 成帧。几乎所有的链路层协议都在网络层数据报在链路上传输之前,用链路层帧将其封装。2. 链路访问。媒体访问控制协议定义了帧在链路上传输的规则。3. 可靠交付。当链路层协议提供可靠的传输服务时,它可以保证将每个网络层的数据报无差错地通过链路层。4. 流量控制。链路每一个端点具有有限容量的帧缓冲。5. 差错检测。当帧中的一个比特作为1传输时,接收方节点可能错误地判断是零,反之也是。6. 差错纠正。差错纠正和差错检测类似,区别在于接收方不仅能检测是否帧中引入了差错,而且能够准确地判断帧中的差错出现在哪里(并因此纠正这些差错)。7. 全双工和半双工。采用全双工传输时,链路两端的节点可以同时传输分组。采用半双工传输时,一个节点不能同时传输和接收。如上所述,链路层提供的许多服务和传输层提供的服务是非常相似的。例如,链路层和传输层都能提供可靠交付。尽管在这两层用于提供可靠交付的机制相似,这两个可靠交付服务是不同的。传输层协议在端到端的基础上为两个进程之间提供了可靠的交付;可靠的链路层协议在一条链路相连的两个节点之间提供可靠的交付服务。同样地,链路层和传输层协议都能提供流量控制和差错检测;此外,传输层协议中的流量控制是在端到端的基础上提供的,而链路层上的协议是在节点对相邻节点基础上提供的。数据链路层的协议可分异步协议和同步协议两类。在TCP/IP协议族中,链路层主要有三个目的:(1)为IP模块发送和接收IP数据报(2)为ARP模块发送ARP请求和接收ARP应答;(3)为RARP发送RARP请求和接收RAR P应答。T CP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、F D D I(光纤分布式数据接口)及R S-2 3 2串行线路等。网络链路有点对点链路和广播链路。点对点链路由链路一端的单个发送方和链路另一端的单个接收方组成。许多链路层协议都是基于点对点链路设计的;PPP(点对点协议)就是这种协议之一。第二种类型的链路是广播链路(broadcast link),它能够有多个发送和接收节点连接到相同的,单一的,共享的广播信道。这里用“广播”是因为当任何一个节点传输一帧时,该信道广播该帧,从而每个其他节点都可以收到一个拷贝。以太网和无线LAN就是广播链路层技术的例子。以太网是一种有线局域网技术。局域网是一种将小区域内的各种通信设备互连在一起的通信网络。通信网络由一定数量的设备互联而成,为网络中的两个相连设备提供它们之间的数据传输的途径。这些设备常被称为网络结点(Node),而在局域网技术中又经常被称为站点,它可能是一台计算机,通过一种硬件设备比如网卡连接到局域网中,在这些计算机上可以运行网络应用程序,通过局域网这个通信网来进行通信实现资源共享,这个时候人们也把该计算机称为主机(Host)。局域网技术有令牌环网,FDDI,ATM和以太网等。局域网的基本特点有1)高数据传输率(10 1000 Mbps)2)短距离(0.1 10 km)3)低出错率(10-8 10-11)局域网拓扑结构有1)星型结构2)环型结构3)总线型结构4)树型结构。如下图 星型 环型 总线型树型传输介质有1)双绞线2)基带同轴电缆3)光纤4)无线数据链路层协议交换的数据单元称为帧。以太网是属于数据链路层的技术,因此有以太网帧的结构如下图所示:前同步码 目的地址 源地址 类型 数据 CRC 以太网这个术语通常是指由DEC,Intel和Xerox公司在1982年联合公布的一个标准,它是当今TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法,是第一个广泛使用的高速LAN(局域网)。它要比令牌环,FDDI和ATM容易实现且价格便宜的多。几年后,IEEE802委员会公布了一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络;此三种帧的通用部分由802.2标准来定义,也就是我们所熟悉的802网络共有的逻辑链路控制(LLC)。Ethernet II和IEEE802.3的帧格式分别如下:Ethernet II帧格式: 前序 目的地址 源地址 类型 数据 FCS 4 byte| 8 byte 6 byte | 6 byte | 2 byte | 461500 byte | IEEE802.3一般帧格式 前序 帧起始定界符 目的地址 源地址 长度 数据 FCS 7 byte 1 byte 2/6 byte 2/6 byte 2 byte 461500 byte 4 byte Ethernet II和IEEE802.3的帧格式比较类似,主要的不同点在于前者定义的2字节的类型,而后者定义的是2字节的长度;所幸的是,后者定义的有效长度值与前者定义的有效类型值无一相同,这样就容易区分两种帧格式了。一、前序字段 前序字段由8个(Ethernet II)或7个(IEEE802.3)字节的交替出现的1和0组成,设置该字段的目的是指示帧的开始并便于网络中的所有接收器均能与到达帧同步,另外,该字段本身(在Ethernet II中)或与帧起始定界符一起(在IEEE802.3中)能保证各帧之间用于错误检测和恢复操作的时间间隔不小于9.6毫秒。二、帧起始定界符字段 该字段仅在IEEE802.3标准中有效,它可以被看作前序字段的延续。实际上,该字段的组成方式继续使用前序字段中的格式,这个一个字节的字段的前6个比特位置由交替出现的1和0构成。该字段的最后两个比特位置是11,这两位中断了同步模式并提醒接收后面跟随的是帧数据。 当控制器将接收帧送入其缓冲器时,前序字段和帧起始定界符字段均被去除。类似地当控制器发送帧时,它将这两个字段(如果传输的是IEEE802.3帧)或一个前序字段(如果传输的是真正的以太网帧)作为前缀加入帧中。三.目的地址字段 目的地址字段确定帧的接收者。两个字节的源地址和目的地址可用于IEEE802.3网络,而6个字节的源地址和目的地址字段既可用于Ethernet II网络又可用于IEEE802.3网络。用户可以选择两字节或六字节的目的地址字段,但对IEEE802.3设备来说,局域网中的所有工作站必须使用同样的地址结构。目前,几乎所有的802.3网络使用6字节寻址,帧结构中包含两字节字段选项主要是用于使用16比特地址字段的早期的局域网。四、源地址字段 源地址字段标识发送帧的工作站。和目前地址字段类似,源地址字段的长度可以是两个或六个字节。只有IEEE802.3标准支持两字节源地址并要求使用的目的地址。Ethernet II和IEEE802.3标准均支持六个字节的源地址字段。当使用六个字节的源地址字段时,前三个字节表示由IEEE分配给厂商的地址,将烧录在每一块网络接口卡的ROM中。而制造商通常为其每一网络接口卡分配后字节。五、类型字段 两字节的类型字段仅用于Ethernet II帧。该字段用于标识数据字段中包含的高层协议,也就是说,该字段告诉接收设备如何解释数据字段。在以太网中,多种协议可以在局域网中同时共存,例如:类型字段取值为十六进制0800的帧将被识别为IP协议帧,而类型字段取值为十六进制8137的帧将被识别为IPX和SPX传输协议帧。因此,在Ethernet II的类型字段中设置相应的十六进制值提供了在局域网中支持多协议传输的机制。 在IEEE802.3标准中类型字段被替换为长度字段,因而Ethernet II帧和IEEE802.3帧之间不能兼容。六、长度字段 用于IEEE802.3的两字节长度字段定义了数据字段包含的字节数。不论是在Ethernet II还是IEEE802.3标准中,从前序到FCS字段的帧长度最小必须是64字节。最小帧长度保证有足够的传输时间用于以太网网络接口卡精确地检测冲突,这一最小时间是根据网络的最大电缆长度和帧沿电缆长度传播所要求的时间确定的。基于最小帧长为64字节和使用六字节地址字段的要求,意味着每个数据字段的最小长度为46字节。唯一的例外是吉比特以太网。在1000Mbit/s的工作速率下,原来的802.3标准不可能提供足够的帧持续时间使电缆长度达到100米。这是因为在1000Mbit/s的数据率下,一个工作站在发现网段另一端出现的任何冲突之前已经处在帧传输过程中的可能性很高。为解决这一问题,设计了将以太网最小帧长扩展为512字节的负载扩展方法。 对除了吉比特以太网之外的所有以太网版本,如果传输数据少于46个字节,应将数据字段填充至46字节。不过,填充字符的个数不包括在长度字段值中。同时支持以太网和IEEE802.3帧格式的网络接口卡通过这一字段的值区分这两种帧。也就是说,因为数据字段的最大长度为1500字节,所以超过十六进制数05DC的值说明它不是长度字段(IEEE802.3).而是类型字段(Ethernet II)。七、数据字段 如前所述,数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。八、校验序列字段 既可用于Ethernet II又可用于IEE802.3标准的帧校验序列字段提供了一种错误检测机制,每一个发送器均计算一个包括了地址字段、类型/长度字段和数据字段的循环冗余校验(CRC)码。发送器于是将计算出的CRC填入四字节的FCS字段。 虽然IEEE802.3标准必然要取代Ethernet II,但由于二者的相似以及Ethernet II作为IEEE802.3的基础这一事实,我们将这两者均看作以太网。 第二章以太网上的数据交换 按照OSI分层模型的设计,在进行数据交换时,每一层只处理该层对应的数据,即目标计算机上第N层软件必须接收发送端计算机上第N层软件发送的信息。层次结构模型中数据的实际传送过程如图1.2所示。图中发送进程送给接收进程的数据,实际上是经过发送方各层从上到下传递到物理媒体;通过物理媒体传输到接收方后,再经过从下到上各层的传递,最后到达接收进程。 在发送方从上到下逐层传递的过程中,每层都要加上适当的控制信息,即图中的H7、H6、H1,统称为报头,这个在数据上加入报头或将数据包在里面的过程被称为封装(encapsulation)。到最低层成为由“0”或“1”组成的数据比特流,然后再转换为电信号载物理媒体上传输至接收方。接收方在向上传递时过程正好相反,要逐层剥去发送方相应层加上的控制信息。因接收方的某一层不会收到底下各层的控制信息,而高层的控制信息对于它来说又只是透明的数据,所以它只阅读和除去本层的控制信息,并进行相应的协议操作。发送方和接受方的对等实体看到的信息是相同的,就好像这些信息通过虚通信直接给了对方一样。在偶然情况下,发送端计算机的层会将一个数据信元(包括前一层的报头)分开为多个部分,更小的数据信元,并且每个更小的数据信元用较低协议层的新报头进行封装。这个过程帮助控制数据流并写地址给网络上的数据包大小限制。随着数据逐渐达到模型的底层,它逐渐变小,而且在大小和内容上越来越统一。当目的端计算机接收到数据时,接收节点上的对应层将在把数据传送到下一个层之前,重新装配数据字段。随着数据逐渐在目的地的模型上向上移动,它像一个游戏一样逐渐将分段拼装到一起。 OSI七层模型与通信协议的对照如下图所示。应用层 HTTP HTML MPEG(vidio) POP(email) X.400 表达层 ISO 8822/3/4/5 运输层 ISO8326/7 会话层 TCP UDP 网络层 IP(Internet) X.25 IPX/SPX(Novell LANS)数据链路层 802.3Ethernet 802.5Token Ring PPP 物理层 IEEE802.3Category 5 Cable CCITTv.24 RS232C Cable V.34 modem 图1.3 OSI七层模型与通信协议的对照图这种分层封装交换数据的方式,明确了各层任务,使数据交换的效率得到提高,减少错误的发生,让数据交换能快速通畅的进行。第三章以太帧格式RFC894定义的以太帧在TCP/IP世界中,从上层传递来的数据报在数据链路层被进行最后一次封装。通常使用术语帧(frame)指代特殊类型网络对包的定义。以太网IP数据报的封装是在RFC894Hornig 1984中定义的,IEEE802网络的IP数据报封装是在RFC1042Postel and Reynolds 1988中定义的。主机需求RFC要求每台Internet主机都与一个10Mb/s的以太网电缆相连接:1 必须能发送和接收采用RFC894(以太网)封装格式的分组。2 应该能接收与RFC894混合的RFC1042(IEEE802)封装格式的分组。3 也许能够发送采用RFC1042格式封装的分组。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC894分组。RFC894是最常用的封装格式。图1.4显示了RFC894以太网帧的封装格式。图中每个方框下面的数字是它们的字节长度。 目的地址 源地址 类型 数据 CRC 6 6 2 461500 4 0800 IP数据报 2 461500 0806 ARP请求/应答 PDA 2 28 18 86DD IPv6数据报 2 461500 图 以太网的封装格式(RFC894)以太帧格式采用48bit(6字节)的目的地址和源地址。这就是我们所说的硬件地址(MAC地址)。ARP和RARP协议对32bit的IP地址和48bit的硬件地址进行映射。接下来的2个字节是以太网的类型字段,它定义了后续数据的类型。例如:0x0800表示后续数据为IP数据报,0x0806表示后续数据为ARP数据报,0x86DD表示后续数据为IPv6数据报。该字段所表示后续数据类型详见RFC1340Postel and Reynolds 1992。类型字段之后就是数据。以太帧规定数据长度在461500个字节范围内。以太网要求数据区最少要有46字节。为保证这一点,必须在不足的空间插入填充(pad)字节。CRC字段用于帧内后续字节差错的循环冗余码检验(校验和)(它也被称为FCS或帧检验序列)。综上所述,目前绝大多数局域网的组建都采用IEEE802.3标准(CSMA/CD)局域网技术。以太帧是数据链路层最常见的数据封装格式。下文所讨论的数据包都是封装在RFC894定义的以太帧内的数据包。3.1 IP数据报格式IP数据报的格式如下图所示。普通的IP首部长为20个字节,除非含有选项字节。 0 15 16 314位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节数) 16位标识 3位标志 13位片偏移8位生存时间(TTL) 8位协议 16位首部检验和 32位源IP地址 32位目的IP地址 选项(如果有) 数据(261480字节) 图2.2 IP数据报的格式版本号:指出报文所使用的IP协议的版本号,IP版本4(IPv4)是当前广泛使用的版本。版本6(IPv6)是新一代IP协议。首部长度:指出整个报文头的长度,接收端通过此项可以知道报文头在何处结束及读数据的开始处。由于它是个4比特字段,因此首部最长为60个字节。普通IP数据报(没有任何选项)字段的值是5。服务类型(TOS):包括一个3bit的优先权子字段,4bit的TOS子字段和1bit未用位但必须置0。4bit的TOS分别代表:最小延迟、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。RFC 1340Reynolds and Postel 1992描述了所有的标准应用如何设置这些服务类型。RFC 1349Almquist 1992对该RFC进行了修正,更为详细地描述了TOS的特性。总长度:指整个IP数据报的长度,以字节位单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据报最长可达65535字节。尽管可以传送一个长达65535字节的IP数据报,但大多数的链路层都会对它进行分片。而且,主机也要求不能接收超过576字节的数据报。由于TCP把用户数据分成若干片,因此一般来说这个限制不会影响TCP。在后面的章节中将遇到大量使用UDP的应用(RIP,TFTP,BOOTP,DNS,以及SNMP),它们都限制用户数据报长度为512字节,小于576字节。但是,事实上现在大多数的实现(特别是那些支持网络文件系统NFS的实现)允许超过8192字节的IP数据报。总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。标识字段:唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会增加1。标志字段和片偏移字段:在路由器分片数据报时,路由器将该标志号拷贝到每个片断中。接收者使用每个片断中的标志号和IP源地址判断片断属于哪个数据报。并使用片偏移字段判断片断在数据报中的位置。生存时间(TTL):该字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值由源主机设置,一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。首部检验和:该字段是根据IP首部计算的检验和码。它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。为了计算一份数据报的I P检验和,首先把检验和字段置为0。然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。在RFC 1071 Braden,Borman and Patridge 1988中有关于如何计算Internet检验和的实现技术。源IP地址和目的IP地址:都是32bit的IP地址值。任选项:是数据报中的一个可变长的可选信息。选项字段一直都是以32bit作为界限,在必要的时候插入值为0的填充字节,这样保证IP首部始终是32bit的整数倍。数据:指上层协议数据报。如TCP数据报、UDP数据报、ICMP数据报、IGMP数据报等等。通过隧道代理机制,IPv4包头还能封装IPv6数据报。一般数据区存放数据大小为261400字节左右。3.2 TCP传输控制协议可靠性是传输协议的责任,应用程序与传输服务进行交互以便发送和接收数据。在TCP/IP协议族中,传输控制协议(Transmission Control Protocol,TCP)提供了这种可靠传输服务。TCP是传输层协议(OSI参考模型中第四层),它是通过一系列公开出版的IETF文档进行开发的。3.2.1 TCP的包头格式TCP数据被封装在一个IP数据报中,如图2.3所示。 IP数据报 TCP报文段 IP首部 TCP首部 TCP数据 20字节 20字节 图2.3 TCP数据在IP数据报中的封装TCP报头的数据格式如下图所示。如果不计任选项字段,它通常是20个字节。0 15 16 31 16位源端口号 16位目的端口号 32位序号 32位确认序号4位首部长度 保留(6位) U A P R S F 16位窗口大小 16位检验和 16位紧急指针 选项 数据(261460字节) 图2.4 TCP首部格式源端口号和目的端口号:这两个字段用于寻找发送端和接收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。序列号:用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单项流动,则TCP用序号对每个字节进行计数。序号是32bit的无符号数,序号达到232-1后又从0开始。确认序列号:包含发送确认的一端所期望收到的下一个序号。所以,确认序号应当是上次已成功收到数据字节序号加1。由于TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连结的每一端必须保持每个方向上的传输数据序号。首部长度:它给出了首部中32bit字的数目。需要这个只是因为任选字段的长度是可变的。这个字段占4bit,因此TCP最多有60字节的首部,没有任选字段,正常的长度是20字节。保留字段:6bit恒置0的域。为将来定义新的用途保留。标志比特:它们中的多个可同时被设置为1。 URG 紧急指针(urgent pointer)有效。 ACK 确认序号有效。 PSH 接收方应该尽快将这个报文段交给应用层。 RST 重建连接。 SYN 同步序号用来发起一个连接。 FIN 发送端完成发送任务。窗口大小:控制TCP的流量。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16bit字段,因而窗口大小最大为65535字节。检验和:它覆盖了整个TCP报文段(TCP首部和TCP数据)。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。紧急指针:只有当URG标志置为1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。选项:最常见的选项字段是最长报文大小,又称为MSS(Maximun Segment Szie)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。3.3 UDP的包头格式UDP数据报被封装在一个IP包头内。如图2.5所示。 IP数据报 UDP数据报 IP首部 UDP首部 UPD数据 20字节 8字节 图2.5 UDP数据报封装UDP报头的数据格式如图2.6所示。包头共8个字节。 0 15 16 31 16位源端口号 16位目的端口号 16位UDP长度 16位UDP检验和 数据(261460字节) 图2.6 UDP数据报格式UDP源端口号:16位的源端口号是源计算机上的连接号。源端口和源IP地址作为报文的返回地址之用。UDP目的端口号:16位的目的端口号是目的计算机上的连接号。目的端口号用于把到达目的主机的报文转发到正确的应用程序。UPD长度:信息长度域16位长,告诉目的计算机信息的大小。这一域为目的计算机提供了另一机制,验证信息的有效性。UDP检验和:检验和是一个16位的错误检查域,基于报文的内容计算得到。目的计算机执行和源主机上相同的数学计算。两个计算值的不同表明报文在传输过程中出现了错误。第四章 利用WinPcap函数库函数解析 捕获数据包的以太帧头我们可以利用WinPcap函数库函数解析捕获数据包的以太帧头4.1 原始套接字Winsock是一种标准应用程序编程接口(application programming interface,API),主要用于网络中的数据通信。它是由Microsoft公司开发的。使用Winsock编程接口,应用程序可通过普通网络协议如TCP/IP建立通信。目前,Winsock有两个主要版本,即Winsock1和Winsock2。其中只有Winsock2提供了对原始套接字的支持。因此,无论Windows CE还是老版本的Windows 95(无Winsock2升级),都不能使用原始套接字。利用原始套接字可以访问位于基层的传输协议,如访问网络层的IP数据包,采集网络中传输的数据。另外,使用原始套接字,也可对IP头信息进行操作,如程序员自己构造一个IP数据包并发往网络等等。所有原始套接字都是使用SOCK_RAW这个套接字类型来创建的。原始套接字可以用socket命令或WSASocket调用来实现,但在创建过程中,必须手动设定SOCK_RAW标志。原始套接字虽然是一种强有力的机制,可供我们对基层协议进行操作。但大多数协议(除ATM以外)并不支持原始套接字。4.2 Jpcap类库包Jpcap是一个能够捕获、发送网络数据报的java类库包。这个类库需要Libpcap和原始套接字API提供底层支持。目前,Jpcap在FreeBSD 3.x、Linux RadHat6.1、Solaris以及Microsoft Windows 2000/XP系统上已经做过测试,都能够正常运行,成为一个跨平台的开发工具。Jpcap支持Ethernet、IPv4、IPv6、TCP、UDP、ICMPv4协议。Jpcap运行时需要的系统环境为:Java2工作平台(java2 Runtime Environment)或者Java2 SDK;最新版本的Libpcap(对于UNIX平台)或者(对于Windows平台)。Jpcap是日本人Keita Fujiiy开发的,目前最新版本为2003.4发布的Jpcap0.4版,这个版本的类库拥有1个接口14个类。如:其中JpcapHandler这个接口用来定义分析被捕获数据包的方法;ARPPacket类描述了ARP/RARP包、EthernetPacke类t描述了以太帧包、IPAddress类描述了IPv4和IPv6地址,其中包含了将IP地址转换为域名的方法、JcapSender类用来发送一个数据包。虽然Jpcap能够完成网络数据包的捕获以及数据包的发送,但Jcap相对于WinPcap还不算是一个高效、成熟、完备的网络开发工具。4.3 Libcap与WinPcap函数库 4.3.1 Libpcap与WinPcap简介目前,大多数网络应用程序都是通过被广泛使用的系统原函数(如套接字)来访问网络。这种方法允许在网络上进行简单的数据传送,因为OS处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。然而有时候“简便方法”并不能满足实际需要。因为一些程序为了直接处理网络中的通信数据,要对网络进行底层的访问,所以这需要在没有类似协议栈的实体介入条件下对网络进行原始访问。而Libpcap以及WinPcap函数库就是适用于这种情况的一个函数库。Libpcap是一个系统无关、采用分组捕获机制的分组捕获函数库,用于访问数据链路层。这个函数库为不同的平台提供了一致的编程接口,在安装了libpcap的平台上,以libpcap为接口写的程序、应用,能够自由的跨平台使用。Libpcap在基于BSD系统的监听程序结构中占据主要地位,它隐藏了用户程序和操作系统内核交互的细节。它向用户程序提供了一套功能强大的抽象函数接口,根据用户要求生成过滤指令,管理用户缓冲区,负责用户程序和内核的交互。WinPcap是一个在Windows操作系统下的免费的、公开的用于直接访问网络的系统。它是由libpcap发展而来,它是一个包含了一套与libpcap兼容的捕获数据包的函数库。这套函数库是由加州大学和Lawrence Berkeley实验室及其投稿者联合开发的。WinPcap的目的就是为Win32应用程序提供这种访问方式;它有以下功能:l 捕获原始数据包,包括发送到正在运行的主机上的数据包和在其它主机在共享媒介上交换的数据包。l 过滤器在将数据包发送给应用程序之前按照用户的规定对捕获的数据包进行过滤。l 向网络发送原始数据包。l 对网络通信进行统计。鉴于WinPcap的以上功能,它能够被各种不同的网络分析工具、发现并修理故障工具、安全工具和监听工具使用。依赖于WinPcap的典型工具有:网络和协议分析软件;网络监听软件;网络通信量记录软件;网络数据生成软件;用户机网桥和路由器;网络入侵探测系统;网络扫描软件;网络安全工具。但由于WinPcap可以独立于主机的协议(如TCP-IP协议)进行接收和发送数据包。这意味着WinPcap不能阻塞、过滤或处理本机上其它程序产生的数据:它仅仅能嗅探在网线上传输的数据包。因此,WinPcap不能在traffic shapers、QoS schedulers和个人防火墙这类应用程序中使用。因为对于个人防火墙来说,当前流行的防火墙技术主要过滤型、检测型。个人防火墙通过对所有进出计算机系统的数据包进行检查,获得数据包头的内容,了解数据包的发送地址、目标地址、使用协议、TCP或者UDP的端口等信息,再将检查到的内容与用户设置的规则相比较,根据规则的匹配结果决定是否允许数据包的进出。4.3.2 WinPcap的体系结构下图显示了WinPcap体系结构的各个部分。 应用程序 Wpcap.dll函数库 Packet.dll函数库 用户层NPF设备驱动 内核层 数据包 网络 图4.1 WinPcap体系结构的各个部分。首先,为了获取在网络中传送的原始数据,一个捕获数据包系统就需要绕过协议栈。这就要求程序有一部分要在OS内核中运行,直接与网络接口驱动联系。而这部分正好是依赖于系统的,在我们的解决方案中,将其作为设备驱动来实现,称为Netgroup Packet Filter(NPF)。我们为Windows95/98/ME,WindowsNT4/2000/XP提供了不同版本的驱动程序。这些驱动程序提供了象捕获或发送数据包这类基本的功能,还提供了程式化过滤系统和监听引擎这类较高级的功能。前者可以用来限定捕获网络中的某一类数据,后者可提供比较强大但简单的机制来获取网络中数据的统计数据。 图4.2 WinPcap内核层的基本结构其次,捕获数据包系统必须有一个接口,用户层的应用程序可以通过这个接口来利用内核驱动提供的功能。WinPcap提供了两个不同的库:packet.dll和wpcap.dll。packet.dll提供了一个低层API,这个API能够通过独立于Microsoft操作系统的编程接口函数来直接调用驱动的函数。实际上,不同版本的Windows都提供了不同的内核模块和应用程序之间的接口函数。packet.dll有一套独立于系统的API来处理这些不同。基于packet.dll编写的程序可以不经过重新编译就在各种Win32平台下实现捕获数据包。packet.dll还包含了其他一些函数。它可以进行一些底层的操作,如:获取网络适配器名或动态的加载驱动程序。packet.dll还可以取得一些系统信息,如:主机的MAC地址和一些硬件计数(以太网上冲突次数等等)。packet.dll和NPF都依赖于OS,并且由于Windows95/98和WindowsNT/2000之间OS结构的不同而在不同版本的操作系统上有所不同。Wpcap.dll提供了一套更强大的高层的捕获数据包的函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论