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

tcp特点+TCP的状态转换图+time_wait详解

tcp特点+TCP的状态转换图+time wait详解

目录

一、tcp特点解释

1.1 面向连接

1.1.1 连接建立——三次握手

1.1.2 连接释放——四次挥手

1.2 可靠的

1.2.1 应答确认

1.2.2 超时重传

1.2.3 乱序重排

1.2.4 去重

1.2.5 滑动窗口进行流量控制

1.3 流失服务(字节流传输)

1.3.1 tcp粘包概念

1.3.2 产生 TCP 粘包的原因

发送端原因

接收端原因

1.3.3 解决 TCP 粘包的方法

定长协议

分隔符协议

消息头 + 消息体协议

二、服务器接收多个客户端 

三、TCP(传输控制协议)的状态转换图

2.1 状态

2.2 转换


一、tcp特点解释

1.1 面向连接

1.1.1 连接建立——三次握手

在进行数据传输之前,TCP 需要通过 “三次握手” 来建立连接。具体过程为:客户端向服务器发送一个 SYN 包,请求建立连接;服务器收到 SYN 包后,向客户端发送一个 SYN + ACK 包,表示同意建立连接;客户端收到 SYN + ACK 包后,再向服务器发送一个 ACK 包,连接建立完成。这种方式确保了双方都有发送和接收数据的能力,并且双方对连接的初始序列号达成一致。

1.1.2 连接释放——四次挥手

数据传输结束后,TCP 使用 “四次挥手” 来释放连接。客户端发送一个 FIN 包,表示请求关闭连接;服务器收到 FIN 包后,发送一个 ACK 包表示同意关闭;接着服务器发送一个 FIN 包,表示自己也请求关闭连接;客户端收到 FIN 包后,发送一个 ACK 包表示同意关闭,连接释放完成。这种机制保证了双方都能正确地结束数据传输。

1.2 可靠的

1.2.1 应答确认

TCP 使用确认机制来确保数据的可靠传输。发送方发送数据后,会等待接收方的确认信息(ACK)。如果在一定时间内没有收到确认信息,发送方会重新发送该数据。例如,发送方发送了一个数据包,接收方收到后会返回一个带有确认号的 ACK 包,告知发送方已经正确接收了哪些数据。

1.2.2 超时重传

当发送方发送的数据丢失或者接收方返回的确认信息丢失时,发送方会在超时后重传数据。TCP 通过设置定时器来实现超时重传,定时器的时间会根据网络状况动态调整。

1.2.3 乱序重排

我们每发一个tcp报文都有相应的序号。TCP 保证字节流中的数据按照发送的顺序到达接收方。如果数据在传输过程中出现乱序,TCP 会在接收方进行重新排序,确保应用层接收到的数据是有序的

1.2.4 去重

俩个相同序号的报文去重

1.2.5 滑动窗口进行流量控制

滑动窗口用于控制数据的发送速率和流量,同时保证数据的可靠传输。发送方和接收方都有一个滑动窗口,窗口的大小表示可以发送或接收的数据量。滑动窗口越大代表我能发送的数据越大.发送方在发送数据时,会根据接收方的窗口大小来决定发送多少数据,避免接收方缓冲区溢出。窗口内的允许发送,窗口外的不允许发送

(不会丢包因为是可靠的,底层可能会丢但是会重传时间特别快,我们应用层感受不到)

1.3 流失服务(字节流传输)

多线程并发——给一个服务器同时链接俩个以上客户端

发送缓冲区:send数据写到这里

接收缓冲区:recv接收数据

TCP 将应用层的数据看作是无边界的字节流进行传输。发送方可以将多个应用层的消息合并成一个字节流发送,接收方需要自己从字节流中提取出各个消息。例如,应用层发送了两条消息 “Hello” 和 “World”,TCP 可能会将它们合并成一个字节流 “HelloWorld” 进行发送,接收方需要根据具体的协议来区分这两条消息。

1.3.1 tcp粘包概念

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。而 TCP 粘包是在使用 TCP 进行数据传输时可能遇到的一个常见问题。

TCP 粘包指的是在 TCP 连接中,发送方发送的若干个数据包,到接收方接收时,这些数据包粘连在一起,接收方难以区分哪些字节属于哪个原始数据包的现象。 

1.3.2 产生 TCP 粘包的原因

发送端原因
  • Nagle 算法:TCP 为了提高传输效率,采用了 Nagle 算法。该算法会将小的数据包合并成大的数据包进行发送,以此减少网络中的数据包数量。例如,当你连续发送多个小数据包时,Nagle 算法可能会将它们合并成一个大的数据包发送,从而造成粘包。
  • TCP 缓冲区:TCP 协议的发送缓冲区用于暂存待发送的数据。如果发送方的数据产生速度大于网络的发送速度,那么数据就会在缓冲区中累积,当缓冲区满或者达到一定条件时,就会将缓冲区中的数据一起发送出去,这也可能导致多个数据包粘连在一起。
