IP 协议

内容列表

作为 TCP/IP 协议栈中最核心的协议,IP 协议为网络数据传输和网络互联提供最基本的服务。IP 协议有 IPv4 和 IPv6 两个版本,我们只讨论 TPv4 版本的 IP 协议。

IP 协议

网络层是网络体系中通信子网的最高层,对于 TCP/IP 来说,网络层是其核心所在。该层包含 5 个协议:IP、ARP、RARP、ICMP、IGMP,其中最主要的 IP 协议负责生成发往目的地的数据报以实现逻辑寻址,完成数据从网络上一个节点向另一个节点的传输。

IP 协议定义

IP(Internet Pcotocol,网际协议)是 TCP/IP 协议栈中网络层的协议,也是最为核心的协议,提供无连接的 IP 数据报投递服务。IP 协议是为了在分组交换(Packer-switching,又称包交换)计算机通信网络的互联系统中使用而设计。IP 层(网络层)只负责数据的路由和传输,在源节点与目的节点之间传送数据报,但并不处理数据内容。数据报中有目的地址等必要内容,使每个数据报经过不同的路径也能准确到达目的地,在目的地重新组合还原成原来发送的数据。IP 协议使用以下 4 个主要的机制来提供服务:

  • 服务类型(Type of Service)
  • 用来指示要求的服务质量。
  • 生存时间(Time of Live)
  • 数据报生存时间的上限。
  • 选项(Operation)
  • 提供某些情况下需要或有用的控制功能。
  • 首部校验和(Header Checksum)
  • 提供对 IP 首部内容进行出错检测的功能。

IP 层通过 IP 地址实现了物理地址的统一,通过 IP 数据报实现了数据帧的统一。IP 层通过对以上两个方面的统一达到了向上屏蔽底层差异的目的。

IP 协议的基本功能

IP 协议的主要目的是通过一个互联的网络传输数据报,涉及两个最基本的功能。

  • 寻址(Addressing)

    IP 协议根据数据报首部中包括的目的地址将数据报传送到目的节点,这就涉及传送路径的选择,即路由功能。IP 协议使用 IP 地址来实现路由。

  • 分片(Fragmentation)

    IP 协议还提供对数据大小的分片和重组,以适应不同网络对数据包大小的限制。如果网络只能传送小数据包,IP 协议将对数据报进行分段并重新组成小块再进行传送。

IP 协议的特性

IP 协议是一个无连接的、不可靠的、点对点的协议,只能尽力传送数据,不能保证数据的到达。具体地讲,主要有以下特性:

  • IP 协议提供无连接的数据报服务,各个数据报独立传输,可能沿着不同的路径到达目的地,也可能不会按序到达目的地。
  • IP 协议不含错误检测或错误恢复的编码,属于不可靠的协议。位于上一层(传输层)的 TCP 协议则提供了错误检测和恢复机制。
  • 作为一种点对点协议,虽然 IP 数据报携带源 IP 地址和目的 IP 地址,但进行数据传输时的对等实体一定是相邻设备(同一网络)中的对等实体。
  • IP 协议的效率非常高,实现起来非常简单。

数据报分片

数据报分片(Fragmentation)是 IP 协议的基本功能中的一个功能,实现数据报分片的意义和作用我们接下来将会讨论。IP 数据报最大长度可达 65535(2^16-1)字节,但很少有底层的物理网络能够封装如此大的数据包,因此将 IP 数据报分片传输,目的主机将分片重组还原为一个数据报。

####### 最大传输单元(MTU)

底层物理网络能够封装的最大数据长度称为该网络的最大传输单元(Maximum Transmission Unit,MTU)。当数据报封装成帧时,数据报的长度必须小于 MTU。对于不同的物理网络协议,MTU 的值也是不同的。物理网络的 MTU 是由硬件决定的,通常网络的速度越高,MTU 也就越大。

IP 数据报在从源节点到目的节点的传输过程中往往要经过多个不同的网络,而各个物理网络的 MTU 可能不同。将一个数据报封装在具有较大 MTU 的物理网络帧中发送时,可能在穿过较小 MTU 的物理网络时无法正常传输。此时解决这个问题有两种方案:一是将数据报按照从源节点到目的节点的最小 MTU 进行封装,但这种方案不能充分利用网络的传输能力,传输效率较低;二是将数据报先以源节点所在网络的 MTU 进行封装,在传输过程中再根据需要对数据报进行动态分片。

TCP/IP 协议采用的是第二种方案,即数据报分片。

####### 分片与重组

