【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

目录
- 1、初识协议
- 2、UDP、TCP
- 3、Mac、IP地址
- 4、端口号
- 5、网络字节序
- 6、socket
1、初识协议
- 协议就是一种约定。
- 如何让不同厂商生产的计算机之间能够互相通信?需要由权威组织或公司制定网络协议。
- 协议本质也是软件,在设计上为了更好的进行模块化,解耦合,因此被设计为层状结构。
协议本质也是软件,为了更好的模块换,降低耦合度,所以被设计为层状结构。在Linux网络协议栈中,各个层次协同工作,以实现数据的封装、传输、路由和接收。从底层到高层,这些层次包括:
-
链路层(数据链路层):负责物理网络上的数据传输,包括帧的封装、错误检测和纠正等。在Linux中,这一层通常与特定的网络接口卡(NIC)驱动程序相关联。
-
网络层:提供IP地址管理和路由功能,确保数据包能够正确地从一个网络传输到另一个网络。Linux支持IPv4和IPv6两种IP协议版本。
-
传输层:提供端到端的通信服务,确保数据的可靠传输或快速、不可靠的传输。TCP(传输控制协议)提供可靠的数据传输,而UDP(用户数据报协议)则提供无连接的数据传输服务。
-
应用层:提供用户和网络服务之间的接口,包括HTTP(用于Web浏览)、SMTP(用于电子邮件发送)、FTP(用于文件传输)等多种应用层协议。
一般而言:
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容
- 对于一台路由器,它实现了从网络层到物理层
- 对于一台交换机,它实现了从数据层到物理层
- 对于一台集线器,它只实现了物理层
2、UDP、TCP
传输层的典型代表:
TCP协议 | UDP协议 |
---|---|
传输层协议 | 传输层协议 |
有连接 | 无连接 |
可靠传输 | 不可靠传输 |
面向字节流 | 面向数据报 |
TCP协议格式:
- 确认应答至少应该是一个完整的TCP报头
- 确认序号 = 序号 + 1,表示该序号之前的内容被全部收到了
- 为什么要有序号和确认序号两个序号,并且是独立的字段?
TCP报文,大多数情况下既是应答,又是数据,即捎带应答机制,这个时候序号和确认序号这两个字段要被同时使用。
TCP 将每个字节的数据都进行了编号,即为序列号。每一个 ACK 都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据,下一次你从哪里开始发。
- 4位首部长度:这个字段的单位是4字节,取值范围是0到15,乘以4后得到报头的实际字节长度范围是20到60字节。当首部长度为5时,表示的是标准的20字节报头。
6 位标志位:用于区分报文类型
标志位 | 说明 |
---|---|
URG | 紧急指针是否有效,需要优先处理的报文 |
ACK | 表明自己是应答报文 |
PSH | 提示接收端应用程序立刻从 TCP 缓冲区把数据读走 |
RST | 对方要求重新建立连接,我们把携带 RST 标识的称为复位报文段 |
SYN | 请求建立连接,我们把携带 SYN 标识的称为同步报文段 |
FIN | 通知对方,本端要关闭了,我们称携带 FIN 标识的为结束报文段 |
- 16位窗口大小:流量控制,由接收缓冲区剩余空间大小决定,由滑动窗口实现
- 超时重传:在TCP连接中,当发送方发送一个数据段后,会启动一个超时计时器,如果在计时器超时之前,发送方没有收到接收方的确认(ACK)报文,那么发送方就会认为该数据段已经丢失,并重新发送该数据段,直到收到确认报文或达到重传次数限制为止。
在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接。
为什么要三次握手?四次挥手?
- 建立双方主机通信的意愿共
- 双方验证全双工信道的通畅性
- 本质是四次握手,因为捎带应答机制变为三次握手
- Tcp是全双工的,要关闭两个朝向上的连接
我们测试时有时会出现bind error,是什么原因?
- TCP 协议规定,主动关闭连接的一方要处于
TIME_ WAIT
状态,等待两个MSL(一般为2分钟)的时间后才能回到 CLOSED 状态 - 我们使用 Ctrl-C 终止了 server,所以 server 是主动关闭连接的一方,在
TIME_WAIT
期间仍然不能再次监听同样的 server 端口
如何解决?
- 使用
setsockopt()
设置 socket 描述符的选项SO_REUSEADDR
为 1,表示允许创建端口号相同但 IP 地址不同的多个 socket 描述符
int opt = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
CLOSE_WAIT
状态则是被动关闭连接的一方在接收到FIN报文并发送ACK后的状态- 如果服务器不关闭sockfd,则只会完成两次挥手,服务器就会长时间处于
close_wait
状态。
滑动窗口:
- 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值
- 操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉
- 窗口只能向右滑动,且根据对方接收缓冲区的大小调整大小
丢包重传问题:
- 如果发送端主机连续三次收到了同样一个 “1001” 这样的应答,则说明我们只收到了 “1001” 之前的报文,在这种情况下,发送方不等待超时定时器的触发,而是立即重传该丢失的数据包,即将对应的数据 1001 - 2000 重新发送。这种机制被称为 "高速重发控制”(快重传)
拥塞控制:
- 虽然 TCP 滑动窗口能够高效可靠的发送大量的数据,但是如果刚开始就发送大量的数据,仍然可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络状态下,贸然发送大量的数据,很有可能雪上加霜。
- TCP引入慢启动机制,即先发少量的数据探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据
- 当拥塞窗口达到慢启动阈值后,TCP会进入拥塞避免阶段。此时,拥塞窗口会按线性速率增长,以避免突然的大幅增加导致网络拥塞
Tcp通过校验和、序列号(按序到达、去重)、确认应答、超时重发、连接管理、流量控制、拥塞控制等保证可靠性;通过滑动窗口、快速重传、延迟应答、捎带应答等提高性能。
UDP协议格式:
-
无连接:知道对端的 IP 和端口号就直接进行传输,不需要建立连接;
-
不可靠:没有确认机制,没有重传机制,如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息;
-
面向数据报:不能够灵活的控制读写数据的次数和数量;
-
16 位 UDP 长度,表示整个数据报(UDP 首部+UDP 数据)的最大长度,如果要传输的数据超过 64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装;
-
如果校验和出错,就会直接丢弃;
-
UDP协议的报头是固定的8字节,所以协议的接收方直接截取前8个字节的报头,剩下的就是有效数据。
UDP的缓冲区:
- 发送缓冲区:UDP 没有真正意义上的发送缓冲区,调用 sendto 会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
- 接收缓冲区:UDP的接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致,如果缓冲区满了,再到达的 UDP 数据就会被丢弃;
TCP/UDP 对比:
- 无论是Tcp有连接Udp无连接,还是Tcp可靠Udp不可靠,这都是它们的特性,不是优缺点,它们适用于不同的需求场景
- TCP 用于可靠传输的情况,应用于文件传输,重要状态更新等场景
- UDP 用于对高速传输和实时性要求较高的通信领域,例如早期的 QQ、视频传输、广播等
3、Mac、IP地址
每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址。
以太网中,任何时刻,只允许一台机器向网络中发送数据。如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞,所有发送数据的主机要进行碰撞检测和碰撞避免,没有交换机的情况下,一个以太网就是一个碰撞域,局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定的。
其中每层都有协议,当我们进行传输流程的时候,要进行封装和解包:
Tcp/IP通讯过程:
IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址,对于 IPv4 来说, IP 地址是一个 4 字节,32 位的整数,我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如1.94.9.200,用点分割的每一个数字表示一个字节,范围是 0 - 255。
Mac地址 vs IP地址:
唐僧从东土大唐出发,要去西天拜佛求经,途中要经过女儿国和黑风岭,女儿国和黑风岭是相邻两地。
- 东土大唐 -> 西天:源IP地址 -> 目的IP地址
- 女儿国 -> 黑风岭:源Mac地址 -> 目的Mac地址
其中经过的各个国家就是路由器,相邻的国家在同一个局域网中,路由器路由的下一个目的地是根据目的IP地址路由的,局域网通信需要Mac地址指路,一般Mac地址只在局域网中有效,IP地址几乎不变。
IP在网络中标识主机的唯一性,数据传输到主机不是目的而是手段,最终到达主机内的目的进程才是目的。但是在主机中,同一时间进程可能有很多,那怎么找到目的进程呢?
4、端口号
端口号(port)是传输层协议的内容,是一个2字节16位的整数,端口号标识唯一进程,一个端口号只能被一个进程占用。
IP地址+端口号能够标识网络中的唯一进程。
网络通信,本质上也是进程间通信。
其中 0 - 1023 是知名端口号,HTTP, FTP, SSH等这些广为使用的应用层协议,它们的端口号都是固定的。1024 - 65535 是操作系统动态分配的端口号,比如客户端程序的端口号就是有操作系统动态分配的。
pid也可以标识唯一进程,为什么还要引入端口号呢?
进程pid属于系统概念,如果继续沿用pid标识唯一进程,会增加耦合度。另外,一个进程可以绑定多个端口号,但一个端口号不能被多个进程绑定。
网络通信的本质,也是进程间通信,本质是两个互联网进程代表人来进行通信。IP + port 叫做套接字socket。
一个进程可以 bind 多个端口号,但一个端口号不能被多个进程 bind。
5、网络字节序
内存中的多字节数据相对于内存地址有大端和小端之分,网络数据流同样有大端小端之分,如何定义网络数据流的地址?
- 网络数据流的地址被规定:先发出去的是低地址,后发出去的是高地址。
- TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
为使网络程序具有可移植性,使用样的C代码在大端和小端机器上编译后都能正常运行,可以调用下面库函数做网络字节序和主机字节序的转换。
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t hostlong);
uint16_t ntohs(uint16_t hostshort);
h
表示host
,n
表示network
,l
表示32位长整数,s
表示16位短整数。
6、socket
socket常见API:
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
socket:
socket()
打开一个网络通讯端口,如果成功,就像open()一样返回一个文件描述符,出错返回-1- 应用程序可以像读写文件一样用 read/write 在网络上收发数据
- 对于 IPv4,
family
参数指定为AF_INET
- 对于 TCP 协议,
type
参数指定为SOCK_STREAM
,表示面向流的传输协议protocol
参数指定为 0 即可
bind:
- bind()成功返回 0,失败返回-1
- bind()的作用是将参数 sockfd 和 myaddr 绑定在一起,使 sockfd 这个用于网络通讯的文件描述符监听 myaddr 所描述的地址和端口号
- struct sockaddr *是一个通用指针类型,myaddr 参数实际上可以接受多种协议的 sockaddr 结构体,而它们的长度各不相同,所以需要第三个参数 addrlen指定结构体的长度,我们可以对 myaddr 参数这样初始化:
struct sockaddr_in local; memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_port = htons(_port); local.sin_addr.s_addr = INADDR_ANY;
listen:
- listen()声明 sockfd 处于监听状态,并且最多允许有 backlog 个客户端处于连接
等待状态,如果接收到更多的连接请求就忽略- listen()成功返回 0,失败返回-1
accept:
- 三次握手完成后,服务器调用 accept()接受连接
- 如果服务器调用 accept()时还没有客户端的连接请求,就阻塞等待,直到有客户端
连接上来- addr 是一个传出参数,accept()返回时传出客户端的地址和端口号
- 如果给 addr 参数传 NULL,表示不关心客户端的地址
- addrlen 参数是一个传入传出参数(value-result argument),传入的是调用者提供的,缓冲区 addr 的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度
connect:
- 客户端需要调用 connect()连接服务器
- connect 和 bind 的参数形式一致,区别在于 bind 的参数是自己的地址,connect 的参数是对方的地址
- connect()成功返回 0,出错返回-1
注意:
- 由于客户端不需要固定的端口号,因此不必调用 bind(),客户端的端口号由内核自动分配
- 客户端不是不允许调用 bind(),只是没有必要显示的调用 bind()固定一个端口号,否则如果在同一台机器上启动多个客户端,就会出现端口号被占用导致不能正确建立连接
- 服务器也不是必须调用 bind(),但如果服务器不调用 bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦
sockaddr结构:
sock API是一层抽象的网络编程接口,适用于各种底层网络协议,各种网络协议的地址格式并不相同。
socket API 可以都用struct sockaddr*
类型表示,在使用的时候需要强制转换成sockaddr_in
,增加了程序的通用性。
本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

