IP 协议(Internet Protocol 网际协议)是 TCP/IP 协议族中的核心协议,传输层的 TCP、UDP 等协议数据都通过 IP 数据报封装并传输
IP 协议提供尽力而为,无连接的数据报交付服务,其中尽力而为指的是数据不一定会送达目标地址,而无连接指的是 IP 协议不维护网络单元(路由器)中数据报相关的任何链接状态信息,这会使每个数据报独立于其它数据报来处理。
作为一个通信协议,以上两点显然会为信息的传输带来数据的完整性与可靠性问题,以及数据报间因为相互独立产生的多路径、乱序、重复等问题,并且数据报在传输过程中还可能被复制或者改变内容。但以上这些都不是 IP 协议要考虑的,它的主要职责是跨网络边界分组交换(简单来说就是只负责把数据从源地址传递到目标地址),而这些可靠性必须由上层(如传输层的 TCP 协议)协议提供
IPv4 报头结构
一般标准的 IP 数据报头部大小为 20 Byte,少数包含额外选项的情况下 IP 数据报头部最大可以达到 60 Byte。一个报头由多个部分组成,我们在下文来逐一了解
- • 版本号:版本号在整个报头的头部,共占 4 位,表示 IP 协议版本,IPv4 用 4 表示,IPv6 用 6 表示,IPv4 与 IPv6 的协议头只有此处一样
- • IHL:IHL(Internet Header Length)报头长度,共占 4 位,用来标识 IP 头部中有多少份 32 bit 的数据。因为只占 4 位,所以只能表示 15 个数,所以 IP 头部中最多包含 15 个 32 bit 的数据(60 Byte),一般情况下为 5(20 Byte)
- • DS:区分服务,共占 6 位,表示期望获取哪种类型的服务
- • ENC:显式拥塞通知,共占 2 位,当网络出现拥塞时会在这里进行标记,标记被某些服务检查到后会通知源主机减缓发送速度
- • 总长度:标识 IP 数据报的总长度(包含数据部分),共占 16 位,所以每个 IP 数据报包含数据部分最大长度为 216 Byte(65535 Byte、64 MB),通过总长度和 IHL 可以计算出数据部分的大小
- • 标识:数据报标识,共占 16 位,主机每产生一个数据报 + 1,数据报分片时,把当前标识号复制给所有分片标识
- • 标志:分片标志信息,共占 3 位,目前只使用前两位,第一位为 MF(More Fragment)值为 1 时代表当前不是最后一个分片,为 0 时表示当前是最后一个分片。第二位为 DF(Don’t Fragment)值为 1 时允许分片,为 0 时不允许分片
- • 分片偏移:分片中的数据偏移量,共占 13 位,表示当前分片在原数据中的偏移量(相对位置)
标识、标志、分片偏移都与分片息息相关,在下文我们会详细了解什么是分片
- • TTL:标识数据报的生存周期,共占 8 位,代表数据报可经过路由器的上限,数据报每经过一个路由器 TTL 的计数就会减一(会修改报头数据,所以后面提到的校验和也会重新计算),TTL 为 0 后数据报会被丢弃,并使用 ICMP 协议消息通知发送方
- • 协议:标识上层(传输层)数据部分的协议类型,共占 8 位,通常为 17(UDP)或 6(TCP)
- • 头部校验和:共占 16 位,仅计算头部校验和,不检查数据报有效载荷(TCP 或 UDP 数据)的正确性,TTL 变化时校验和也必须改变,当头部校验和验证错误时,数据报会被丢弃
- • 源 & 目标 IP 地址:标识数据报的起始地址与目标地址,每段地址占 32 位
IPv4 数据报分片
在前文我们对 IP 数据报头的各个属性有了一个初步的认识,现在我们来着重了解一下数据报的分片与头部校验和
对 IP 数据报进行分片的目的是把一份 IP 数据报拆分成体积更小的多份分别进行传输,以满足链路层的 MTU(最大传输单元) 限制。而标识、标志、分片偏移这三个属性的存在为分片后乱序传输的多个数据报的组合复原提供了支持
MTU 以 Byte 为单位,就像公路或隧道的限高,规定了发送端每次发送报文的最大体积。以太网的 MTU 通常为 1500 Byte,接下来我们以一个数据载荷为 4000 Byte 的 IP 数据报为例,结合图 2 来看一下数据报分片是如何进行的
图 2:IP 数据报分片
首先,既然要进行分片那么我们就要知道每份分多大,以 1500 的 MTU 为例,除去报头的 20 Byte 最多还剩 1480 Byte 的数据载荷空间。因为分片大小以 8 为单位,大小必须是 8 的整数倍,所以经过计算(图 3)最大分片大小 d = 1480 Byt,所有数据报分片按最大分片大小 d 进行拆分,最后剩余的数据大小为(总长度)L % d
知道了每个分片数据报多大我们就能知道原数据报需要分片多少份,设份数为 n, 最大分片大小 d 与分片份数 n 的计算方法如下
图 3:最大分片 d,分片个数 n
经过以上计算我们把总长度为 4020 的数据报拆分为以下三个数据报,它们每一个都符合当前 1500 Byte 的 MTU 的限制
图 4:分片
拆分完毕的三个数据报有着同样的标志位,这个值来自于原数据报,用于在接收时标识分片所属的原数据报
接下来看标识位 MF,它代表当前分片是不是原数据报的最后一个分片,所以分片 A、B 的 MF 位为 1,分片 C 的 MF 位为 0
最后是分片偏移,它以 8 位为一个单位来计算,标识当前分片中的数据载荷在原数据中的开始位置,计算方法为:当前分片顺序 i 减 1(开始位置)乘分片大小 d 然后除 8(8 位为一个偏移单位)
图 5:分片偏移
IPv4 头部校验和
头部校验和用来验证 IP 数据报头部数据,在计算时先把当前校验和置零,然后以 16 位为一个单位对其进行二进制反码求和,图 4 为计算与验证的具体过程
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/14767.html