31 0
|----|----|------|--|-------------------|----------
|ver |ihl | -tos | -| tot_len |
|----|----|------|--|-------------------|
| id | frag_off -|
|---------|---------|-------------------|
| ttl |protocol | check | 20 Bytes
|---------|---------|-------------------|
| saddr |
|---------------------------------------|
| daddr |
|---------------------------------------|----------
| |
-| options | 40 Bytes
| |
|---------------------------------------|
IPv4 (Internel协议)头部
这里对IPv4和IPv6头部的一些常用的重要字段进行整理总结,没做出解释的是一些不常用到的字段,有兴趣可以自行查阅。
MAC header | IPv4 header | Data ::: |
1. IPv4 header:
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
· Version:IP版本号4 ;
· IHL: IP 头部长度,以字节表示;
· Total Length:整个IP报长度,包含IP头部和数据,以字节表示 ;结合IP头部长度便可确定IP报数据部分的开始和结束;
· TTL:IP数据包生存周期,通常每经过一次路由该值就会被减一;
· Protocol:表示传输层是哪种协议,该值有IANA统一规定(http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)
· Source/Destination IP address: 消息的源/目的IP地址,这两地址不会随着消息的路由而发生变化。
和IPv4数据报分片相关的Field:
首先接受为何要分片,以太网规定网络间传输的MTU为1500个字节,超过1500个字节的IP报就需要被分片;此外不同的链路层(Token Ring,FDDI…)规定的MTU值是不同的,在一个IP报从源地址送到目的地的过程中可能需要经过各种不同的网络,所以即使在以太网里面不分片,在其他网络里面可能被分片。
· Identification: 源主机每发出一个数据包就会为该数据包分配一个唯一的Identification值,通常是依次递增的方式分配;加入IP报在某个路由上需要分片,则 Identification会被复制到每一个分片的IP头中。
· Flags:一共有三个bit,第一个bit目前不用,始终为0;第二个bit为0表示允许分片;为1表示不允许分片;第三个bit为0表示这是最后一个IP报分片,为1表示后面还有更多的IP报分片;
· Fragement Offset:表示该分片距离原始IP数据包的偏移字节数;
· Total Length:IP报被分片后,该值需要被更新为新分片的总长度;
MAC header | IPv6 header | Data ::: |
2. IPv6 header:
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Source address ::: | |||||||||||||||||||||||||||||||
Data ::: |
· Version:IP版本号6 ;
· Payload Length:由于IPv6的基本头部的长度是固定的,所以只需要记录Payload的长度即可定位一个IP数据包的结束,这里的Payload包含IPv6的扩展头部。
· Hop Limit:和IPv4中的TTL作用一致;
· Source/Destination IP address: 消息的源/目的IP地址,格式变为IPv6的IP地址格式;这两地址不会随着消息的路由而发生变化。
· Next Header:相当于IPv4中的protocol域,标识上层协议(协议的标识值与IPv4兼容);此外的另一个作用是标识IPv6的扩展头部,目前IPv6定义了7中扩展头部,每一中扩展头部都有一个数值来标识,比如基本头部中的Next Header中的值是44,表示基本头部后面紧跟一个分段扩展头部;
0 | 逐跳头 |
43 | 选路头( R H ) |
44 | 分段头( F H) |
51 | 身份验证头( A H ) |
52 | 封装安全性净荷( E S P ) |
59 | 没有下一个头 |
60 | 目的地选项头 |
扩展头部的基本结构如下:
扩展头部的第一字节也是Next Header,作用同基本头部中的Next Header,IPv6除了基本头部之外可以带多个扩展头部,如果带有扩展头部则基本头部中的Next Header指示第一个扩展头部类型,否则指示传输层的协议类型;如果带有多个扩展头部,则扩展头部中的Next Header依次指示下一个扩展头部类型,最后一个扩展头部的Next Header指示传输层的协议类型;如下图所示:
扩展头部的第二个字节是该扩展头部的长度,依此可找到该扩展头部的结束位置;某些类型的扩展头部(比如,分段扩展头部)长度是固定的,则该字节作为保留字节不用。
IPv6的分片:
IPv6对IPv4的分片进行了以下主要改进:
1) IPv6只允许源节点对数据包进行分片,不允许中间路由分片,这样一来一个数据包如果需要分片则只进行一次分片即可;源主机为了判断是否需要分片,需要获取路径MTU;
2) IPv4的头部有些字段只和分片有关系,也就是说,在无需分片的时候,这些字段是没有用的,IPv6对此进行了改进,只有在需要分片的时候,才加一个“分段扩展头部”,把和分片相关的信息放到这个扩展头部中,从而提高了传输效率。
分段扩展头部结构:
· 分段偏移值:与 I P v 4的分段偏移值字段很相似。此字段共 1 3位,以8字节为单位,表示此包(分段)中数据的第一个字节与原来整个包中可分段部分的数据的第一个字节之间的位置关系。换言之,若该值为1 7 5,表示分段中的数据从原包的第1 4 0 0字节开始。
· M:此位表示是否还有后续字段。若值为 1,表示后面还有后续字段;若值为 0则表示这是最后一个分段。
· 标识:该字段与I P v 4的标识字段类似,但是为3 2位,而在I P v 4中为1 6位。源节点为每个被分段的I P v 6包都分配一个3 2位标识符,用来唯一标识最近 (在包的生存期内)从源地址发送到目的地址的包。
注意:整个I P v 6包中只有部分可以被分段,可分段的部分包括:净荷和只能在到达最终目的地时才处理的扩展头。对于 I P v 6头和在发往目的节点的途中必须由路由器处理的扩展头,如选路头或逐跳选项头,则不允许进行分段。