接收端原因
  • TCP 接收缓冲区:接收端在接收数据时,会将数据先存放在接收缓冲区中。如果接收方没有及时从缓冲区中读取数据,后续的数据也会不断地存入缓冲区,这样就可能导致多个数据包的数据混合在一起,形成粘包。

1.3.3 解决 TCP 粘包的方法

定长协议

规定每个数据包的长度是固定的。接收方按照固定长度来读取数据,这样就可以明确区分每个数据包。

分隔符协议

在每个数据包的末尾添加一个特殊的分隔符,接收方根据分隔符来区分不同的数据包。

消息头 + 消息体协议

在每个数据包的前面添加一个消息头,消息头中包含消息体的长度信息。接收方先读取消息头,根据消息头中的长度信息来读取相应长度的消息体。

二、服务器接收多个客户端 用fork做并发

它是一个简单的TCP服务器程序,它在本地6000端口上监听连接请求,接受客户端的连接,并为每个连接创建一个新的进程来处理

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建监听套接字if( -1 == sockfd ){exit(1);}//定义套接字地址结构, ipv4,ipv5,unixstruct sockaddr_in saddr,caddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//将套接字绑定到指定的IP地址和端口。如果绑定失败(返回-1),则打印错误信息并退出程序。int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//指定ip portif( -1 == res){printf("bind err\n");exit(1);}//使套接字进入监听状态,监听队列大小设置为5。如果监听失败(返回-1),则退出程序。res = listen(sockfd,5);//设置监听队列 大小是5if( -1 == res){exit(1);}//进入一个无限循环,等待客户端的连接请求。accept函数用于接受连接请求,并将客户端的地址信息存储在caddr中。while( 1 ){int len = sizeof(caddr);int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//检查是否成功接受连接。如果失败,则继续下一次循环。if( c < 0 ){continue;}//创建一个新的进程来处理这个连接。如果创建进程失败,则关闭连接并继续下一次循环pid_t pid = fork();if( pid == -1 ){close(c);continue;}//在子进程中,进入一个无限循环,接收客户端发送的数据,并发送"ok"作为响应。如果接收失败或客户端关闭连接,则打印信息,关闭连接,并退出子进程。if( pid == 0 ){while( 1 ){char buff[128] = {0};int n = recv(c,buff,127,0);if( n<= 0 ){break;}printf("recv:%s\n",buff);send(c,"ok",2,0);}printf("client close\n");close(c);exit(0);}close(c);}
}

这个程序实现了一个简单的TCP服务器,它可以在本地6000端口上监听连接请求,接受客户端的连接,并为每个连接创建一个新的进程来处理。服务器接收客户端发送的数据,并发送"ok"作为响应。服务器使用多进程模型来处理多个客户端的连接。 

TCP客户端程序cli,它连接到本地服务器(127.0.0.1),发送消息,并接收服务器的响应

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main()
{//创建一个TCP套接字。AF_INET 表示使用IPv4地址,SOCK_STREAM 表示使用面向连接的流式套接字。int sockfd = socket(AF_INET,SOCK_STREAM,0);//检查套接字是否创建成功。如果失败(返回-1),则退出程序。if( sockfd == -1 ){exit(1);}//定义并初始化服务器的地址结构。memset 用于清零结构体,sin_family 设置为IPv4,sin_port 设置为6000端口(使用htons函数转换为网络字节序),sin_addr.s_addr 设置为本地地址127.0.0.1(使用inet_addr函数转换为网络字节序)。struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//尝试连接到服务器。如果连接失败(返回-1),则打印错误信息并退出程序。int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if ( res == -1 ){printf("connect err\n");exit(1);}//进入一个无限循环,提示用户输入,然后使用fgets函数从标准输入读取一行文本(最多127个字符),存储在缓冲区buff中。while( 1 ){printf("input\n");char buff[128] = {0};fgets(buff,128,stdin);//检查用户输入是否为"end"。如果是,则退出循环。if( strncmp(buff,"end",3) == 0 ){break;}//发送用户输入的消息到服务器(不包括换行符),清空缓冲区,接收服务器的响应,并打印出来。send(sockfd,buff,strlen(buff)-1,0);memset(buff,0,128);recv(sockfd,buff,127,0);printf("read:%s\n",buff);}close(sockfd);exit(0);
}

 这个程序实现了一个简单的TCP客户端,可以连接到本地服务器,发送消息,并接收服务器的响应。它使用了基本的套接字编程技术,包括创建套接字、连接服务器、发送和接收数据以及关闭套接字。程序通过一个无限循环来持续接收用户输入,并在输入"end"时退出。

 

