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

【三次握手】TCP三次握手由入门到精通(完整版)

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜

✏️write in front✏️
📝个人主页:陈丹宇jmu
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
🙉联系作者🙈by QQ:813942269🐧
🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️‍🌈
✉️少年不惧岁月长,彼方尚有荣光在 🏆

📋笔记目录

建议在文章界面右边的导航栏中选择隐藏侧边栏并显示文章目录


《TCP三次握手由入门到精通》

1.1 三次握手的基本概念

1.1.1 三次握手概念简述 

三次握手是TCP/IP协议中建立可靠连接的过程,其基本原理如下:

        三次握手(Three-way Handshake)是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

        进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常;并且指定自己的初始化序列号(Sequence Number)为后面的可靠性传送做准备。

        三次握手实质上其实就是连接服务器指定端口(传输层),建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

1.1.2 三次握手具体过程

三次握手的交互过程

刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。

进行三次握手:

第一次握手:

客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(随机生成的)。此时客户端处于 SYN_SENT 状态。

首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

第二次握手:

服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(随机生成的)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。

在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。

第三次握手:

客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。

确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。

发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open)。

在socket编程中,客户端执行connect()时,将触发三次握手。

1.1.3 三次握手深入理解

        要想能深入理解三次握手的深刻内涵,熟悉TCP头部的报文格式必不可少,只有深刻认识和了解到了TCP头部报文每一个字段的内容和含义,结合抓包分析工具,更加深刻地认识到三次握手的过程。

TCP的头部结构

TCP头部报文字段是TCP协议在数据传输过程中用来控制和管理数据包的信息。以下是TCP头部报文的一些常见字段:

  1. 源端口(Source Port):16位字段,表示发送方的端口号。

  2. 目标端口(Destination Port):16位字段,表示接收方的端口号。

  3. 序列号(Sequence Number):32位字段,表示发送方发送的数据字节流的序列号。

  4. 确认号(Acknowledgment Number):32位字段,表示接收方期望接收的下一个数据字节流的序列号。

  5. 数据偏移(Data Offset):4位字段,表示TCP头部的长度,以4字节为单位。

  6. 控制位(Flags):6位字段,包括以下标志位:

    • URG(Urgent):表示紧急指针字段是否有效。
    • ACK(Acknowledgment):表示确认号字段是否有效。
    • PSH(Push):表示接收方应该尽快将数据交给应用程序。
    • RST(Reset):表示中断连接。
    • SYN(Synchronize):表示发起连接请求。
    • FIN(Finish):表示结束连接。
  7. 窗口大小(Window Size):16位字段,表示接收方可接收的数据量大小,用于流量控制。

  8. 校验和(Checksum):16位字段,用于检测TCP头部和数据是否有错误。

  9. 紧急指针(Urgent Pointer):16位字段,在URG标志位有效时指示紧急数据的位置。

  10. 选项(Options):可变长度的字段,用于传递一些额外的控制信息,如最大段长度、时间戳等。

这些字段共同组成了TCP头部报文,通过对这些字段的设置和解析,TCP协议能够实现可靠的数据传输和连接管理。

三次握手的具体过程

三次握手过程中比较需要注意的TCP头部报文字段有:

  • 序列号(Sequence Number)
  • 确认号(Acknowledgment Number)
  • 控制位(Flags)中的ACK(Acknowledgment)标志位------表示确认号字段是否有效。
  • 控制位(Flags)中的SYN(Synchronize)标志位------表示发起连接请求。

1.2 三次握手的报文解析

1.2.1 第一次握手的报文解析

💡第一次握手报文摘要Info

TCP	60	12660 → 23 [SYN] Seq=0 Win=4128 Len=0 MSS=1460

第一次握手报文解析:

第一次握手报文解析
  • 源端口号:12660
  • 目标端口号:23
  • SYN标志:该数据包是建立TCP连接的第一个数据包,用于发送方发起连接请求。
  • 序列号(Seq):0
    • 表示这是一个新的TCP连接,初始序列号被设置为0。
  • 窗口大小(Win):4128
    • 表示发送方的接收窗口大小,用于告知接收方可以接收的数据量。
  • 数据长度(Len):0
    • 数据包中携带的数据长度为0,即没有负载数据
  • 最大段大小(MSS):1460
    • 表示发送方能够接收的最大TCP段(即数据包)的大小。

