网络网络层之(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)IPv4协议
-
-
-
- 1. 介绍
-
- 1.1 IPv4协议
- 1.2 IPv4协议族
- 1.3 相关RFC文档
- 2. IP数据报格式
-
- 2.1 IPv4报文格式
- 2.2 IP分片报文
- 2.3 IP首部校验和(Internel校验和)
- 2.4 差异化服务(DS)
- 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位的和。最后将该和取反,得到校验和。接收方重复这个过程,并将计算得到的校验和与接收到的校验和进行比较。如果两者相同,则认为数据传输无误;否则,认为数据传输出错。
计算过程:
- 将IP首部划分为16位的字。如果首部长度不是16位的整数倍,则在末尾填充0。
- 将所有16位的字相加,得到一个32位的和。
- 将32位的和的高16位与低16位相加,得到一个16位的和。
- 如果上一步的结果产生进位,则将进位加到结果的低16位上。
- 将上一步得到的16位和取反,得到校验和。
假设一个IP首部的前20字节为:4500 003c 1c46 4000 4006 [检验和b1e6] ac10 0a63 ac10 0a0c
计算过程如下:
- 划分16位字相加:4500 + 003c + 1c46 + 4000 + 4006 + ac10 + 0a63 + ac10 + 0a0c = 2 4E17
- 高16位与低16位相加:0002 + 4E17 = 4E19
- 取反: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字段的各部分含义如下:
字段名称 | 比特位 | 含义 |
---|---|---|
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选项字段由一个或多个选项组成,每个选项都有以下格式:
| -- 类型(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
也信美人终作土,不堪幽梦太匆匆……
如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!
(。◕‿◕。)感谢您的阅读与支持~~~