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

网络网络层之(4)IPv4协议
网络网络层之(1)IPv4协议 Author: Once Day Date: 2024年4月4日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的…...

16-LINUX--线程安全
一。线程安全 线程安全即就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 要保证线程安全需要做到: 1) 对线程同步,保证同一时刻只有一个线程访问临界资…...

Flask SQLAlchemy 技术指南
文章目录 什么是 Flask SQLAlchemy?安装 Flask SQLAlchemy创建 Flask 应用和数据库模型添加和查询数据运行 Flask 应用总结**数据库迁移(Database Migrations)****复杂查询****关系模型****事务处理****性能优化****安全性****扩展功能** Fla…...

js通过时间对JSON中的数据进行排序
需求 现在需要通过每一个数据段的date字段对数组的整体数据进行排序! 元数据如下: var data [{"filename": "123","date": "2024-05-10 19:53:57","stand": "GB-14","filter":…...

leetcode206-Reverse Linked List
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 分析 用一个指针记录当前位置,另外一个指针记录当前位置的前一个位置,…...

云计算第十二课
安装虚拟机 第一步新建虚拟机 选择自定义安装 下一步 选择稍后安装操作系统 选择系统类型和版本 选择虚拟机文件路径(建议每台虚拟机单独存放并且路径不要有中文)点击下一步 选择bios下一步 选择虚拟机处理器内核数量 默认硬盘或者自行调大硬盘 选择虚…...

【elasticsearch】慢查询替代查询审计的尝试
【elasticsearch】慢查询替代查询审计的尝试 使用了es有两年了,突然发现一个,es没有查询审计日志,某个用户查询了某个索引的审计。 找了官方文档和社区的回复都是说使用slow log替代慢查询。 尝试一下。 参考链接1:https://discus…...

腐烂的橘子BFS
题目: 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子…...

什么是分库分表
读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:如果 MySQL 一张表的数据量过大怎么办? 答案当然是分库分表 什么是分库? 分库 就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可…...

pytest并发执行用例方案
背景 开始做新项目的UI自动化,需要考虑用例的并发执行,因为之前做的项目是通过插件pytest-parallel 0.1.1 pytest-multithreading-allure 1.0.8来实现的,所以这次也打算用此方法,然而在实际使用过程中发现一些问题。 问题一 通…...

VO,PO,DTO
DTO(Data Transfer Object)数据传输对象 前后端之间的传输时使用 比如前端登录请求的请求参数有username,password,但后端pojo类user有username,password,birthday,gender时,可以创…...

Java设计模式-工厂
Java设计模式中,工厂模式主要包括普通工厂模式以及抽象工厂模式,普通工厂模式是用于制造输出不同类型的对象,抽象工厂模式是用于制造输出不同类型的普通工厂,本文主要描述工厂模式的基本用法。 如上所示,使用普通工厂模…...

【JavaEE】【1.3 Servlet】1.3.6 监听
什么是Servlet上下文? Servlet上下文(Servlet Context)是Java Servlet技术中的一个概念,它代表了一个Web应用程序的上下文环境。在Servlet规范中,每个Web应用程序都有一个唯一的Servlet上下文对象,该对象在…...

C#泛型委托
在C#中,delegate 关键字用于声明委托(delegates),委托是一种类型安全的函数指针,允许你传递方法作为参数或从方法返回方法。有时我们需要将一个函数作为另一个函数的参数,这时就要用到委托(Dele…...

从零开始精通RTSP之多播传输
概述 多播(Multicast)是一种高效的网络通信技术,它允许一台或多台主机(可称为多播源)发送单一数据包到多个目标主机(可称为多播组的成员),而只有属于该多播组的接收者才会接收到这些…...

(五)STM32F407 cubemx IIC驱动OLED(2)硬件篇
这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。 废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统硬件IIC配…...

头歌实践教学平台:CG1-v1.0-点和直线的绘制
第5关:0<k<1直线绘制-中点算法 一.任务描述 根据下面要求,在右侧修改代码,绘制出预期输出的图片。平台会对你编写的代码进行测试。 1.本关任务 掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的中点画线算法…...

java基础之面向对象的思想
一、面向对象和面向过程的编程思想对比 面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的(自己干活)。 面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的…...

红黑树的理解和简单实现
目录 1. 红黑树的概念和性质 2. 红黑树的插入 2.1. 情况一:新增节点的父亲为空 2.2. 情况二:新增节点的父亲非空且为黑色节点 2.3. 情况三:当父亲为红节点,叔叔存在且为红 2.3.1. 当祖父为根节点的时候 2.3.2. 当祖父不是根…...

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解
文章目录 [发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之:gemm/th…...

【C语言项目】贪吃蛇(下)
个人主页~ 源码在Gitee仓库~ 上一篇贪吃蛇(上)~ 贪吃蛇 四、核心的实现游戏测试1、GameStart(1)控制台窗口大小和名字设置(2)光标隐藏(3)打印欢迎界面(4)创建…...

【Unity实战|热更】Addressable读取SO文件报错解决
情景再现 假定你有一个Unity工程,使用了HybridCLR和Addressable,SO文件存放在Addressable中。热更加载后进入游戏场景出现了SO文件读取报错: UnityEngine.AddressableAssets.InvalidKeyException: Exception of type UnityEngine.Addressab…...

Web自动化 - selenium
文章目录 一、selenium的使用selenium的安装 二、元素1. 定位选择元素1.id 定位2. class_name 定位find_element 和 find_elements的区别3. TAG_NAME 定位4. 超链接 定位 2. 操控元素1. 查询内容2. 获取元素文本内容3. 获取元素属性 3. 浏览器常用操作API4. 鼠标操作 - perform…...

基于select for update 实现数据库分布式锁
1、select for update 的基本语法 SELECT * FROM table_name WHERE condition FOR UPDATE;2、select for update 的定义及作用 2.1 、select for update的含义是在查询数据的同时对所选的数据行进行锁定,以保证数据的一致性和并发控制。在并发环境下,多…...

Java后端实现对象与文件接收数据(minio测试)
实现思路: 1. 两个接口实现,一个接对象数据(file),一个接文件数据(json)。 2. json对象(base64String) 实体类信息 ,请求体统一接收 3. file, String name ,String password ,String name , Controller层接收 统一…...

考研踩坑经验分享
文章目录 写在前面自身情况简介自身学习路线优点坑点 学习路线建议1、2和3月份3、4和5月份6、7和8月份9、10月份11、12月份 一些私货建议结尾 写在前面 考研是一件非常有盼头的事,但绝对不是一件容易的事。 如果你不能做好来年三月份出成绩时,坦然接受…...

Android Compose 一:基础控件
Flutter 与 Compose 组件辣么像,难道是同一个google团队整的;也未深究,只是猜测。 创建项目 需要使用新版本Android studio,忽略步骤… 项目目录 MainActivity说明 1 系统默认页面 Preview 修饰的方法,只用来供开发…...

python3.12.0 在Linux 制作镜像包 部署到docker 全过程
项目结构: 比如,在pycharm里需要运行 themain.py 1、上传Linux的目录结构: Dockerfile 文件需要制作: 这里是关键: #基于的基础镜像 FROM python:3.12.0 #代码添加到code文件夹 ADD ./EF_NFCS /code #设置code文…...

STM32理论 —— μCOS-Ⅲ(新)
文章目录 1. 任务调度器1.1 抢占式调度 μCos-Ⅲ全称是Micro C OS Ⅲ,由Micriμm 公司发布的一个基于C 语言编写的第三代小型实时操作系统(RTOS); RTOS 与裸机相比最大的优势在于多任务管理与实时性,它提供了多任务管理和任务间通信的功能&a…...

衢州知识付费系统报价,教师如何做精品课程?怎么创造精品课程?
精品课程对于学生的意义来说是不同的,越是精品让学习的人就越觉得值得,所以,做为教师来说,做出精品课程不仅仅是对学生负责,也是对自己负责,那如何做精品课程?相信很多教师们也想知道。 如何创造精品课程?…...