IP的概念
Internet Protocol(互联网协议):IP 是互联网协议的核心,它定义了数据包如何在互联网中的各个网络之间传输。IP 地址是分配给连接到互联网上的每个设备的唯一数字标识,用于在数据通信中识别源和目标设备。IPv4 是目前广泛使用的版本,它使用32位(4字节)地址,理论上可以支持约43亿个设备。然而,随着物联网(IoT)的发展,设备数量急剧增加,IPv4 地址空间已经接近耗尽,因此 IPv6 被开发出来,它使用128位(16字节)地址,可以支持几乎无限数量的设备。
IPV4
![](https://i-blog.csdnimg.cn/direct/777e608bf14a4a7fbb3e2b98a9dafedd.png)
各字段功能:
**1、版本号(Version):**长度 4 bit 。标识目前采用的 IP 协议的版本号。一般的值为 0100(IPv4),0110(IPv6)
|---------|-------------------------|-------------------------------------------------------------------------------------------------------------------------|
| 版本号 | 版本 | RFC 文档 |
| 0 | 保留 | |
| 1~3 | 未分配 | |
| 4 | Internet 协议版本 4(IPv4) | RFC791 |
| 5 | ST 数据报(Datagram) | RFC1190 |
| 6 | 简单 Internet 协议(SIP) | |
| 6 | IPv6 | RFC1883 |
| 7 | TP / IX | RFC1475 |
| 8 | P Internet 协议(PIP) | RFC1621 |
| 9 | 使用更大地址的 TCP 和 UDP(TUBA) | RFC1347 |
| 10~14 | 未分配 | |
| 15 | 保留 | |
**2、IP 报头长度(Header Length):**长度 4 bit 。这个字段的作用是为了描述 IP 报头的长度,因为在 IP 报头中有变长的可选部分。该部分占 4 个 bit,长度单位为 4 个字节,即本区域值 = IP 头部长度(单位为字节)/ 长度单位(4 个字节)。因此,一个 IP 报头的长度最长为 " 1111 ",即 15 x 4 个字节 = 60 个字节。IP 报头最小长度为 20 字节。
|-------------------|-----------------------------------|
| Header Length | Header Length 所代表的实际的 IP 报头长度 |
| 0101 | 20 字节 |
| 0110 | 24 字节 |
| 0111 | 28 字节 |
| ... | ... |
| 1101 | 52 字节 |
| 1110 | 56 字节 |
| 1111 | 60 字节 |
3、服务类型(Type of Service): 长度 8 bit 。8 位按位被如下定义:PPP DTRC0(更多详细信息可以参见 RFC1340 和 RFC1349)
- PPP:前 3 位,定义包的优先级,取值越大数据越重要
- 000 普通(Routine)
- 001 优先的(Priority)
- 010 立即的发送(Immediate)
- 011 闪电式的(Flash)
- 100 比闪电还闪电式的(Flash Override)
- 101 CRI / TIC / ECP(找不到这个词的翻译)
- 110 网间控制(Internetwork Control)
- 111 网络控制(Network Control)
- DTRCO:后 5 位
- D 时延:0:普通,1:延迟尽量小
- T 吞吐量:0:普通,1:流量尽量大
- R 可靠性:0:普通,1:可靠性尽量大
- M 传输成本:0:普通,1:成本尽量小
- 0 最后一位被保留,恒定为 0
**4、IP 包总长度(Total Length):**长度 16 bit 。以字节为单位计算的 IP 包的长度(包括头部和数据),所以 IP 包最大长度 65 535 字节。所以,数据包有效载荷的大小 = IP 包总长度(Total Length)- IP 报头长度(Header Length)。
**5、标识符(Identifier):**长度 16 bit 。该字段和 Flags 和 Fragment Offest 字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
**6、标记(Flags):**长度 3 bit 。
- 该字段第一位不使用。
- 第二位是 DF(Don't Fragment)位,DF 位设为 1 时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。
- 第三位是 MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的 IP 包的报头中将 MF 位设为 1 。
**7、片偏移(Fragment Offset):**长度 13 bit,以 8 个八位组为单位。表示该 IP 包在该组分片包中位置,接收端靠此来组装还原 IP 包。
**8、生存时间(TTL):**长度 8 bit,设计之初是以秒(s)为单位的,但实际以跳数为单位,建议的缺省值为 64 。当 IP 包进行传送时,先会对该字段赋予某个特定的值。当 IP 包经过每一个沿途的路由器的时候,每个沿途的路由器会将 IP 包的 TTL 值减少 1 。如果 TTL 减少为 0,则该 IP 包会被丢弃。这个字段可以防止由于路由环路而导致 IP 包在网络中不停被转发。
**9、协议(Protocol):**长度 8 bit 。标识了上层所使用的协议。以下是比较常用的协议号:1 ICMP;2 IGMP;6 TCP;17 UDP;88 IGRP;89 OSPF 。
10、头部校验(Header Checksum): 长度 16 bit 。用来做 IP 头部的正确性检测,但不包含数据部分。 因为每个路由器要改变 TTL 的值,所以路由器会为每个通过的数据包重新计算这个值(RFC1141 讨论了一些简化计算的策略)。
**11、起源和目标地址(Source and Destination Addresses):**这两个地址都是 32 bit 。标识了这个 IP 包的起源和目标地址。要注意除非使用 NAT,否则整个传输的过程中,这两个地址不会改变。
**12、可选项(Options):**这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
- **松散源路由(Loose source routing):**给出一连串路由器接口的 IP 地址。IP 包必须沿着这些 IP 地址传送,但是允许在相继的两个 IP 地址之间跳过多个路由器。
- **严格源路由(Strict source routing):**给出一连串路由器接口的 IP 地址。IP 包必须沿着这些 IP 地址传送,如果下一跳不在 IP 地址表中则表示发生错误。
- **路由记录(Record route):**当 IP 包离开每个路由器的时候记录路由器的出站接口的 IP 地址。
- **时间戳(Timestamps):**当 IP 包离开每个路由器的时候记录时间。
- **填充(Padding):**因为 IP 报头长度(Header Length)部分的单位为 32 bit,所以 IP 报头的长度必须为 32 bit 的整数倍。因此,在可选项后面,IP 协议会填充若干个 0,以达到 32 bit 的整数倍。
IPV6
![](https://i-blog.csdnimg.cn/direct/f93d94430f0d47f2a2ba0d42f4ad91c1.png)
Version(版本号):4位,IP协议版本号,值= 6。
Traffice Class(通信类别):8位,指示IPv6数据流通信类别或优先级。功能类似于IPv4的服务类型(TOS)字段。
Flow Label(流标记):20位,IPv6新增字段,标记需要IPv6路由器特殊处理的数据流。该字段用于某些对连接的服务质量有特殊要求的通信,诸如音频或视频等实时数据传输。在IPv6中,同一信源和信宿之间可以有多种不同的数据流,彼此之间以非"0"流标记区分。如果不要求路由器做特殊处理,则该字段值置为"0"。
Payload Length(负载长度):16位负载长度。负载长度包括扩展头和上层PDU,16位最多可表示65535字节负载长度。超过这一字节数的负载,该字段值置为"0",使用扩展头逐个跳段(Hop-by-Hop)选项中的巨量负载(Jumbo Payload)选项。
(上层数据单元即PDU,全称为Protocol Data Unit。PDU由传输头及其负载(如ICMPv6消息、或UDP消息等)组成。而IPv6包有效负载则包括IPv6扩展头和PDU,通常所能允许的最大字节数为65535字节,大于该字节数的负载可通过使用扩展头中的Jumbo Payload(见上文)选项进行发送。)
Next Header(下一包头):8位,识别紧跟IPv6头后的包头类型,如扩展头(有的话)或某个传输层协议头(诸如TCP,UDP或着ICMPv6)。
Hop Limit(跳段数限制):8位,类似于IPv4的TTL(生命期)字段。与IPv4用时间来限定包的生命期不同,IPv6用包在路由器之间的转发次数来限定包的生命期。包每经过一次转发,该字段减1,减到0时就把这个包丢弃。 Source Address(源地址):128位,发送方主机地址。 Destination Address(目的地址):128位,在大多数情况下,目的地址即信宿地址。但如果存在路由扩展头的话,目的地址可能是发送方路由表中下一个路由器接口。
-
IPv6数据包:扩展包头
-
-
IPv6包头设计中对原IPv4包头所做的一项重要改进就是将所有可选字段移出IPv6包头,置于扩展头中。由于除Hop-by-Hop选项扩展头外,其他扩展头不受中转路由器检查或处理,这样就能提高路由器处理包含选项的IPv6分组的性能。
-
通常,一个典型的IPv6包,没有扩展头。仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与IPv4不同,IPv6扩展头长度任意,不受40字节限制,以便于日后扩充新增选项,这一特征加上选项的处理方式使得IPv6选项能得以真正的利用。 但是为了提高处理选项头和传输层协议的性能,扩展头总是8字节长度的整数倍。
-
目前,RFC 2460中定义了以下6个IPv6扩展头:Hop-by-Hop(逐个跳段)选项包头、目的地选项包头、路由包头、分段包头、认证包头和ESP协议包头:
-
(一)Hop-by-Hop选项包头包含分组传送过程中,每个路由器都必须检查和处理的特殊参数选项。其中的选项描述一个分组的某些特性或用于提供填充。这些选项有:
-
Pad1选项(选项类型为0),填充单字节。
-
PadN选项(选项类型为1),填充2个以上字节。
-
Jumbo Payload选项(选项类型为194),用于传送超大分组。使用Jumbo Payload选项,分组有效载荷长度最大可达4,294,967,295字节。负载长度超过65,535字节的IPv6包称为"超大包"。
-
路由器警告选项(选项类型为5),提醒路由器分组内容需要做特殊处理。路由器警告选项用于组播收听者发现和RSVP(资源预定)协议。
-
(二)目的地选项包头指名需要被中间目的地或最终目的地检查的信息。有两种用法:
-
如果存在路由扩展头,则每一个中转路由器都要处理这些选项。
-
如果没有路由扩展头,则只有最终目的节点需要处理这些选项。
-
(三)路由包头
-
类似于IPv4的松散源路由。IPv6的源节点可以利用路由扩展包头指定一个松散源路由,即分组从信源到信宿需要经过的中转路由器列表。
-
(四)分段包头
-
提供分段和重装服务。当分组大于链路最大传输单元(MTU)时,源节点负责对分组进行分段,并在分段扩展包头中提供重装信息。
-
(五)认证包头
-
提供数据源认证、数据完整性检查和反重播保护。认证包头不提供数据加密服务,需要加密服务的数据包,可以结合使用ESP协议。
-
(六)ESP协议包头
-
提供加密服务。
IPV4与IPV6的区别
与IPV4相比,IPV6具有以下几个优势:
一,IPv6具有更大的地址空间。IPv4中规定IP地址长度为32,即有2^32-1(符号^表示升幂,下同)个地址;而IPv6中IP地址的长度为128,即有2^128-1个地址。
二,IPv6使用更小的路由表。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。
三,IPv6增加了增强的组播(Multicast)支持以及对流的支持(Flow Control),这使得网络上的多媒体应用有了长足发展的机会,为服务质量(QoS,Quality of Service)控制提供了良好的网络平台。
四,IPv6加入了对自动配置(Auto Configuration)的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。
五,IPv6具有更高的安全性。在使用IPv6网络中用户可以对网络层的数据进行加密并对IP报文进行校验,极大的增强了网络的安全性。
IPv6包由IPv6包头(40字节固定长度)、扩展包头和上层协议数据单元三部分组成。 IPv6包扩展包头中的分段包头(下文详述)中指名了IPv6包的分段情况。其中不可分段部分包括:IPv6包头、Hop-by-Hop选项包头、目的地选项包头(适用于中转路由器)和路由包头;可分段部分包括:认证包头、ESP协议包头、目的地选项包头(适用于最终目的地)和上层协议数据单元。但是需要注意的是,在IPv6中,只有源节点才能对负载进行分段,并且IPv6超大包不能使用该项服务。