当前位置: 首页 > news >正文

数据链路层 I(组帧、差错控制)【★★★★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。

为了把主要精力放在点对点信道的数据链路层协议上,可以采用下图(a)所示的三层模型。在这种三层模型中,不管在哪一段链路上的通信(主机 - 路由器之间 or 路由器 - 路由器之间),我们都看成是结点和结点的通信(如下图中的结点 A 和 B ) ,而每个结点只有下三层一一网络层、数据链路层和物理层。

点对点信道的数据链路层在进行通信时的主要步骤如下:
① 结点 A 的数据链路层把网络层交下来的 IP 数据报添加首部和尾部封装成帧。
② 结点 A 把封装好的帧发送给结点 B 的数据链路层。
③ 若结点 B 的数据链路层收到的帧无差错,则从收到的帧中提取出 IP 数据报交给上面的网络层;否则丢弃这个帧。
数据链路层不必考虑物理层如何实现比特传输的细节(为终端结点隐蔽物理传输的细节是物理层的功能)。我们甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如上图(b)所示。

数据链路层协议有很多种,但有三个基本问题则是共同的,即封装成帧、透明传输和差错检测。

一、组帧

先来了解一些定义和概念:

  • 封装成帧(framing, 又称组帧):是指在一段数据的前后分别添加首部和尾部,构成帧(即数据链路层的数据传送单元)。
  • 帧长:等于数据部分的长度加上首部和尾部的长度。
  • 帧定界:首部和尾部中含有很多控制信息,它们的一个重要作用是确定帧的界限,即帧定界。
  • 帧同步:指接收方能从接收到的二进制比特流中区分出帧的起始与终止。
  • 透明传输:如果在数据中恰好出现与帧定界符相同的比特组合(会误认为“传输结束”而丢弃后面的数据),若下图所示,那么就要采取有效的措施解决这个问题,即透明传输。更确切地说,透明(看不见)传输就是不管所传数据是什么样的比特组合,都应当能在链路上传送。
  • 最大传送单元(Maximum Transfer Unit, MTU):为了提高帧的传输效率, 应当使帧的数据部分的长度尽可能地大于首部和尾部的长度,但每种数据链路层协议都规定了帧的数据部分的长度上限,即 MTU 。

注意:组帧时既要加首部,又要加尾部。原因是, 在网络中信息是以帧为最小单位进行传输的,所以接收端要正确地接收帧,必须要清楚该帧在一串比特流中从哪里开始到哪里结束(因为接收端收到的是一串比特流,没有首部和尾部是不能正确区分帧的)。而分组(即IP 数据报)仅是包含在帧中的数据部分,所以不需要加尾部来定界。

数据链路层之所以要把比特组合成帧为单位传输,是为了在出错时只重发出错的帧,而不必重发全部数据,从而提高效率。组帧主要解决帧定界、帧同步、透明传输等问题。通常有以下 4 种方法实现组帧。

1. 字符计数法

如下图所示,字符计数法是指在帧首部使用一个计数字段来记录该帧所含的字节数(包括计数字段自身所占用的 1 个字节)。当接收方读出帧首部的字节计数值时,就知道后面跟随的字节数,从而可以确定帧结束的位置。因为帧与帧之间是连续传输的,所以也能确定下一帧的开始位置。

这种方法最大的问题在于若计数字段出错,即失去了帧边界划分的依据,那么接收方就无法判断所传输帧的结束位和下一帧的开始位,收发双方将失去同步,从而造成灾难性后果。

2. 字节填充(byte stuffing)法

字符填充法使用特定字符来定界一帧的开始与结束,在下图所示的例子中, 控制字符 SOH(Start Of Header)放在帧的最前面,表示帧的首部开始;控制字符 EOT(End Of Transmission)表示帧的结束。