这两段代码分别实现了一个简单的 TCP 客户端和一个 TCP 服务器。

 TCP 服务器代码解释

这段代码实现了一个 TCP 服务器,它在本地计算机的 6000 端口上监听来自客户端的连接请求。

1. **创建套接字**:
   - 使用 `socket` 函数创建一个 TCP 套接字 `sockfd`。

2. **绑定地址**:
   - 使用 `bind` 函数将套接字绑定到本地地址 `127.0.0.1` 和端口 `6000` 上。这样,服务器就准备好在指定的地址和端口上监听客户端的连接请求。

3. **监听连接**:
   - 使用 `listen` 函数使套接字进入监听状态,等待客户端的连接请求。监听队列的大小设置为 5,这意味着服务器可以同时处理最多 5 个未处理的连接请求。

4. **接受连接**:
   - 使用 `accept` 函数接受客户端的连接请求。每当有新的客户端连接时,`accept` 函数会返回一个新的套接字 `c`,用于与该客户端进行通信。

5. **处理客户端请求**:
   - 使用 `fork` 创建一个新的子进程来处理每个客户端的请求。这样,服务器可以同时处理多个客户端的连接。
   - 在子进程中,使用 `recv` 函数接收客户端发送的数据,并使用 `send` 函数发送响应(在这个例子中,响应是字符串 "ok")。
   - 当客户端关闭连接或发生错误时,子进程会退出。

6. **关闭连接**:
   - 在父进程中,关闭与客户端的连接套接字 `c`。

 TCP 客户端代码解释

这段代码实现了一个 TCP 客户端,它连接到本地服务器(127.0.0.1:6000),发送消息,并接收服务器的响应。

1. **创建套接字**:
   - 使用 `socket` 函数创建一个 TCP 套接字 `sockfd`。

2. **连接到服务器**:
   - 使用 `connect` 函数连接到服务器的地址 `127.0.0.1` 和端口 `6000` 上。

3. **发送和接收数据**:
   - 进入一个无限循环,提示用户输入消息。
   - 使用 `fgets` 函数从标准输入读取用户输入的消息。
   - 如果用户输入 "end",则退出循环,关闭连接并退出程序。
   - 使用 `send` 函数将用户输入的消息发送到服务器。
   - 使用 `recv` 函数接收服务器的响应,并使用 `printf` 函数打印响应。

4. **关闭连接**:
   - 在退出循环后,关闭与服务器的连接套接字 `sockfd`。

### 总结

这两段代码实现了一个简单的 TCP 客户端-服务器通信模型:

- **服务器**:在本地计算机的 6000 端口上监听客户端的连接请求,使用多进程模型来处理每个客户端的请求。服务器接收客户端发送的数据,并发送 "ok" 作为响应。
- **客户端**:连接到本地服务器,发送用户输入的消息,并接收服务器的响应。

这种模型可以用于实现各种基于 TCP 的网络应用程序,如聊天程序、文件传输等。

会出现僵死进程,所以需要加入信号的使用来解决僵死进程

三、TCP(传输控制协议)的状态转换图

展示了TCP连接从建立到关闭的整个过程中可能经历的各种状态。

2.1 状态

1. **CLOSED**:初始状态,表示连接尚未建立。
2. **LISTEN**:服务器在该状态监听来自客户端的连接请求。
3. **SYN_SENT**:客户端发送SYN请求连接,等待服务器确认。
4. **SYN_RCVD**:服务器收到SYN请求后,发送SYN+ACK响应,进入此状态,等待客户端的确认。
5. **ESTABLISHED**:双方确认连接后,连接建立,可以开始传输数据。
6. **FIN_WAIT_1**:主动关闭连接的一方发送FIN请求,希望关闭连接。
7. **FIN_WAIT_2**:在FIN_WAIT_1状态下收到对方的ACK后,进入此状态,等待对方的FIN请求。
8. **CLOSING**:双方同时发送FIN请求,等待对方的ACK。
9. **TIME_WAIT**:主动关闭连接的一方在发送FIN请求并收到对方的ACK后,进入此状态,等待一段时间以确保对方收到ACK。
10. **CLOSE_WAIT**:被动关闭连接的一方收到FIN请求后,进入此状态,等待应用程序关闭连接。
11. **LAST_ACK**:被动关闭连接的一方发送FIN请求后,等待对方的ACK。

