计算机网络——运输层(可靠传输、超时重传、选择确认、流量控制和拥塞控制、TCP连接和释放)
TCP可靠传输的实现
我们假定数据传输只在一个方向进行,即A发送数据,B给出确认。这样的好处是使讨论限于两个窗口,即发送方A的发送窗口和接收方B的接收窗口。
以字节为单位滑动窗口
发送方构造窗口
![]()
窗口前沿和后沿的移动情况
描述发送窗口的状态需要三个指针
传输步骤详解
注意,这里使用的累积确认和超时重传机制:这样在延迟的时间内收到多个连续的包,可以累积一个包,确认通过延迟和累计确认的方式,减少了回复确认包的数量。
窗口和缓存的关系
在TCP的面向字节流的特点得知:把字节流写入TCP的发送缓存,接收方的应用进程从TCP的接收缓存中读取字节流:
首先我们要明确两点:
第一,缓存空间和序号空间都是有限的,并且都是循环使用的。
第二,由于缓存或窗口中实际的字节数可能很大,因此图例仅仅是个示意图,并不代表具体大小数值关系
![]()
从此图也可以得知发送缓存和发送窗口不是一个东西
发送缓存
发送缓存用来暂时存放:
(1)发送应用程序传送给发送方TCP准备发送的数据;(2)TCP已发送出但尚未收到确认的数据。
发送窗口通常只是发送缓存的一部分。已被确认的数据应当从发送缓存中删除,因此发送缓存和发送窗口的后沿是重合的。
发送应用程序最后写入发送缓存的字节减去最后被确认的字节,就是还保留在发送缓存中的被写入的字节数。
发送应用程序必须控制写入缓存的速率,不能太快,否则发送缓存就会没有存放数据的空间。
接收缓存
接收缓存用来暂时存放:
(1)按序到达的、但尚未被接收应用程序读取的数据;(2)未按序到达的数据。
如果收到的分组被检测出有差错,则要丢弃。
如果接收应用程序来不及读取收到的数据,接收缓存最终就会被填满,使接收窗口减小到零。
反之,如果接收应用程序能够及时从接收缓存中读取收到的数据,接收窗口就可以增大,但最大不能超过接收缓存的大小。
强调三点重要的关系
第一,虽然A的发送窗口是根据B的接收窗口设置的,但在同一时刻,A的发送窗口并不总是和B的接收窗口一样大。这是因为通过网络传送窗口值需要经历一定的时间滞后性
另外,发送方A还可能根据网络当时的拥塞情况适当减小自己的发送窗口数值。
第二,TCP通常是把不按序到达的数据先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
第三,TCP要求接收方必须有累积确认的功能,这样可以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。需要注意两点:
- 一是接收方不应过分推迟发送确认,否则会导致发送方不必要的重传,这反而浪费了网络的资源。
- TCP标准规定,确认推迟的时间不应超过0.5秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认。
- 二是捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据。
第四、TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口时,一定要弄清楚是哪一方的窗口
超时重传时间
RTTs
TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到的相应的确认时间。这两个时间之差就是报文段往返时间RTT
超时重传时间RTO的计算
往返时间测量相当复杂
通过上述两个例子可以看出:当发送方出现超时重传后,收到确认报文段时是无法判断出该确认到底是对原数据报文段的确认还是对重传数据报文段的确认,也就是无法准确测量出RTT,进而无法正确计算RTO。
练习
选择确认SACK
若收到的报文段无差错只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?
选择确认(Selective ACK)就是一种可行的处理方法。
说明SACK的工作原理
左边界指出字节块的第一个字节的序号,但右边界减1才是字节块的最后一个序号。
TCP的流量控制
若发送方数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方发送速率不要太快,要让接收方来得及接收。
TCP的流量控制的机制
序号201到300的数据封装成一个TCP报文段发送出去。但该报文段在传输过程中丢失了。这可能由于误码被路由器丢弃或路由器繁忙而丢弃。
注意,上述为第一次流量控制的过程。
超时重传及第二次流量控制
第三次流量控制
TCP持续计时器
设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些可用空间。于是主机B向主机A发送了接收窗口等于300的报文段。
然而,这个报文段在传输过程中丢失了主机,A会一直等待主机B发送的非零窗口的通知,而主机B会一直等待主机A发送的数据。
TCP持续计时器的原理
当主机A的持续计时器超时时,主机A立刻发送一个仅携带1字节数据的零窗口探测报文段。
假设主机B此时的接收窗口值又为零了,主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为零。主机A再次收到零窗口通知,就再次启动一个持续计时器。当持续计时器超时时,主机A立刻发送一个零窗口探测报文段。
假设主机B此时的接收缓存又有了一些可用的空间,于是将自己的接收窗口调整为300。主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为300,这样就打破了死锁的局面。
Q1:A发送的零窗口探测报文段到达B时,如果B此时的接收窗口值仍然为0,那么B根本就无法接受该报文段,又怎么会针对该报文段给A发回确认呢?
A1:实际上TCP规定:即使接收窗口值为0,也必须接受零窗口探测报文段、确认报文段以及携带有紧急数据的报文段。
Q1:如果零窗口探测报文段丢失了,还会打破死锁的局面吗?
A1:回答是肯定的。因为零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传。
例题
TCP传输效率
应用进程把数据传输到TCP的发送缓存后,剩下的发送任务就由TCP来控制了,且可以用不同的机制来控制TCP报文段的发送时机。
三种机制来控制TCP报文段发送时机
第一种:TCP维持一个变量,它等于最大报文段长度MSS。只要缓存中存放的数据达到MSS字节,就组装一个TCP报文段发送出去。
第二种:发送方的应用进程指明要求发送报文段,即TCP支持的推送操作
第三种:发送方的一个计时器期限到了,将已有的缓存数据装入报文段(但长度不能超过MSS)发送出去。
TCP传输的两大问题——控制发送时机
TCP传输的两大问题——糊涂窗口综合症
要解决此问题,可以让接收方等待一段时间,使得接收缓存已有足够容纳一个最长的报文段,或者等到接收缓存已有一半空间。
TCP的拥塞控制
在计算机网络中的链路容量(带宽)、交换节点的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况叫做拥塞。
流量控制与拥塞控制
从控制理论的角度来看拥塞控制这个问题。
流量控制:往往是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便接收端来得及接收。
拥塞控制:防止过多数据注入到网络中,这样可以使网络中的路由器或链路不至于过载。
两者的异同
都是控制源点发送速率,一个点对点地控制,一个全局性控制。
拥塞控制图像
横坐标是提供的负载,也称为输入负载或网络负载 。纵坐标是吞吐量,代表单位时间内从网络输出的分组数目。
在吞吐量饱和之前,网络吞吐量应等于提供的负载,故吞吐量曲线是45°斜线;而到达某一程度吞吐量不再增长而保持为水平线,这就说明提供的负载中有一部分损失掉了。
在实际的网络下,随着提供负载增大,网络吞吐量的增长速率逐渐减小。也就是说吞吐量还未饱和时,就已经有一部分的输入分组被丢弃了。
- 当网络的吞吐量明显小于理想的吞吐量时,网络就进入了轻度拥塞状态、
- 当提供负载达到某一数值时,网络的吞吐量反而随提供的负载的增大而下降,这时网络就进入了拥塞状态。
- 当提供的负载继续增大到某一数值时,网络的吞吐量就下降到零
需要注意:Q1:为什么负载越大,反而容易造成网络拥塞?带宽限制:网络的带宽是有限的,它决定了网络能够同时传输的数据量。当负载增大时,即有更多的数据需要通过网络进行传输,如果这些数据量超过了网络的带宽限制,就会导致网络拥塞
拥塞控制的两种方法
闭环控制
开环控制
衡量拥塞程度的指标:
上述这些指标的上升都标志着拥塞发生的可能性增加。
TCP的拥塞控制算法
为了集中精力讨论拥塞,我们控制以下两个变量:
- 数据是单方面传送的,对方只传送确认报文。
- 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。
发送方控制拥塞窗口的原则:只要网络未出现拥塞,拥塞窗口就可以增大,以便将更多分组发送出去;但只要网络出现拥塞,就必须把拥塞窗口减小。
发送方如何判断网络出现拥塞:网络拥塞时,路由器会将来不及处理的分组丢弃;只要发送方未按时收到确认报文,即出现超时,就可以估计出现了拥塞。因此,发送方在超市重传计时器启动时,就判断网络出现了拥塞。
慢开始算法与拥塞窗口
双方建立连接时,拥塞窗口cwnd的初始值被设置为1。这是因为主机刚开始发送数据时,完全不知道网络的拥塞情况。如果立即把大量的数据都注入网络中,就有可能引起网络拥塞。
较好的方法是由小到大逐渐增大发送方的拥塞窗口(慢开始算法):
发送方给接收方发送名号数据报文段,接收方收到后给发送方发回对零号数据报文段的确认报文段。此时,第一个传输轮次结束,注意,传输轮次是指发送方给接收方。
发送数据报文段后的接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间其实就是往返时间。
当到达慢算法门值ssthresh=16时,改用拥塞避免算法
又开始使用慢开始算法
之后又是拥塞避免算法:
图像小结:
快重传算法和快开始算法
主机将封装有TCP报文的IP数据报传输到路由器,该数据报首部误码被路由器丢弃,这将导致源主机的重传计时器超时,并误认为出现拥塞,于是将拥塞窗口的值降为1,开启了慢开始算法。
采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法首先要求接收方不要等待自己发送数据时才捎带确认,而是要立即发送确认,即使收到了失序报文段也要立即发出对已收到报文段的确认回复。
发送方只要一连收到3个重复确认,就可知道现在并未出现网络拥塞,而只是接收方少收到一个报文段,因而立即重传该报文段。
快重传算法步骤如下:
接收方正确接收到M1和M2后都及时发送了确认,现假定未收到M3而接收到了M4。按照快重传算法,接收方必须立即发送对M2的重复确认,以便让发送方及早知道未收到报文段M3。
发送方接着发送了M5、M6,接收方收到后也仍要再次分别发出对M2的重复确认。如此,发送方一个收到4个M2确认,后3个是重复确认,就可知道现在并未出现网络拥塞,而是接收方少收到一个报文段M3,因而立即重传M3。
快恢复算法
发送方现在知道只是丢失个别的报文段。于是不启动慢开始,而是执行快恢复算法
发送方将慢开始门限ssthresh的值和拥塞窗口cwnd的值都调整为当前cwnd值的一半,并开始执行拥塞避免算法。
也有的快恢复实现是把快恢复开始时的cwnd值再增大一些,即cwnd=新ssthresh+3。既然发送方收到了3个重复的确认,就表明有3个数据报文段已经离开了网络。这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中。
可见现在网络中不是堆积了报文段而是减少了3个报文段,因此可以适当把cwnd值增大一些。
练习
发生超时用慢开始算法,三个确认重传采用快重传和快恢复
而且注意题目中询问的是甲的发送窗口。
注意出现超时重传时,慢开始门限要减少一半,且之后开始进行拥塞算法,
在流量控制中,讲过接收窗口会影响发送窗口的大小,在拥塞控制中知道这个关系是取决于拥塞窗口和接收窗口的最小值。
将收到的数据全部存入缓存而不取走,意味着接收窗口会缩小,发送窗口的大小意味多少数据传入,接收数据前的窗口大小减去当前发送窗口大小就是接收数据后的窗口大小。
重新认识到RTT的效果,初次建立连接时不算在RTT中。
一个RRT包括了:从发送上一处的数据——缩小接收窗口——收到确认后修改发送窗口,这个修改是:接收到确认分组时,拥塞窗口翻倍且同时修改接收窗口
快速重传算法
未出现拥塞的前提下的最长时间,即从拥塞窗口从8kb开始使用拥塞避免算法
主动队列管理AQM
假定一个路由器对某些分组的处理时间特别长,那么这就可能使这些分组中的数据部分经过很长时间才能到达终点,结果引起发送方对这些报文段重传,就可能会引起拥塞,于是采取了拥塞控制措施。
TCP拥塞控制与网际层拥塞控制策略有着密切关系。
网络层的策略对TCP拥塞控制影响最大的就是路由器分组丢弃策略,在最简单的情况下,路由器队列通常采用“先进先出”的规则处理到来的分组。而队列长度有限,当队列已满时,以后再到达的所有分组(这些分组都将排在队列尾部)都被丢弃,这叫作尾部丢弃原则。
路由器尾部丢弃往往会导致一连串分组丢失,使发送方出现超时重传,使TCP进入拥塞控制的慢开始状态,结果使TCP连接的发送方突然把数据的发送速率降低到很小的数值。
- 这导致了网络中许多TCP连接(它们源点和终点各不同),这些连接中的报文段通常是复用在网络层中的IP数据报中传送的。
若发生了尾部丢弃,同时使这些TCP进入到慢开始状态,这在TCP术语中称为全局同步
为了避免网络中出现全局同步问题,在1998年提出了主动队列管理。
- 所谓“主动”,就是在路由器的队列长度达到某个阈值但还未满时就主动丢弃IP数据报,而不是要等到路由器的队列已满时才不得不丢弃后面到达的IP数据报,这样就太被动了。
- 应当在路由器队列长度达到某个值得警惕的数值时,也就是网络出现了某些拥塞征兆时,就主动丢弃到达的IP数据报来造成发送方的超时重传,进而降低发送方的发送速率,因而有可能减轻网络的拥塞程度,甚至不出现网络拥塞。
TCP的运输连接管理
TCP是建立连接的协议,运输连接是用来传送TCP报文的。
TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。
因此,运输连接有三个阶段:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接和释放都能正常进行。
TCP建立连接的过程要解决以下三个问题:
- 要使每一方能够确知对方存在
- 要允许双方协商一些参数
- 能够对运输实体资源进行分配
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫作客户,而被动等待连接建立的应用进程叫作服务器。
TCP的连接建立步骤
TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段
一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于收听状态,等待客户的连接请求。此时B处于被动打开链接。
A的TCP客户进程也是首先创建传输控制块TCB。然后,在打算建立TCP连接时,向B发出连接请求报文段。A属于主动打开链接
- 这时首部中同步位SYN=1,同时选择一个初始序号seq=x。TCP规定syn=1的报文段不能携带数据,但要消耗掉一个序号,这时TCP客户进程进入同步已发送状态。
TCP客户进程收到请求后,如同意连接建立,向A发送确认TCP连接请求确认报文段首部中的同步标志位SYN和确认标志位ACK的值都设置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y(请注意,这个报文段也不能携带数据,但同样需要消耗一个序号)。
这时TCP服务器进程进入同步收到状态。
TCP客户进程收到B的确认后,还要向B给出确认。
确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。
TCP标准规定,ACK报文段可以携带数据,如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。
这时,TCP连接已经建立,A进入已建立连接状态。
当B收到A的确认后,也进入已建立连接状态
Q1:“三报文握手”建立TCP连接—使用“三报文握手”,而不是“两报文握手”建立TCP连接的原因。
A1:
当第一次客户端的TCP连接请求报文段传输延迟时,将会超时重传该连接请求报文段,假设经过此次重传后,TCP接收到该报文段后直接进入已建立连接状态(因为是两次握手),并且传输完成后释放连接进入关闭状态。
此时第一次的客户端的TCP连接请求报文传输到服务器,服务器接收后进入连接建立状态,而客户端收到该报文后因为未发送连接请求报文段而不做出反应,所以会导致服务器资源耗费。
练习
- 发送方的初始序列号在第一次握手时创立=第三次握手的seq
- 接受方的初始序列号在第二次握手时创立=第三次握手的ack
TCP的连接释放
数据传输结束后,通信双方都可释放连接。现在A和B都处于连接建立状态。A的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。
A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入终止等待1状态(FIN-WAIT-1)。需要注意:FIN报文段即使不携带数据,也要消耗一个序号。
B收到连接释放报文段即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面的已传送过的数据最后一个字节的序号加1。然后B就进入关闭等待状态(CLOSE-WAIT).
TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即A已经没有数据要发送了。但B若发送数据,A仍要接收。
A收到B的确认后,就进入终止等待2状态,等待B发出的连接释放报文段。若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w。B还必须重复上次发送过的确认号ack=u+1。这时B就进入了最终确认状态,等待A的确认。
A在收到B的连接释放报文段后,必须对此发出确认。再确认报文段中的ACK置为1,确认号ack=w+1,而自己的序号是seq=u+1(前面发送过的FIN报文段要消耗一个序号),然后进入到时间等待状态。当经过时间等待计时器设置的时间2MSL,A才进入到CLOSED状态。
Q1:TCP客户进入时间等待状态等待2MSL后才进入关闭状态,这是否有必要?
A1:若客户在终止等待2状态收到B发来的报文后,发送了最后确认报文后进入了关闭状态
若客户发送的该报文丢失,服务器的最后确认状态一直向客户发送最后确认报文,但此时客户已经关闭状态,而服务器却无法进入关闭状态。
练习
“消耗序号”的含义:当发送一个SYN段时,尽管它不包含数据,但它仍然会占用一个序号值。这意味着,在后续的数据传输过程中,第一个数据字节的序号将是SYN段序号加1。因此,我们可以说SYN段“消耗掉了一个序号”,因为它为后续的数据传输预留了一个序号空间。
SYN段指的是三次握手时建立同步这个阶段,对于本题,主机甲发送的序号仍是1001,甲给乙发送的第一个应用层数据字节的TCP序号为1001,因为应用层数据作为数据载荷被封装在TCP报文段中。
这里需要注意第三次握手时的1001后续传输时是未携带数据的
实际在应用层到fin段之前如下:
每个序号仅代表一个整数,若每个整数占用相同数量的字节,范围内的整数数量是:
5000 - 1001 + 1 = 4000
TCP计时保活器
TCP建立连接后,如何知道客户端发生故障?
客户端每向服务器发送一次TCP报文,就会激活一次2小时的保活计时器
若TCP出现故障,不能再发送数据,保活计时器到时后,会每隔75秒发送一个TCP探测报文段,一连发送十个后仍无TCP客户进程响应,就判断这个进程所在主机出现故障,便关闭了这个连接。
相关文章:

