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

Linux网络——深入理解传入层协议TCP

目录

一、前导知识

1.1 TCP协议段格式

1.2 TCP全双工本质

二、三次握手

2.1 标记位

2.2 三次握手

2.3 捎带应答

2.4 标记位 RST

三、四次挥手

3.1 标记位 FIN

四、确认应答(ACK)机制

五、超时重传机制

六 TCP 流量控制

6.1 16位窗口大小

6.2 标记位 PSH

6.3 标记位 URG

七、滑动窗口

7.1 滑动窗口的概念 

7.2 滑动窗口的相关问题

7.2.1 滑动窗口的大小

7.2.2 滑动窗口策略简单思路

7.2.2 超时重传时的数据如何保存

7.2.3 超时重传 vs 快重传

八、拥塞窗口


一、前导知识

1.1 TCP协议段格式

源/目的端口号:表示数据是从哪个进程来, 到哪个进程去;
32 位序号/32 位确认号:后面详细讲;
4 位 TCP 报头长度:表示该 TCP 头部有多少个 32 位 (有多少个 4 字节);所以TCP 头部最大长度是 15(2^4 - 1) * 4 = 60
6位标志位:后面具体说
16位窗口大小:后面再说
16位校验和:发送端填充,CRC 校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含 TCP 首部,也包含 TCP 数据部分
16 位紧急指针:后面和标志位中的URG一起说

1.2 TCP全双工本质


在任何一台主机上, TCP 连接既有发送缓冲区, 又有接受缓冲区, 所以, 在内核中, 可以在发消息的同时, 也可以收消息, 即全双工。在这里,收消息和发消息的本质都变成了拷贝,发消息首先把应用层的数据拷贝到发送缓冲区,然后再拷贝到接受方的接受缓冲区,接受方再通过特殊的 API 将接受缓冲区中的数据拷贝到应用层。

二、三次握手

2.1 标记位

为什么要有标记位呢?这里先做一下简单的理解:
作为网络服务器,服务端可以连接多个客户端,但是每个客户端发送的报文分为很多种,以三次握手为例,该报文可能是1)请求连接 2)正文 3)请求关闭 ,所以客户端收到各种各样的报文,这就说明TCP报文是需要类型的,为了区分不同的报文类型,就引入了标记位的概念。

2.2 三次握手

1. TCP建立连接时,发送方先传达一个连接意愿

2. 接收方收到后需要响应这个消息,若不响应,发送方可能会一直重发消息。除此之外,接收方还要表达连接意愿

3.发送方响应接收方的意愿。

首先需要明确的是,上图中的标记位其实是一个个报文,其中SYN指的是报文中SYN标记位被置为1,以此类推:

SYN:请求建立连接,称携带SYN标识的报文为同步报文段。
ACK:确认号是否有效。

其中,当请求方发送连接意愿时,就会发送将SYN标记位置1的报文,接收方相应表示为ACK标记位置1,同时表达连接意愿又会将SYN置1...这种方式即为捎带应答(下面会讲到)。

在这里,配合着上一篇博客中对于TCP网络编程中相关的API来看:
client 通过应用层的 connect 接口发送握手请求,然后阻塞等待三次握手完毕,再继续向后执行
server 通过 listen 接口才会受理接受的 SYN 请求,否则会直接丢弃。

2.3 捎带应答

捎带应答相当于搭顺风车,当不影响网络服务时,ACK 会和服务器的接受意愿一起发送给客户端。但是,在四次握手中并没有出现捎带应答机制,者在下面会讲到。

其实不止是服务器首次回应连接意愿时会有捎带应答,在后面我们要讲到的窗口大小,它们在首次发送时,就会将窗口大小填到报文中传输给发送端,同时,在两次握手后,即发送端确认接受端已经可以接受数据后,发送端相应的ACK就可以开始携带传输数据了!

2.4 标记位 RST

