1. 介绍
1.1 IPv4协议

网际协议版本4(IPv4)是网际协议(IP)的第四版,也是第一个被广泛应用的版本。

IPv4的设计和开发始于20世纪70年代,目的是为了连接不同的网络,实现网际互连。

IPv4使用32位(4字节)地址,理论上可以提供约43亿个唯一IP地址。然而,由于互联网的快速发展,IPv4地址在21世纪初已经面临耗尽的问题。为了解决这一问题,互联网工程任务组(IETF)开发了IPv6协议,使用128位(16字节)地址,提供了更大的地址空间。尽管IPv6的部署已经开始,但直到2011年IANA宣布IPv4地址完全分配完毕时,IPv6仍处于部署的初期阶段。

IPv4是一种无连接的协议,它在使用分组交换技术的链路层(如以太网)上运行。分组交换是一种数据传输方式,将数据拆分为一个个数据包(或称数据报),每个数据包独立传输,可以通过不同的路径到达目的地。这种方式提高了网络利用率,但也带来了一些问题,如数据包丢失、重复、失序等。

IPv4采用尽最大努力交付(Best-effort Delivery)的原则,即不保证数据包一定能够到达目的地,也不保证数据包按照发送顺序到达,或者没有重复

IPv4提供的是一种不可靠的数据传输服务,在实际应用中,可靠性由上层的传输层协议(如TCP)来保证,通过错误检测、重传、排序等机制,实现可靠的端到端数据传输。

1.2 IPv4协议族

IPv4协议族是TCP/IP协议族的核心,其中包含了一系列的协议,这些协议共同支持Internet的运作。

  • 地址解析协议ARP(Address Resolution Protocol)负责将IP地址转换为物理地址(如MAC地址)。当一台主机需要与另一台主机通信时,它必须知道目标主机的物理地址。ARP通过广播一个ARP请求,询问目标IP地址对应的物理地址,目标主机收到请求后,会回复自己的物理地址。
  • 逆地址解析协议RARP(Reverse Address Resolution Protocol)与ARP的功能相反,它负责将物理地址转换为IP地址。RARP通常用于无盘工作站,这些工作站在启动时不知道自己的IP地址,需要通过RARP从服务器获取。
  • 互联网控制消息协议ICMP(Internet Control Message Protocol)用于传输控制消息和错误报告。当网络出现问题时,如目标不可达、超时等,ICMP会发送错误报告,帮助网络管理员诊断和解决问题。此外,ICMP还支持ping等网络诊断工具。
  • 传输控制协议TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议。它提供了错误检测、数据重传、流量控制和拥塞控制等机制,保证数据的可靠传输。TCP在传输数据前,需要先建立连接,数据传输完毕后,再断开连接。TCP广泛用于文件传输、电子邮件等需要可靠传输的应用。
  • 用户数据报协议UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议。与TCP不同,UDP不提供数据重传、流量控制等机制,因此传输速度较快,但不保证数据的可靠性。UDP通常用于对实时性要求高、对可靠性要求低的应用,如视频流、在线游戏等。
1.3 相关RFC文档

IPv4协议相关的主要RFC文档如下:

  • RFC 791 - Internet Protocol (IP),该文档定义了IPv4协议的基本功能、数据包格式和协议操作,是IPv4协议的核心文档。

  • RFC 792 - Internet Control Message Protocol (ICMP),该文档定义了ICMP协议,用于传输控制消息和错误报告。

  • RFC 950 - Internet Standard Subnetting Procedure,该文档介绍了子网划分的标准过程,用于IPv4地址的子网划分。

  • RFC 1122 - Requirements for Internet Hosts - Communication Layers,该文档定义了互联网主机在通信层面的要求,包括IPv4协议的实现要求。

  • RFC 1519 - Classless Inter-Domain Routing (CIDR),该文档引入了无类别域间路由(CIDR),用于解决IPv4地址耗尽和路由表增长的问题。

  • RFC 1812 - Requirements for IP Version 4 Routers,该文档定义了IPv4路由器的要求和功能。

  • RFC 2131 - Dynamic Host Configuration Protocol (DHCP),该文档定义了动态主机配置协议(DHCP),用于自动分配IPv4地址。

  • RFC 2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers,该文档定义了IPv4和IPv6头部中的差分服务字段(DS Field),用于支持差分服务。

  • RFC 3022 - Traditional IP Network Address Translator (Traditional NAT),该文档介绍了传统的网络地址转换(NAT),用于解决IPv4地址不足的问题。