💡第一次握手的完整解析

        根据数据包信息,可以看出这是一个从源端口12660向目标端口23发起的TCP连接请求。发送方将序列号设置为0,表示一个新的连接。发送方希望接收方将接收窗口大小设置为4128,并且发送方自己支持的最大段大小为1460。

        这个数据包中没有携带任何实际的数据负载,而是仅用于建立连接。接收方可以对该数据包进行回应,建立双向的TCP连接。

1.2.2 第二次握手的报文解析

💡第二次握手报文摘要Info

TCP	60	23 → 12660 [SYN, ACK] Seq=0 Ack=1 Win=4128 Len=0 MSS=1460

第二次握手报文解析:

第二次握手报文解析
  • 源端口号:23
  • 目标端口号:12660
  • SYN, ACK标志:该数据包是接收方对连接请求的回应,表示接收方同意建立连接。
  • 序列号(Seq):0
    • 表示接收方建立的TCP连接的初始序列号。
  • 确认号(Ack):1
    • 表示接收方已经收到了发送方的序列号为0的数据包,并期望下一个数据包的序列号是1。
  • 窗口大小(Win):4128
    • 表示接收方的接收窗口大小,用于告知发送方可以接收的数据量。
  • 数据长度(Len):0
    • 数据包中携带的数据长度为0,即没有负载数据。
  • 最大段大小(MSS):1460
    • 表示接收方能够接收的最大TCP段(即数据包)的大小。

💡第二次握手的完整解析

        根据数据包信息,可以看出这是接收方对源端口23向目标端口12660发起的TCP连接请求的回应。接收方将序列号设置为0,表示它自己建立的TCP连接的初始序列号。同时,确认号设置为1,表示接收方已经成功收到了发送方的序列号为0的数据包。接收方还告知发送方接收窗口大小为4128,可以接收的最大段大小为1460。

        这个数据包中没有携带任何实际的数据负载,而是仅用于建立连接的确认。发送方可以对该数据包进行回应,以完成TCP连接的建立。

1.2.3 第三次握手的报文解析

💡第三次握手报文摘要Info

TCP	60	12660 → 23 [ACK] Seq=1 Ack=1 Win=4128 Len=0

第三次握手报文解析:

第三次握手报文解析
  • 源端口号:12660
  • 目标端口号:23
  • ACK标志:该数据包是发送方对接收方建立连接回应的确认。
  • 序列号(Seq):1
    • 表示发送方已经收到了接收方的序列号为0的数据包,并期望下一个数据包的序列号是1。
  • 确认号(Ack):1
    • 表示发送方确认已经成功接收到了接收方的序列号为0的数据包。
  • 窗口大小(Win):4128
    • 表示发送方的接收窗口大小,用于告知接收方可以发送的数据量。
  • 数据长度(Len):0
    • 数据包中携带的数据长度为0,即没有负载数据。

💡第三次握手的完整解析

        根据数据包信息,可以看出这是发送方对接收方建立连接回应的确认数据包。发送方将序列号设置为1,表示它自己期望接收方下一个数据包的序列号是1。同时,确认号设置为1,表示发送方确认已经成功接收到了接收方的序列号为0的数据包。发送方还告知接收方接收窗口大小为4128,即发送方可以继续发送的数据量。

        这个数据包中没有携带任何实际的数据负载,而是仅用于确认建立连接。接收方可以根据该确认进行进一步的数据传输。

1.3 TCP三次握手常考面试题及存在的误区

