1、IP协议概述

       IP是TCP/IP协议中最为核心的协议,所有的tcp、udp、icmp、igmp等都是以IP数据报格式传输的,但它提供的是不可靠、无连接的数据包传输服务。

  • 不可靠表示它不能保证IP数据包能成功的到达目的地
  • 无连接 表示ip并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的。
    普通的IP首部长为20个字节,除非含有选项字段。

2、IPv4首部结构

(1)版本号:占4位,就是IP协议的版本,通信双方的IP协议版本必须要达到一致,IPv4的版本就是4。

(2)首部长度:占四位,因为长度为四比特,所以首部长度的最大值为1111,15,又因为首部长度代表的单位长度为32个字(也就是4个字节),所以首部长度的最小值就是0101,当然,也确实如此,大部分的ip头部中首部字节都是0101.也就是5*4=20个字节,如果是最大值15的话,ip首部的最大值就是60个字节。所以,ipv4首部长度的最大值就是60。

(3)服务类型(Type Of Service,TOS):3位优先权字段(现已被忽略)+4位TOS字段+1位保留字段(须为0)。4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务。

(4)总长度:指整个IP数据报的长度(即:IP数据报中首部和数据的总和的长度),占16位,单位为字节,故IP数据报的最大长度为65535字节(2的16次方)。由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP分片数据报的长度远远没有达到最大值。

下来的3个字段则描述如何实现分片:

(5)标识:唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值。

(6)标志:位1保留,位2表禁止分片(DF),若设置了此位,IP模块将不对数据报进行分片,在此情况下若IP数据报超过MTU,IP模块将丢弃数据报并返回一个ICMP差错报文;位3标识分片(MF),表示后面还有若干个数据报,除了数据报的最后一个分片,其他分片都要把它设置为1。

(7)片偏移:分片相对原始IP数据报数据部分的偏移。实际的偏移值为该值左移3位后得到的,所以除了最后一个IP数据报分片外,每个IP分片的数据部分的长度都必须是8的整数倍。

(8)生成时间TTL:数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环。

(9)协议:区分IP协议上的上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17。

(10)头部校验和: 由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏.。计算方式如下:

       在发送端的时候,将校验和全部设置为0,然后把数据报首段数据全部进行反码相加,得到的值为校验和,放入首部的校验和字段;然后在接收端的时候,将数据报首段数据和校验和一起全部反码相加,最后若是得到零,则保留,若不是零,则说明数据报在传输过程中发生了改变,则丢弃该数据报。

(11)IP源地址:占32位,将IP地址看作是32位数值则需要将网络字节顺序转化位主机字节顺序。转化的方法是:将每4个字节首尾互换,将2、3字节互换。

(12)目的地址:也占32位,转换方法和来源IP地址一样。

(13)选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:
      a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径
      b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间
      c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器
      d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器
      e. 上层协议(如TCP/UDP)的头部信息

        在IP协议中,IP协议是面向非连接的,所谓的非连接就是在数据的传递过程中,不需要检测网络是否连通,所以是不可靠的数据报协议。IP协议主要用于在主机之间的寻址和选择数据包路由。

3、IPv6首部结构

与IPv4相比,IPv6的头部做了如下修改:

(1)取消了首部长度,因为IPv6的首部长度是固定的40个字节。

(2)取消了服务类型 ,因为流标号和优先级结合起来实现了服务类型的功能。

(3)取消了总长度字段,改用为有效载荷长度,有效载荷长度就是后面的扩展首部加上数据报中的数据。

(4)取消了标识,标志和片偏移,因为这些功能都包含在了扩展首部里面。

(5)取消了协议字段,改用为下一个首部,功能不变,这样更容易理解。

(6)取消了生存时间TTL,改用为最大跳转数,功能不变。

(7)取消了首部效验和,这样加快了路由器对数据报的处理速度,在数据链路层中,当我们发现有差错的帧就会抛弃,在运输层中,在udp中,当发现有差错就会抛弃,在tcp中,当发现有差错就会重传,直到传送到目的进程为止。因此在网路层的检测就可以精简掉。

(8)取消了选项字段,功能归并在了扩展首部上。

 

参考链接:

https://blog.csdn.net/qq_29344757/article/details/78570272

https://blog.csdn.net/qq_42058590/article/details/82918678

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