2. IP数据报格式
2.1 IPv4报文格式

IP数据报由首部和数据两部分组成,首部前一部分是固定的20字节,所有IP数据报都有.

网络网络层之(4)IPv4协议-LMLPHP

  • 版本(Version,4位),指IP协议的版本。IPv4为4,IPv6为6。

  • 首部长度(Internet Header Length,IHL,4位),表示IPv4头部的长度,以4字节为单位。IPv4头部的最小长度为20字节(IHL=5),最大长度为60字节(IHL=15)。

  • 服务类型(Type of Service,TOS,8位),表示服务质量,用于区分不同类型的数据包,如普通数据包、实时数据包等。最早的RFC 791规定了一个长度为8bit的服务类型(ToS),ToS字段用了4位:D(延迟)、T(吞吐量)、R(可靠性)、C(成本)。但是ToS字段在路由器中并没有很好地利用起来。现已被差分服务(DS)和显式拥塞通告(ECN)取代

  • 区分服务(Differentiated Services,DS,6位),支持不同类型的IP服务,位于服务类型TOS的前六位

  • 显式拥塞通告(Explicit Congestion Notification,ECN,2位),允许在不丢弃报文的同时通知对方网络拥塞的发生。ECN是一种可选的功能,仅当两端都支持并希望使用,且底层网络支持时才被使用。位于服务类型TOS的后两位

  • 总长度(Total Length,16位)指IP头部 + 数据部分的总长度,字节为单位,字段为16位,则数据报最大的长度为65535字节。

    IP协议规定,必须能接收长度不超过576字节的数据报,假设上层交下来的数据长度有512字节,加上最长的IP首部60字节,再加4字节的富余量计算出来的。

  • 标识(Identification,16位),用于标识数据包的唯一性,通常由发送方生成。IP软件维持的一个计数器,每产生一个数据报,计数器就加1。用于分片超过网络MTU大小的IP数据报,能在另一端正确组装起来。

  • 标志(Flags,3位)。第一位保留,always为0。第二位为DF(Don’t fragment),意思是不能分片,DF=0时才能分片。第三位为MF(More Fragment),MF为1表示后面还有“切片”,MF=0表示这已是若干数据报片中的最后一个。

  • 片偏移(Fragment Offset,13位),表示当前分片在原始数据包中的偏移量,以8字节为单位。用于数据包的重组。

  • 生存时间(Time to Live,TTL,8位),表示数据包在网络中的最大跳数。每经过一个路由器,TTL减1,当TTL为0时,数据包被丢弃。用于防止数据包在网络中无限循环。

  • 协议(Protocol,8位),表示数据包携带的上层协议类型,如TCP(6)、UDP(17)、ICMP(1)等。

  • 首部校验和(Header Checksum,16位),这个字段只检验数据报的首部,不包括数据部分,采用反码运算求和方式,也称为Internet校验和。运输层协议必须通过自己的数据完整性检验机制来检查重要数据。每次经过路由器改变TTL时,IP首部校验和也必须改变。

  • 源IP地址(Source Address,32位),表示数据包的源IP地址,即发送方的IP地址。

  • 目的IP地址(Destination Address,32位):表示数据包的目的IP地址,即接收方的IP地址。

  • IP地址可选部分有1-40字节,不满足4字节整数倍需要使用0填充,一般甚少使用。

2.2 IP分片报文

