0


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

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

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

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

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

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

参考文章:

  • 《TCP/IP详解卷一》
  • 【网络干货】IPV4基本原理技术详解 - 知乎 (zhihu.com)
  • 计算机网络知识点总结(八)IPv4协议基本原理详解 - 知乎 (zhihu.com)
  • 一文读懂网络报问中的检验和(checksum)—— 原理+举例+代码-CSDN博客
  • Internet Protocol Version 4 (IPv4) Parameters (iana.org)

文章目录

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字节,因此分成下面三个:
数据报总长度标识MFDF片偏移原始数据报38201456000切片114201456100切片21420145610175切片31020145600350
假定切片2还要划分切片,则如下:
数据报总长度标识MFDF片偏移原始数据报1420145610175切片1820145610175切片2620145610275

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'

可以通过以下公式计算:

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字段的各部分含义如下:
字段名称比特位含义Precedence0-2指定数据包的优先级,取值范围为0-7,值越大优先级越高D3Delay,指定数据包对延迟的敏感程度,1表示低延迟,0表示普通T4Throughput,指定数据包对吞吐量的敏感程度,1表示高吞吐量,0表示普通R5Reliability,指定数据包对可靠性的敏感程度,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值二进制表示服务类别CS00000000尽力而为(Best Effort)CS18001000优先CS216010000立即CS324011000瞬间CS432100000瞬间覆盖CS540101000CRITIC/ECPCS648110000网间控制CS756111000控制AF1110001010保证转发(Assured Forwarding)AF1212001100保证转发(Assured Forwarding)AF1314001110保证转发(Assured Forwarding)AF2118010010保证转发(Assured Forwarding)AF2220010100保证转发(Assured Forwarding)AF2322010110保证转发(Assured Forwarding)AF3126011010保证转发(Assured Forwarding)AF3228011100保证转发(Assured Forwarding)AF3330011110保证转发(Assured Forwarding)AF4134100010保证转发(Assured Forwarding)AF4236100100保证转发(Assured Forwarding)AF4338100110保证转发(Assured Forwarding)EF46101110加速转发(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选项字段由一个或多个选项组成,每个选项都有以下格式:

| -- 类型(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允许发送方请求中间路由器为数据流预留资源,加快数据传输速度。用于实现快速启动和资源预留,提高网络性能。

Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

标签: linux 网络 IPv4

本文转载自: https://blog.csdn.net/Once_day/article/details/138549542
版权归原作者 Once-Day 所有, 如有侵权,请联系我们删除。

“网络网络层之(4)IPv4协议”的评论:

还没有评论