为了使信息位中出现的特殊字符不被误判为帧的首尾定界符,可在特殊字符前面填充一个转义字符 ESC 来加以区分(注意,转义字符是 ASCII 码中的控制字符,是一个字符,而非 “E" “S” “C” 三个字符的组合),以实现数据的透明传输。接收方收到转义字符后,就知道其后面紧跟的是数据信息,而不是控制信息。

在下图(a)所示的字符帧中,帧的数据段中出现 EOT 或 SOH 字符,发送方在每个 EOT 或 SOH字符前再插入一个 ESC 字符(下图(b)所示),接收方收到数据后会自己删除这个插入的 ESC 字符,结果仍得到原来的数据(下图(c)所示)。这也正是字符填充法名称的由来。如果转义字符 ESC 也出现在数据中,则解决方法仍是在转义字符前插入一个转义字符。

3. 零比特填充法

零比特填充法允许数据帧包含任意个数的比特,也允许每个字符的编码包含任意个数的比特。它使用一个特定的比特串 01111110 来标志一帧的开始和结束,如下图所示。

为了不使信息位中出现的比特流 01111110 被误判为帧的首尾标志,发送方的数据链路层先扫描整个数据字段,每遇到 5 个连续的 “1” 时,将自动在其后插入 1 个 “0” 。接收方做该过程的逆操作,即每收到 5 个连续的 “1” 时,就自动删除后面紧跟的 “0” ,以恢复原始信息。

在数据链路层早期使用的 HDLC 协议中,便是采用这种比特填充的首尾标志法来实现透明传输的。零比特填充法很容易由硬件来实现,性能优于字符填充法。

4. 违规编码法

在物理层进行比特编码时,通常采用违规编码法。例如,曼彻斯特编码方法将数据比特 “1” 编码成“高 - 低“电平对,将数据比特 “0” 编码成“低 - 高”电平对,而“高 - 高“电平对和“低 - 低“电平对在数据比特中是违规的(即没有采用)。因此可以借用这些违规编码序列来定界帧的起始和终止。局域网 IEEE 802 标准就采用了这种方法。违规编码法不需要采用任何填充技术,便能实现数据的透明传输,但它只适用于采用冗余编码的特殊编码环境。

因为字符计数法中计数字段的脆弱性和字节填充法实现上的复杂性与不兼容性,目前较常用的组帧方法是零比特填充法和违规编码法。

5. 例题

【2013 统考真题】HDLC 协议对 01111100 01111110 组帧后,对应的比特串为( A )。
A. 01111100 00111110 10
B. 01111100 01111101 01111110
C. 01111100 01111101 0
D. 01111100 01111110 01111101

二、差错控制

由于信道噪声等各种原因,帧在传输过程中可能会出现错误。用以使发送方确定接收方是否正确收到由其发送的数据的方法称为差错控制。通常,这些错误可分为位错和帧错。

  • 位错:帧中某些位出现了差错。通常采用循环冗余校验(CRC)方式发现位错。
  • 帧错:指帧丢失、帧重复或帧失序等错误,它们都属于传输差错。

过去 OSI 的观点是:必须让数据链路层向上提供可靠传输。因此在 CRC 检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。
这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法:
① 对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,传输层的 TCP 协议)来完成。
② 对于通信质量较差的无线传输链路,数据链路层协议依然使用确认和重传机制,向上提供可靠传输的服务。
实践证明,这样做可以提高通信效率。

在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率(Bit Error Rate, BER)。误码率与信噪比有很大的关系,如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。比特在传输过程中可能会产生差错:1 可能会变成 0,而 0 也可能变成 1 ,这就叫做比特差错。比特差错是传输差错中的一种。下面我们仅讨论比特差错。

为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。通常利用编码技术进行差错控制,主要有两类:
自动重传请求(Automatic Repeat Request, ARQ),当接收端检测到差错时,就设法通知发送端重发,直到接收到正确的数据为止;
前向纠错(Forward Error Correction, FEC),接收端不但能发现差错,而且能确定比特串的错误位置并加以纠正。
因此,差错控制又可分为检错编码和纠错编码。

1. 检错编码(Error Detection Codes)

检错编码是用于检测在数据传输或存储过程中是否发生了错误的编码方式。通过添加冗余信息,检错编码能够检测到数据在传送过程中所发生的错误,而无法修正这些错误。常见的检错编码有奇偶校验码(Parity Bit)和循环冗余码(Cyclic Redundancy Check, CRC)。

