当前位置:Linux教程 - Linux资讯 - TCP/IP原理、基础以及在Linux上的实现(下)

TCP/IP原理、基础以及在Linux上的实现(下)

  3.1 IP数据报头    一个IP数据报由一个头部和数据部分构成。头部包括一个20字节的固定长度部分和一个可选任意长度部分。头部格式如图5所示。  

  点击查看大图

  版本:4位长。记录了数据报对应的协议版本号。当前的IP协议有两个版本:IPV4 和IPV6。    IHL:4位长。代表头部的总长度,以32位字节为一个单位。    服务类型:8位长。使主机可以告诉子网它想要什么样的服务。如下图所示,服务类型域又分为了5个部分。优先权字段是标志优先级的;三个标志位分别代表延迟、吞吐量、可靠性。  

 

  总长:16位。指头部和数据的总长。最大长度是65535个字节。    标识:16位。通过它使目的主机判断新来的分段属于哪个分组,所有属于同一分组的分段包含同样的标识值。    DF:代表不要分段。它命令路由器不要将数据报分段,因为目的端不能重组分段。    MF:代表还有进一步的分段,用它来标志是否所有的分组都已到达。除了最后一个分段的所有分段都设置了这一位。    分段偏移:13位。标明分段在当前数据报的什么位置。    生命期:8位。用来限制分组生命周期的计数器。它在每个节点中都递减,而且当在一个路由器中排队时可以倍数递减。    协议:8位。说明将分组发送给那个传输进程,如TCR、VDP等。    头校验和:16位。仅用来校验头部。    源地址: 32位。产生IP数据报的源主机IP地址。    目的地址:32位。IP数据报的目的主机的IP地址。    可选项:是变长的。每个可选项用一个字节标明内容。有些可选项还跟有一字节的可选项长度字段,其后是一个或多个数据字节。现在已定义了安全性、严格的源路由选择、松的源路由选择、记录路由和时间标记五个可选项。但不是所有的路由器都支持全部5个可选项。    安全性选项说明了信息的安全程度。    严格的源路由选择选项以一系列的IP地址方式,给出了从源到目的地的完整路径。数据报必须严格地从这条路径传送。当路由选择表崩溃,系统管理员发送紧急分组时,或作时间测量时,此字段很有用。    松的源路由选择选项要求分组遍及所列的路由器,但它可以在其间穿过其它的路由器。    记录路由选项让沿途的路由器都将其IP地址加到可选字段之后,这使系统管理者可以跟踪路由选择算法的错误。    时间标记选项像记录路由选项一样,除了记录32位的IP地址外,每个路由器还要记录一个32位的时间标记。同样地,这一选择可用来为路由选择算法查错。    3.2 IP数据报的分段与重组    IP数据报是通过封装为物理帧来传输的。由于因特网是通过各种不同物理网络技术互连起来的,在因特网的不同部分,物理帧的大小(最大传输单元MTU)可能各不相同。为了最大程度的利用物理网络的能力,IP模块以所在的物理网络的MTU做为依据,来确定IP数据报的大小。当IP数据报在两个不同MTU的网络之间传输时,就可能出现IP数据报的分段与重组操作。    在IP头中控制分段和重组的IP头域有三个:标识域、标志域、分段偏移域。标识是源主机赋予IP数据报的标识符。目的主机根据标识域来判断收到的IP数据报分段属于哪一个数据报,以进行IP数据报重组。标志域中的DF位标识该IP数据报是否允许分段。当需要对IP数据报进行分段时,如果DF位置1,网关将会抛弃该IP数据报,并向源主机发送出错信息。标志域中的MF位标识该IP数据报分段是否是最后一个分段。分段偏移域记录了该IP数据报分段在原IP数据报中的偏移量。偏移量是8字节的整数倍。分段偏移域被用来确定该IP数据报分段在IP数据报重组时的顺序。    IP数据报在被传输过程中,一旦被分段,各段就作为独立的IP数据报进行传输,在到达目的主机之前有可能会被再次或多次分段。但是IP数据报分段的重组都只在目的主机进行。    3.3 IP对输入数据报的处理    IP对输入数据报的处理分为两种,一种是主机对数据报的处理,一种是网关对数据报的处理。    当IP数据报到达主机时,如果IP数据报的目的地址与主机地址匹配,IP接收该数据报并将它传给高级协议软件处理;否则抛弃该IP数据报。    网关则不同,当IP数据报到达网关IP层后,网关首先判断本机是否是数据报到达的目的主机。如果是,网关将接收到的IP数据报上传给高级协议软件处理。如果不是,网关将对接收到的IP数据报进行寻径,并随后将其转发出去。    3.4 IP对输出数据报的处理    IP对输出数据报的处理也分为两种,一种是主机对数据报的处理,一种是网关对数据报的处理。    对于网关来说,IP接收到IP数据报后,经过寻径,找到该IP数据报的传输路径。该路径实际上是全路径中的下一个网关的IP地址。然后,该网关将该IP数据报和寻径到的下一个网关的地址交给网络接口软件。网络接口软件收到IP数据报和下一个网关地址后,首先调用ARP完成下一个网关IP地址到物理地址的映射,然后将IP数据报封装成帧,最后由子网完成数据报的物理传输。    ICMP协议  ICMP(Internet Control Message Protocol)-因特网控制报文协议。ICMP主要用于差错信息和控制信息的构造及某些网络信息的获取。ICMP与IP 同属IP层,但ICMP报文是经IP封装后,作为IP数据报发送出去的。不把ICMP作为一个独立的协议层次,是因为ICMP不是上层协议的基础,在概念上构不成一个独立的层次。    ICMP消息包括以下类型:目的不可达、超时、参数问题、源端抑制、重定向、回声请求、回声应答、时间标记请求、时间标记应答。    目的不可达消息用来报告子网或路由器不能定位目的地,或设置了DF位的分组不能绕过"小分组"网络。    超时消息用来报告报文由于计时器为零而被丢弃。    参数问题消息表明在头部字段中发现了非法值。    源端抑制消息用来抑制发送过多分组的主机。当主机收到这个消息,就要减慢发送速度。    重定向消息在路由器发现可能出现了路由错误时发送。    回声请求和回声应答消息用来测试目的是否可达且正常运行。收到回声请求消息,目的端应该往回发一个回声应答消息。时间标记请求和时间标记应答与此类似,只是消息到达时间和应答发出时间应加入应答中,其好处是可以用来测试网络性能。    IP在Linux上的实现    如图6所示,Linux以分层的软件结构实现了TCP/IP协议。BSD套接字由一般性的套接字管理软件INET套接字层支持。INET套接字管理着基于IP的TCP或UDP协议端。在传输UDP数据报时,Linux不必关心数据报是否安全到达目的端。但对TCP数据报来说,Linux需要对数据报进行编号,数据报的源端和目的端需要协调工作,以便保证数据报不会丢失,或以错误的顺序发送。IP层包含的代码需要处理数据报的报头信息,并且必须将传入的数据报发送到TCP或 UDP两者中正确的一层处理。在IP层之下是Linux的网络设备层,其中包括以太网设备或PPP设备等。和Linux系统中的其它设备不同,网络设备并不总代表实际的物理设备,例如,回环设备就是一个纯软件设备。ARP协议提供地址解析功能,因此它处于IP层和网络设备层之间。  

 