(1)为什么需要三次握手,两次不行吗?

        需要三次握手确保TCP的可靠链接在于考虑到了:验证双方的通信能力误当成有效的连接网络延迟三个方面的问题。

        确保双方的通信能力:

        通过三次握手,客户端和服务器可以相互验证对方的地址是否可达,以及确保双方具备正常的通信能力。在第一次握手中,客户端发送SYN报文请求连接;在第二次握手中,服务器回应ACK确认,并发送自己的SYN请求连接;在第三次握手中,客户端再次回应ACK确认。通过这样的交互过程,双方可以确保彼此的网络连接正常运作。

        防止已失效的连接请求被误认为有效的连接:

        如果采用两次握手,那么只有一次请求和确认,缺少了第三次确认的过程。这种情况下,如果客户端发出连接请求后,在网络中滞留的这个请求被延迟到服务端很晚才到达,导致服务端在超时时间内未收到请求,会认为客户端并未真正想建立连接。然而,客户端可能只是因为网络延迟等原因,所以在超时后重新发送连接请求。如果只有两次握手,服务端会认为之前的连接请求是有效的,这样就可能与客户端之前的连接请求发生冲突。

        防止网络延迟产生的问题:

        TCP是一种面向连接的可靠协议,能够保证数据传输的可靠性。通过三次握手,可以验证双方的收发能力,并建立起一条完整的连接。如果只有两次握手,由于没有第三次握手的确认,就无法准确判断网络延迟带来的问题。例如,如果第二次握手的确认包因为网络延迟而丢失,那么服务端就无法确认客户端的请求,也无法建立可靠的连接。

(2)ISN(Initial Sequence Number)是固定的吗?

        ISN(Initial Sequence Number)并不是固定的。ISN是TCP连接建立过程中的一个起始序列号,用于标识发送方传输的数据段。每个TCP连接都会使用不同的ISN

        ISN的选择原则是确保在一段时间内唯一且随机。

        这样可以增加TCP连接的安全性,防止攻击者通过猜测或预测ISN来进行网络攻击,例如连接劫持数据包重放等。

ISN的生成算法通常基于以下几个因素:

  • 以时间为基础:常见的实现方式是使用当前的系统时间作为ISN的一部分。由于时间是不断变化的,这样可以保证在一定时间内生成的ISN是唯一的。
  • 随机性:为了进一步增加ISN的安全性,通常会将一些随机数或随机算法引入ISN的生成过程。这样可以使ISN更难被猜测或预测。
  • 混合其他因素:根据具体实现,ISN的生成可能还会考虑其他因素,如IP地址、端口号等。这样可以确保不同主机之间的ISN不会发生冲突。

        需要注意的是,ISN不是永久性的,它只在建立连接时使用,并在连接建立后逐渐增加。每个数据段的序列号都以ISN为基准进行增量偏移。

原始和相对序列号(1)
原始和相对序列号(2)

        总而言之,ISN是动态生成并具有一定随机性的,它在TCP连接建立过程中起到重要的作用,并且为连接提供一定的安全性。

(3)三次握手过程中可以携带数据吗?

        在TCP的三次握手过程中,实际上并没有定义用于携带数据的字段或报。三次握手的目的是确保客户端和服务器之间建立一个可靠的连接,以便后续的数据传输。

        但是,这也并不意味着三次握手的过程中不能在相关字段中嵌入数据信息,当然这属于非正常报文。其实第三次握手的时候存在携带数据的可能。但是,第一次、第二次握手是一定不可以携带数据的。

        为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

        也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

(4)SYN攻击是什么?

        服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向服务器端不断地发送SYN包,服务器端则回复确认包,并等待客户端确认,由于源地址不存在,因此服务器端需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

SYN 攻击是一种典型的 DoS/DDoS 攻击。

        检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击。

netstat -n -p TCP | grep SYN_RECV

常见的防御 SYN 攻击的方法有如下几种:

  • 缩短超时(SYN Timeout)时间
  • 增加最大半连接数
  • 过滤网关防护
  • SYN cookies技术

(5)什么是半连接队列?

        服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。

        当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

        这里在补充一点关于SYN-ACK 重传次数的问题: 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。 注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s......

🚩结尾

考虑到阅读篇幅,更多知识内容参考本专栏中的其他文章


🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
🌈写给读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️‍🌈

相关文章:

【三次握手】TCP三次握手由入门到精通(完整版)

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…...

Java 异步计算

CompletableFuture(可完成的Future) 一个可完成的Future,在我们调用他的get方法的时候,他会阻塞等待这个任务完成来获取他的结果。 当然也可以为这个任务注册一些回调,类似于完成时,出现异常时,…...

【FAQ】调用视频汇聚平台EasyCVR的iframe地址,视频无法播放的原因排查

有用户反馈,在调用iframe地址后嵌入用户自己的前端页面,视频无法播放并且要求登录。 安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中…...