1)奇偶校验码

奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它由 n - 1 位数据和 1 位校验位组成,校验位的取值(0 或 1)将使整个校验码中 “1” 的个数为奇数或偶数。

  • 奇校验码:在附加一个校验位后,码长为 n 的码字中 “1" 的个数为奇数;
  • 偶校验码:在附加一个校验位后,码长为 n 的码字中 “1" 的个数为偶数。

它只能检测奇数个比特的错误,但并不知道哪些位错了,也不能发现偶数个比特的错误。

例如,数据 1001101 对应的奇校验码为 1001101 1,奇校验码为 1001101 0。若该数据出现 1 位错误(即奇数个比特出错)变为 10 1 1101 ,那么可以检测出该数据有误;若该数据出现 2 位错误(即偶数个比特出错)变为 10 10 101 ,那么将检测不出该数据有误。

2)循环冗余码(CRC)

数据链路层广泛使用循环冗余码检错技术。循环冗余码(CRC)检错的基本思想为:

① 收发双方约定生成多项式 G(x)(最高位和最低位必须为 1)。k 位位串可视为阶数为 k - 1 的多项式的系数序列。例如,可用多项式 x3 + x2 + 1 表示位串 1101 。
② 发送方基于待发送的数据 M 和 G(x),计算出冗余码,将冗余码附加到数据后面一起发送。
③ 接收方收到数据和冗余码后,通过 G(x) 来计算收到的数据和冗余码是否产生差错。

假设一个待传送 m 位的数据 M ,CRC 运算产生一个 r 位的冗余码,称为帧检验序列(FCS)。这样形成的帧将由 m + r 位组成(在所要发送的数据后面增加 r 位冗余码,虽然增大了传输开销,但是可以进行差错检测,这种代价往往是值得的)。这个带检验码的帧刚好能被预先确定的多项式 G(x) 整除。接收方用相同的多项式去除收到的帧,若无余数,则认为无差错。

帧检验序列(Frame Check Sequence, FCS)是指为了进行检错而添加的冗余码。循环冗余检验 CRC 和帧检验序列 FCS 并不是同一个概念,CRC 是一种检错方法,而 FCS 是添加在数据后面的冗余码。CRC 冗余码的位数等于多项式 G(x) 的最高次数。

假设一串二进制数据 M 有 m 位,给定的多项式 G(x) 的阶(即最高次数)为 r,则计算冗余码的步骤如下:
① 加 0 :在 M 的低位端加上 r 个 0,相当于乘以 2r
② 模 2 除:利用模 2 除法,用 ① 中计算出的 2r × M 除以多项式 G(x) 对应的二进制数据串,得到的余数即为冗余码(共 r 位,若前面有 0,则不可省略)。
按照模 2 运算规则,加法不进位,减法不借位,相当于对应位进行逻辑异或操作。下面举一个例子:

设多项式 G(x) = x3 + x2 + 1(即 r = 3),待传送的二进制数据 M = 101001(即 m = 6),经模 2 除法运算后的结果是:商 Q = 110101、余数 R = 001 。所以发送出去的数据为 101001 001(即 2rM + FCS),共有 m + r 位。

在数据链路层,发送端帧检验序列 FCS 的生成和接收端的 CRC 检验都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。

若在传输过程中无差错,则经过 CRC 检验后得出的余数 R 肯定为 0 。但是,若出现误码,则余数 R 仍为 0 的概率极低。因此,在数据链路层若使用 CRC 差错检测技术,可以做到对帧的无差错接受,即:“凡是接收方数据链路层接受的帧均无差错”。

凡是接收方数据链路层接受的帧,我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错;而接收端丢弃的帧虽然曾收到了,但最终还是因为有差错而被丢弃,即未被接受。