2.2 转换

1. **被动打开**:服务器从CLOSED状态进入LISTEN状态,等待客户端的连接请求。
2. **主动打开**:客户端从CLOSED状态发送SYN请求,进入SYN_SENT状态。
3. **连接建立**:
   - 客户端发送SYN请求,进入SYN_SENT状态。
   - 服务器收到SYN请求,发送SYN+ACK响应,进入SYN_RCVD状态。
   - 客户端收到SYN+ACK响应,发送ACK确认,进入ESTABLISHED状态。
   - 服务器收到ACK确认,进入ESTABLISHED状态。
4. **数据传输**:在ESTABLISHED状态下,双方可以进行数据传输。
5. **连接关闭**:
   - 主动关闭的一方发送FIN请求,进入FIN_WAIT_1状态。
   - 被动关闭的一方收到FIN请求,发送ACK确认,进入CLOSE_WAIT状态。
   - 被动关闭的一方发送FIN请求,进入LAST_ACK状态。
   - 主动关闭的一方收到FIN请求,发送ACK确认,进入TIME_WAIT状态。
   - TIME_WAIT状态持续一段时间后,连接关闭,进入CLOSED状态。 

TCP连接的建立和关闭是一个复杂的过程,涉及到多个状态和状态转换。连接建立需要三次握手(SYN, SYN+ACK, ACK),而连接关闭需要四次挥手(FIN, ACK, FIN, ACK)。这种设计确保了连接的可靠性和数据的完整性。

在Linux系统中使用netstat命令查看网络连接状态的输出结果。netstat是一个常用的网络工具,用于显示网络连接、路由表、接口统计等信息。图片中的命令netstat -nat用于显示所有网络连接和监听端口,包括TCP和UDP协议,并且不解析服务名称

  1. 输出字段

    • Proto:协议类型,如TCP或TCP6。

    • Recv-Q:接收队列长度。

    • Send-Q:发送队列长度。

    • Local Address:本地地址和端口。

    • Foreign Address:远程地址和端口。

    • State:连接状态,如LISTEN、ESTABLISHED、CLOSE_WAIT等。

    • PID/Program name:进程ID和程序名称。

  2. 状态解释

    • LISTEN:端口正在监听,等待连接请求。

    • ESTABLISHED:连接已建立,数据可以传输。

    • CLOSE_WAIT:被动关闭连接的一方等待关闭连接。

    • FIN_WAIT_1:主动关闭连接的一方等待对方的FIN请求。

    • FIN_WAIT_2:主动关闭连接的一方等待对方的ACK确认。

    • TIME_WAIT:主动关闭连接的一方等待一段时间以确保对方收到ACK。

  • 第一张图显示了多个端口处于LISTEN状态,表示这些端口正在等待连接请求。

  • 第二张图显示了一个端口(127.0.0.1:6000)已经完成了三次握手,处于ESTABLISHED状态,表示连接已经建立。

  • 第三张图显示了一个端口(127.0.0.1:6000)处于CLOSE_WAIT状态,表示被动关闭连接的一方等待关闭连接。

变成time wait端口被占用 状态服务器不能启动

为什么需要time wait状态? 

1. 可靠的终止TCP连接

TCP 连接的终止需要通过四次挥手过程来完成。在主动关闭连接的一方发送了 FIN 报文后,它需要等待对方的 ACK 报文。然而,由于网络延迟或其他原因,这个 ACK 报文可能会丢失或延迟到达。如果主动关闭方在发送 FIN 报文后立即关闭,那么它将无法接收到这个 ACK 报文,从而导致连接没有被正确关闭。

为了避免这种情况,主动关闭方会进入 TIME_WAIT 状态,等待一段时间(通常是 2 倍的 MSL,即 Maximum Segment Lifetime,报文段的最大生存时间)。这段时间足够长,可以确保即使 ACK 报文丢失或延迟,主动关闭方也能够接收到来自对方的重传 ACK 报文,从而可靠地终止连接。

2. 保证让迟来的TCP报文段有足够的时间被识别并丢弃

TCP 连接的标识是由源 IP 地址、目的 IP 地址、源端口号和目的端口号共同组成的。当一个 TCP 连接被关闭后,这些标识可能会被新的连接所使用。然而,由于网络延迟或其他原因,旧连接的报文段可能会在连接关闭后仍然存在于网络中。

如果新的连接使用了相同的标识,那么这些迟来的旧报文段可能会被错误地识别为新连接的报文段,从而导致数据混乱。TIME_WAIT 状态通过等待一段时间,确保所有旧的报文段都已经被丢弃或过期,从而避免这种情况的发生。

相关文章:

tcp特点+TCP的状态转换图+time_wait详解

tcp特点TCP的状态转换图time wait详解 目录 一、tcp特点解释 1.1 面向连接 1.1.1 连接建立——三次握手 1.1.2 连接释放——四次挥手 1.2 可靠的 1.2.1 应答确认 1.2.2 超时重传 1.2.3 乱序重排 1.2.4 去重 1.2.5 滑动窗口进行流量控制 1.3 流失服务&#xff08;字节…...

flutter 桌面应用之窗口自定义

在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为&#xff08;大小/位置&#xff09;✅&#xff08;基本…...

【C++】NAN相关研究

先说结论&#xff1a;NAN对比一切都是false INF 对INF 是true 正无穷与正无穷比较相等&#xff0c;正无穷与负无穷比较不相等 window linux环境下基本相同&#xff0c; debug release基本相同 NAN -NAN INF -INF 不做论述 // TestNan.cpp : 此文件包含 "main" 函数。…...

windows下Git安装及其IDEA配置

1.下载Git安装包 阿里镜像链接&#xff08;建议从这里下载&#xff0c;速度很快&#xff09; git-scm.com&#xff08;官方网站&#xff0c;提供了各个平台&#xff08;Windows、Mac、Linux&#xff09;的安装程序&#xff09; 选择版本号后&#xff0c;在选择此版本的不同包…...

迷你世界脚本脚本常见问题

脚本常见问题 彼得兔 更新时间: 2024-05-22 17:54:44 在查阅开发者学院中的脚本API时&#xff0c;若有任何问题或建议&#xff0c;欢迎通过问卷进行反馈&#xff01;【点我填写问卷】 1.Block中的data在什么地方使用 data使用有具体需求,此处不建议开发者使用。开发者尽可能使…...

2025蓝桥杯C++ A组省赛 题解

昨天打完蓝桥杯本来想写个 p y t h o n python python A A A 组的题解&#xff0c;结果被队友截胡了。今天上课把 C A CA CA 组的题看了&#xff0c;感觉挺简单的&#xff0c;所以来水一篇题解。 这场 B B B 是一个爆搜&#xff0c; C C C 利用取余的性质比较好写&#…...

链接世界:计算机网络的核心与前沿

计算机网络引言 在数字化时代&#xff0c;计算机网络已经成为我们日常生活和工作中不可或缺的基础设施。从简单的局域网&#xff08;LAN&#xff09;到全球互联网&#xff0c;计算机网络将数以亿计的设备连接在一起&#xff0c;推动了信息交换、资源共享以及全球化的进程。 什…...

MySQL 常见存储引擎全解析:InnoDB、MyISAM、Memory 等对比与实战

一、什么是存储引擎&#xff1f; 存储引擎&#xff08;Storage Engine&#xff09;是 MySQL 中负责数据存储与管理的底层模块。不同的存储引擎负责处理表的读写、索引维护、事务支持、崩溃恢复等机制。 在创建表时可以指定使用的存储引擎&#xff1a; CREATE TABLE user (id…...

21天Python计划:零障碍学语法(更新完毕)

目录 序号标题链接day1Python下载和开发工具介绍https://blog.csdn.net/XiaoRungen/article/details/146583769?spm1001.2014.3001.5501day2数据类型、字符编码、文件处理https://blog.csdn.net/XiaoRungen/article/details/146603325?spm1011.2415.3001.5331day3基础语法与…...

Python中NumPy的统计运算

在数据分析和科学计算领域&#xff0c;Python凭借其丰富的库生态系统成为首选工具之一&#xff0c;而NumPy作为Python数值计算的核心库&#xff0c;凭借其高效的数组操作和强大的统计运算功能&#xff0c;广泛应用于机器学习、信号处理、统计分析等场景。本文将系统介绍NumPy在…...

SQL 解析 with as