⛳ TCP 协议面试题

目录 ⛳ TCP 协议面试题🐾 一、为什么关闭连接的需要四次挥⼿,⽽建⽴连接却只要三次握⼿呢?🏭 二、为什么连接建⽴的时候是三次握⼿,可以改成两次握⼿吗?👣 三、为什么主动断开⽅在TIME-WAIT状态…...

C 语言的字符串函数 puts()

属于标准库 <stdio.h> 函数原型: int puts(const char *str) str – 这是要被写入的 C 字符串. 如果成功, 该函数返回一个非负值为字符串长度 (包括末尾的 \0), 如果发生错误则返回 EOF. 作用: puts() 函数只显示字符串, 把一个字符串写入到标准输出 stdout, 直到空…...

Flutter如何知道页面/组件可见?

在以前项目中,onPageShow和onPageHide由开源框架flutter_boost提供,在此次项目中,创新性的采用了fusion框架,fusion框架同样提供了类似的方法,但在实践中发现,当flutter页面相互replace或者多次pop页面后,onPageShow不会调用,这就导致了诸多bug,于是,需要探索如何了解…...

【MySQL】如何使用Named Pipe协议(Windows)连接MySQL数据库

文章目录 【MySQL】如何使用Named Pipe协议(Windows)连接MySQL数据库连接MySQL的协议使用Named Pipe协议(Windows)连接MySQL步骤1&#xff1a;确认MySQL服务器已启用Named Pipe连接启动Named Pipe连接方法 步骤2&#xff1a;客户端使用Named Pipe连接MySQL服务器。例1&#xff…...

【c++】c++的一些技术操作

pthread_create 的第三个参数&#xff0c;为函数指针&#xff0c;指向处理线程函数的地址。该函数&#xff0c;要求为静态函数。如果处理线程函数为类成员函数时&#xff0c;需要将其设置为静态成员函数。C静态成员函数访问非静态成员 https://blog.csdn.net/yueguangmuyu/arti…...

JS中对象数组深拷贝方法

structuredClone() JavaScript 中提供了一个原生 API 来执行对象的深拷贝&#xff1a;structuredClone。它可以通过结构化克隆算法创建一个给定值的深拷贝&#xff0c;并且还可以传输原始值的可转移对象。 当对象中存在循环引用时&#xff0c;仍然可以通过 structuredClone()…...

2022数学建模国赛C题官网展示论文C155论文复现

2022数学建模国赛C题C155论文复现 1.内容比对2.第一问第二小问复现代码2.1 页表合并2.2 数据的正态性检验2.2.1数据的正态性检验效果图 2.3不满足正态性&#xff0c;进行中心化对数比变换2.3.1 核心步骤-inf用0值替换2.3.2中心化对数比变换效果图 2.4描述性统计2.5 箱线图绘制 …...

阿里云 K8s PVC 绑定 StorageClass 申领 PV 失败

错误场景: 因为阿里云没有默认的 StorageClass 我也懒得更新&#xff0c;所以就创建了一个类型是云盘的 StorageClass。 但是在创建 PVC 之后发现一直是 Pending 状态就查询了一下日志&#xff0c;然后看到很多下面这种错误 liuduiMacBookM1Pro ~ % kubectl describe pvc graf…...

php数组

php数组是什么&#xff1f; 可以使用单个变量名存储多个不同类型的数据的特殊变量&#xff0c;这就是php数组。 php数组就是一个特殊的变量&#xff0c;它允许存储多个任意类型的数据。 创建数组 php数组有两种类型&#xff0c;分为索引数组和关联数组。 创建数组的方法有三种…...

构造不包含字母和数字的webshell

构造不包含字母和数字的webshell <?php echo "A"^""; ?> 输出的结果是字符"!“。之所以会得到这样的结果&#xff0c;是因为代码中对字符"A"和字符”"进行了异或操作。在PHP中&#xff0c;两个变量进行异或时&#xff0c;…...

中国大学生服务外包创新创业大赛丨借 AI 之力,助“记账”难题