在传输控制协议(TCP)中,RST标记位(Reset flag)用于复位连接。RST标记位通常在以下情况下使用:

  1. 拒绝连接:当一方收到一个连接请求(例如SYN包),但不愿意或者无法建立连接时,它会发送一个带有RST标记位的包来拒绝连接请求。

  2. 中止连接:当一个已经建立的连接出现问题(例如,某一方的应用程序崩溃),一方可能会发送一个带有RST标记位的包来强制终止连接。

  3. 处理错误的数据包:如果一方收到一个无法识别或不符合预期的数据包,它可能会发送一个带有RST标记位的包来通知发送方存在错误并终止连接。

具体来说,当一个TCP数据包的RST标记位被设置时,接收方会立即关闭连接,并不会等待剩余的数据传输完成。这是一种快速且强制性的连接终止方式。

RST标记位的使用通常表示存在某种异常或错误情况,因此在正常的TCP连接管理过程中,RST标记位的出现相对较少。

三、四次挥手

1. 发送方发起断开意愿

2. 接收端响应消息

3. 接收方表达断开意愿

4. 发送方响应断开意愿

3.1 标记位 FIN

这和三次握手的规律大致相同,只是把中间一条拆分成了两条,其中2和3不可以合并为一条,当接收方等待数据数据接收完整后,才可以表达断开意愿。


FIN:通知对方,本端要关闭了,称携带FIN表示的报文为结束报文段

四、确认应答(ACK)机制

在TCP的特点中,有一点叫做:可靠。那么TCP的可靠指的是什么呢?

TCP的可靠指的是,发送方不仅要发送数据,而且还要知道自己发送的数据是否被接收方接收,这就依赖于TCP的确认应答机制。

TCP 将每个字节的数据都进行了编号,即为序列号:

TCP 将应用程序发送的字节流分割成适合传输的段,每个段包含一个序列号,用于在接收端重新组装数据。接收方可以根据这些序列号将数据段正确地拼接成原始的字节流。

下面将发送缓冲区简单想象成线性的数组:

假设主机A发送的数据段是 1-1000 ,那么主机B的应答则需要是 1001 ,此时1001就会写到协议段中的32位确认序号中,表示确认序号以前的报文全部被收到。

五、超时重传机制

若发送方未收到接受方的应答,则统一约定接受方未收到报文,此时有三种可能:
1) 传输数据丢失 2) 应答丢失 3) 被阻塞在路由器中

为了避免第三种情况,发送方会进行等待,如果等待超时,则会进行重传,这就是超时重传机制。超时重传中约定的等待时间在 Linux 系统中会以500ms为基本单位进行动态调整。

六 TCP 流量控制

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速度。这个机制就叫做流量控制。

6.1 16位窗口大小

那么,假设主机A向主机B发送消息,如果要进行流量控制,就需要知道主机B的接受能力,即接受缓冲区中剩余空间的大小。这就要求主机B要将自身的接受能力通告给主机A,这里就用到了TCP协议段格式中的16位窗口大小,用于标明主机B接受缓冲区中剩余空间的大小,同时使用了确认应答机制与捎带应答机制。

6.2 标记位 PSH

当B的接受缓冲区中剩余空间大小为0时,A在此期间会发送一个窗口探测的包,如果B的接受缓冲区一直为0,A就会将报文中的 PSH 标记位置1作为催促标记位,要求主机B尽快将缓冲区中的数据交给上层。

当然不止是这种极端情况,在日常通信中,凡是有这种需求时,都会将标记位 PSH 置1。

6.3 标记位 URG

以上已经介绍了五种标记位,现在剩下最后一种 URG ,URG表示紧急指针是否有效。

在接受缓冲区中,TCP按序为我们排好了很多的数据并按序向应用层进行交付,
紧急指针:仅当URG标记位被设置时才有效。它指示了紧急数据的结束位置。紧急指针的值是一个相对序号,它表示从当前序号开始到紧急数据结束的偏移量。

接受方会优先处理该报文,但是URG的使用并不常见,它传输的紧急数据通常是1字节,表示的是一个状态码,比如在传输2G的数据时,接受方的缓冲区已经接受了1G,此时发送方想要紧急停止传输工作,就会传输一个 URG 被设置的报文,接受方优先处理该报文得知其状态码意味着中断传输,那么之前存放在缓冲区的1G数据也不会再向上进行交付