计算机网络——运输层(可靠传输、超时重传、选择确认、流量控制和拥塞控制、TCP连接和释放)
TCP可靠传输的实现 我们假定数据传输只在一个方向进行,即A发送数据,B给出确认。这样的好处是使讨论限于两个窗口,即发送方A的发送窗口和接收方B的接收窗口。 以字节为单位滑动窗口 发送方构造窗口 窗口前沿和后沿的移动情况 描述发送窗口的状…...
Web安全实践
前言 安全无小事,成败在细节,网络有风险,灾难弹指间。 安全一般情况下看不见,在你周围漂浮着,显现出来后,往往会刻骨铭心。正因为安全看不见,所以往往不受重视,因为感知到的概率真…...

【算法篇】动态规划类(2)——01背包+完全背包(笔记)
目录 一、理论基础 1. 问题类型 2. 01背包问题 3. 完全背包问题 4. 解题步骤 (1)确定dp数组(dp table)以及下标的含义。 (2)确定递推公式。 (3)dp数组如何初始化。 &#x…...

基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 医生界面…...

二进制漏洞利用 | 整数溢出探究
什么是整数溢出? 整数溢出是指当算术运算的结果超出用于存储该结果的数据类型的容量时发生的现象。简单来说,就是当一个数值变得过大(对于有符号整数来说,也可能是过小),无法被正常存储,从而导…...