一、中国大学生服务外包创新创业大赛 赛事介绍 中国大学生服务外包创新创业大赛&#xff0c;是响应国家关于鼓励服务外包产业发展、加强服务外包人才培养的相关战略举措与号召&#xff0c;举办的每年一届的全国性竞赛。 大赛均由中华人民共和国教育部、中华人民共和国商务部…...

MacOS 安装Redis并设置密码

在开发过程中&#xff0c;需要本地进行安装Redis进行测试&#xff0c;记录了下MacOS环境下安装Redis&#xff0c;以及设置密码。 Brew 安装 $ brew install redis启动服务 # 启动服务 brew services start redis # 关闭服务 brew services stop redis # 重启服务 brew servic…...

函数的参数作为引用

文章目录 1. num,list ,tuple2. list 作为默认值导致共享同一列表3. 防御可变参数4. 结论 1. num,list ,tuple 结论&#xff1a;num ,tuple 作为参数&#xff0c;自身不会因为函数的原因而改变&#xff0c;list 为可变量&#xff0c;会因为函数变而变。 测试 def f(a, b):a …...

【文化课学习笔记】【化学】非金属及其化合物

【化学】必修一&#xff1a;非金属及其化合物 硅及其化合物 硅单质 物理性质 单晶硅的结构与金刚石类似&#xff0c;为正四面体的立体网状结构。晶体中每个硅原子与其他四个硅原子相连接。\(1\mathrm{mol}\) 硅单质还有 \(\mathrm{2N_A}\) 个 \(\mathrm{Si-Si}\) 键&#xff1b…...

Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)

文章目录 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)前情提要客户端部分 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三) 前情提要 单例泛型类 using System.Collections; using System.Collections.Generic; …...

步步向前,曙光已现:百度的大模型之路

大模型&#xff0c;是今年全球科技界最火热&#xff0c;最耀眼的关键词。在几个月的狂飙突进中&#xff0c;全球主要科技公司纷纷加入了大模型领域。中国AI产业更是开启了被戏称为“百模大战”的盛况。 但喧嚣与热闹之后&#xff0c;新的问题也随之而来&#xff1a;大模型的力量…...

常见的 Python 错误及其解决方案

此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明&#xff1a;无效的语法是最常见的错误之一&#xff0c;通常是由于编写代码时违反了 Python 的语法规则。可能的原因&#xff1a; 忘记在 if、while、for 等语句后写冒号&#xff0c;或者…...

文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)

要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才得以通过评论,…...

java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?

目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…...

matlab 点云最小二乘拟合空间直线(方法一)

目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示四、可视化参考本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x...

详解junit

目录 1.概述 2.断言 3.常用注解 3.1.Test 3.2.Before 3.3.After 3.4.BeforeClass 3.5.AfterClass 4.异常测试 5.超时测试 6.参数化测试 1.概述 什么是单元测试&#xff1a; 单元测试&#xff0c;是针对最小的功能单元编写测试代码&#xff0c;在JAVA中最小的功能单…...

Nginx的安装及负载均衡搭建

一.Nginx的安装 1&#xff09;准备安装环境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一个Perl库&#xff0c;包括 perl 兼容的正则表达式库。 nginx的http模块使用pcre来解…...

JVM学习笔记(一)

1. JVM快速入门 从面试开始&#xff1a; 请谈谈你对JVM 的理解&#xff1f;java8 的虚拟机有什么更新&#xff1f; 什么是OOM &#xff1f;什么是StackOverflowError&#xff1f;有哪些方法分析&#xff1f; JVM 的常用参数调优你知道哪些&#xff1f; 内存快照抓取和MAT分…...

fastjson 序列化问题:Comparison method violates its general contract

fastjson 序列化问题&#xff1a;Comparison method violates its general contract 问题重现 今天在测试接口的时候&#xff0c;调用了Mybatis Plus 分页查询的接口&#xff0c;然后将查询的结果转换成 Json字符串的形式&#xff0c;结果报了这个错误&#xff1a; java.lang.…...

Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源

一&#xff1a;错误出现 这个错误的意思是&#xff0c;拒绝将字符串评估为 JavaScript&#xff0c;因为‘unsafe-eval’不是以下内容安全策略中允许的脚本源。 二&#xff1a;错误场景 testEval() {const data eval("var sum2 new Function(a, b, return a b); sum2(em…...