当 IP 层要传送的数据大于物理网络的最大传输单元时,必须将 IP 数据包分片传输。分片是将一个数据报划分成若干个更小的单元,以适应底层物理网络的 MTU。分片必须满足两个条件:一是分片尽可能大,但必须能够为帧所封装;二是分片中数据的大小必须为 8 字节的整数倍,否则 IP 无法表达其偏移量。

同一数据报各个分片到达目的地,必须被重组为一个完整的数据报。目的主机在进行分片重组时,采用一组重组定时器。开始重组时即启动定时器,如果重组定时器超时仍然未能完成重组(由于某些分片没有及时到达目的主机),源主机的 IP 层将丢弃该数据报,并产生一个超时错误,报告给源主机。

分片可以在源主机或传输路径上的任何一台路由器上进行,而分片的重组只能在目的主机上进行。

IP 寻址与地址解析

IP 地址是 TCP/IP 中的一个非常重要的概念,在网络层实现了底层网络地址的统一,使 TCP/IP 网络层地址具有全局唯一性和一致性。**IP 地址是 TCP/IP 网络的寻址机制(逻辑寻址),是 TCP/IP 网络进行寻址和选择路由的依据。**IP 数据包最终需要物理网络来处理,当 IP 数据包交付给物理网 络之后,物理网络就需要它自己的寻址机制来处理,即 MAC 寻址(物理地址)。这就涉及两种地址的转换,具体由地址解析协议(ARP)和反向地址解析协议(RARP)来实现。

IP 地址

在 TCP/IP 网络中每个主机都有唯一的地址,它是通过 IP 协议来实现的,用来标识每一个网络节点以确保它们之间的相互通信。

####### IP 地址格式

Internet 采用一种全局通用的地址格式,为每一个网络和每一台主机都分配一个 IP 地址,以屏蔽物理网络地址的差异。IPv4 规定,IP 地址长度为 32 位(IPv6 规定地址长度为 128 位)。因此,IPv4 的地址空间为 2^32。

IP 地址是 32 位二进制数字,为了方便我们一般将 IP 地址分为 4 个 8 位字段,以 4 个十进制数表示,之间用点隔开。例如,202.112.10.105,这种记录方法称为“点-数”法。

IP 地址标识一个网络和连入此网络的一台主机。IP 地址采用一种由网络 ID(Net-id)和主机 ID(Host-id)组成的两级结构,网络 ID 表示主机所属的网络,主机 ID 代表主机本身。例如,192.168.1.102,这个 IP 地址中前 3 个十进制数表示网络 ID,最后一个十进制数表示主机 ID。

####### IP 地址分配

IP 地址分配的基本原则是,要为同一网络(子网或网段)内的所有主机分配相同的网络 ID,同一网络中的不同主机必须分配不同的主机 ID,以区分主机。

####### IP 地址分类编址

考虑到不同规模网络的需要,IP 将 32 位地址空间划分为不同的地址类别,并定义了 5 类地址,即 A 类至 E 类。其中 A、B、C 是 3 个基本的类别,分别代表不同规模的网络,由 InterNIC 在全球范围内统一分配。

  • A 类地址

    高 8 位代表网络 ID,低 24 位代表主机 ID。

  • B 类地址

    高 16 位代表网络 ID,低 16 位代表主机 ID。

  • C 类地址

    高 24 位代表网络 ID,低 8 位代表主机 ID。

IP 子网与超网

子网(Subnet)是对一个网络的进一步划分。子网划分不仅解决了 IP 地址的短缺问题,而且可以让用户灵活配置自己的 IP 网络。超网(Supernet)与子网正好相反,将多个网络合并成一个网络。

####### 子网掩码(Subnet Mask)

子网掩码(Subnet Mask)用来将 IP 地址划分成网络地址和主机地址两部分。对于同一个 IP 地址,如果其子网掩码不同,则代表不同的网络或主机。

与 IP 地址相同,子网掩码也是 32 位二进制数,其中高位部分对应 IP 地址中的网络位,用“1”表示;剩余低位部分对应 IP 地址中的主机位,用 “0” 表示。为了方便,同样采用“点-数”法记录。

  • A 类地址子网掩码:255.0.0.0
  • B 类地址子网掩码:255.255.0.0
  • C 类地址子网掩码:255.255.255.0

####### 划分子网

对于一个 C 类地址网络来说,可支持 254 台主机接入网络,如果需要两个网络,并且两个网络接入主机数加起来不超过 254 台(各自的主机数较少)时,若使用两个 C 类地址网络,对于 IP 地址来说是一种浪费;此时可以利用子网掩码来将同一个 C 类地址网络进一步划分成两个不同子网,以此来提高 IP 地址的利用率。