10种经典的螺栓防松设计
螺栓防松在机械设计中至关重要,不同方式的螺栓防松有哪些特点一起来看一下。 01双螺母 双螺母防松也称对顶螺母防松,当两个对顶螺母拧紧后,两个对顶的螺母之间始终存在相互作用的压力,两螺母中有任何一个要转动都需要克服旋合螺纹…...

开放式蓝牙耳机哪个品牌好用?开放式耳机排行榜测评!
开放式耳机,因其特殊的不入耳佩戴模式,让使用者在享受音乐或者进行通话的过程中,依然可以对外界声音保持敏感。在户外运动场景下,这种特性优势尽显,既保证了耳机佩戴的稳定和舒适,又提高了运动的安全性。为…...

新能源行业必会基础知识---电力现货问答---第5问---何为电力中长期市场?与电力现货市场之间有何关系?国内试点地区如何衔接?国外有哪些经验值得借鉴?
新能源行业必会基础知识-----电力现货问答-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/142909208 虽然这本书已经出来有几年了,现货市场已经产生了一定变化,但是原理还是相通的。还是推荐大家买来这本书进行阅读观看&#…...

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 2 部分:Elastic Agent
作者:来自 Elastic Hemendra Singh Lodhi 了解将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 这是多部分博客系列的第二部分,探讨了将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 在本博客中,我们将了解如何使用 Elastic Agent…...