IP分片是指当一个IP数据包的大小超过了网络的最大传输单元(MTU)时,将数据包分割成多个更小的数据包进行传输的过程。这个机制源于早期的网络设计,当时网络链路的MTU大小差异较大,分片能够保证大数据包能够在不同的网络环境中传输。

IP分片由发送方主机或中间路由器执行。当一个大的数据包需要传输时,发送方或路由器将数据包分割成多个小的数据包,每个分片都有自己的IP头部,并设置适当的标识、标志和片偏移字段,以便接收方能够正确地重组数据包。

IP分片也带来了一些问题:

  • 性能开销,分片和重组过程需要消耗额外的CPU和内存资源,特别是对于高速网络,这可能成为性能瓶颈。
  • 重组错误,如果一个分片丢失或损坏,整个原始数据包都无法重组,导致数据丢失。
  • 安全隐患,一些网络攻击(如Ping of Death)利用分片机制,通过发送畸形的分片数据包导致目标系统崩溃。

为了避免IP分片带来的问题,现代网络采用了以下几种解决方法:

  • 路径MTU发现(Path MTU Discovery,PMTUD),发送方通过探测网络路径的MTU大小,确保发送的数据包不超过路径的最小MTU,从而避免分片。这是目前最常用的方法,不过PMTUD依赖ICMP报文,而一些网络设备(如防火墙)可能会阻止ICMP报文,导致PMTUD失效。
  • TCP MSS(Maximum Segment Size):TCP在建立连接时,通过协商确定合适的MSS值,保证TCP段的大小不超过MTU,避免在IP层进行分片。但MSS协商不适用于UDP,MSS协商是TCP的机制,对于UDP这样的无连接协议,无法使用这种方式避免分片。
  • 使用IPv6,IPv6要求链路层支持最小MTU为1280字节,同时也不允许中间路由器进行分片。这有效地避免了分片带来的问题。
  • 分片和重组卸载,一些高性能网络设备(如网卡、交换机)提供了硬件级的分片和重组功能,减轻了主机的处理负担。

IP数据报切片举例:

一个数据总长3820字节,头部为固定长度20字节。第一次要求IP数据报长度不能超过1420字节,因此分成下面三个:

假定切片2还要划分切片,则如下:

2.3 IP首部校验和(Internel校验和)

Internet校验和是一种用于检测数据传输错误的简单方法,广泛应用于IP、TCP、UDP等协议中。

IP首部校验和的计算基于16位的二进制反码算法。发送方将首部划分为16位的字(word),并将所有字相加,得到一个32位的和。然后将高16位与低16位相加,得到一个16位的和。最后将该和取反,得到校验和。接收方重复这个过程,并将计算得到的校验和与接收到的校验和进行比较。如果两者相同,则认为数据传输无误;否则,认为数据传输出错。

计算过程:

  1. 将IP首部划分为16位的字。如果首部长度不是16位的整数倍,则在末尾填充0。
  2. 将所有16位的字相加,得到一个32位的和。
  3. 将32位的和的高16位与低16位相加,得到一个16位的和。
  4. 如果上一步的结果产生进位,则将进位加到结果的低16位上。
  5. 将上一步得到的16位和取反,得到校验和。

假设一个IP首部的前20字节为:4500 003c 1c46 4000 4006 [检验和b1e6] ac10 0a63 ac10 0a0c

校验过程,接收方收到数据包后,执行与发送方相同的计算过程,得到一个16位的和。将该和与接收到的校验和字段进行比较。如果两者完全相同(即,和的取反等于校验和),则认为数据传输无误;否则,认为数据传输出错。

实际计算校验和时,直接将校验和字段也放在里面进行计算,这样算出来的反码和为0XFFFF,直接判断这个值即可。取反之检验和后为0,也可以判断此零值。

快速更新校验和,当IP首部的某些字段发生变化时(如TTL减1),可以快速计算新的校验和,而无需重新计算整个首部的校验和。设原来的校验和为HC,更改前后的字段值分别为m和n,则新的校验和HC'可以通过以下公式计算:

HC' = ~(~HC + ~m + n)

其中,~表示取反操作,+表示16位的加法操作。这个公式可以推导如下:

