2-ipv6基础知识之-数据包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-ipv6基础知识之-数据包相关的知识,希望对你有一定的参考价值。
参考技术A IPv4 包头由固定20字节的包头与可变长的选项组成:版本(Version)域, 长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)
IHL用4位来表示。
由于头部的长度是不固定的,所以头部的IHL域指明了该头部有多长(以32位字的长度为单位)。
IHL的最小长度为5,这个时候表明没有可选项(Option),此4位域的最大值也就是15,也就是说头部的最大长度为15*(32/8) = 60字节,因此可选项(Option) = 60 - 20 = 40字节,可选项的内容最大为40字节。对于某些选项,比如记录一个分组沿途路径的选项,40字节往往太小了,这就使得这样的选项其实没有什么用处。
服务类型(Type of Service)域, 长度8比特。
8位按位被如下定义 PPP DTRC0
PPP:定义包的优先级,取值越大数据越重要
DTRCO
总长度(Total Length)域, 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
标识(Identification)域, 该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。是让目标主机确定一个新到来的分段是属于哪一个数据报的。同一个数据报的的所有分段都有相同的Identification值。
接下来是未使用的位。然后是两个1位域。
DF代表不分段(Don't Fragment),这是针对路由器的一个命令,它让路由器不要分割该数据报,因为目标主机可能无法将分片重新组合回原来的数据报。例如,当一台计算机启动的时候,它的ROM可能向网络请求一个包含内存映像的一个数据报。在数据报中标记了DF位之后,它就知道该数据将作为一个整体到达接收方,不过这意味着该数据报必须避开最优路径的小分组网络,而不得不走次优的的路径。所有的机器都要求能接受576字节或者更少的分段(4.5k)。
MF代表更多的分段(More Fragment)。除了最后一个分段以外,其它所有的分段都必须设置这一位,它的用途是,接收方可以知道什么时候一个数据报的所有分段已经到达了。
分段偏移(Fragment Offset)(13位域)域指明了该分段在当前数据报中的什么位置上。除了一个数据报的最后一个分段以外,其他所有的分段必须是8字节的倍数,这里的8字节是基本的分段单位(64bit大小)。由于该域有13位,所以每个数据报最多可以有2^13 = 8192个分段,因此,最大的数据报长度为8192*8 = 65536字节,比Taotal length域还要大1.
TTL(Time to live)域(8位域), 当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
当网络层组装完成一个完整的数据报之后,它需要知道该如何对它进行处理。协议(Protocol)域指明了该将它交给哪一个传输进程。TCP是一种可能,UDP或者其他协议也是一种可能。协议的编号是整合Internet全球统一的。
头部校验和(Header checksum)域只校验头部。这样的校验和对于检测“因路由器中的坏内存而产生的错误”非常有用。因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。其算法是这样的:当数据到达时,所有的16位(半字)累加起来,然后再取结果的补码。该算法的意图是,当数据到达之后,Header checksum的计算结果应该为0.该算法比常规算法更加稳定。请注意,在每一跳上,Header checksum域必须重新计算,因为至少有一个域总是要改变的(即Time to live),但是通过一些技巧可以加速计算。
都用32为表示。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变
选项(Option)域的设计意图是:主要用于测试; 允许后续版本的协议包含一些原来的设计中没有出现的信息;允许实验人员试验新的想法;避免为那些不常使用的信息分配头部域。选项是变长的,每一个选项的第一个字节是一个标识码,它标明了该选项。有的选项后面跟着1个字节的选项长度域,然后是一个或多个数据字节。Options域被补齐到4字节的倍数。
IPv6 数据报包括一个主首部和0 或多个扩展首部。IPv6 包头结构如下图所示。
IPv6包头长度固定为40字节,去掉了IPv4中一切可选项,只包括8个必要的字段,因此尽管IPv6地址长度为IPv4的四倍,IPv6包头长度仅为IPv4包头长度的两倍。
4位,IP协议版本号,值 = 6。
8位,指示IPv6数据流通信类别或优先级。功能类似于IPv4的服务类型(TOS/QOS)字段。 (通往目标节点的过程中,这个字段的值可能会被修改)
20位,IPv6新增字段,标记需要IPv6路由器特殊处理的数据流,这个字段是为了给实时数据报交付和QoS提供更多的支持。该字段用于某些对连接的服务质量有特殊要求的通信,诸如音频或视频等实时数据传输。在IPv6中,同一信源和信宿之间可以有多种不同的数据流,彼此之间以非“0”流标记区分。如果不要求路由器做特殊处理,则该字段值置为“0”。 flow label最初是28bit,逐渐修改至rfc2460的20bit。flow label通过伪随机算法生成,介于1至fffff之间。如果一组数据流具有相同的源地址、目的地址、hop-by-hop和routing,那么这组数据流可能共享flow label。由此可见,IPv6结点可以仅通过flow label,不检查其它属性值,即可知道如何处理和转发这组数据流。
16位负载长度。负载长度包括扩展头和上层PDU,16位最多可表示65535字节负载长度。超过这一字节数的负载,该字段值置为“0”,使用扩展头逐个跳段(Hop-by-Hop)选项中的巨量负载(Jumbo Payload)选项。 总而言之,该字段的值=报文总长度-40
8位,指明识别紧跟在IPv6头后的包头类型,如扩展头(有的话)或某个传输层协议头(诸如TCP,UDP或者ICMPv6)。
由下图可以看出,因为可以有多个扩展头,一个扩展头中还有Next Header字段,用于指明下一个扩展头或者传输层的类型。(扩展可以有多个,但是上层数据只能有一个)
常见的Next Header值:
8位,类似于IPv4的TTL(生命期)字段。与IPv4用时间来限定包的生命期不同,IPv6用包在路由器之间的转发次数来限定包的生命期。包每经过一次转发,该字段减1,减到0时就把这个包丢弃。
S
128位(16字节),发送方主机地址。
128位,在大多数情况下,目的地址即信宿地址。但如果存在路由扩展头的话,目的地址可能是发送方路由表中下一个路由器接口。
参考文档《深入解析IPv6》
IPv6之地址冲突的那段“网事”!
前段时间在用户那里部署IPv6,群里有好多人反映,一开机就提示IP地址冲突,查看系统日志,发现提示IPv6地址冲突。不应该啊!所有的IP地址都是通过DHCP服务器下发的,怎么会冲突呢?于是决定抓包分析原因,在抓包过程中发现故障不是每次都能复现,所以一直没有抓到什么有价值的包,抓包一事就此告吹了。
好几个人盯着用户反馈上来的图片,不停地对比着,包括IPv6地址、物理网卡的MAC地址……等等,终于有所发现,这些IP地址冲突的用户,相互冲突的两台设备,他们的DUID是相同的。这一发现让所有人感觉,事情的真相已经浮出水面。
DUID是什么?在哪里查看?下面先以一张图看一下DUID:
那么DUID究竟是什么?
DUID是DHCP 唯一标识符(DHCP Unique Identifier),每个服务器或客户端有且只有一个唯一标识符,服务器使用DUID来识别不同的客户端,客户端则使用DUID来识别服务器。
后来查看资料发现:
This characteristic of DHCPv6 DUIDs has caused some interesting
challenges given the popularity of cloned and/or virtual OSes. OS clones
are likely to have identical DUIDs. One would have to manually change
it before bringing the host online in a DHCPv6 environment or the DHCPv6
server will assume that DHCPv6 packets from different hosts with the
same DUID are in fact all the same host.
上面最主要的部分我已经用红色标红了,大体意思主要就是说系统克隆会导致主机具有相同的DUID,而具有相同DUID的主机会被认为是同一台主机。
那么针对这种情况该如何处理呢?
其实,微软已经给出了解决方案,在注册表中找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesTCPIP6Parameters删除Dhcpv6DUID这个键值,重启系统后电脑会重新计算出一个DUID,这样就不会出现DUID相同的情况了。
后来用户写了一个批处理用于删除Dhcpv6DUID这个键值,文件下发下去执行后,再没有用户反馈IP地址冲突的情况了。至此问题解决!
*********************************************************************************
总结:
1、在故障面前一定要擦亮眼睛,不要放过一丝一毫可能出现问题的点。
2、故障处理的过程就是学习的过程,是经验积累的过程。
*********************************************************************************
以上是关于2-ipv6基础知识之-数据包的主要内容,如果未能解决你的问题,请参考以下文章