前言

本文章会和大家一起探讨 TCP/IP 协议栈中的网络层中的IP协议。

网络层的解决问题:

  • 提高一种能力能将数据跨网段从主机A传输到主机B

注意:

  • 下面的 IP 协议是基于 IPv4 的

1. IP 协议简介

  • IP 协议

    IP(Internet Protocol,网际协议)。是实现主机到主机的通信,更具体地说,是实现从源IP地址到目标IP地址的数据包传送

    所处协议簇位置:整个协议是处于 TCP/IP 模型中的网络层,位于传输层(如 TCP、UDP)之下,数据链路层(如以太网、Wi-Fi)之上的。

    关键特性:无连接 和 不可靠。

    • 无连接:在发送数据之前,双方不需要先建立一条连接。

      就像你寄平信,不需要提前通知收件人“我要给你寄信了”,直接扔进邮筒即可。

    • 不可靠:它不保证数据包一定能送达目的地,也不保证数据包按顺序到达,也不保证数据包在传输过程中不损坏。如果中途丢了,IP 协议自己不会负责重传。(可靠性由上层协议,例如TCP来保障)

IP 协议就像邮政系统,它负责把写着地址的信件从A地扔到B地。它不关心信里具体是什么内容(那是TCP/UDP关心的事),也不关心信是走公路还是铁路(那是链路层关心的事)。它只关心地址是否正确,以及如何根据地址找到下一站。

  • IP 协议的两大核心功能

    1. 寻址与路由:这是IP协议最重要的功能

      寻址:为网络中的每一台设备分配一个唯一的逻辑地址,即 IP 地址。

      路由:网络中的路由器(Router)像邮局的分拣中心,它们查看数据包的目标IP地址,并根据自己的“路由表”(像地图一样)决定下一步该把数据包往哪个方向转发,直到最终到达目的地。

    2. 数据包的分片与重组

      不同的物理网络(如以太网、Wi-Fi)能传输的最大数据单元(MTU)是不同的。一个大的 IP 数据包在经过一个 MTU 较小的网络时,可能无法直接通过。所以这个时候就需要 IP 协议对数据包进行分片处理。当收到数据的时候,又需要将这些数据重组起来。

      • 分片:这时,路由器会将这个大的IP数据包切割成多个较小的“分片”,每个分片都有自己的IP头,可以被独立传输。

      • 重组:这些分片最终到达目标主机后,由目标主机的 IP 层负责将它们重新组装成原始的数据包,再交给上层协议。

2. IP 协议报文介绍

  • 如下图:

    在这里插入图片描述


  • 我们需要解决两个问题:

    1. Q:IP 协议中的报头和有效载荷如何分离?

      A:IP 协议采用固定长度的报头 + 自描述字段。这个固定的长度是报头的长度20字节。再根据读取的内容的4位头部长度就能读取到整个报头长度了。

    2. Q:有效载荷是如何交付给上层的?

      A:在 IP 协议中有一个特殊字段:8位协议。通过8位协议字段操作系统就能知道如何交付给上层哪一个传输层了。


下面我们来详细介绍一下这些字段:

  1. 4位版本:

    指明是当前报文采用的版本是 IPv4 还是 IPv6。0100(十进制代表4)表示IPv4,0110(十进制代表6)表示IPv6。

  2. 4位首部长度:

    占4位。指明IP头部的长度,以4字节为单位。因为头部长度不固定(可能有可选字段),所以需要这个字段来界定头部在哪里结束,数据从哪里开始。该字段的取值范围是:[5, 15]。

  3. 8位服务类型:

    用来指示数据包的服务质量,比如优先级、延迟、吞吐量等要求。但现实中用得不多。

  4. 16位总长度

    指整个IP数据包(头部+数据)的总长度,单位是字节。这意味着一个 IP 数据包最大可达65535字节。但是实际上不可能安排一个 IP 数据包这么大的数据量,还需要考虑到上层传输内容以及下层的接受能力。

  5. 8位生存时间(TTL)

    这是一个非常重要的字段,用来防止数据包在网络中无限循环。每经过一个路由器(称为一跳),TTL 值就减1。当 TTL 减到0时,路由器会丢弃这个数据包,并通常发回一个“超时”消息给发送方。

  6. 8位协议

    指明这个 IP 数据包携带的数据是哪个上层协议的。这样,当目标主机收到数据包后,IP 层就知道该把数据部分交给传输层的哪个协议去处理。

    例如,6代表TCP,17代表UDP。

  7. 16位头部校验和:

    用于检查 IP 头部在传输过程中是否出错。如果出错,路由器会直接丢弃。

    注意:它只校验头部,不校验数据部分。数据的可靠性由传输层(如TCP)或应用层来保障

  8. 32位源 IP 地址:

    发送方的 IP 地址。

  9. 32位目的 IP 地址:

    接收方的IP地址。

  10. 可选字段:

    长度可变(范围一般是[0, 40])。用于一些特殊的功能,如安全、时间戳、特殊路由等,但通常很少使用。

  11. 16位标识符、3位标志、13位片偏移(重要):

    这三个字段共同用于分片与重组

    • 标识符:是发送方给原始数据包的一个唯一编号。同一个数据包的所有分片都有相同的标识符,这样接收方才知道哪些分片是属于同一个包的。

    • 标志:其中一位表示“禁止分片”(DF),另一位表示“还有更多分片”(MF)。

      如果 DF 被置为1,则说明这个 IP 数据包是一个完整的;如果 DF 被置为0,则说明这个 IP 数据包是被分片的,这个时候就需要依靠 MF 标志了:其中如果 MF 被置为 1 了,说明当前数据包不是分片的最后一个数据包;如果 MF 被置为 0 了,说明当前数据包是分片的最后一个数据包。

    • 片偏移:指明当前分片在原始数据包中的位置(原始的数据包,不含 IP 报头信息)。一般计算的时候都需要 /8


