IPV4包头
图示
解释
-
version最是简单,保留了四个比特,16种变化,但当前只有两种变化,不是4就是6,如果是ipv4这个字段那这个字段就是0100,如果是ipv6这个字段就是0110.
-
header length有点意思,它的意思说是IP头部的长度,它占了四位,能表示最大十进制数是15,即15位,每一位又代理4个字节,也就是说头部最大可以有60个字节。为什么头部的长度还需要强调呢?因为ipv4头部的长度并不是固定的,所以需要强调,不是说ipv4的包头长度是20个字节吗?这种说法其实并不准确,正确的说法是IP头部的长度至少是20个字节,最大可以变成60个字节。
正是因为首部不固定,所以需要明确指定头部有多少字节,如果头部的字节数固定了,那就不用指定了,在IPV6当中,头部固定字节是60个字节,无需指定,就是这么大,所以在IPV6的报文当中就没有header length这个字段。
IPV4头部最大只有60个字节,也就是说是有上限的,是有可能不够用的,在IPV6里面也改进了这一点,在IPV6里面固定40个字节的包头,但是包头之外可以有无限个扩展包头。
-
differentiated services field,区分服务,长度是8个比特,这是用来干什么的呢?可以配置计算机的特定程序在这个字段添加一个标志,然后再配置网络设备让其遇到这个标志的数据包之后在带宽比较紧张的情况下,优先处理这带有这种标志的报文,这就是区分服务,因为这种技术能保证服务质量(服务质量又简称是QOS),这个字段在旧的标准当中叫服务类型,但实际上一直没有被使用过,后来改名为区分有服务(differentiated services),意为在只有在区分服务的时候,这个字段才会起作用,这个字段有8个比特,也有可能不够用,所以的IPV6当中设置了个比较长的字段用做区分服务。
-
total lengeth,总长度指IP首部和数据之和的长度,这存在的意思就是用其减去header length从而运算出数据部门的长度,在ipv6当中也有改进,直接明确数据部分的大小,这个字段一共16位,所以是65535个字节,这么大的数据包,其实是很少遇到的。链路层当中有规定,最大能封装的数据包大小是1500个字节,遇到这样的话,网络层会对其进行分片,既然链路层不允许有这么大的数据包,但是网络层规定最大可以到达这么大就没什么意思了,如果规定最大可以到1500个字节就正好,考虑到ipv4的设计人员也是赶鸭子上架头一回,可以理解,可以理解。
-
标识、标志、片偏移都是用来将拆分后的数据包进行重组时使用的
-
TTL,用来防环的,每过一个路由设备就减少一跳,直接到消耗完毕。
-
协议字段指明封装的报文是什么协议,即指明上层协议,目的是以目的主机知道将报文交给哪个部分处理,原本我认为这里写交给哪个上层协议处理,觉得不妥,为什么?因为像ICMP、ICMP、TCP、UDP、EGP、IGP、IPV6、ESP、OSPF都是和IP同等的协议,并不是上层协议。
-
校验和,只校验包头部分,ipv6里面没有这个字段,因为当初设计的这个字段的时候,基础设施还不完善,可能会因为电的原因丢包什么的,现代不太可能发生这种情况,所以在IPV6里面就取消这个字段,取消了之后还能减少资源的消耗,因为计算校验和也需要浪费一定的资源。
-
padding 填充,如果包头的首部大小不是4字节的位数时,就在这个字段里面加以填充,因此数据部分永远是从4字节的整数倍开始。