您的位置:首页 > 理论基础 > 数据结构算法

IP数据报格式

2010-02-22 17:14 323 查看
IP首部:指的是下图中4位版本字段一直到选项(如果有)字段部分,不包括数据。

首先让我们认识一下IP数据报格式,如下图:



版本:4位,标识IP版本号。目前有IPv4、IPv6。我们目前所用的IP协议基本都是IPv4版本。

首部长度:4位,度指的是首部占32bit字的数目,包括任何选项。由上图可知首部所占字节数为(4+4+8+16+16+3+13+8+8+16+32+32+0) = 160bit,正好是32bit的5倍,所以首部长度最小为5。如果选项字段有其它数据,则这个值会大于5。由上面也可知IP首部最小长度为20字节,最大长度为(2的4次方-1)*32/8 = 60字节;

服务类型:8位。

       优先权:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)。
        TOS:   4位,分别表示最小延时、最大吞吐量、最高可靠性、最小费用。如果4位TOS子字段均为0,那么就意味着是一般服务。



    未使用:   1位,必须置0。
总长度:16位,总长度指首部和数据之和的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道I P数据报中数据内容的起始位置和长度。由于该字段长1 6比特,所以I P数据报最长可达6 5 5 3 5字节。

标识:16位,唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。在分片和重组技术中将会用到。

标志:3位,但目前只有2位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

        保留位: 1位
        DF字段:1位,取值:0(允许数据报分段)、1(数据报不能分段)
        MF字段:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)

偏移:13位,占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

生存时间:8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。一般可以理解为经过路由器的最大数目。

协议:8位,占8位,协议字段指出此数据报携带的数据是使用何种协议(上层协议),以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。协议可包括TCP、UDP、TELNET等。
1=ICMP,2=IGMP,3=TCP,17=UDP...

首部校验和:16位,首部检验和字段是根据I P首部计算的检验和码。它不对首部后面的数据进行计算。I C M P、I G M P、U D P和T C P在它们各自的首部中均含有同时覆盖首部和数据检验和码。为了计算一份数据报的I P检验和,首先把检验和字段置为0。然后,对首部中每个16 bit 进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份I P数据报后,同样对首部中每个16 bit 进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该 为全1。如果结果不是全1(即检验和错误),那么I P就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

源IP地址:32位,发送IP的主机地址。

目的IP地址:32位,数据发往的IP主机地址。
 
 
下面,我们再自己根据上面的IP数据报格式,定义一个IP数据结构:
typedef struct ip_hdr
{
    unsigned char ip_verlen;          // 8bit 4版本 + 4首部长度
    unsigned char ip_tos;               // 8bit 服务类型
    unsigned short ip_totallength;   // 16bit 总长度(字节数)
  
    unsigned short ip_id;                 // 16bit 标识
    unsigned short ip_fragoffset;     // 16bit 3bit标志 + 13bit片偏移,
   
    unsigned char ip_ttl;                  // 8bit 生存时间(TTL)
    unsigned char ip_protocol;       // 8bit 上层协议
    unsigned short ip_checksum;     // 16bit 首部检验和
   
    unsigned int   ip_srcaddr;          // 32bit 源IP地址
   
    unsigned int   ip_destaddr;        // 32bit 目的IP地址
} IPV4_HDR, *PIPV4_HDR, FAR * LPIPV4_HDR
上面的结构可以很清楚的看出32 * 5 = 60bytes.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息