相关文章:
【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…...
vue 学习-vite api.js
/** 整机管理 * */ // 整机分类 列表 export const wholeMachineServersType params > ajaxGet({url: wholeMachine/serverstype/,params}) // 整机分类 新增 export const wholeMachineServersTypeAdd params > ajaxPost({url: wholeMachine/serverstype/,params}) /…...
Unity贴图与模型相关知识
一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图(但并不规范) 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB:勾选此选项代表此贴图存储于Gamma空间中…...
Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路
引言:Elasticsearch——数据世界的“福尔摩斯” 大家好,今天我们要聊的是一个在数据世界中扮演“福尔摩斯”角色的工具——Elasticsearch。如果你曾经为海量数据的搜索和分析头疼不已,那Elasticsearch就是你的救星!它不仅能帮你快…...
更改visual studio 2022 默认NuGet包路径
本文章仅提供更改用户级别的NuGet包默认路径的更改,电脑级别的更改需要更改%ProgramData%\NuGet\Config\machine.config, 而且需要管理员权限,但是更改内容类似用户级别的NuGet更改。 1. 关闭VS 2. 打开NuGet配置文件路径 可通过以下两种方…...
什么是超越编程(逾编程)(元编程?)
超越编程(逾编程)(元编程?)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素,其有三种含义ÿ…...
深入理解设计模式之解释器模式
深入理解设计模式之解释器模式 在软件开发的复杂世界中,我们常常会遇到需要处理特定领域语言的情况。比如在开发一个计算器程序时,需要解析和计算数学表达式;在实现正则表达式功能时,要解析用户输入的正则表达式来匹配文本。这些场景都涉及到对特定语言的解释和执行,而解…...
用户体验测试
引言 在数字化时代,用户体验(UX)是衡量产品成功与否的关键指标之一。它不仅关乎产品的功能和性能,更涉及用户在使用过程中的情感反应和信任建立。作为软件测试专家,深入理解并实践用户体验测试是确保产品竞争力的关键。…...
51单片机-串口通信编程
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下: 确定T1的工作方式(编程TMOD寄存器)计算T1的初值,装载TH1\TL1启动T1(编程TCON中的TR1位…...
论文略读:Uncovering Hidden Representations in Language Models
202502 arxiv 说一下主要结论吧 对于下游任务,语言模型的中间层在所有架构和任务中始终优于最后一层 这挑战了使用最后一层表示的传统观点。 不同的架构表现出不同的信息压缩模式。自回归模型在中间层存在瓶颈,而双向模型则保持更均匀的趋势 BERT通过双…...
正确清理C盘空间
一.系统清理 正确清理C盘空间主要是删除不需要的文件和应用程序,以释放磁盘空间。以下是一些常用的方法: 删除临时文件:在Windows搜索框中输入“%temp%”,打开临时文件夹,将其中的文件全部删除。 清理回收站…...
数据表的存储过程和函数介绍
文章目录 一、概述二、创建存储过程三、在创建过程中使用变量四、光标的使用五、流程控制的使用六、查看和删除存储过程 一、概述 存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可…...
IntelliJ IDEA 控制台输出中文出现乱码
IntelliJ IDEA 控制台输出中文出现乱码通常是由于编码设置不一致导致的。以下是常见原因及解决方法 1. 项目编码设置 检查路径:File → Settings → Editor → File Encodings 确保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…...
ARMS 助力假面科技研发运维提效,保障极致游戏体验
客户介绍与项目背景 假面科技成立于 2014 年,致力于打造创新的数字产品,火爆一时的“狼人杀”、“谁是卧底”、“足记相机”都是假面科技旗下产品,公司产品总数超过 40 款,覆盖用户数超过 2 亿人。 随着业务的持续发展ÿ…...
go json处理 encoding/json 查询和修改gjson/sjson
推荐 标准库encoding/json import ("encoding/json""log" )// Student1 注意点: // 1. 注意alain别名的写法: json:"name1" 而非 "json:name1" // 2. 注意json.Marshal的时候只输出首字母大写的属性 // 3. jso…...
Web Worker终极优化指南:4秒卡顿→0延迟的实战蜕变
💡 导读:从4秒卡顿到丝滑响应 真实痛点场景:当斐波那契数列计算量达10亿次时,页面完全冻结4.2秒!通过Web Worker优化后,UI响应时间降至16ms以内。本文手把手带您实现性能蜕变! 一、Web Worker核…...
python读取pdf文档
import io import pdfplumber from opencc import OpenCC import fitz # pymupdf import osfile_path /document/pdf/xxx.pdf output_dir /classification/pdf/images #获取图片 demo def extract_images_from_pdf(pdf_path, output_dir):# 确保输出目录存在if not os.path.…...
CSS垂直居中终极方案:告别复杂计算,拥抱现代布局
CSS垂直居中终极方案:告别复杂计算,拥抱现代布局 📌 前言:为什么垂直居中如此重要?一、2024年最推荐的3种方案1. Flexbox布局(首推方案)2. Grid布局(未来趋势)3. Transfo…...
ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置
视频讲解 ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置 创建 ROS 2 包 进入工作空间的 src 目录,然后创建一个新的 Python 包: ros2 pkg create --build-type ament_python panda_joint_control --dependencies rclpy control_msgs…...
SHELL32!Shell_MergeMenus函数分析
SHELL32!Shell_MergeMenus函数分析 UINT Shell_MergeMenus( [in] HMENU hmDst, [in] HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags ); 参数 [in] hmDst 类型: HMENU 要向其添加 hmSrc…...
python: SQLAlchemy (ORM) Simple example using SQLite
领域层(Domain Laye):定义了 School 实体类和 SchoolRepository 抽象基类,明确了业务实体和数据访问的契约。 基础设施层(Infrastructure Laye):通过 SQLAlchemy 实现了 SchoolRepository 类&am…...
MySQL 视图入门
一、什么是 MySQL 视图 1.1 视图的基本概念 在 MySQL 中,视图是一种虚拟表,它本身并不存储实际的数据,而是基于一个或多个真实表(基表)的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询…...
【洛谷排序算法】P1012拼数-详细讲解
这道题本质上是通过确定数字的拼接顺序来得到最大拼接数,虽然主要思路是利用字符串及其比较规则来实现,但也可以基于数组结合一些转换操作来解决,以下是大致思路和代码示例: 【算法思路】 首先将输入的数字存储在数组中。然后自…...
在WPS中设置word的页码不从第一页开始,从指定页开始插入页码
大家好,我是小鱼。 在日常的办公中为Word文档页面插入页码是经常要做的。如果一个文档有几十页,插入页码不仅可以快速定位到文章的内容,如果需要制作目录也方便制作。正确情况下插入页码都是从第一页开始的,但是有些文档比如说标…...
鸿蒙app 开发中 对于数组方法 filter 的理解
这段代码是 TypeScript 中数组 filter 方法的类型定义,下面将详细解释其各个部分的含义、作用及使用场景。 整体功能概述 filter 方法是 JavaScript 和 TypeScript 中数组对象的一个内置方法,它的主要功能是创建一个新数组,新数组中的元素是…...
【废物研究生刷算法】字符串
文章目录 1. 反转字符串2. 替换数字3. 反转字符串中的单词4. 右旋字符串总结1、字符串处理函数2、字符串切片 如果使用python处理字符串,有很多py内置的函数可以使用,主要还是记住这些处理方法。 1. 反转字符串 class Solution:def reverseStr(self, s, …...
深入理解 SQL 注入漏洞及解决方案
一、引言 在当今数字化时代,数据库作为存储和管理数据的核心组件,其安全性至关重要。SQL 注入是一种常见且极具威胁性的数据库安全漏洞,它可能导致数据泄露、篡改甚至系统被完全控制。本文将深入探讨 SQL 注入漏洞的产生原因、表现形式以及如…...
Next.js 学习-1
Next.js学习 引用:https://www.nextjs.cn/learn/basics/create-nextjs-app 先试试水吧,正好dify用的这个构建的前端项目。 使用 如果您尚未安装 Node.js,请 从此处安装。要求 Node.js 10.13 或更高版本。 好吧得用新的了,记得…...
[ComfyUI]Recraft贴图开源方案,实现服装印花自由
一、介绍 今天发现了一个简单又好用的插件,可以实现类似Recraft的贴图功能,这是一个作者开发的ComfyUI插件,叫做Comfyui-Transform 这个插件比我们简单的图像覆盖多了一些可控参数,形状、透明度、倾斜、拉升和混合模式等诸多可控…...
JavaScript 数组连接方法
在 JavaScript 中,有多种方法可以连接数组。每种方法都有其自身的优点和缺点。常见的方法包括 concat()、扩展运算符(...)、push()、splice()、slice()、join()、forEach()、reduce() 以及 Array.from() 等。下面是这些方法的详细说明和示例代码。 1. concat() co…...
Windows安装MySQL教程
1.下载 下载地址:https://www.mysql.com/downloads/ 下载版本:MySQL Installer for Window 2.安装MySQL 以下只列出需要注意的一些界面,没出现的界面默认继续即可。 1.选择安装类型 提供了多种安装模式,包括默认开发版、仅…...
VOS3000线路对接、路由配置与路由分析操作教程
一、VOS3000简介 VOS3000是一款常用的VoIP运营平台,支持多种线路对接和路由配置,适合新手快速上手。本教程将带你了解如何对接线路、配置路由以及进行路由分析。 二、线路对接 准备工作 获取线路信息:从供应商处获取线路的IP地址、端口、用…...
PiscTrace的开发者版
基于 PiscTrace 架构的视图处理的纯开发板,支持静态图片、实时视频流、摄像头视频流和网络视频流的处理。与 PiscTrace 应用版相比,开发者版通过直接的代码开发,提供了更高的灵活性和可定制性,适用于需要深度定制和复杂处理的应用…...
OnlyOffice:前端编辑器与后端API实现高效办公
OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…...
github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新
1.github上新建一个repository 设置为private tips删除在这 点setting 然后往下拖动 会有个这里是用来删项目的 2.另外 一台电脑拉取这个repository的时候 需要配置 一个ssh key 这个key的内容生成参考本地电脑的生成 然后在这配置 2.1 生成 SSH 密钥(如果还没有…...
本周行情——250222
本周A股行情展望与策略 结合近期盘面特征及市场主线演化,本周A股预计延续结构性分化行情,科技成长与政策催化板块仍是资金主战场,但需警惕高标股分歧带来的波动。以下是具体分析与策略建议: 1. 行情核心驱动因素 主线延续性&…...
分发糖果(力扣135)
题目说相邻的两个孩子中评分更高的孩子获得的糖果更多,表示我们既要考虑到跟左边的孩子比较,也要考虑右边的孩子,但是我们如果两边一起考虑一定会顾此失彼。这里就引入一个思想:先满足右边大于左边时的糖果分发情况,再…...
QML ToolButton与DelayButton的使用、详解与自定义样式
QML MenuBarItem与MenuItem的使用、详解与自定义样式 一、介绍1、ToolButton常见用法基础示例设置图标 常用属性texticonenabledshortcutcheckable & checked 信号onClickedonPressed 和 onReleased 样式和外观使用场景 2、DelayButton使用场景核心属性1. delay 核心信号1.…...
动态规划
简介 动态规划最核心两步: 状态表示:dp[i]代表什么状态转移方程:如何利用已有的dp求解dp[i] 只要这两步搞对了, 就完成了动态规划的%95 剩下的就是细节问题: dp初始化顺序(有时是倒序)处理边…...
SQL FIRST() 函数详解
SQL FIRST() 函数详解 在SQL中,FIRST() 函数是一个用于处理查询结果的聚合函数。它通常与 GROUP BY 子句结合使用,用于返回每个分组中的第一个记录。本文将详细解释 FIRST() 函数的用法、参数、返回值以及与它的关联函数。 1. 函数概述 FIRST() 函数的…...
ClickHouse系列之ClickHouse安装
ClickHouse系列之ClickHouse安装 1 ClickHouse2 Docker安装ClickHouse2.1 docker 启动脚本2.2 默认用户及密码2.3 8123和9000端口的作用2.3.1 81232.3.2 9000 3 Clickhouse连接3.1 命令行客户端连接3.1.1 常见的客户端脚本3.1.1.1 查看数据库:show databases;3.1.1.…...
大模型监督微调(SFT)技术解析
大模型监督微调(SFT)技术深度解析 一、基本知识介绍 监督微调(Supervised Fine-Tuning)是连接预训练与具体应用的关键技术层。其本质是通过特定任务的标注数据,在保持预训练模型核心能力的前提下,调整模型…...
PTA: 有序顺序表的合并
请设计一个能够将有序顺序表LA,LB进行合并的算法,要求合并后的顺序表LC依然有序。 例如: LA的元素 1 3 5 7 LB的元素 2 4 LC的元素 1 2 3 4 5 7 其中,LA和LB的长度不超过1000,当中的元素为非递减排序。 输入格式: 第…...
Vuetify解决与旧版浏览器(如Internet Explorer 11)的兼容性问题
简介 由于Vuetify使用了ES2015/2017的特性,这些特性在旧版浏览器中可能不被支持,因此需要通过配置来确保这些特性能够被正确转换。 配置1 在项目项目根目录下的vue.config.js文件,或nuxt.config.ts中,添加 transpileDependencies …...
android,flutter 混合开发,pigeon通信,传参
文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性,安全性,性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle,添加 Flutter module3. 在 Android app 的 build.gradl…...
Shell文档归档、压缩与解压
Shell文档归档、压缩与解压 1、文件归档与压缩2、zip、gzip与tar指令2.1、zip指令2.2、gzip指令2.3、tar指令 1、文件归档与压缩 归档文件是指将一组文件或目录保存到一个文件中;压缩文件是指将一组文件或目录按照某种存储格式保存到一个文件中,所占磁盘…...
【Bluedroid】AVRCP 连接源码分析(一)
一、AVRCP协议简介 AVRCP(Audio/Video Remote Control Profile)是蓝牙协议栈中的一个重要部分,它定义了蓝牙设备之间的音视频传输控制的流程和特点。AVRCP使得用户可以通过一个蓝牙设备(如手机)远程控制另一个蓝牙设备(如蓝牙耳机或音箱)上的音视频播放,如播放、暂停、…...
CMake入门
1.什么是CMake Makefile想必大家都不陌生吧,它能够解决我们的自动化编译问题,大多是IDE软件都集成了make,譬如 Visual C的 nmake、linux 下的 GNU make、Qt 的 qmake 等等。 不同的IDE所集成的make工具所遵循的规范和标准都不同,也…...
基于vite6创建项目
pnpm create vue vite已自动配置路径,在.config.js jsconfig.json 中 按需引用element-plus 官网中有 pnpm install element-plus npm install -D unplugin-vue-components unplugin-auto-import // vite.config.ts import { defineConfig } from vite import Aut…...
简单封装一个websocket构造函数
问题描述 最近维护一个老项目,发现项目中有大量重复代码,特别是websocket的调用这一块,同样的代码复制了十几个页面,于是自己封装了一个websocket调用的构造函数。 export default class CreateWebSocket {constructor(url) {//…...