将 IP 地址的主机 ID 部分划分成:子网 ID +主机 ID。也就是说将原来的 IP 地址两级结构扩充为三级结构:网络 ID +子网 ID +主机 ID。通过增加子网掩码中的 “1”(增加网络位),即可实现子网划分。例如,将 C 类地址的子网掩码 255.255.255.0,改成 255.255.255.128 即可。

####### 组合超网

对于一个 C 类地址网络来说,它仅能支持 254 台主机接入网络,如果需要一个网络,并且接入主机数多于 254(远小于 65534)时,若使用一个 B 类地址网络(可支持接入主机 65534 台),对于 IP 地址来说是一种浪费;此时可以利用子网掩码来将多个 C 类地址网络合并成一个超网,以此来提高 IP 地址的利用率。

将 IP 地址的网络 ID 一部分划分为新的主机 ID。通过减少子网掩码中的 “1”(减少网络位),即可实现超网组合。例如将 C 类地址的子网掩码 255.255.255.0,改成 255.255.248.0 即可。

地址解析

IP 地址属于网络层的寻址,数据包通过 IP 地址及路由表在物理网络中传递,还必须遵守网络的物理层协议,底层的物理网络需要获知 IP 地址,这就需要将 IP 地址映射为物理网络地址。同时,物理网络地址也需要映射为 IP 地址。网络层提供的 ARP(地址解析协议)和 RARP(反向地址解析协议)即可实现 MAC 地址(物理地址)和 IP 地址(逻辑地址)的相互转换。

####### ARP(地址解析协议)

IP 数据报必须封装成帧才能通过物理网络传输,这就要求发送方必须知道接收方的物理地址。ARP 的功能分为两部分:一部分在发送数据包时请求获得目的节点的物理地址;另一部分向请求物理地址的节点发送解析结果。

当网络中的一个节点(主机或路由器)需要获知另一个节点(主机或路由器)的物理地址时它就发送 ARP 查询报文。这个报文包括发送方的物理地址和 IP 地址,以及接收方的 IP 地址。由于发送方并不知道接收方的物理地址,查询报文就只能在网络上广播。

在网络上的每一个节点都会接受这个 ARP 查询报文,将该报文中的接收方 IP 地址与自己的 IP 地址进行比较,相同的节点向查询者回传 ARP 应答报文。该应答报文中包含接受方的 IP 地址和物理地址,以及发送方的物理地址。由于知道查询者物理地址,该报文用单播方式直接发送给查询者。

####### RARP(反向地址解析协议)

RARP 可以实现从物理地址到 IP 地址的转换,主要被无盘计算机用来获取其 IP 地址。

ARP 假定每个主机都知道自己的物理地址和 IP 地址的映射,地址解析的目的是获取另一个网络节点的物理地址。而 RARP 则主要是通过本机的物理地址获取本机的 IP 地址,需要借助于 RARP 服务器帮助完成解析。

结语

虽然网络层中有 5 个协议,但 IP 协议是最核心的协议,其他 4 个协议都是为 IP 协议服务的,增加地址解析、差错控制等功能。

相关

前端工程化:对于构建工具链的简单思考

前端工程化是在做与业务开发完全不同的事情,旨在解决软件工程领域与开发者密切相关的问题,通常会将其与基建开发、DevOps 放在一起讨论。前端开发是复杂的,其结合了 HTML/CSS/JavaScript 3 种语言,甚至还有很多其超集,没有开箱即用的工具链,不像 Java Web 开发、Android 开发等等有官方或者商业领域非常成熟的工具可以利用,一切都源于开源社区的从 0 开始构建。正因如此,前端工程化领域百花齐放,开放与创新展现的淋漓尽致,这也是前端开发者了解学习软件工程的机会。

了解更多

Fastify框架 - 专注于性能和低内存消耗

最近在做 Node.js 技术相关的调研,需要选定一个 Web 框架作为基础来构建业务。一般来说,首选开源方案,对于我来说,比较关注框架背后的开发团队情况、项目活跃度、是否有足够多的商业案例、文档是否完整可读、框架的设计理念、技术架构是否灵活可扩展、技术社区生态是否完整等方面。目前,我比较倾心的是 Fastify 这个新兴框架,根据官网介绍,其专注于高性能和低消耗,并且公开的基准测试表现相当不错,项目足够活跃,更重要的是属于 OpenJS 基金会的孵化项目。本文主要介绍 Fastify 的设计理念和探究其是如何提高性能和降低内存消耗的。

了解更多

编辑器:Sublime Text - Vim 插件

Sumblime Text 是一个具有漂亮的界面和强大功能的文本编辑器,而且也支持许多丰富的插件。它是一个收费软件,但是允许开发人员无限期的免费试用。

了解更多