IP协议是在TCP/IP协议模型中的重要组成部分,目前我们使用最多的是IPv4协议,IPv6协议的用户量也在慢慢增加,苹果在几年之前就已经开始支持IPv6协议了。我们先来了解一下IPv4和IPv6协议,然后看下他们的不同,以及从IPv4到IPv6的过渡阶段使用方案。
IP协议的主要功能包括寻址和分段。
IP可以根据数据包包头中包括的目的地址将数据包传送到目的地址,在此过程中IP负责选择传送的道路,这种选择道路称为路由功能。如果有些网络内只能传送小数据包,IP可以将数据包重新组装并在报头域内注明。
IPv4协议
来一张图,看一下IPv4协议的数据报格式,主要就是对头部的学习了解。
![](https://i-blog.csdnimg.cn/blog_migrate/554f7226ad86628340fb58df00464e90.png)
数据报是一个可变长分组,由两部分组成:头部和数据。头部长度可由20~60个字节组成,该部分包含有与路由选择和传输有关的重要信息。头部的字段含义如下:
1.版本(4位):版本占了4位,最大值为15,是协议版本号的定义,IPv4的话版本号就是4,IPv6的话版本号就是6。
2.首部长度(4位):首部长度占了4位,最大值是15,不过这个数字代表的含义是在整个头部中含有的32位字长的数量,首部长度的最小值为5,最大值为15。由此根据计算可得整个头部的最小值为5 * 32位 = 5 * 4字节 = 20字节,最大值为 15 * 32位 = 15 * 4字节 = 60字节。
3.区分服务(TOS)(4位):该字段定义上层协议对处理当前数据报所期望的服务质量,并对数据报按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型,最后1位没有定义。这些8位字段用于分配优先级、延迟、吞吐量以及可靠性。(想具体了解TOS的具体使用规则及位控制请移步文末扩展部分。)
4.总长度(16位):该字段定义整个IP数据报的字节长度,包括协议头部和数据。其最大值为65535字节。以太网协议对能够封装在一个帧中的数据有最小值和最大值的限制(46~1500个字节)。过大的数据需要进行切片传输。
链路层的帧格式中的数据字段的最大长度称为最大传送单元MTU(Maximum Transfer Unit)。当数据包封装成链路层的帧的时候,该数据报的头部+数据的长度不可以超过MTU的最大长度,超过的需要进行切片传输。
5.标识(16位):该字段的值由发送到分配,如果该数据报需要进行切片分段的话,每一段的标识位的值都是一样的,方便接收端收到分段的数据后进行组装。
6.标志(3位):该字段占3位,但是只有前两位才有意义:
最低位为MF (More Fragment),当MF=0的时候,表明该数据报已经是分段传输的最后一段报文,当MF=1的时候说明后面还有分段报文需要拼接。
中间位为DF(Don’t Fragment),当DF = 0的时候说明该报文不允许切片,=1的时候可以进行切片分段传输
7.片位移(13位):标记了该段报文在原始报文中的位置,方便接收端进行拼接操作。片位移以8个字节为偏移单位,所以对数据包进行分段操作的时候一定是以8个字节为单位进行分段的。如果最后一个分段不足8个字节的话会进行填充。
8.生存时间TTL(8位):该字段定义为路由器跳数,指的是在传输的过程中最多可以经过多少个路由器进行转发,最大值为255(2的8次方 - 1),每经过一次路由器跳转这个值就会被-1,当该值为0的时候路由器会将该数据报丢弃。该值存在的意义是防止无法交付的资源在路由里无限跳转占用网络资源。
9.协议(8位):表示在传输层使用哪种协议进行封装的(比如17代表UDP,6代表TCP,1代表ICMP),这样接收方的网络层可以知道使用何种协议来对数据进行解析。
10.首部校验和(16位):该字段帮助确保IP协议头的完整性。由于某些协议头字段的改变,这就需要对每个点重新计算和检验。计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分,将各部分相加,再将计算结果取反码,插入到校验和字段中。当接收方接收到数据报后,也对其首部进行校验计算,如果结果与“首部校验和”的值不同,就丢弃收到的数据报。
11.源地址(32位):源主机IP地址,在整个传输过程中保持不变。将IP地址看作是32位数值则需要将网络字节顺序转化位主机字节顺序。转化的方法是:将每4个字节首尾互换,将2、3字节互换。
12.目的地址(32位):目的主机IP地址,在整个传输过程中保持不变。
13.可选字段:长度可变,如果选项存在的话,它在IPv4分组中紧跟在基本IPv4头部之后。实际应用中用到的很少(想了解的看文末扩展吧)。
14.填充:IP头是以32bit字长为单位,有时需要填充来实现。
15.数据部分:从传输层封装过来的数据。
IPv6协议
![](https://i-blog.csdnimg.cn/blog_migrate/5cc5247d01270c235ef4a031a502e91e.png)
IPv6的很多字段含义和IPv4是一样的
各字段含义:
1.版本号(4位):值为6
2.流量等级(8位)(Traffic Class (流量类别)):该节段代替了IPv4中的Type of Service字段,它有助于处理实时数据以及任何需要特别处理的数据。发送节点和转发路由器可以使用该字段来识别和分辨IPv6数据包的类别和优先级。
3.流标签(20位):用来标识同一个流里面的报文
4.载荷长度(16位):单位为字节长度,该长度包括了IPV6扩展头的长度
5.下一报头(8位):该字段用来指明报头后接的报文头部的类型,若存在扩展头,表示第一个扩展头的类型,否则表示其上层协议的类型,它是IPv6各种功能的核心实现方法(详细了解请看文末扩展)。
6.跳数限制(8位):该字段类似于IPv4中的TTL,每次转发跳数减一,该字段达到0时包将会被丢弃
11.源地址(128位):源主机IP地址
12.目的地址(128位):目的主机IP地址
【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料;进群私聊群管理领取 内核资料包(含视频教程、电子书、实战项目及代码)
![](https://i-blog.csdnimg.cn/blog_migrate/c1a744f86a073bbed3ec2e86abd69ad9.jpeg)
内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料
学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
IPv6和IPv4的区别:
1.取消了首部长度,因为IPv6的首部长度是固定40个字节。
2.取消了服务类型,因为流标号和优先级结合起来实现了服务类型的功能。
3.取消了总长度字段,改用为有效载荷长度,有效载荷就是后面的扩展首部加上数据报中的数据。
4.取消了标识,标志和片偏移,因为这些功能都包含在了扩展首部里面。
5.取消了协议字段,改用为下一个首部,功能不变,这样更容易理解。
6.取消了生存时间ttl,改用为跳数限制,功能不变,这样更容易理解,更形象了。
7.取消了首部效验和,这样加快了路由器对数据报的处理速度,在数据链路层中,当我们发现有差错的帧就会抛弃,在运输层中,在udp中,当发现有差错就会抛弃,在tcp中,当发现有差错就会重传,直到传送到目的进程为止。因此在网路层的检测就可以精简掉。
8.取消了选项字段,功能归并在了扩展首部上。
IPv6和IPv4相比的改进:
1.IPv6的地址大小增加到128位。这解决了IPv4地址空间有限的问题,并提供了一个更深层次的编址层级以及更简单的配置
2.IPv6的报头固定为40字节。这刚好容下8字节的报头和两个16字节的IP地址(源地址和目的地址)。IPv6的报头中去掉了IPv4报头中的一些字段,或者是将其变为可选项。这样,数据包可以在低处理消耗下更快地进行操作。
3.对于IPv4,选项集成于基本的IPv4报头中。而对于IPv6,这些选项被作为扩展报头(Extension header)来处理,是可选的。
4.IPv6指定了固有的对身份验证的支持,以及对数据完整性和数据机密性的支持。
5.属于同一传输流,且需要特别处理或需要服务质量的数据包,可以由发送者进行标记。实时服务就是这种应用的典型例子。
6.即使IPv6报头的总长度是默认的IPv4报头的两倍长,达到了40字节,但它实际上还是被简化了的,因为报头的绝大部分被两个16字节的IPv6地址占据。这样,只剩8个字节可供其他报头信息使用。
7.数据包的报头越简单,处理过程就越快。IPv6采用新方法来处理选项,显著地改善了处理速度,保证对数据报文的高速转发和较低的延时,提高了QoS。
IPv6的表示方式
IPv6的地址长度为128位,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,采用十六进制表示。IPv6有3种表示方法。
一、冒分十六进制表示法
格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
这种表示法中,每个X的前导0是可以省略的,例如:
2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
二、0位压缩表示法
在某些情况下,一个IPv6地址中间可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → ::
三、内嵌IPv4地址表示法
为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1与::FFFF:192.168.0.1就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用 [9]
IPv4和IPv6的协议不同,是无法 互相通信的,那么在过渡时期如何进行使用呢?
(该段落图片和文字均引用自 IT知识大全:IPv6详解)
1、双协议栈技术
双协议栈技术是指在路由器或者主机上同时运行IPv4和IPv6协议。其中大多数应用服务器采用的为双栈主机的解决方案,严格意义上它并不是解决IPv4与IPv6互通的问题,而是适配两种网络模式来为不同网络下的客户端提供服务。
![](https://i-blog.csdnimg.cn/blog_migrate/b895d24de25a57fc35ccc0115f056734.png)
当IPv4网络下的客户端发起请求时,服务器及链路会在IPv4网络下进行响应。同理,当发起客户端处于IPv6网络时,服务器会在IPv6网络下进行响应。
反之,也可以在客户终端上配置双协议栈,来分别访问不同网络协议下的服务器。
2、隧道技术
目前常见的IPv6隧道传输方案有手工隧道与自动隧道,例如6 over 4、6 to 4等。其中自动隧道因为需要同时配置IPv4和IPv6地址,所以需要双协议栈路由器支持。
![](https://i-blog.csdnimg.cn/blog_migrate/74cf7356dcf9e1c44f954eaf269590a0.png)
隧道技术是指将IPv6的数据包封装在IPv4的数据包里进行发送,它好处就是不需要对现有的IPv4网络进行改造,就可以直接利用隧道来传输IPv6的数据包。隧道技术主要是为了向IPv6网络过渡过程中减少搭建设备的成本,但是它依然无法解决纯IPv4主机与IPv6主机的互通问题。
3、网络协议转换技术
IPv6_上的网络协议转换技术类似于IPv4上经常使用的NAT技术,但是转换的内容不一样。早期的翻译网关采用的为NAT- -PT技术,但是因为技术的局限性和安全性,最终还是改用了NAT64转换技术。
![](https://i-blog.csdnimg.cn/blog_migrate/da965a01e6c6e6f6676b9d74e557a35d.png)
NAT64的工作原理就是搭建一台 翻译网关位于IPv4与IPv6网络之间,将通过网关的IPv6与IPv4的数据包进行翻译传输。NAT64-般只能单方向的将发往IPv4网络的IPv6报文进行翻译,而不能主动翻译反方向的IPv4发往IPv6的报文,需要进行静态条目绑定才能真正实现IPv4访问IPv6网络,在技术实现上成本较高。
4、IVI技术
IVI技术是国内研发的翻译网关技术,虽然都属于翻译网关,但是NAT64转换基 于状态,而IVI可以进行无状态的映射。
![](https://i-blog.csdnimg.cn/blog_migrate/0b2ba20973f3198651b14b21a3994fa8.png)
网络运营商通过对一部分IPv4和IPv6地址进行映射,生成IVI专用地址。IPv6网络的用户如果想访问IPv4网络,可以通过IV|网关的映射表获得IPv4地址来直接访问IPv4网络。而IPv4用户 如果需要访问IPv6网络,则会通过IVI网关获得IVI- 6地址来访问IPv6网络。目前IVI是IPv4向IPv6过渡的较优方案,原因就是它不需要改变用户的使用习惯和成本,可以直接由运营商进行搭建翻译网关来进行双网互访。
扩展:
1.IPv4 ToS字段的使用及含义
![](https://i-blog.csdnimg.cn/blog_migrate/46f9678f865139bd46f34a70217eda70.jpeg)
前3位(0-2)定义优先级,IP优先级(IP Precedence)使用最高3比特,可以定义8个服务等级.
111–Network Control(网络控制);
110–Internetwork Control(网间控制);
101–Critic(关键);
100–Flash Override(疾速);
011–Flash(闪速);
010–Immediate(快速);
001–Priority(优先);
000–Routine(普通)。
优先级6和7一般保留给网络控制数据使用,如路由。
优先级5推荐给语音数据使用。
优先级4由视频会议和视频流使用。
优先级3给语音控制数据使用。
优先级1和2给数据业务使用。
优先级0为默认标记值。
中间4位(3-6)定义延迟、吞吐量和可靠性,由RFC791定义(3-5位),称为DTR(Delay,Throughput,Reliability)位,后来RFC1349又扩展到第6位。
0000–normal service; 最小时延
1000–minimize delay; 最大吞吐量
0100–maximize throughput; 最高可靠性
0010–maximize reliability; 最小费用
0001–minimize monetary cost。
4 bit中只能置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务。
Telnet、Rlogin这两个交互应用要求最小的传输时延,FTP文件传输要求最大吞吐量,最高可靠性是指网络管理(SNMP)和路由选择协议。用户网络新闻要求最小费用。
2.IP选项
IP选项:用于提供一些在数据传输时需要用到的附加功能,比如记录路由、严格源路由等,还负责数据传输的安全问题,还用于侦测和调试网络。不是必需的字段,长度可变,默认大小为0字节,最大40字节。
![](https://i-blog.csdnimg.cn/blog_migrate/60d5a30d626c638384b381f239aee295.png)
IP选项由选项码、选项长度和选项数据三部分组成,其中选项码为1字节,可分为复制位、选项类和选项号三部分。
·复制位:1bit,用于控制数据报分片时是否将选项复制到各个分片中,0表示不复制。
·选项类:2bit,用于定义选项的一般作用。
·选项号:5bit,用于定义选项的具体类型。
主要使用的选项类型见下表:
![](https://i-blog.csdnimg.cn/blog_migrate/bc3f891860d43d2242e184ce58dbd8b1.png)
·选项长度:8bit,定义整个选项的长度。
·选项数据:变长,用于定义选项请求。
表中的6种主要选项类型的说明:
·EOL:选项结束,提示最后一个选项,必须放在所有选项的后面
·NOP:空操作,用于选项间的边界对正,当数据报有两个以上的选项时,如果其中某个选项的长度不足4字节的倍数,则可以在其中加入NOP,将长度补足到4字节的倍数,以便对正到下一个选项的起始位置。
·RR:记录路由,用于记录数据报在网络中传送过程中从信源到信宿所经过的各路由器的IP地址。因为所记录的路由器数量不定,因此该选项的长度可变。格式为:
![](https://i-blog.csdnimg.cn/blog_migrate/5dd7245f0ba1f3dea4de21c0715ce347.png)
其中,指针指向路由记录地址表中下一个可以存放路由器IP地址的位置,每记录一个路由IP地址,指针值增加4,直到路由记录地址表用完为止。
·SSRR:严格的源路由,用于信源预先设定数据报在网络中传送时指定数据报的传送路径并记录传输路径。格式与RR类似,但选项码为10001001。选项中所指定的路由器必须是一一相连的,并且两个相邻的路由器之间不能有其他路由器,以确保数据报根据指定的路由器能顺利地从信源传送到信宿。IP报头的目的地址只是代表数据报要传送的下一跳地址,而不是信宿地址;信宿地址是选项中路由记录指定的最后一个IP地址。
·LSRR:宽松的源路由,用于预先指定数据报传送过程中必须经过的关键路由。这些指定的路由并不一定能组成一条完备的路径,只是给出了路径上的某些关键点,并记录传送过程中所经过的路由器的IP地址。选项格式与RR类似,但选项码为10000011。
·TS:时间戳,用于记录路由器处理数据报的时间。根据时间戳可以估算数据报从一个路由器传送到另一个路由器所花费的时间,进而分析网络吞吐率和负载情况。
![](https://i-blog.csdnimg.cn/blog_migrate/b52e29cbd1b5f2d51eebc1ab35cf4929.png)
其中,溢出字段用于记录因预留空间不够而未能记录下来的时间戳个数。当溢出字段也溢出时,路由器将丢弃数据报,并产生ICMP参数错报文发送给信源。标志字段用于定义时间戳选项的格式,取值范围:
·0:路由器仅记录时间戳数据,忽略IP地址
·1:路由器记录出口IP地址和时间戳
·3:仅记录信源指定地址处的时间戳
时间戳以ms为单位,从世界标准时间午夜零时开始计算。在IP数据报需要分片传送时,时间戳选项不复制到各个分片,仅在第一片出现。
3.下一报头
长度为8bit,这个字段指出了ipv6基本报头之后所跟的下一个扩展报头字段中的协议类型,与ipv4字段类似可以指出上层协议是tcp还是udp 同时还可以指明是否存在 ipv6扩展头
下一报头值对应扩展类型或者协议如下
![](https://i-blog.csdnimg.cn/blog_migrate/f62a874f655b5931728f47909097ab9f.png)
IPv6报文中不再有“选项”字段,而是通过“下一报头”字段配合IPv6扩展报头来实现选项的功能。使用扩展头时,将在IPv6报文下一报头字段表明首个扩展报头的类型,再根据该类型对扩展报头进行读取与处理。每个扩展报头同样包含下一报头字段,若接下来有其他扩展报头,即在该字段中继续标明接下来的扩展报头的类型,从而达到添加连续多个扩展报头的目的。在最后一个扩展报头的下一报头字段中,则标明该报文上层协议的类型,用以读取上层协议数据
![](https://i-blog.csdnimg.cn/blog_migrate/5ea20915b97022ee8abac1f58bf84c7c.png)