[1] [2] 下一页 

                图6 Linux网络分层结构图    1 套接字缓冲区    Linux利用套接字缓冲区在协议层和网络设备之间传送数据。Sk_buff包含了一些指针和长度信息,从而可让协议层以标准的函数或方法对应用程序的数据进行处理。如图7所示,每个sk_buff均包含一个数据块、四个数据指针以及两个长度字段。利用四个数据指针,各协议层可操纵和管理套接字缓冲区的数据,这四个指针的用途如下。    Head:指向内存中数据区的起始地址。Sk_buff和相关数据块在分配之后,该指针的值是固定的。    Data:指向协议数据的当前起始地址。该指针的值随当前拥有Sk_buff的协议层的变化而变化。    Tail:指向协议数据的当前结尾地址。和data指针一样,该指针的值也随当前拥有Sk_buff的协议层的变化而变化。    End:指向内存中数据区的结尾。和head指针一样,Sk_buff被分配之后,该指针的值也固定不变。    Sk_buff的两个长度字段,len和truesize,分别描述当前协议数据报的长度和数据缓冲区的实际长度。  

  32 接收IP数据报    当网络设备从网络上接收到数据报时,它必须将接收到的数据转换为sk_buff数据结构,然后将该结构添加到backlog队列中排队。当backlog队列变得很大时,接收到的sk_buff数据将会被丢弃。当新的sk_buff添加到backlog队列时,网络底层程序将被标志为就绪状态,从而可以让调度程序调度底层程序进行处理。    调度程序最终会运行网络的底层处理程序。这时,网络底层处理程序将处理任何等待传输的数据报,但在这之前,底层处理程序首先会处理sk_buff结构的backlog队列。底层处理程序必须确定将接收到的数据报传递到哪个协议层。    在Linux进行网络层的初始化时,每个协议要在ptype_all链表或ptype_base哈希表中添加packet_type数据结构以进行注册。Packet_type数据结构包含协议类型、指向网络设备的指针、指向协议的接收数据处理例程的指针等。Ptype_base是一个哈希表,其哈希函数以协议标识符为参数,内核通常利用该哈希表判断应当接受传入的网络数据报的协议。通过检查ptype_all链表和ptype_base哈希表,网络底层处理程序会复制新的sk_buff,最终,sk_buff会传递到一个或多个目标协议的处理例程。    3 发送IP 数据报    网络处理代码必须建立sk_buff来包含要传输的数据,并且在协议层之间传递数据时,需要添加不同的协议头和协议尾。    首先,IP协议需要决定要使用的网络设备,网络设备的选择依赖于数据报的最佳路由。对于只利用调制解调器和PPP协议连接的计算机来说,路由的选择比较容易,但是对于连接到以太网的计算机来说,路由的选择是比较复杂的。    对每个要传输的IP数据报,IP利用路由表解析目标IP地址的路由。对每个可从路由表中找到路由的目标IP地址,路由表返回一个rtable数据结构描述可使用的路由。这包括要使用的源地址、网络设备的device数据结构的地址以及预先建立的硬件头信息。该硬件头信息和网络设备相关,包含了源和目标的物理地址以及其它的介质信息。    4 数据报的分段与重组    当传输IP数据报时,IP从IP路由表中找到发送该IP数据报的网络设备,网络设备对应的device数据结构中包含由一个mtu字段,该字段描述最大的传输单元。如果设备的mtu小于等待发送的IP数据报的大小,就需要将该IP数据报划分为小的片断。每个片断由一个sk_buff代表,其中的IP头标记为数据报片断,以及该片断在IP数据报中的偏移。最后的数据报被标志为最后的IP片断。如果分段过程中IP不能分配sk_buff,则传输失败。    IP片断的接收较片断的发送更加复杂一些,因为IP片断可能以任意的顺序接收到,而在重组之前,必须接受到所有的片断。每次接收到IP数据报时,IP 要检查是否是一个分段数据报。当第一次接收到分段的消息时,IP建立一个新的ipq数据结构,并将它链接到由等待重组的IP片断形成的ipqueue链表中。随着其他IP片断的接收,IP找到正确的ipq数据结构,同时建立新的ipfrag数据结构描述该片断。每个ipq数据结构中包含有其源和目标IP地址、高层协议的标识符以及该IP帧的标识符,从而唯一描述了一个分段的IP接收帧。当所有的片断接收到之后,它们被组合成单一的sk_buff并传递到上一级协议层处理。如果定时器在所有的片断到达之前到期,ipq数据结构和ipfrag被丢弃,并假定消息已经在传输中丢失,这时,高层协议需要请求源主机重新发送丢失的信息。

 

来源:赛迪网

(出处:http://www.sheup.com)


上一页 [1] [2] 

 

来源:赛迪网

(出处:http://www.sheup.com)


上一页 [1] [2] [3]