DTL698电表数据 转 profinet IO协议项目案例
目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关 2 5 用PROFINET IO协议转发数据 4 6 其他说明 6 7 案例总结 7 1 案例说明 设置网关采集DLT698电表数据数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转…...

CSS @规则(At-rules)系列详解___@font-face规则使用方法
CSS 规则(At-rules)系列详解 ___font-face规则使用方法 本文目录: 零、时光宝盒 一、CSSfont-face规则定义和用法 二、font-face语法 三、font-face使用方法例子 3.1、指定一种字体 3.2、font-face 里添加文本的描述符 3.3、设置多个 font-face 规则。 3.4…...

如何通过CDN优化网站服务器访问速度?
CDN,即内容分发网络(Content Delivery Network),在现代互联网中起着重要作用。它可以显著提升网站服务器的访问速度。以下是CDN在加速网站访问方面的主要优势及其工作原理。 1. 全球分布的服务器节点 CDN通过在全球范围内布设多个…...
JAVA学习-练习试用Java实现“自定义函数之字符反转”
问题: 写一函数,使输入的一个字符串按反序存放,在主函数中输入并输出反序后的字符串(不包含空格)。 示例 :输入一行字符123456abcdef,输出逆序后的字符串fedcba654321。 解答思路: …...

大衍数列——考研408考试科目之数据算法——未来之窗学习通
一、大衍数列 中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。 它的前几项是:0、2、4、8、12、18、24、32、40、50 … 其规律是:对偶数项,是序号平方再除2,奇数项,是…...