注意:
I、循环冗余码(CRC)是具有纠错功能的,只是数据链路层仅使用了它的检错功能。为了方便协议的实现,检测到帧出错则直接丢弃。
II、目前我们没有要求数据链路层向网络层提供“可靠传输”的服务。所谓“可靠传输”就是:数据链路层的发送端发送什么,在接收端就收到什么。传输差错可分为位错(比特差错)和帧错(帧丢失、帧重复或帧失序)。可能接收方收到的每一个帧都没有发生比特差错,但却出现了帧丢失、帧重复或帧失序的传输差错情况。因此,我们应当明确:“无比特差错”与“无传输差错”并不是同样的概念。在数据链路层使用 CRC 检验,能够实现无比特差错的传输,但这还不是可靠传输。

2. 纠错编码(Error Correction Codes)

纠错编码不仅可以检测到错误,还能够在一定程度上自动修正错误。这类编码通过更复杂的冗余信息使接收方能够恢复原始数据,通常在信号噪声较大的环境中使用。最常见的纠错编码是海明码(Hamming Code)。

1)海明码

海明码的实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。

码距,又称海明距离,指两个码字中不相同的二进制的个数。对于一个编码系统,将其中所有的合法码字的最小距离值称为这个编码系统的码距。
例如,某编码系统有 3 个二进制码字,每个码字占 3 位,为 000 101 001。其中,码字 000 和码字 101 的码距为 2;码字 000 和码字 001 的码距为 1;码字 101 和码字 001 的码距为 1。因此,此编码系统的码距为 1 。
海明码 “纠错” d 位,需要码距为 2d + 1 的编码方案;“检错” d 位,需要码距为 d + 1 的编码方案。

现以数据码 1010 为例讲述海明码的编码原理和过程。

① 确定海明码的位数
设 n 为有效信息的位数(n = 4),k 为校验位的位数,则信息位 n 和校验位 k 应满足:n + k <= 2k - 1 。当 k = 3 时,海明码位数为 n + k = 7 <= 23 - 1 成立,此时的 n、k 有效。
设信息位为 D4D3D2D1(1010),共 4 位,检验位为 P3P2P1,共 3 位,对应的海明码为 H7H6H5H4H3H2H1

② 确定检验位的分布
规定校验位 Pi 在海明位号为 2i-1 的位置上,其余各位为信息位,因此有:
P1 的海明位号为 2i-1 = 20 = 1,即 H1 为 P1
P2 的海明位号为 2i-1 = 21 = 2,即 H2 为 P2
P3 的海明位号为 2i-1 = 22 = 4,即 H4 为 P3
将信息位按原来的顺序插入,则海明码各位的分布为:H7H6H5H4H3H2H1 = D4D3D2P3D1P2P1

③ 分组以形成校验关系
每个数据位用多个校验位进行校验,但要满足条件:被校验数据位的海明位号等于校验该数据位的各校验位海明位号之和。另外,校位不需要再被校验。分组形成的校验关系如下。

④ 校验位取值
校验位 Pi 的值为第 i 组(由该校验位校验的数据位)所有位求异或。根据 ③ 中的分组有:
P1 = D1 ⊕ D2 ⊕ D4 = 0 ⊕ 1 ⊕ 1 = 0
P2 = D1 ⊕ D3 ⊕ D4 = 0 ⊕ 0 ⊕ 1 = 1
P3 = D2 ⊕ D3 ⊕ D4 = 1 ⊕ 0 ⊕ 1 = 0
所以, 1010 对应的海明码为 101 0 0 10(被标记的为校验位,其他为信息位)。

⑤ 海明码的校验原理
每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查,构成 k 个校验方程:
S1 = P1 ⊕ D1 ⊕ D2 ⊕ D4
S2 = P2 ⊕ D1 ⊕ D3 ⊕ D4
S3 = P3 ⊕ D2 ⊕ D3 ⊕ D4
若 S3S2S1 的值为 “000" ,则说明无错;否则说明出错,且这个数就是错误位的位号,如S3S2S1 = 001 ,说明第 1 位出错,即 H1 出错,直接将该位取反就达到了纠错的目的。

3. 例题

① 要发送的数据是 1101 0110 11,采用 CRC 检验,生成多项式是 10011,那么最终发送的数据应该是( C )。
A. 1101 0110 1110 10
B. 1101 0110 1101 10
C. 1101 0110 1111 10
D. 1111 0011 0111 00

