ipv6和ipv4(1)

20174年7月5日

参考资料:

《Linux高性能服务器编程》       

linux-2.6.32源代码

《TCP/IP详解》(卷一)

         网络编程最重要的一个环节就是要理清TCP/IP传输协议栈。而协议栈的学习自然的少不了最关键的一个环节就是协议的分析。

首先是IPv4的首部信息:

如果涉及到编程在linux下/usr/include/netinet/ip.h中对首部字段有相关的定义。

         4位版本号(IPv4则值为4)

         4位首部长度(注意4位表示的最大值为15,而该字段用4字节表示一个字所有首部长度最大值为60这也说明了扩展部分【也就是选项部分】最大值为40个字节)

         8位服务类型

         16位总长度:整个IP数据报长度,以字节为单位。所以最大长度应该是65535字节。由于MTU的限制,超过MTU的部分将会涉及到分片。针对分片后面也会有相关的介绍。

         16位标识:唯一的标识一个主机发送的数据报,需要注明的是这个数值由系统开始随机分配,后面每发送一个数据报其值都会加1.

         3位标志:第一位保留,第二位DF表示禁止分片。如果该位设置则不能对数据包分片,如果数据包长度超过MTU则会直接丢弃并产生ICMP差错报文。第三位MF表示更多分片除了最后一个数据报,其他分片都要置为1.

         13位片偏移:分片相对原始IP数据报开始处的片偏移。(实际偏移值应该是左移三位*8取得,所以每个IP分片的数据长度必须是8的整数倍)

         8位生存时间。

         8位协议:区分上层协议

         16位首部校验和

         32位源和目的IP地址。

         选项字段为可边长信息部分,最多包含40个字节,其中包括,记录路由、时间戳、松散源路由选择、严格源路由选择。

IP模块的基本工作流程如下:(摘自博客图:http://book.51cto.com/art/201306/400253.htm)


         通过上图可以清晰的理解和分析清楚IP模块的具体工作流程。而针对地址耗尽的问题提出了IPv6,下图中贴出ipv6的首部报文格式:


         4位版本号:与ipv4 的版本号一样,ipv6版本号的值为6

         12位通信类型:指示数据流通信类型或者优先级和ipv4的TOS字段类似

         20位流标签:用于对连接的服务质量有一定要求的通信,如语音、视频等。

         16位净荷长度:除ipv6首部以外所有数据部分和扩展头部数据长度之和。

         8位下一个包头:指出记下来的报头类型

         8位跳数限制:类似于RTT值。

注意:扩展头部没有详细说明,该部分内容可以查阅相关资料。

总结:

         与ipv4不同在于ipv6首部没有选项字段,而且首部长度固定为40个字节(ipv4如果没有选项字段则首部固定长度为20字节)而且ipv6和ipv4并没有包含关系,两者是两种完全不同的协议。在操作系统中两种协议也是各自独立的运行。(这也是为什么使用双协议栈比较占系统资源的原因)在以太网帧的封装中ipv4协议类型值为0X0800而ipv6的以太网封装则为0X86dd。在编程过程中如果要对协议进行解析,可以通过该字段区分。这也进一步说明了两种协议的独立性。

 

你可能感兴趣的:(TCP/IP传输协议栈,网络体系结构)