十一、Linux用户及用户组的权限信息如何查看?如何修改?什么是权限的数字序号?

目录&#xff1a; 1、认知权限信息 2、rwx&#xff1f; &#xff08;1&#xff09;总括&#xff1a; &#xff08;2&#xff09;r权限&#xff1a; &#xff08;3&#xff09;w权限&#xff1a; &#xff08;4&#xff09;x权限&#xff1a; 3、修改权限 &#xff08;1&a…...

ahooks.js:一款强大的React Hooks库及其API使用教程(二)

一、ahooks.js简介二、ahooks.js安装三、继续ahooks.js API的介绍与使用教程21. useLocalStorageState22. useSessionStorageState23. useClickAway24. usePersistFn25. useCreation26. useFullscreen27. useInViewport28. useInfiniteScroll29. usePagination30. useDynamicLi…...

ARM 配置晶振频率

文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言 上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接&#xff0c;包括电源、SOC、SD 卡座等&#xff0c;板子已经可以跑起来了。 但是发现串口乱码&#xff0c;今天就来解决串口乱码问…...

最强自动化测试框架Playwright(37)-网络

介绍 Playwright 提供 API 来监控和修改浏览器网络流量&#xff0c;包括 HTTP 和 HTTPS。页面执行的任何请求&#xff0c;包括 XHR 和获取请求&#xff0c;都可以被跟踪、修改和处理。 模拟接口 查看我们的 API 模拟指南&#xff0c;了解有关如何 模拟 API 请求&#xff0c…...

Ant Design Pro 前端脚手架 配置混合导航

Ant Design Pro脚手架 点击查看阅读 混合导航&#xff1a; 顶部导航和侧边栏导航实现联动效果&#xff0c;点击不同的顶部导航按钮会显示对应的子菜单项。 实现点&#xff1a; 1. 路由的配置 菜单展示 我们可以在 route 中进行 menu 相关配置&#xff0c;来决定当前路由是否…...

tcl学习之路(五)(Vivado时序约束)

1.主时钟约束 主时钟通常是FPGA器件外部的板机时钟或FPGA的高速收发器输出数据的同步恢复时钟信号等。下面这句语法大家一定不会陌生。该语句用于对主时钟的名称、周期、占空比以及对应物理引脚进行约束。 create_clock -name <clock_name> -periood <period> -wa…...

Hlang-中英双语言编程语言使用手册

文章目录 介绍Hlang基本使用下载配置环境变量特性中文关键字支持中文符号混合编程中文错误提示终端多行输入基本数据类型整数浮点数列表字符串基本操作变量定义逻辑判断基本运算条件判断循环函数介绍 Hlang是一款基于Python编写的支持中英文混合编程的动态语言。其简单易上手,…...

centos 7 安装docker

系统配置&#xff1a; CentOS关闭selinux sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config关闭防火墙(可选)或者放行相应端口 systemctl stop firewalld.service && systemctl disable firewalld.service配置内核IP 转发 net.ipv4.ip_forward1 dock…...

Spring环境搭建、SpringIOC容器基础、SpringDI基础

文章目录 Spring环境搭建、SpringIOC容器基础、SpringDI基础一、SpringIOC核心思想二、搭建Spring环境步骤三、SpringIOC容器使用步骤四、SpringIOC 总结五、SpringDI&#xff08;依赖注入&#xff09;1、基本概念2、实现方式&#xff08;1&#xff09;set 注入&#xff08;2&a…...

CentOS7.9手工配置静态网络流程

进入网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 配置 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" //static 配置静态网络 DEFROUTE"yes" IPV4_FAILURE_FATAL"no…...

JVM面试题-1

1、什么是JVM内存结构&#xff1f; jvm将虚拟机分为5大区域&#xff0c;程序计数器、虚拟机栈、本地方法栈、java堆、方法区&#xff1b; 程序计数器&#xff1a;线程私有的&#xff0c;是一块很小的内存空间&#xff0c;作为当前线程的行号指示器&#xff0c;用于记录当前虚拟…...

漫谈红黑树:红黑树的奇妙演化