② 【2023 统考真题】若甲向乙发送数据时采用 CRC 检验,生成多项式为 G(x) = X4 + X + 1(即 G = 10011),则乙方接收到比特串( D )时,可以断定其在传输过程中未发生错误。
A. 10111 0000
B. 10111 0100
C. 10111 1000
D. 10111 1100

三、其他知识点(了解即可)

  1. 数据链路层使用的两种信道:
    点对点信道:使用一对一的点对点方式。PPP 协议则是目前使用最广泛的点对点协议。
    广播信道:使用一对多的广播通信方式。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送,采用共享广播信道的有线局域网普遍使用 CSMA/CD 协议,而无线局域网则使用 CSMA/CA 协议。

  2. 数据链路层所处的地位:
    下图中主机 H1 与主机 H2 都有完整的五层协议栈,而路由器在转发分组时仅使用协议栈的下三层。从图中可以看出数据从主机 H1 传送到主机 H2 需要在路径中的各结点的协议栈向上和向下流动多次。

当我们专门研究数据链路层的问题时,在许多情况下我们可以只关心在协议栈中水平方向的各数据链路层。于是,当主机 H1 向主机 H2 发送数据时,我们可以想象数据就是在数据链路层从左向右沿水平方向传送的,如下图所示。

从数据链路层来看,主机 H1 到主机 H2 的通信可以看成由四段不同的链路层通信组成,即: H1 --> R1, R1 --> R2, R2 --> R3 和 R3 --> H2 。这四段不同的链路层可能采用不同的数据链路层协议。

  1. 点对点信道的一些基本概念:
    链路(“物理链路”, link):指从一个结点到相邻结点的一段物理线路(有线或无线),且中间没有任何其他的交换结点。当进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
    数据链路(“逻辑链路”, data link):当在一条链路上传送数据时,除了需要链路本身外,还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。【即逻辑链路是物理链路加上必要的通信协议。】
    :数据链路层对等实体之间进行逻辑通信的协议数据单元。数据链路层把网络层交下来的数据构成帧发送到链路上,并把接收到的帧中的数据取出并上交给网络层。

  2. 数据链路层通常可以为网络层提供如下三种服务:
    无确认的无连接服务:源主机发送数据帧时不需先建立链路连接,目的主机收到数据帧时不需发回确认。
    【数据传输的可靠性交由高层负责。适用于误码率较低的通信信道,如以太网。对于信道比较可靠且对实时性要求高的网络,数据链路层采用该服务比较合适。】
    有确认的无连接服务:源主机发送数据帧时不需先建立链路连接,但目的主机收到数据帧时必须发回确认。源主机在所规定的时间内未收到确定信号时,就重传丢失的帧,以提高传输的可靠性。
    【该服务适用于误码率较高的通信信道,如无线通信。】
    有确认的面向连接服务:帧传输过程分为三个阶段:建立链路、传输帧、释放链路。目的主机对收到的每一帧都要返回确认,源主机收到确认后才能发送下一帧,因而该服务的可靠性最高。
    【该服务适用于可靠性要求较高的场合。】

注意:有连接就一定要有确认,即不存在无确认的面向连接的服务。

  1. 链路管理:
    数据链路层连接的建立、维持和释放过程称为链路管理,它主要用于 面向连接 的服务。链路两端的结点要进行通信,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中则要能维持连接,而在传输完毕后要释放该连接。

相关文章:

数据链路层 I(组帧、差错控制)【★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 为了把主要精力放在点对点信道的数据链路层协议上&#xff0c;可以采用下图&#xff08;a&#xff09;所示的三层模型。在这种三层模型中&#xff0c;不管在哪一段…...

悟空降世 撼动全球

文&#xff5c;琥珀食酒社 作者 | 积溪 一只猴子能值多少钱&#xff1f; 答案是&#xff1a;13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话&#xff1a;悟空》 这只猴子到底有多火&#xff1f; 这么跟你说吧 茅台见了它都…...

Swoole 和 Java 哪个更有优势呢