IP 协议的分片和重组

在网络层,我们的数据来自于传输层,我们网络层处理完数据之后会将数据发送到数据链路层。但是数据链路层对传输在网络中的数据包的大小是有要求的

不同的数据链路层协议是对 MTU(最大传输单元)的要求是不同的。当一个大的 IP 数据包在经过一个较小的 MTU 的网络的时候,可能无法直接通过。所以这就要求网络层对数据进行分片处理。

下面我们以以太网为例(以太网的 MTU 为 1500 字节)。

IP 协议就依赖于上面的三个字段来实现对数据包的分片:

  1. 16位标识:确定来自上层的唯一数据包。当上层数据完成分片的时候,每一个小包通过该16位标识来识别身份,如果相同则说明它们来自同一个上层数据包。

  2. 标志:该标志说明了当前数据包是否进行了分片(DF)以及是否是分片数据包的最后一个数据(MF)。

  3. 片偏移:该片偏移说明了当前的数据小包在原始数据包中的偏移量是多少。

注意:每一个分片也就是每一个独立的 IP 数据包。即上层传输层的数据来到网络层之后进行分片后,每一个分片都会重新组装 IP 报头

下面我们通过几个问题就能回答明白这几个字段的精妙之处:

  1. 如何得知一个 IP 数据包是否是被分片了呢?

    片偏移不为0 或者 DF == 1。

  2. 如何保证所有分片聚集在一起呢(如何重组)?

    我们通过16位的标识,就能识别分片的身份。只需要将相同分片的数据聚集在一起即可,然后通过片偏移进行排序就能获取到对应数据的相应位置了。

  3. 如果分片发生了丢失怎么办呢?

    • 开头分片丢失:在所有的分片中没有片偏移为0 的分片。

    • 中间分片丢失:在进行组装的时候发现片偏移不完整。

    • 结束分片丢失:没有 MF 标识位为0 的分片。

    这里就诞生了一个问题:在一个完整的数据包中,如果任何一个 IP 数据包分片丢失了,那么就会导致整个数据包都要重新发送

    所以:不建议对数据包进行分片。而上层传输层中 TCP 协议对每次发送的数据进行了要求,即滑动窗口中还需要对数据进行分段,每一个小段中数据量都有限制(MSS,这也是体现 TCP 可靠性的一个方面);但是类似 UDP 协议就没有对每次发送的数据进行大小的要求!

  4. 为什么要求网络层对数据进行分片呢?而不是传输层?亦或者是数据链路层自己完成呢?

    • 为什么传输层不合适:路径 MTU 未知(这是最关键的原因)。传输层只组织数据流(这是它的责任)。所以传输层在发送数据时,它并不会知道数据包在到达目的地之前的整条路径上,会经过哪些类型的网络(以太网、WIFI、令牌环网)。这些网络要求的 MTU 都不一样,传输层无法预知下层的 MTU 的大小,无法做出合理的分片方式。

    • 为什么数据链路层不合适:重组问题导致的效率问题。如果数据链路层对 IP 包进行了分片,那么它必须在下一个设备(路由器)的数据链路层将分片重组回原始的 IP 包,这样才能交付给上层网络层,从而实现合理的网络路由功能。这意味着:每跳都要重组和再分片:在每个路由器上都会发生,造成巨大的处理开销和延迟

    网络层合适的原因:

    1. 为上层传输层屏蔽下层网络的差异。

    2. 实现了 PMTUD 机制,允许一台计算机(或网络设备)发现从它自己到另一个目标主机之间的网络路径上,所能传输的最大数据包的大小是多少(操作系统会告知上层例如 TCP 这样的实现 MSS 的传输层协议,从而控制上层传输层的发送数据包的大小),而无需进行分片。

    3. 当无法避免进行分片的时候(类似于 UDP 这样的传输层协议),他仅仅会在需要分片的路由设备的网络层重新进行分片,做到一次性分片,终点重组,让中间路由器保持简单高效

      例如:开始某一个路由器下层的数据链路层是不同的,一个是以太网(1500),一个是PPPoE(1492)。当以太网的数据来到该路由器的时候,路由器的网络层会根据发现当前数据已经超过了下一跳的网络的 MTU,那么就会将分片再次进行分片(将原始的数据提取出来,例如1480字节,再根据这1480字节进行分片处理),来符合 PPPoE 的 MTU。


总结

  • IP 协议的两个核心功能:

    1. 寻址路由。

    2. 分片重组。

  • IP 协议的分片重组依赖于 IP 报文中的三个字段:标识、标志、片偏移

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