漫谈红黑树&#xff1a;红黑树的奇妙演化 一、红黑树的提出二、红黑树性质的简单推导三、结论 博主简介 &#x1f4a1;一个热爱分享高性能服务器后台开发知识的博主&#xff0c;目标是通过理论与代码实践的结合&#xff0c;让世界上看似难以掌握的技术变得易于理解与掌握。技能…...

docker启动rabbitmq,但是页面加载不出来问题解决

首先docker启动rabbitmq docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq -d 后台运行 -p 映射外部端口 -- name 取名&#xff08;方便管理&#xff09; 然后发现&#xff0c;成功启动rabbitmq&#xff0c;却加载不进去 因为你下载的是rabbitmq的latest…...

Qt项目报错:Cannot run compiler ‘clang++‘. /bin/sh: 1: clang++: not found

在一台旧电脑上装了深度系统&#xff0c;装了Qt&#xff0c;导入项目&#xff0c; build提示 clang找不到&#xff1a; Project ERROR: Cannot run compiler clang. Output: /bin/sh: 1: clang: not found Maybe you forgot to setup the environment? Error while parsing …...

奇舞周刊第503期:图解串一串 webpack 的历史和核心功能

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 图解串一串 webpack 的历史和核心功能 提到打包工具&#xff0c;可能你会首先想到 webpack。那没有 webpack 之前&#xff0c;都是怎么打包的呢&#xff1f;webpack 都有哪些功能&…...

6.redis面试题和坑

1.哨兵模式 多少个节点多少个哨兵(如果全部哨兵检测到已经master dead,重新选举)写sentinel.conf,监控的主机 票数 sentinel monitor myredis 127.0.0.1 6379 1启动哨兵 redis-sentinel sentinel.conf关闭主机 failover sdown info replication shutdown优点 1.基于主从复制模式…...

【ES6】—使用 const 声明

一、不属于顶层对象window 使用const关键字 声明的变量&#xff0c;不会挂载到window属性上 const a 5 console.log(a) console.log(window.a) // 5 // undefined二、不允许重复声明 使用const关键字不允许重复声明相同的变量 cosnt a 5 cosnt a 6 // Uncaught SyntaxEr…...

iOS开发 - Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!

前言 Codable 是 Swift 4.0 引入的一种协议&#xff0c;它是一个组合协议&#xff0c;由 Decodable 和 Encodable 两个协议组成。它的作用是将模型对象转换为 JSON 或者是其它的数据格式&#xff0c;也可以反过来将 JSON 数据转换为模型对象。 Encodable 和 Decodable 分别定…...

RabbitMq:Topic exchange(主题交换机)的理解和使用

RabbitMq:Topic exchange(主题交换机)的理解和使用 在RabbitMq中&#xff0c;生产者的消息都是通过交换机来接收&#xff0c;然后再从交换机分发到不同的队列中去&#xff0c;在分发的过程中交换机类型会影响分发的逻辑&#xff0c;下面主要讲解一下主题交换机。 ​ 主题交换…...

汽车级36V、4A同步降压转换器MAX20404AFOD/VY、MAX20404AFOC/VY、MAX20404AFOA/VY开关稳压器

MAX20404是小型同步降压转换器&#xff0c;集成了高端和低端开关。这些IC均设计为可在3V到36V的宽输入电压范围内提供高达4A的电流。电压质量可以通过观察PGOOD信号来监测。该器件可以在99%的占空比下运行&#xff0c;非常适合汽车和工业应用。 MAX20404提供可编程输出电压或5…...

C++------利用C++实现二叉搜索树【数据结构】

文章目录 二叉搜索树概念二叉搜索树的操作查找插入删除 二叉搜索树的应用 二叉搜索树 概念 什么是二叉搜索树&#xff0c;二叉搜索树就是指左孩子永远比根小右孩子永远比根大。这个规则适用于所有的子树。 上面的就是一棵二叉搜索树&#xff0c;我们还可以发现这棵树走一个中…...

HotSpot虚拟机之内存模型与线程安全

目录 一、线程内存模型 1. 内存模型 2. 内存模型操作 二、Happens-Before原则 三、Java线程 1. 线程实现方式 2. Java线程状态 四、Java线程安全 1. 线程安全程度 2. 锁优化 五、参考资料 一、线程内存模型 1. 内存模型 内存模型主要目的是定义共享变量的访问规则&…...