Swoole 和 Java 各有优势&#xff0c;在性能上不能简单地说哪一个更好&#xff0c;需要根据具体的应用场景来分析。 Swoole 优势&#xff1a;高并发&#xff1a;Swoole 是一个基于 PHP 的异步、协程框架&#xff0c;专为高并发场景设计&#xff0c;适用于 I/O 密集型应用&…...

Salesforce 发布开源大模型 xGen-MM

xGen-MM 论文 在当今 AI 技术飞速发展的时代&#xff0c;一个新的多模态 AI 模型悄然崛起&#xff0c;引起了业界的广泛关注。这个由 Salesforce 推出的开源模型—— xGen-MM&#xff0c;正以其惊人的全能特性和独特优势&#xff0c;在 AI 领域掀起一阵旋风。那么&#xff0c;x…...

冒 泡 排 序

今天咱们单独拎出一小节来聊一聊冒泡排序昂 冒泡排序的核心思想就是&#xff1a;两两相邻的元素进行比较&#xff08;理解思路诸君可看下图&#xff09; 接下来我们上代码演示&#xff1a; 以上就是我们初步完成的冒泡排序&#xff0c;大家不难发现&#xff0c;不管数组中的元…...

采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...

IAA游戏APP如何让合理地让用户观看更多广告,提高广告渗透率

广告变现已经成为休闲游戏开发者重要的收益方式之一&#xff0c;超50%国内休闲游戏已经采用广告变现的方式&#xff0c;游戏广告预算是游戏行业开发者广告变现的主要预算来源。 #深度好文计划#如何合理地提高广告渗透率&#xff1f; 广告渗透率能直接反映游戏中有广告行为用户…...

环网交换机的特殊作用是什么?

环网交换机作为现代网络建设的重要组成部分&#xff0c;具有独特而特殊的作用。在信息技术迅猛发展的今天&#xff0c;各类数据传输和网络连接需求日益增加&#xff0c;环网交换机的出现为解决这些问题提供了理想的方案。环网交换机通常将多个网络节点通过环形结构连接起来&…...

mac电脑安装Zsh并启用

安装 Zsh 1. 安装 Zsh 新版mac系统会默认安装并使用zsh&#xff0c;如没用&#xff0c;需在终端中安装&#xff1a; brew install zsh2. 安装 Oh My Zsh 克隆Oh My Zsh到你的目录&#xff1a; git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh3. 复…...

【后续更新】python搜集上海二手房数据

