IP 作为整个 TCP/IP 协议族中至关重要的协议,主要负责将数据包发送给最终的目标计算机,为上层协议提供无状态、无连接、不可靠的服务。
- 无状态:无状态是指 IP 通信双方是不同步传输数据的状态信息。所有 IP 数据报的发送、传输和接收都是相互独立。
- 无连接:无连接是指IP通信双方都不长久地维持对方的任何信息。上层协议每次发送数据的时候,都需要明确指出对方的IP地址。
- 不可靠:不能保证 IP 数据报准确到达接收端,它只承诺尽最大努力交付。IP 模块一旦检测到数据报发送失败,就通知上层协议,而不会试图重传。
通过 IP 进行通信时,需要在数据的前面加入 IP 首部信息。IP 首部包含着用于 IP 协议进行发包控制时所有的必要信息。
- 版本由 4 比特构成,用来标识 IP 首部的版本号。IPv4 版本号就是 4。关于 IP 所有版本如下图所示:
- 首部长度表示 IP 首部的大小,单位是 4字节(32bit)。IP 头部的长度也就是 length * 4 的字节数. 当没有可选项时,length 是 5,也就是20字节。
- 区分服务(TOS)用来表示服务的质量。可划分为 DSCP 和 ECN,DSCP 用来进行质量控制,ECN 用来报告网络拥堵情况。
- 总长度表示的是 IP 首部 与数据部分合起来的总字节数,最大长度是 65535 字节。
- 标识用于分片*。同一个分片的标识值是相同的,不同分片的标识值不同。每发送一个 IP 包,它的值也会逐渐递增。
- 标志表示包被分片的相关信息。每一位的具体含义如下图。
- 片偏移用来标识被分片的每一个分段相对于原始数据的位置。
- 生存时间(TTL)这个不是一个时间的概念,实际上是指可以中转多少个路由器的意思,每经过一个路由器,TTL会减少 1,直到变成0 则丢弃该包。
- 协议表示 IP 首部的下一个首部属于哪个协议。
- 首部校验和该字段只会校验数据包的首部,不会去校验数据部分。这个字段主要目的是用来确保 IP 数据包不被破坏。
- 源地址表示发送端的 IP 地址。
- 目标地址 表示接收端的 IP 地址。
- 可选字段长度可变,通常只在进行实验或诊断时使用。
- 填充在有可选字段的情况下,首部长度可能不是 32 比特的整数倍。通过向字段填充 0,调整为 32 比特的整数倍。
- 数据用来存入实际要传输的数据,同时将 IP 上层协议的首部也作为数据进行处理。
IPv6 相比 IPv4 已经发生了巨大变化。IPv6 中为了减轻路由器的负担,省略了首部校验和字段。提高了包转发的效率。
- 版本与 IPv4 是一样的,其版本号是 6。
- 通信量类相当于 IPv4 的 TOS 字段。
- 流标号由 20 比特构成,准备用于服务质量的控制。在进行服务质量控制时,将流标号设置为一个随机数,然后利用一种可以设置流的协议在路由器上进行服务质量设置。
- 有效载荷长度有效载荷是指包的数据部分。这个是不包含首部的,只表示数据部分的长度,
- 下一个首部相当于 IPv4 的协议字段。通常表示 IP 的上一层协议是 TCP 或 UDP。
- 跳数限制与 IPv4 中的 TTL 相同,表示可通过路由器的个数。数据每经过一次路由器就减1,减到 0 则丢弃数据。
- 源地址表示发送端的 IP 地址。
- 目标地址表示接收端的 IP 地址。
- 扩展首部IPv6 首部长度是固定的,无法将可选项加入其中。取而代之的是通过扩展首部对功能进行了有效扩展。在需要对 IP 数据报进行分片时,可以使用扩展首部。