使用这个公式,可以在O(1)的时间内计算出新的校验和,避免了重新计算整个首部校验和的开销。这对于频繁更新TTL等字段的路由器非常有用,能显著提高转发性能。

2.4 差异化服务(DS)

在早期的IP网络中,使用TOS(Type of Service)字段来提供服务质量(QoS)支持。TOS字段的各部分含义如下:

但是,由于TOS字段的定义和使用存在一些问题,如可扩展性差、实现复杂等,因此引入了DS字段来取代TOS字段。

DS字段(Differentiated Services Field)用于标识数据包的服务等级,以便网络设备根据DS字段的值对数据包进行区分处理。在DiffServ模型中,网络管理员可以根据业务需求定义不同的服务类别(如语音、视频、数据等),并为每个类别分配特定的DS字段值。网络设备根据DS字段值对数据包进行相应的处理,如队列调度、带宽分配、丢弃策略等,以保证不同类别的服务质量要求。

DS字段中的前6位称为DSCP(Differentiated Services Code Point),用于标识服务类别。DSCP值由两部分组成:

  • 前3位表示服务等级(Class Selector),取值范围为0-7,向后兼容IP优先级(Precedence)。
  • 中间2位表示丢弃概率Drop Precedence,取值范围为0-3,用于区分同一服务等级内的不同丢弃优先级。
  • 最后一位保留为0。

以下是一些常见的DSCP值及其对应的服务类别:

保证转发(Assured Forwarding,AF):AF提供了四个服务类别(AF1x、AF2x、AF3x、AF4x),每个类别内部有三个丢弃优先级(AFx1、AFx2、AFx3)。AF保证一定的带宽,但允许一定程度的拥塞发生。当拥塞发生时,高优先级的数据包被优先转发,低优先级的数据包可能被丢弃。

加速转发(Expedited Forwarding,EF):EF提供了最高优先级的服务,保证数据包的低延迟、低抖动和低丢失。EF通常用于对时延敏感的应用,如语音、视频等实时业务。EF要求网络为其预留足够的带宽,以确保端到端的服务质量。

2.5 IP选项

IP选项是IP头部中的一个可变长度字段,最大长度为40字节。它允许在IP数据包中携带一些额外的信息,以实现某些特殊功能,如源路由、时间戳等。

IP选项字段由一个或多个选项组成,每个选项都有以下格式:

| -- 类型(Type, 1 byte) -- | -- 长度(Length, 1 byte) -- | -- 数据(data, 可变长度) -- |
  • 选项类型(1字节):指定选项的类型,如记录路由、时间戳等。
  • 选项长度(1字节):指定选项的总长度,包括选项类型和选项长度字段。
  • 选项数据(变长):携带选项的具体数据,长度由选项长度字段决定。

IP选项的类型有以下几种:

  • 单字节选项:只有选项类型字段,没有选项长度和选项数据字段。
  • 多字节选项:包含选项类型、选项长度和选项数据字段。

在早期的网络中,IP选项曾被用于实现一些特殊功能,如源路由、时间戳、路由器警示等。这些功能对于网络诊断、性能测量和特殊路由需求等方面有一定的作用。

然而,随着网络技术的发展,IP选项的使用逐渐减少。大多数现代网络设备和协议都不再依赖IP选项来实现相关功能。当前,IP选项主要在一些特定场景中使用,如网络研究、安全测试等。

在路由转发过程中,如果数据包包含IP选项,则路由器需要对选项进行处理。这会增加路由器的处理开销,影响转发性能。有些路由器可能会直接忽略或丢弃包含某些选项的数据包。

防火墙在处理包含IP选项的数据包时,通常会采取更严格的策略。许多防火墙会直接丢弃包含某些选项(如源路由)的数据包,以防止潜在的安全威胁。

下面是一些常见的IP选项(详见Internet Protocol Version 4 (IPv4) Parameters (iana.org)):







网络网络层之(4)IPv4协议-LMLPHP

05-08 08:52