七、滑动窗口

在前面的讲解中,我们也会意识到,每次先传输数据等待应答后才能再次传输的效率太低了,尤其是数据往返的时间较长的时候:

7.1 滑动窗口的概念 

既然这样一发一收的方式性能较低, 那么我们一次发送多条数据,这些数据暂时不需要被应答,可以直接发送,这样就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了),这种策略在发送方的体现就是以一个滑动窗口的形式:

在不考虑网络的前提下,将暂时不需要应答,可以直接发送的数据的最大值称为发送方的滑动窗口的大小,上图中滑动窗口的大小就是4000字节。

滑动窗口其实就是在发送窗口上的双指针之间的一个数据段:

从上图我们可以把发送缓冲区分为三段:

7.2 滑动窗口的相关问题

重中之重:
确认序号的意义:确认序号以前的报文全部被收到

7.2.1 滑动窗口的大小

在不考虑网络速度的前提下,窗口的大小一般是接受方接收缓冲区中剩余空间的大小。

7.2.2 滑动窗口策略简单思路

7.2.2 超时重传时的数据如何保存

前面提到了确认序号的意义以及滑动窗口的策略,当有数据丢包时,比如1001-2000丢了,那么确认应答的值就为1001,从滑动窗口的策略可以看出:左指针仍是1001,这意味着1001-2000的数据仍在滑动窗口中,那么发送方就可以进行数据的重传。

