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

网络网络层之(1)IPv4协议

Author: Once Day Date: 2024年4月4日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦...

漫漫长路,有人对你微笑过嘛...

全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客

参考文章:


文章目录

  • 网络网络层之(1)IPv4协议
        • [1. 介绍](#1. 介绍)
          • [1.1 IPv4协议](#1.1 IPv4协议)
          • [1.2 IPv4协议族](#1.2 IPv4协议族)
          • [1.3 相关RFC文档](#1.3 相关RFC文档)
        • [2. IP数据报格式](#2. IP数据报格式)
          • [2.1 IPv4报文格式](#2.1 IPv4报文格式)
          • [2.2 IP分片报文](#2.2 IP分片报文)
          • [2.3 IP首部校验和(Internel校验和)](#2.3 IP首部校验和(Internel校验和))
          • [2.4 差异化服务(DS)](#2.4 差异化服务(DS))
          • [2.5 IP选项](#2.5 IP选项)
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数据报都有.

  • 版本(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字节,因此分成下面三个:

数据报 总长度 标识 MF DF 片偏移
原始数据报 3820 1456 0 0 0
切片1 1420 1456 1 0 0
切片2 1420 1456 1 0 175
切片3 1020 1456 0 0 350

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

数据报 总长度 标识 MF DF 片偏移
原始数据报 1420 1456 1 0 175
切片1 820 1456 1 0 175
切片2 620 1456 1 0 275
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

计算过程如下:

  1. 划分16位字相加:4500 + 003c + 1c46 + 4000 + 4006 + ac10 + 0a63 + ac10 + 0a0c = 2 4E17
  2. 高16位与低16位相加:0002 + 4E17 = 4E19
  3. 取反:4E19的反码为B1E6,即校验和为B1E6,符合报文里面的值

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

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

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

yacas 复制代码
HC' = ~(~HC + ~m + n)

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

设原来的首部字段和为S,则有:HC = ~S

更改后的首部字段和为S',则有:S' = S + (~m + n),反码和运算式里加上一个0xFFFF不改变结果,而~m + m = 0xFFFF。

新的校验和HC'应满足:HC' = ~S'

将S'展开:HC' = ~(S + (~m + n))

将HC代入:HC' = ~(~HC + (~m + n))

移项:HC' = ~(~HC + ~m + n)

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

2.4 差异化服务(DS)

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

字段名称 比特位 含义
Precedence 0-2 指定数据包的优先级,取值范围为0-7,值越大优先级越高
D 3 Delay,指定数据包对延迟的敏感程度,1表示低延迟,0表示普通
T 4 Throughput,指定数据包对吞吐量的敏感程度,1表示高吞吐量,0表示普通
R 5 Reliability,指定数据包对可靠性的敏感程度,1表示高可靠性,0表示普通
保留 6-7 未使用,为零值。

但是,由于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值及其对应的服务类别:

名称 DSCP值 二进制表示 服务类别
CS0 0 000000 尽力而为(Best Effort)
CS1 8 001000 优先
CS2 16 010000 立即
CS3 24 011000 瞬间
CS4 32 100000 瞬间覆盖
CS5 40 101000 CRITIC/ECP
CS6 48 110000 网间控制
CS7 56 111000 控制
AF11 10 001010 保证转发(Assured Forwarding)
AF12 12 001100 保证转发(Assured Forwarding)
AF13 14 001110 保证转发(Assured Forwarding)
AF21 18 010010 保证转发(Assured Forwarding)
AF22 20 010100 保证转发(Assured Forwarding)
AF23 22 010110 保证转发(Assured Forwarding)
AF31 26 011010 保证转发(Assured Forwarding)
AF32 28 011100 保证转发(Assured Forwarding)
AF33 30 011110 保证转发(Assured Forwarding)
AF41 34 100010 保证转发(Assured Forwarding)
AF42 36 100100 保证转发(Assured Forwarding)
AF43 38 100110 保证转发(Assured Forwarding)
EF 46 101110 加速转发(Expedited Forwarding)

保证转发(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选项字段由一个或多个选项组成,每个选项都有以下格式:

yacas 复制代码
| -- 类型(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)):

IP选项名称 选项编号 作用 用途
记录路由(Record Route) 7 记录数据包经过的路由器IP地址,每经过一个路由器,将其IP地址添加到选项中。 用于网络诊断和故障排除,跟踪数据包的实际传输路径。
时间戳(Timestamp) 68 记录数据包经过路由器的时间戳,用于测量网络延迟和计算路由器处理时间。 用于网络性能测量和分析,评估网络的时延特性。
松散源路由(Loose Source Route) 131 指定数据包经过的部分路由器IP地址,数据包将按照指定的路径传输,但允许中间路由器进行路由选择。 用于实现特殊的路由需求,如策略路由、流量工程等。
严格源路由(Strict Source Route) 137 指定数据包经过的完整路由器IP地址,数据包将严格按照指定的路径传输,不允许中间路由器进行路由选择。 用于实现特殊的路由需求,如安全路由、网络测试等。
路由器警示(Router Alert) 148 通知中间路由器对数据包进行特殊处理,如RSVP、IGMP等协议使用该选项。 用于实现一些需要路由器特殊处理的协议和功能。
安全(Security) 130 提供数据包的安全相关信息,如安全等级、口令等,用于军事和政府网络。 用于实现网络的安全控制和访问限制。
流标识(Stream ID) 136 标识数据包所属的特定流,用于实现服务质量(QoS)和流量控制。 用于区分不同的数据流,提供差异化的服务质量保证。
快速响应(Quick-Start) 25 允许发送方请求中间路由器为数据流预留资源,加快数据传输速度。 用于实现快速启动和资源预留,提高网络性能。

Once Day

也信美人终作土,不堪幽梦太匆匆......
如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!
(。◕‿◕。)感谢您的阅读与支持~~~

相关推荐
lldhsds1 分钟前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
明月看潮生14 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
wowocpp24 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君37 分钟前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维41 分钟前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
筱源源43 分钟前
Elasticsearch-linux环境部署
linux·elasticsearch
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine2023912 小时前
06 网络编程基础
java·网络
pk_xz1234563 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器