JVM(HotSpot):直接内存及其使用建议
文章目录 一、什么是直接内存?二、特点三、使用案例四、直接内存的管理 一、什么是直接内存? Direct Memory:系统内存 普通IO,运行原理图 磁盘到系统内存,系统内存到jvm内存。 NIO,运行原理图 划分了一块…...
centos7安装mysql5.7
1. 更新系统软件包 首先,确保您的系统是最新的。打开终端并运行: sudo yum update -y 2. 安装MySQL 5.7的YUM仓库 MySQL提供了自己的YUM仓库,您可以通过下载并安装官方提供的RPM包来添加这个仓库。 wget https://dev.mysql.com/get/mysql57-c…...

如何在JVS逻辑引擎中巧妙运用包含查询功能?
在实际业务场景中,数据查询是不可或缺的一环,包含查询在实际业务场景中经常用到,被广泛应用于各类业务系统中。当我们需要查询状态为指定几种状态的数据时,类似SQL语句中的IN查询就显得尤为重要。为了满足这一需求,在J…...

Spring Boot视频网站:安全与可扩展性设计
4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构,而是基于网络浏览器的方式去访问服务器,进而获取需要的数据信息,这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构,…...
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
目录 写在前面 什么是 Stack 布局? Stack 的基本用法 Stack 布局的核心概念 屏幕适配与 Stack 布局 使用 MediaQuery 获取屏幕尺寸 使用 LayoutBuilder 进行自适应布局 高级层叠样式布局示例 1. 照片展示与文字描述 2. 动态调整层叠布局 写在最后 写在前…...
JavaScript中Number相关特性
目录 非 VIP 用户可前往公众号“前端基地”进行免费阅读 数值范围 小数注意问题 NaN isNaN()判断是不是NaN JavaScript可以表示的进制 数值扩展 非 VIP 用户可前往公众号“前端基地”进行免费阅读 数值范围 数字类型主要涵盖整数与小数。在数值范围方面,存在特…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...