当某一段报文段丢失之后, 发送端会一直收到 1001 这样的 ACK, 就像是在提醒发送端 "我想要的是 1001" 一样;
如果发送端主机连续三次收到了同样一个 "1001" 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
这个时候接收端收到了 1001 之后, 再次返回的 ACK 就是 7001 了(因为 2001 -7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
这种机制被称为 "高速重发控制"(也叫 "快重传")

在滑动窗口中,可以分为窗口最左侧数据丢包,窗口中间数据丢包,窗口最右侧数据丢包,但是根据确认序号的意义,每次的确认序号都会保证确认序号前面的数据全部被成功接收,如果最左侧数据被丢包那么就参考以上方案。如果中间和右侧数据被丢包,那么它们最后都会称为滑动窗口中的最左侧,解决方案也同上一样。

7.2.3 超时重传 vs 快重传

从上面可以看出快重传的效率明显高于超时重传,超时重传需要等待一定的时间,而快重传接受到确认应答即可实现重传,那么超时重传的存在还有意义吗?

其实,从7.2.2中的图中可以看出接受方需要发送3次重复的确认应答,发送方也需要收到3个同样的确认应答才会重发,那么总有不足3个的情况,这时候发生生丢包,就需要超时重传进行兜底。

八、拥塞窗口

虽然 TCP 有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。

TCP 引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据

此处引入一个概念称为拥塞窗口:
1.发送开始的时候, 定义拥塞窗口大小为 1;
2.每次收到一个 ACK 应答, 拥塞窗口加 1
3.每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。

实际上,拥塞窗口并不是一直呈指数增长的,这里引入了新的概念,即慢启动的阈值,当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长

当 TCP 开始启动的时候,慢启动阈值等于窗口最大值;
•在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回 1;
少量的丢包, 我们仅仅是触发超时重传;大量的丢包,就认为网络拥塞;
当 TCP 通信开始后, 网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;
拥塞控制,归根结底是 TCP 协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案。

TCP 拥塞控制这样的过程, 就好像热恋的感觉

相关文章:

Linux网络——深入理解传入层协议TCP

目录 一、前导知识 1.1 TCP协议段格式 1.2 TCP全双工本质 二、三次握手 2.1 标记位 2.2 三次握手 2.3 捎带应答 2.4 标记位 RST 三、四次挥手 3.1 标记位 FIN 四、确认应答(ACK)机制 五、超时重传机制 六 TCP 流量控制 6.1 16位窗口大小 6.2 标记位 PSH 6.3 标记…...

快速搞定分布式RabbitMQ---RabbitMQ进阶与实战

本篇内容是本人精心整理;主要讲述RabbitMQ的核心特性;RabbitMQ的环境搭建与控制台的详解;RabbitMQ的核心API;RabbitMQ的高级特性;RabbitMQ集群的搭建;还会做RabbitMQ和Springboot的整合;内容会比较多&#…...

5万字长文吃透快手大数据面试题及参考答案(持续更新)

目录 Flink为什么用aggregate()不用process() 为什么使用aggregate() 为什么不用process() 自定义UDF, UDTF实现步骤,有哪些方法?UDTF中的ObjectInspector了解吗? 自定义UDF实现步骤 自定义UDTF实现步骤 UDTF中的ObjectInspector Spark Streaming和Flink的区别 Flu…...

WordPress原创插件:启用关闭经典编辑器和小工具

WordPress原创插件:启用关闭经典编辑器和小工具 主要功能 如图所示,用于启用或禁用经典编辑器和经典小工具,以替代Gutenberg编辑器。 插件下载 https://download.csdn.net/download/huayula/89592822...

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑:自动驾驶的先锋与挑战 萝卜快跑作为自动驾驶领域的重要参与者,被视为自动驾驶的先锋。它代表了自动驾驶技术在实际应用中的重要突破,为人们的出行方式带来了革新。萝卜快跑的发展展示了自动驾驶技术的巨大潜力,如提高交通…...

得到xml所有label 名字和数量 get_xml_lab.py,get_json_lab.py

import os import xml.etree.ElementTree as ETrootdir2 r"F:\images3\xmls" file_list os.listdir(rootdir2) # 列出文件夹下所有的目录与文件# 初始化字典 classes_dict {}for file_name in file_list:path os.path.join(rootdir2, file_name)if os.path.isfi…...

数据结构算法-排序(二)

插入排序 插入排序核心 假设数组中的一部数据已经排好序,要插入的数据和这些数据进行比较,直到找到合适的位置插入新数据。 插入排序步骤 插入排序主要有以下步骤构成: 假设有序,我们假设**a[0]**已经排好序待插入的数据为a[j]…...

Linux安装与配置

下载VMware 首先我们需要下载一个叫VMware的软件: 进入官方下载,地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【 输入许可证密钥 MC60H-DWHD5-H80U9-6V85…...

AI赋能交通治理:非机动车监测识别技术在城市街道安全管理中的应用

引言 城市交通的顺畅与安全是城市管理的重要组成部分。非机动车如自行车、电动车、摩托车等在城市交通中扮演着重要角色,但同时也带来了管理上的挑战。尤其是在机动车道上误入非机动车的现象,不仅影响交通秩序,还可能引发交通事故。思通数科…...

水电站泄洪放水预警广播系统解决方案

一、背景 在现代水利工程管理中,水电站泄洪放水预警广播系统扮演着至关重要的角色。这一系统不仅关系到水电站的安全运行,也直接关系到下游地区人民群众的生命财产安全。因此,设计一套完善、高效、可靠的泄洪放水预警广播系统显得尤为必要。…...

【Django】ajax和django接口交互(获取新密码)

文章目录 一、需求1. 效果图 二、实验1. 写get接口后端2. 写html后端3. 写前端4. 测试 一、需求 1. 效果图 二、实验 1. 写get接口后端 写views import string import random def getnewpwd(request):words list(string.ascii_lowercasestring.ascii_uppercasestring.digi…...

Logback 日志打印导致程序崩溃的实战分析

在软件开发和运维中,日志记录是必不可少的一环,帮我们追踪程序的行为,定位问题所在。然而,有时日志本身却可能成为问题的根源。本文将通过一个真实的案例来探讨 Logback 日志系统中的一个常见问题,当并发量大&#xff…...

新加坡 Numen Cyber 与香港光环云数据有限公司达成战略合作

新加坡本土网络安全公司 Numen Cyber 宣布与香港光环云数据有限公司(简称“光环云香港”)建立战略合作伙伴关系。此次合作将重点放在云服务器和云服务业务场景的安全领域。 Numen Cyber,作为一家致力于为客户提供专业网络安全服务和一体化安…...

Laravel魔术方法:框架的隐秘力量

Laravel魔术方法:框架的隐秘力量 引言 Laravel是一个充满魔力的PHP框架,它通过许多巧妙的设计让Web开发变得简洁而优雅。在Laravel中,魔术方法(Magic Methods)是这些魔力的体现之一。魔术方法是PHP预定义的、可以在类…...

系统复习Java日志体系

一&#xff0c;我们采用硬编码体验一下几个使用比较多的日志 分别导入几种日志的 jar 包 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…...

网络管理linux命令

在Linux系统中&#xff0c;有许多常用的网络命令用于检查网络配置、诊断网络问题以及管理网络连接。以下是一些常用的网络命令及其简要说明&#xff1a; ifconfig 显示或配置网络接口。 ifconfigip 用于显示和操作路由、设备、策略路由和隧道。 ip addr show ip link show ip …...

PowerDNS架构解析与安装部署指南

1、背景介绍 目前公司使用PowerDNS进行DNS管理&#xff0c;但由于采用的是单节点架构&#xff0c;存在不可用的风险。为提升系统的稳定性和可靠性&#xff0c;我们计划对现有架构进行重构。通过引入高可用性设计&#xff0c;我们将优化系统架构&#xff0c;使其能够在故障情况…...

Ubuntu 20.04.6 安装 Elasticsearch

1.准备 -- 系统更新 sudo apt update sudo apt upgrade -- 安装vim 文本编辑器 sudo apt install vim-- jdk 版本确认 java -versionjdk 安装可以参照&#xff1a;https://blog.csdn.net/CsethCRM/article/details/140768670 2.官方下载Elasticsearch 官方地址&#xff1a;h…...

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…...

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…...

ngzero使用外部的svg图标

1.将图标svg下下来&#xff0c;放到项目中&#xff0c;路径如下所示 之后 <span nz-icon [nzIconfont]“‘icon-zhibiao’”>使用 2.直接使用阿里的图标 先将你要用的图标放入购物车&#xff0c;再将购物车的图标添加到你主页的我的项目中 之后代码中在startupService…...

逆矩阵、秩

在数学的广阔天地中&#xff0c;线性代数扮演着至关重要的角色。它不仅是现代科学和工程学的基石&#xff0c;也是理解复杂数据结构的关键。本文将深入探讨线性代数中的几个核心概念&#xff1a;逆矩阵、秩、列空间和零空间&#xff0c;通过详细的解释和丰富的实例&#xff0c;…...

pc端小程序抓包修改数据相关记录

看了很多关于小程序抓包的 废话不多说直接演示 一、小程序抓包 1.所需要的工具 官网下载即可&#xff1a; https://www.charlesproxy.com/latest-release/download.do 我这里用的 Charles-proxy-4.6.6-win64 需要中文破解参考 https://www.jianshu.com/p/4d67dbbf2f6a 2、破…...

用Python打造精彩动画与视频.2.1 Python基础语法概述

2.1 Python基础语法概述 Python作为一门功能强大且易于学习的编程语言&#xff0c;其基础语法简单直观&#xff0c;非常适合初学者入门。这一节将带你了解Python的基本语法规则&#xff0c;为后续制作动画和视频打下坚实的基础。 1. 变量与数据类型 Python的变量不需要提前声…...

Golang高效合并(拼接)多个gzip压缩文件

有时我们可能会遇到需要把多个 gzip 文件合并成单个 gzip 文件的场景&#xff0c;最简单最容易的方式是把每个gzip文件都先解压&#xff0c;然后合并成一个文件后再次进行压缩&#xff0c;最终得到我们想要的结果&#xff0c;但这种先解压后压缩的方式显然效率不高&#xff0c;…...

MySQL数据库-基本概念

数据 描述事物的符号记录包括属组、文字、图形、图像、声音、档案记录等以“记录”形式按统一的格式进行存储 表 将不同的记录组织在一起用来存储具体数据 数据库 表的集合&#xff0c;是以一定的组织方式存储的相互有关的数据集合 数据库管理系统&#xff08;DBMS&#…...

【无标题】web+http协议+nginx搭建+nginx反向代理(环境准备)

一&#xff0e;Web 为用户提供互联网上浏览信息的服务&#xff0c;web服务是动态的&#xff0c;可交互的。 1.安装httpd yum -y install httpd 2.启动 systemctl start httpd 3.关闭防火墙 systemctl stop firewalld [rootrs html]# echo "我手机号是" > …...

c-periphery RS485串口库文档serial.md(serial.h)(非阻塞读)(VMIN、VTIME)

c-peripheryhttps://github.com/vsergeev/c-periphery 文章目录 NAMESYNOPSISENUMERATIONS关于奇偶校验枚举类型 DESCRIPTIONserial_new()serial_open()关于流控制软件流控制&#xff08;XON/XOFF&#xff09;硬件流控制&#xff08;RTS/CTS&#xff09;选择流控制方法 serial_…...

Matlab arrayfun 与 bsxfun——提高编程效率的利器!

许多人知道 MATLAB 向量化编程&#xff0c;少用 for 循环 可以提高代码运行效率&#xff0c;但关于代码紧凑化编程&#xff0c; arrayfun 与 bsxfun 两个重要函数却鲜有人能够用好&#xff0c;今天针对这两个函数举例说明其威力。 Matlab arrayfun 概述 arrayfun 是 Matlab …...

【Unity编辑器拓展】GraphView自定义可视化节点

1、创建节点区域脚本 其中的new class UxmlFactory&#xff0c;可以让该元素显示在UI Builder中&#xff0c;我们就可以在Library-Project中看到我们新建的这两个UI元素&#xff0c;就可以拖入我们的UI窗口编辑了 public class NodeTreeViewer : GraphView {public new class…...

教程系列4 | 趋动云『社区项目』极速体验 LivePortrait 人脸表情“移花接木”大法

LivePortrait LivePortrait 由快手可灵大模型团队开源&#xff0c;只需 1 张原图就能生成动态视频。 LivePortrait 的核心优势在于其卓越的表情"迁移"技术&#xff0c;能够令静态图像中的人物瞬间焕发活力&#xff0c;无论是眨眼、微笑还是转头&#xff0c;皆栩栩如…...

WGS84、GCJ-02、BD09三大坐标系详解

文章目录 前言WGS84坐标系定义应用WGS84 Web 墨卡托投影 GCJ-02坐标系&#xff08;火星坐标系&#xff09;定义应用GCJ-02经纬度投影与Web墨卡托投影 BD09坐标系&#xff08;百度坐标系&#xff09;定义应用BD09经纬度投影与Web墨卡托投影 坐标系之间的区别与注意事项总结 前言…...

css上下动画 和淡化

.popup_hidden_bg { transition: opacity .5s ease-out; opacity: 0; pointer-events: none; /* 防止在隐藏时仍然能点击 */ } keyframes popupShop { from { transform: translateY(100%); opacity: 0; } to {transform: translateY(0);opacity: 1; }} keyframes popupHidd…...

深入解析C#中的URI和URL编码:理解EscapeDataString、EscapeUriString和UrlEncode的区别及字符编码错误处理

在C#中&#xff0c;处理URI&#xff08;统一资源标识符&#xff09;和URL&#xff08;统一资源定位符&#xff09;时&#xff0c;可以使用Uri.EscapeDataString、Uri.EscapeUriString和HttpUtility.UrlEncode&#xff08;或WebUtility.UrlEncode&#xff09;方法来编码字符串。…...

【CSS】给图片设置 max-width

.logo img{width:100%; /* 缩成父盒子的100% */max-width:100%; /* (谁小用谁的百分之百) *//* max-width:100%;【1】图片比盒子大&#xff0c;缩成父盒子的100%【2】图片比盒子小&#xff0c;图片自身的100%*/ }示例 设置样式 .el-image {width: 100%;max-width: 100%;max-…...

区块链——代码格式检查(prettier、solhint)

一、引入依赖 // 导入prettier prettier-plugin-solidity yarn add --dev prettier prettier-plugin-solidity yarn add --dev solhint二、创建.prettierrc文件 {"tabWidth": 2,"semi": false,"useTabs": false,"singleQuote": fals…...

搭建自动化 Web 页面性能检测系统 —— 部署篇

作为一个前端想去做全栈的项目时&#xff0c;可能第一个思路是 node vue/react。一开始可能会新建多个工程目录去实现&#xff0c;假设分别为 web 和 server&#xff0c;也许还有管理后台的代码 admin&#xff0c;那么就有了三个工程的代码。此时为了方便管理就需要在远程仓库…...

知识图谱增强的RAG(KG-RAG)详细解析

转自&#xff1a;知识图谱科技 这是一个与任务无关的框架&#xff0c;它将知识图谱&#xff08;KG&#xff09;的显性知识与大型语言模型&#xff08;LLM&#xff09;的隐含知识结合起来。这是该工作的arXiv预印本 https://arxiv.org/abs/2311.17330 。 我们在这里利用一个名为…...

python中list的深拷贝和浅拷贝

其实这还是涉及到python中的可变对象和不可变对象的概念。 https://www.cnblogs.com/poloyy/p/15073168.html # -*- coding: utf-8 -*-person [name, [savings, 100.00]] hubby person[:] # slice copy wifey list(person) # fac func copy a [id(x) for x in person] b …...

【LeetCode】字母异位词分组

题目描述&#xff1a; 给你一个字符串数组&#xff0c;请你将字母异位词组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”…...

Golang | Leetcode Golang题解之第295题数据流的中位数

题目&#xff1a; 题解&#xff1a; type MedianFinder struct {nums *redblacktree.Treetotal intleft, right iterator }func Constructor() MedianFinder {return MedianFinder{nums: redblacktree.NewWithIntComparator()} }func (mf *MedianFinder) AddNum(…...

【C语言】C语言期末突击/考研--数据的输入输出

目录 一、printf()输出函数介绍 二、scanf读取标准输入 &#xff08;一&#xff09;scanf函数的原理 &#xff08;二&#xff09;多种数据类型混合输入 三、练习题 今天我们学习printf和scanf读取标准输入。下面我们开始正式的学习吧。 C语言中有很多内置函数&#xff0c;今…...

How can I fix my Flask server‘s 405 error that includes OpenAi api?

题意&#xff1a;解决包含OpenAI API的Flask服务器中出现的405错误&#xff08;Method Not Allowed&#xff0c;即方法不允许&#xff09; 问题背景&#xff1a; Im trying to add an API to my webpage and have never used any Flask server before, I have never used Java…...

LeetCode Hot100 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…...

【Linux】线程的控制

目录 线程等待 线程退出 线程的优缺点 线程独占和共享的数据 我们说Linux是用进程模拟的线程&#xff0c;所以Linux中只有轻量级进程的概念&#xff0c;但是&#xff0c;用户是只认线程的&#xff0c;所以我们有一个叫原生线程库的东西&#xff0c;它就负责把轻量级进程的系…...

Vue3自研开源Tree组件:人性化的拖拽API设计

针对Element Plus Tree组件拖拽功能API用的麻烦&#xff0c;小卷开发了一个API使用简单的JuanTree组件。拖拽功能用起来非常简单&#xff01; 文章目录 使用示例allowDragallowDrop支持节点勾选支持dirty检测后台API交互 源码实现 使用示例 组件的使用很简单&#xff1a; 通过…...

MYSQL--触发器详解

触发器 1.触发器简介 触发器&#xff08;trigger&#xff09;是一个特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#xff0c;比如当对一个表进行操作&#xff08; insert&#xff0c;delete&#xff0c; update…...

C++实用指南:Lambda 表达式的妙用

Lambda 表达式的灵活性和强大功能确实为编程提供了许多便利。但是我们发现许多开发者仍然无法灵活运用其便利&#xff0c;于是写了这篇文章。 Lambda 允许我们编写更简洁和灵活的代码。例如在处理网络请求时&#xff0c;我们经常需要确保响应与当前的状态或需求仍然相关。通过…...

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…...

基于springboot+vue+uniapp的居民健康监测小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…...