源码如下: import asyncio import aiohttp from lxml import etree import logging import datetime import openpyxlwb = openpyxl.Workbook() sheet = wb.active sheet.append([房源, 房子信息, 所在区域, 单价, 关注人数和发布时间, 标签]) logging.basicConfig(level=log…...

创建GPTs,打造你的专属AI聊天机器人

在2023年11月的「OpenAI Devday」大会上&#xff0c;OpenAI再度带来了一系列令人瞩目的新功能&#xff0c;其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相&#xff0c;不仅标志着个性化AI时代的到来&#xff0c;更为开发者和普通用户提供了前所未有的便利。接下来&#xff0…...

深度学习 vector 之模拟实现 vector (C++)

1. 基础框架 这里我们有三个私有变量&#xff0c;使用 _finish - _start 代表 _size&#xff0c;_end_of_storage - _start 代表 _capacity&#xff0c;并且使用到了模版&#xff0c;可以灵活定义存储不同类型的 vector&#xff0c;这里将代码量较小的函数直接定义在类的内部使…...

关于LLC知识10

在LLC谐振腔中能够变化的量 1、输入电压 2、Rac&#xff08;负载&#xff09; 所以增益曲线为红色&#xff08;Rac无穷大&#xff09;已经是工作的最大极限了&#xff0c;LLC不可能工作在红色曲线之外 负载越重时&#xff0c;增益曲线越往里面 假设&#xff1a; 输入电压…...

最长的严格递增或递减子数组

给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 示例 1&#xff1a; 输入&#xff1a;nums [1,4,3,3,2] 输出&#xff1a;2 解释&#xff1a; nums 中严格递增的子数组有[1]、[2]、[3]、[3]、[4] 以及 [1,4] 。 nums 中…...

【JavaEE】SpringBoot 统一功能处理:拦截器、统一数据返回与异常处理的综合应用与源码解析

目录 SpringBoot 统⼀功能处理拦截器拦截器快速⼊⻔拦截器详解拦截路径拦截器执⾏流程 登录校验定义拦截器注册配置拦截器 DispatcherServlet 源码分析(了解)初始化(了解) DispatcherServlet的初始化1. HttpServletBean.init()2. FrameworkServlet.initServletBean() WebApplic…...

I2C学习:上拉电阻选取

一&#xff0e;I2C简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。I2C总线在使用时&#xff0c;需要接上拉电阻&#xff0c;这是因为I2C接口是开漏输出&#xff0c;如图1所示。 图1 I2C开漏输出 I2C有5种速度模式&#xff1a;标准&#xff08;100KHz&am…...

AC自动机-1

AC自动机&#xff08;Aho-Corasick Automaton&#xff09;是一种高效的多模式字符串匹配算法。它是由Alfred Aho和Margaret Corasick在1975年提出的。这种算法可以在一次扫描输入文本的情况下,同时查找多个模式串。 基本概念 Trie树 AC自动机是基于字典树数据结构构建的字典树…...

注解@Service@Component@Slf4j@Data

在Java中&#xff0c;这四个注解分别属于不同的用途和库&#xff0c;下面是它们各自的作用&#xff1a; Service&#xff1a; 这个注解通常用于Spring框架中&#xff0c;它用于标记服务层组件。在Spring中&#xff0c;服务层通常包含业务逻辑。当一个类被标记为Service&#xf…...

【Nodejs】六、express框架

目录 一、express 介绍 二、express 使用 2.1 express 下载 2.2 express 使用 三、express 路由 3.1 什么是路由 3.2 路由的使用 3.3 获取请求参数 3.4 获取路由参数 四、express 响应设置 五、express 中间件 5.1 什么是中间件 5.2 中间件的作用 5.3 中间件的类…...

进阶 pro max

最近搞了许多有趣的东西&#xff0c;比如自制rtos&#xff0c;速成数模电&#xff0c;学了一点点的AD&#xff0c;看着视频弄了HAL库&#xff0c;以及定时器和串口中断配合实现接收任意长度&#xff08;不超过缓冲值&#xff09;数据&#xff0c;还有配置hal库的freertosfafts …...

Agentic Security:一款针对LLM模型的模糊测试与安全检测工具

关于Agentic Security Agentic Security是一款针对LLM模型的模糊测试与安全检测工具&#xff0c;该工具可以帮助广大研究人员针对任意LLM执行全面的安全分析与测试。 请注意 Agentic Security 是作为安全扫描工具设计的&#xff0c;而不是万无一失的解决方案。它无法保证完全防…...

Spring Cloud Config 与 Spring Cloud Bus 来实现动态配置文件

要使用 Spring Cloud Config 与 Spring Cloud Bus 来实现动态配置文件&#xff0c;你可以按照以下步骤操作&#xff1a; ### 步骤 1: 添加依赖 首先&#xff0c;确保你的项目中添加了 Spring Cloud Config 客户端和 Bus 的依赖。对于 Maven 项目&#xff0c;pom.xml 文件应该…...

Qt:Qt背景

目录 1.Qt解释 2.Windows下开发GUI的方案 3.框架 4.Qt历史 4.Qt支持的平台 5.Qt版本 6.Qt案例 1.Qt解释 前端开发&#xff0c;分为网页前端开发&#xff08;Web)、桌面应用开发&#xff08;Windows、Linux&#xff09;、移动应用开发&#xff08;Android&#xff09;。Q…...

【数据结构】选择排序

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 目录 前言&#xff1a; 基本思想 直接选择排序 思路分…...

国产GD32单片机开发入门(二)GD32单片机详解

文章目录 一.概要二.单片机型号命名规则三.GD32F103系统架构四.GD32F103C8T6单片机启动流程五.GD32F103C8T6单片机主要外设资源六.单片机开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.GD32单片机内部框图3.GD32单片机管脚图4.GD32单片机每个管脚功能5.单片机功耗数…...

8个我平时每天都会看的网站,涵盖办公、娱乐、学习等

分享8个我平时每天都会看的网站&#xff0c;涵盖办公、娱乐、学习等多种类别&#xff0c;试过就知道有多好用&#xff01; 1、MyFreeMP3 tools.liumingye.cn/music/#/ 一个可以免费听歌的平台&#xff0c;不用充会员&#xff0c;里面收录了大多数的国内外知名流行歌手、乐队的…...

Vue2——父子之间间的调用

1、父组件给子组件传值使用props 父组件&#xff1a; <div><SonPage msg"通过props传递值---父>子" ></SonPage><h1>父组件</h1></div> 子组件 <div :style"{border: 1px solid red}"><h1>子组件…...

xfs Vs ext4?

xfs测试 ext4 测试 对比 XFS和EXT4都是Linux系统中广泛使用的文件系统&#xff0c;它们各有特点和优势&#xff0c;选择哪一个取决于你的具体需求和使用场景。下面是它们的主要特点&#xff1a; XFS: 由Silicon Graphics Inc.开发&#xff0c;最初用于SGI的IRIX系统。支持非…...

数据结构stack (笔记)

文章目录 1. 概念理解易混淆内容 2. 时间复杂度3. 实现方式4. 应用5. 内容出处 1. 概念理解 stack(中文名&#xff1a;堆栈、栈)&#xff1a;虽然它叫堆栈&#xff0c;但是它其实指的是栈&#xff0c;跟堆没啥关系。 栈的特性&#xff1a;先进后出、后进先出(这个过程就…...

SQL - 创建 表和数据库

创建和删除数据库 create database if not exists sql_store2; //创建 drop database if exists sql_store2; //删除 -- 创建数据库 create database if not exists sql_store2; drop database if exists sql_store2; 创建表 create table customers (someting); -- 创建表 cre…...

专业手机网站建设哪家好/营销是做什么

随着每天温度的降低&#xff0c;慢慢进入了秋天。虽然这里的秋季雨天比较多&#xff0c;但偶尔晴朗得万里无云的日子会让心情一下变得阳光很多&#xff0c;走在上班的路上都会不自主的哼着歌&#xff0c;呵呵&#xff0c;臭美一下。路边的小桂花树也散发着淡淡的香味&#xff0…...

平面设计网站推荐/拓客软件排行榜

Python初学者的自我修养&#xff0c;找到自己的方向 对于我来说Python的应用场景主要是机器学习、深度学习相关&#xff0c;对于其他的场景涉猎不多。因此本文的目的并不是列举出一系列小项目给你们练手&#xff0c;而是希望引导大家思考这个问题&#xff0c;从而找到适合自己…...

建设网站找谁/百度搜索竞价推广

happens-before和as-if-serial并发编程系列汇总先行发生原则(happens-before)什么是happens-beforehappens-before规则示例as-if-serial语义总结并发编程系列汇总 并发编程系列文章飞机票Thread生命周期及interrupted登机入口synchronized锁升级原理分析登机入口volatile内存屏…...

互联网创业项目哪家好平台/上海快速排名优化

页面布局遇到一个奇怪现象&#xff0c;在RelativeLayout 时最下面的 一个view 设置的layout_marginBottom 在小米手机显示正常&#xff0c;在三星&#xff0c;华为设置的距离就变为 0 了。 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android&…...

南昌网站建设公司服务器/怎样进行seo推广

注:采集专用 假如说在某个页面上有很多连接,样式都是<a href"url">title</a>,我打算将url和title放入数据库中 举个例子,HtmlCode的值如下 <a href"url1">title1</a> <a href"url2">title2</a> <a hre…...

做化工的外贸网站都有什么意思/太原网站制作优化seo

前言&#xff1a;这次的比赛一共有六道web题&#xff0c;接下我会详细介绍解题的步骤以及思路&#xff0c;以便让小白和没有接触过这类题型的小伙伴们能读懂。第一题&#xff0c;nani1、打开网页啥都没有&#xff0c;内容一片空白啥。这时候我们应该按F12去查看网页源码。往往很…...