sql的运行顺序 <select id"getTrendList" parameterType"java.util.HashMap" resultType"java.util.Map"><![CDATA[WITH-- 生成连续年份列表&#xff08;当前年前8年到前1年&#xff09;year_range AS (SELECT EXTRACT(YEAR FROM SYSD…...

07-算法打卡-链表-移除链表-leetcode(203)-第七天

1 题目地址 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09;203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a;[https://assets.leetc…...

抓包神器,自研EtherCAT抓包工具

大家好&#xff0c;博主自研了一款以太网抓包神器&#xff0c;可以用于EtherCAT抓包。 把抓包工具接入以太网总线中&#xff0c;就能正常使用了。 上位机软件采用wireshark。 开启以下协议 抓包截图如下 时间戳的精度为5ns。...

五、adb常用命令

SDK路径下的 \Android\Sdk\platform-tools\adb.exe adb devices 查看连接的设备 adb shell getprop ro.build.version.release 查看系统版本 adb shell dumpsys window windows | findstr mFocusedApp 获取正在运行的app启动包名 结果为空&#xff0c;我不知道是不是Android…...

Java第四节:idea在debug模式夏改变变量的值

作者往期文章 Java第一节&#xff1a;debug如何调试程序&#xff08;附带源代码&#xff09;-CSDN博客 Java第二节&#xff1a;debug如何调试栈帧链&#xff08;附带源代码&#xff09;-CSDN博客 Java第三节&#xff1a;新手如何用idea创建java项目-CSDN博客 步骤一 在需要修改…...

Java学习手册:Java反射与注解

Java反射&#xff08;Reflection&#xff09;和注解&#xff08;Annotation&#xff09;是Java语言中两个强大的特性&#xff0c;它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法&#xff0c;而注解则提供了一种元数据形…...

21 天 Python 计划:MySQL事务四大隔离级别深度剖析

文章目录 一、事务1.1 什么是事务&#xff1f;1.2 事务的四大特性 二、事务并发存在的问题2.1 脏读&#xff08;dirty read&#xff09;2.2 不可重复读&#xff08;unrepeatable read&#xff09;2.3 幻读 三、事务的四大隔离级别实践3.1 读未提交&#xff08;Read Uncommitted…...

IO多路复用沉浸式体验

这篇文章主要讲解一下IO多路复用常见问题&#xff0c;包含常见面试题&#xff0c;对你有帮助的话可以留个赞和关注嘛&#xff1f;谢谢大家支持&#xff01; 1.epoll 相比于 select/poll 的优点有哪些&#xff1f; 高效的数据结构&#xff1a;epoll使用红黑树管理fd&#xff0…...

音视频学习(三十三):GOP详解

GOP 概念 GOP&#xff08;图像组&#xff09;是视频编码中一组帧的集合(按相关性分组)&#xff0c;它从一个关键帧&#xff08;I帧&#xff09;开始&#xff0c;后面跟随若干个参考帧&#xff08;P帧&#xff09;和预测帧&#xff08;B帧&#xff09;。其结构决定了视频帧的压…...

部署YUM仓库

目录 一.YUM 1.1yum概述 1.2yum的实现 1.3yum服务的组成 1.4yum服务实现过程 1.5yum配置文件位置 二.yum相关命令 三.搭建yum仓库的方式 3.1使用HTTP方式搭建yum仓库 准备工作&#xff08;服务端和客户端都需要做&#xff09; 服务端 客户端 3.2使用ftp方式搭建yu…...

中位数学习(低估它了)

-----------------------------------------------------------------中位数------------------------------------------------------- 中位数有一个很好的性质&#xff1a;假设有一批数据&#xff0c;你想找一个数&#xff0c;使得这批数据与它差的绝对值的和最小&#xff0…...

音视频转换器 AV 接口静电保护方案

方案简介 音视频转换器是将音视频&#xff08;AV&#xff09;信号转换成其他格式或信号类型的设备或软件。 它能够实现大多数视频、音频以及图像格式之间的转换&#xff0c;包括但不限于 RMVB、AVI、 MP4、MOV 等常见格式&#xff0c;同时也支持将不同采样率、位深度、声道数…...

蓝桥杯嵌入式第十二届省赛程序设计1(超简单版)

此程序只需要会C语言数组&#xff0c;结构体(struct)&#xff0c;for , if , switch(也可以用if)就能够实现。 引脚设置&#xff1a; 引脚配置&#xff08;参照笔记&#xff09;&#xff1a; 代码部分&#xff1a; /* USER CODE END Header */ /* Includes ------------------…...

CSS 链接样式学习笔记

在网页设计中&#xff0c;链接&#xff08;<a> 标签&#xff09;是不可或缺的元素&#xff0c;通过 CSS 可以对链接进行丰富的样式设置&#xff0c;从而提升用户体验和页面美观度。以下是关于 CSS 链接样式的详细学习笔记。 一、链接的四种状态 链接有四种不同的状态&a…...

有ts文件却无法ts出来解决办法

一开始报错是报这个&#xff0c;但是我其实完全看不懂为什么 原因是这个 打开某个test就行了...

javaSE.Lambda表达式

如果一个接口中有且只有一个待实现的抽象方法&#xff0c;那么我们可以将匿名内部类简写为Lambda表达式。 简写规则 标准格式&#xff1a; &#xff08;【参数类型 参数名称&#xff0c;】...&#xff09; -> {代码语句&#xff0c; 包括返回值} 只有一行花括号{}可以省略。…...

Web渗透之文件包含漏洞

文件包含漏洞原理 1、源代码 <?php$filename $_GET[filename]; include $filename; //或include_once,require,require_onceecho "欢迎来到PHP的世界.";?> 2、利用条件 php.ini中alllow_url_fopenOn(默认开启)和allow_url_includeOff(默认关闭)要开启…...

费马引理和罗尔定理

cheer 向……欢呼&#xff0c;使高兴&#xff0c;欢呼&#xff0c;欢呼&#xff0c;愉快 前言区间平均值费马引理罗尔三步万能构造原函数的方法什么时候用罗尔定理计划拉格朗日需要记忆的不等式柯西中值定理泰勒高阶导数判断极值最后 前言 继续学习。今天争取把讲义和作业题都…...

【合新通信】浸没式液冷中低成本冷媒开发的最新进展

浸没式液冷光模块是一种结合高效散热技术与光通信的新型解决方案&#xff0c;主要用于数据中心、超算中心等高密度计算场景。其核心特点是通过将光模块直接浸入绝缘冷却液中&#xff08;如矿物油、氟化液等&#xff09;&#xff0c;实现高效散热和节能降耗。低成本冷却液的研发…...

【开发记录】服务外包大赛记录

参加服务外包大赛的A07赛道中&#xff0c;最近因为频繁的DEBUG&#xff0c;心态爆炸 记录错误 以防止再次出现错误浪费时间。。。 2025.4.13 项目在上传图片之后 会自动刷新 没有等待后端返回 Network中的fetch /upload显示canceled. 然而这是使用了VS的live Server插件才这样&…...

智能指针之设计模式1

本文探讨一下智能指针和GOF设计模式的关系&#xff0c;如果按照设计模式的背后思想来分析&#xff0c;可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然&#xff0c;它们也不是严格意义上面向对象的设计模式&#xff0c;毕竟它们没有那么分明的类层次体系&…...

Spring Boot 中应用的设计模式

Spring Boot 中应用的设计模式详解 Spring Boot 作为 Spring 框架的扩展&#xff0c;广泛使用了多种经典设计模式。以下是主要设计模式及其在 Spring Boot 中的具体应用&#xff1a; 一、创建型模式 1. 工厂模式 (Factory Pattern) 应用场景&#xff1a; BeanFactory 和 Ap…...

23种GoF设计模式

GoF&#xff08;Gang of Four&#xff09;设计模式是由四位计算机科学家 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的书籍《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的设计模式 目录 一、创建型模式&#xff08;Cre…...

Python实例题:Python实现中文错别字高亮系统

目录 Python实例题 题目 安装依赖库 代码实现 代码解释 运行思路 注意事项 Python实例题 题目 Python实现中文错别字高亮系统 安装依赖库 在开始之前&#xff0c;你需要安装 pycorrector 和 rich 库。可以使用以下命令进行安装&#xff1a; pip install pycorrecto…...

【第三十一周】ViT 论文阅读笔记

ViT 摘要Abstract文章信息引言方法Patch EmbeddingPatch Position EmbeddingTransformer EncoderMLP Head整体架构CNN的归纳偏置 代码实现实验结果总结 摘要 本篇博客介绍了Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是一种突破性的图像分类模型&#xff…...

射频(RF)静电放电防护方案

方案简介 射频&#xff08;RF&#xff09;是 Radio Frequency 的缩写&#xff0c;表示可以辐射到空间的电磁频率&#xff0c;频率 范围从 300kHz&#xff5e;300GHz 之间。射频就是射频电流&#xff0c;简称 RF&#xff0c;它是一种高频交流变化 电磁波的简称。射频天线是一…...

【redis进阶三】分布式系统之主从复制结构(1)

目录 一 为什么要有分布式系统&#xff1f; 二 分布式系统涉及到的非常关键的问题&#xff1a;单点问题 三 学习部署主从结构的redis (1)创建一个目录 (2)进入目录拷贝两份原有redis (3)使用vim修改几个选项 (4)启动两个从节点服务器 (5)建立复制&#xff0c;要想配…...

排序(1)

排序&#xff08;1&#xff09; 日常生活中&#xff0c;有很多场景都会用到排序。比如你买东西&#xff0c;在购物软件就有几种展现方式&#xff0c;按照评论数量给你排序出来&#xff0c;让你选&#xff0c;还是说按照价钱高低排序出来让你选。 排序其实是一种为了更好解决问…...

NR 5G中的N5接口

N5接口的定义: Reference point between the PCF and an AF or TSN AF. 即N5 PCF和AF之间的参考点。 AF Application Function 应用功能&#xff0c;指应用层的各种服务&#xff0c;可以是运营商内部的应用如Volte AF(类似4G的Volte As&#xff09;、也可以是第三方的AF&…...

STM32自学进阶指南:从入门到精通的成长路径 | 零基础入门STM32第九十九步

主题内容教学目的/扩展视频自学指导通过数据手册和搜索引擎查找资料,独立解决问题以积累经验和提升能力。自学过程中应保持敬畏之心,不断总结未知领域,持续进步。师从洋桃电子,杜洋老师 📑文章目录 一、自学指导全景图1.1 学习路线对比1.2 关键学习策略二、待探索技术领域…...

利用 Python 进行股票数据可视化分析

在金融市场中&#xff0c;股票数据的可视化分析对于投资者和分析师来说至关重要。通过可视化&#xff0c;我们可以更直观地观察股票价格的走势、交易量的变化以及不同股票之间的相关性等。 Python 作为一种功能强大的编程语言&#xff0c;拥有丰富的数据处理和可视化库&#xf…...

用 Vue.js 构建基础购物车:从 0 到 1 的实战解析

在当今数字化购物的浪潮中&#xff0c;购物车功能已成为电商平台不可或缺的一部分。它不仅承担着记录用户所选商品的重任&#xff0c;还需提供流畅的交互体验和精准的计算逻辑。本文将深入探讨如何利用 Vue.js 这一强大的 JavaScript 框架&#xff0c;逐步搭建一个基础但功能完…...

MapSet常用的集合类(二叉搜索树,哈希表)

Set集合 Set的核心特点&#xff1a; Set继承了Collection。 保存的元素不会重复。 保存的元素不能修改。 保存的元素无序&#xff0c;和List不同&#xff0c;如果有两个&#xff1a;List {1&#xff0c;2&#xff0c;3}&#xff0c;List {2&#xff0c;1&#xff0c;3}&…...

五种IO模型

1、通信的本质&#xff1a; 通过网络通信的学习&#xff0c;我们能够理解网络通信的本质是进程间通信&#xff0c;而进程间通信的本质就是IO。 IO也就是input和output。当读取条件不满足的时候&#xff0c;recv会阻塞。write写入数据时&#xff0c;会将数据拷贝到缓冲区中&am…...

路由器开启QOS和UPNP的作用

QOS 的作用 保障关键业务带宽&#xff1a;可根据网络应用的重要性分配带宽。比如在家庭网络中&#xff0c;当多人同时使用网络时&#xff0c;将视频会议等实时性要求高的关键业务设置为高优先级&#xff0c;确保其能获得足够带宽&#xff0c;避免卡顿&#xff0c;而文件下载等…...

学习MySQL的第九天

纸上得来终觉浅 绝知此事要躬行 数据处理的增删查改 一、添加数据 添加数据有两种方式&#xff0c;一种是一条一条的添加数据&#xff0c;另一种是通过对其他表的查询&#xff0c;将查询的结果插入到表中&#xff1b;第一种方式又可以分为三种方式&#xff1a…...

怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改

​ 现在非常流行glb格式模型&#xff0c;和gltf格式文件&#xff0c;可是之类模型网站非常非常少 1&#xff0c;咱们先直接打开http://glbxz.com 官方glb下载网站 glbxz.com 2 可以搜索&#xff0c;自己想要的模型关键词 3&#xff0c;到自己想下载素材页面 4&#xff0c;…...

高效数据拷贝方法总结

1.系统/语言层面的高效拷贝 内存拷贝优化 使用memcpy(C/C)或类似函数进行大块内存拷贝 利用SIMD指令(如AVX/SSE)进行向量化拷贝 2.零拷贝技术 文件映射(mmap) - 将文件映射到内存空间 发送文件描述符而非数据本身(Unix域套接字) 使用sendfile系统调用(文件到套接字直接传…...

C 语言 第八章 文件操作

目录 文件操作 文件和流的介绍 C 输入 & 输出 C 文件的读写 创建/打开文件 写入文件 fputc 函数 fputs 函数 fprintf 函数 实例&#xff1a; 读取文件 fgets函数 实例&#xff1a; 关闭文件 文件操作 文件和流的介绍 变量、数组、结构体等数据在运行时存储于内存…...

开发一款游戏需要哪些岗位角色参与?

常见分类 1. 游戏策划&#xff08;Game Designer&#xff09; 核心职责&#xff1a;设计游戏的玩法、规则、内容和整体体验。 具体工作&#xff1a; 系统设计&#xff1a;设计游戏的战斗、经济、成长、社交等核心系统。 数值设计&#xff1a;平衡角色属性、装备数值、经济系…...