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

TCP连接管理机制:三次握手四次挥手

🍑个人主页:Jupiter.
🚀 所属专栏:Linux从入门到进阶
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

    • `连接管理机制`
      • `三次握手`
          • `三次握手的目的`
          • `三次握手的步骤`
            • `第一次握手`
            • `第二次握手`
            • `第三次握手`
            • `注意:`
      • `为什么建立连接是三次握手,而不是一次两次或则四次?`
            • `确保双方通信能力`
            • `防止失效连接请求`
            • `为什么不是一次或两次握手`
            • `为什么不是四次或更多次握手`
      • `四次挥手`
            • `第一次挥手`
            • `第二次挥手`
            • `第三次挥手`
            • `第四次挥手`
        • `为什么需要四次挥手`
            • `服务端状态转化`
      • `理解 TIME_WAIT 状态`
            • `理解 CLOSE_WAIT 状态`


连接管理机制

在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接

三次握手

在这里插入图片描述

三次握手的目的

三次握手的主要目的是确保客户端和服务器之间的连接是可靠的,即双方都能确认自己与对方的发送与接收功能是正常的。

三次握手的步骤
第一次握手
  • 客户端:客户端向服务器发送一个SYN(同步序列编号)报文段,并将SYN标志位置为1。同时,客户端随机生成一个初始序列号seq=x,将其放在TCP报文段的序列号字段中,然后发送给服务器。此时,客户端进入SYN_SENT(同步已发送)状态
  • 服务器:服务器收到客户端的SYN报文段后,确认客户端请求建立连接。
第二次握手
  • 服务器:服务器将自己的SYN标志位置为1,表示同意建立连接。同时,服务器将ACK(确认)标志位置为1,表示确认收到客户端的SYN报文段,并将确认号设置为客户端的序列号加1,即ack=x+1。此外,服务器也随机生成一个自己的初始序列号seq=y,并将其放在TCP报文段的序列号字段中,然后发送给客户端。此时,服务器进入SYN_RCVD(同步收到)状态
  • 客户端:客户端收到服务器的SYN+ACK报文段后,确认服务器已经准备好建立连接。
第三次握手
  • 客户端:客户端将ACK标志位置为1,表示确认收到服务器的SYN报文段。同时,客户端将确认号设置为服务器的序列号加1,即ack=y+1,并将自己的序列号设置为seq=x+1(因为客户端已经发送了一个SYN报文段,所以序列号需要加1)。然后,客户端将ACK报文段发送给服务器。此时,客户端进入ESTABLISHED(已建立连接)状态
  • 服务器:服务器收到客户端的ACK报文段后,确认客户端已经准备好进行数据传输。此时,服务器也进入ESTABLISHED状态,完成三次握手,连接建立。
注意:
  • 只有监听(listen)了服务器才允许受理 SYN连接请求。

  • connect只是发起了三次握手

  • accept不参与三次握手,如果三次握手没有完成,accept会阻塞,accept只是三次握手结束后,才会返回,

  • 三次握手不能保证100%能建立好连接,而是经历了三次握手,客户端与服务端都认为建立好连接了。

当客户端将最后一个ACK发出去的时候,并且这个ACK是没有应答的,客户端就认为连接已经建立好了。但是在客户端发送了ACK之后,可能会出现一些原因导致服务端没有建立好连接,这个时候,服务端就会给客户端发送RST报头,让其关闭连接并且重新三次握手。

  • 所谓的连接重置,就是让双方重新进行三次握手。

为什么建立连接是三次握手,而不是一次两次或则四次?

确保双方通信能力
  • 第一次握手:客户端发送一个SYN报文给服务器,表示请求建立连接,并随机生成一个序列号seq。这一步主要是让服务器知道客户端有发送数据的能力,并且准备好接收服务器的响应。
  • 第二次握手:服务器收到客户端的SYN报文后,回复一个SYN+ACK报文。其中,ACK表示确认收到客户端的SYN报文(ack=seq+1),SYN表示服务器也请求建立连接,并随机生成一个序列号seq2。这一步让客户端知道服务器有接收数据的能力,并且也准备好接收客户端的确认。
  • 第三次握手:客户端收到服务器的SYN+ACK报文后,回复一个ACK报文,其中ACK表示确认收到服务器的SYN报文(ack=seq2+1)。这一步是让客户端和服务器都确认对方已经准备好进行通信,从而确保双方的数据发送和接收能力都正常。
防止失效连接请求

三次握手还可以有效防止已失效的连接请求报文段被误认为是新的连接请求。例如,如果客户端发送的SYN报文在网络中丢失,那么客户端会重新发送SYN报文。此时,如果服务器收到了两次SYN报文而只回复了一次SYN+ACK报文,那么客户端就无法确定哪个SYN报文被成功接收并回复,从而可能导致连接建立失败或混乱。而三次握手机制通过要求客户端对服务器的SYN+ACK报文进行确认,可以确保连接建立的准确性。

为什么不是一次或两次握手

一次握手:无法确认双方的通信能力,也无法防止失效的连接请求。(并且如果一个客服端一直给服务端发送连接请求,会造成SYN洪水攻击。)
两次握手:虽然可以确认服务器的接收能力和客户端的发送能力,但无法确认客户端的接收能力。这可能导致服务器发送大量数据给客户端,而客户端由于某些原因(如网络故障)无法接收或确认这些数据,从而造成资源浪费和连接混乱。

为什么不是四次或更多次握手

四次(其实三次握手实际上也是四次握手,只是第中间一次是捎带应答)或更多次握手虽然可以进一步增加连接的可靠性,但也会增加连接的建立时间和复杂度。TCP协议设计时需要在可靠性和效率之间做出平衡。三次握手已经足够确保连接的可靠性和准确性,同时也不会引入过多的开销和复杂度。

四次挥手

在这里插入图片描述

TCP的四次挥手是TCP连接释放的过程,用于终止客户端和服务器之间的连接。这个过程确保了双方都能正确地关闭连接并释放资源,避免了数据丢失或资源泄露。以下是TCP四次挥手的详细过程:

第一次挥手

发起者:客户端
动作:客户端发送一个FIN(Finish)报文段给服务器,用来关闭客户端到服务器的数据传输。FIN报文段的标志位FIN被设置为1,表示客户端已经没有数据要发送给服务器了。
状态变化:客户端进入FIN_WAIT_1状态,等待服务器的确认。

第二次挥手

接收者:服务器
动作:服务器收到客户端的FIN报文段后,发送一个ACK报文段给客户端,确认收到了客户端的关闭连接请求。ACK报文段 的确认号被设置为收到的FIN报文段的序号加1,表示服务器已经准备好接收客户端关闭连接的请求。
状态变化:服务器进入CLOSE_WAIT状态,表示服务器已经同意关闭连接,但还需要完成一些清理工作(如发送剩余的数据)。同时,客户端收到服务器的ACK报文段后,进入FIN_WAIT_2状态,继续等待服务器的关闭连接请求。

第三次挥手

发起者:服务器
动作:当服务器完成所有数据的发送后(包括可能的剩余数据),它会向客户端发送一个FIN报文段,用来关闭服务器到客户端的数据传输。FIN报文段的标志位FIN被设置为1,表示服务器也没有数据要发送给客户端了。
状态变化:服务器进入LAST_ACK状态,等待客户端的确认。

第四次挥手

接收者:客户端
动作:客户端收到服务器的FIN报文段后,发送一个ACK报文段给服务器,确认收到了服务器的关闭连接请求。ACK报文段的确认号被设置为收到的FIN报文段的序号加1,表示客户端已经准备好关闭连接。
状态变化:客户端在发送完ACK报文段后,会进入TIME_WAIT状态等待一段时间(通常是2MSL,即两倍的最大报文段生存时间)以确保服务器已经完全关闭连接。服务器在收到客户端的ACK报文段后,会关闭连接,进入CLOSED状态。客户端在等待时间结束后,如果没有收到任何来自服务器的报文段,也会关闭连接,进入CLOSED状态。

为什么需要四次挥手
  • TCP连接是全双工的,即数据可以在两个方向上同时传输。因此,每个方向上的连接都需要独立关闭。这就是为什么需要两次FIN报文(一次来自客户端,一次来自服务器)和两次ACK报文(一次确认客户端的FIN,一次确认服务器的FIN)的原因。

  • 确保数据可靠传输:四次挥手过程中的每次报文交换都是对之前动作的确认。例如,客户端发送FIN报文后等待服务器的ACK报文确认;服务器发送FIN报文后也等待客户端的ACK报文确认。这种确认机制确保了数据的可靠传输直到连接完全关闭。

  • 释放资源:四次挥手过程还负责适当地释放在建立连接时分配的资源,如端口号、内存缓冲区等。这是确保系统资源得到有效利用和管理的重要步骤。

  • 关闭顺序的灵活性:任一端(客户端或服务器)都可以主动发起关闭连接的请求。这种双向的关闭过程确保双方都同意关闭,并且各自的数据传输都已经结束。

注意:

  • 当客户端给服务端发送FIN报文请求断开连接时,如果服务端也正好有断开连接的意图,并且服务端此时已经没有数据需要发送给客户端了,那么服务端可能会采取“捎带应答”的方式,将ACK报文和自身的FIN报文合并发送,从而实现TCP连接的三次挥手过程。

第一次挥手后,客户端已经把文件描述符关闭了,那么后面服务端向客户端发送应答,客户端怎么知道的呢?

在TCP的四次挥手过程中,客户端和服务端之间的通信是通过TCP连接来维持的,这种连接状态在操作系统层面由TCP/IP协议栈管理。当客户端决定关闭连接时,它会发起第一次挥手(FIN包),但此时客户端可能并没有完全关闭其TCP连接(即TCP状态机可能还未到达CLOSED状态),特别是如果客户端的TCP栈还在等待服务端的确认(ACK)时。

系统中有系统调用可以实现把一个文件描述符 设置只将写/读/读写 关闭。
在这里插入图片描述

完整流程图

在这里插入图片描述

服务端状态转化
  • [ CLOSED -> LISTEN ] 服务器端调用 listen 后进入 LISTEN 状态, 等待客户端连接;
  • [ LISTEN -> SYN_RCVD ] 一旦监听到连接请求(同步报文段), 就将该连接放入内核等待队列中, 并向客户端发送 SYN 确认报文.
  • [ SYN_RCVD -> ESTABLISHED ] 服务端一旦收到客户端的确认报文, 就进入ESTABLISHED 状态, 可以进行读写数据了.
  • [ ESTABLISHED -> CLOSE_WAIT ] 当客户端主动关闭连接(调用 close), 服务器会收到结束报文段, 服务器返回确认报文段并进入 CLOSE_WAIT;
  • [ CLOSE_WAIT -> LAST_ACK ] 进入 CLOSE_WAIT 后说明服务器准备关闭连接(需要处理完之前的数据); 当服务器真正调用 close 关闭连接时, 会向客户端发送FIN, 此时服务器进入 LAST_ACK 状态, 等待最后一个 ACK 到来(这个 ACK 是客户端确认收到了 FIN)
  • [ LAST_ACK -> CLOSED ] 服务器收到了对 FIN 的 ACK, 彻底关闭连接.

客户端状态转化:

  • [ CLOSED -> SYN_SENT ] 客户端调用 connect, 发送同步报文段;
  • [ SYN_SENT -> ESTABLISHED ] connect 调用成功, 则进入 ESTABLISHED 状态, 开始读写数据;
  • [ ESTABLISHED -> FIN_WAIT_1 ] 客户端主动调用 close 时, 向服务器发送结束报文段, 同时进入 FIN_WAIT_1;
  • [ FIN_WAIT_1 -> FIN_WAIT_2 ] 客户端收到服务器对结束报文段的确认, 则进入 FIN_WAIT_2, 开始等待服务器的结束报文段;
  • [ FIN_WAIT_2 -> TIME_WAIT ] 客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出 LAST_ACK;
  • [ TIME_WAIT -> CLOSED ] 客户端要等待一个 2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会进入 CLOSED 状态.

理解 TIME_WAIT 状态

现在做一个测试,首先启动 server,然后启动 client,然后用 Ctrl-C 使 server 终止,这时马上再运行 server, 结果是:
在这里插入图片描述
这是因为,虽然 server 的应用程序终止了,但 TCP 协议层的连接并没有完全断开,因此不能再次监听同样的 server 端口. 我们用 netstat 命令查看一下:
在这里插入图片描述

  • TCP 协议规定,主动关闭连接的一方要处于 TIME_ WAIT 状态,等待两个MSL(maximum segment lifetime)的时间后才能回到 CLOSED 状态。

  • 我们使用 Ctrl-C 终止了 server, 所以 server 是主动关闭连接的一方, 在TIME_WAIT 期间仍然不能再次监听同样的 server 端口;

  • MSL 在 RFC1122 中规定为两分钟,但是各操作系统的实现不同, 在 Centos7 上默认配置的值是 60s;

  • 可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看 msl 的值;

在这里插入图片描述
想一想, 为什么是 TIME_WAIT 的时间是 2MSL?

  • TCP协议中的TIME_WAIT状态持续时间为2MSL(两倍的最大段生存时间),这一设计是为了确保数据包的可靠传输以及连接的正确终止。具体原因如下:

  • 确保所有数据包在网络中消失
    在TCP连接关闭过程中,可能存在一些尚未到达目的地的旧数据包。这些数据包可能由于网络延迟、路由循环或其他原因而滞留。等待2MSL的时间可以确保这些数据包在网络中超时并被丢弃,从而避免它们干扰新的连接。

  • 确保最后一个ACK报文段被正确接收
    当连接的一方发送最后一个ACK报文段后,这个ACK可能会在网络中丢失。如果接收方没有收到这个ACK,它将重新发送FIN报文段。发送方必须等待足够长的时间以确保接收方收到了ACK并且不会重新尝试关闭连接。等待2MSL的时间可以确保发送方有足够的时间重新发送ACK报文段,以防接收方没有收到。

  • 防止旧连接的数据包干扰新连接
    如果旧的连接没有正确关闭,并且新的连接使用相同的四元组(源IP地址、源端口、目标IP地址、目标端口)建立,那么旧的数据包可能会干扰新连接的数据流。等待2MSL的时间可以确保所有旧的数据包已经消失,从而避免这种干扰。

解决 TIME_WAIT 状态引起的 bind 失败的方法

在 server 的 TCP 连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的

  • 服务器需要处理非常大量的客户端的连接(每个连接的生存时间可能很短, 但是每秒都有很大数量的客户端来请求.
  • 这个时候如果由服务器端主动关闭连接(比如某些客户端不活跃, 就需要被服务器端主动清理掉), 就会产生大量 TIME_WAIT 连接。
  • 由于我们的请求量很大, 就可能导致 TIME_WAIT 的连接数很多, 每个连接都会占用一个通信五元组(源 ip, 源端口, 目的 ip, 目的端口, 协议). 其中服务器的 ip 和端口和协议是固定的. 如果新来的客户端连接的 ip 和端口号TIME_WAIT 占用的链接重复了, 就会出现问题.

使用 setsockopt()设置 socket 描述符的 选项 SO_REUSEADDR 为 1, 表示允许创建端口号相同但 IP 地址不同的多个 socket 描述符
在这里插入图片描述

理解 CLOSE_WAIT 状态
  • 小结:
    对于服务器上出现大量的 CLOSE_WAIT 状态, 原因就是服务器没有正确的关闭
    socket, 导致四次挥手没有正确完成. 这是服务器上的一个 BUG,大概率是没有正确关闭自己的socket导致。 只需要加上对应的 close 即可解决问题.

相关文章:

TCP连接管理机制:三次握手四次挥手

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 连接管理机制三次握手三次握手的目的三次握手的步骤第一次握手第二次握手第三次握手注意: 为什么建立连接是三次握手&…...

1022. 宠物小精灵之收服

思路 双层dp 代码 #include <bits/stdc.h> using namespace std;const int N 1010, mod 1e9 7;int n, m, k, x, y, z, ans, t; int w[N], f[N][N];void solve() {cin >> n >> m >> k;for (int i 1; i < k; i ){cin >> x >> y;f…...

人工智能生成内容(AI-Generated Content)

此外&#xff0c;ALGC还在影视剧本创作、音乐创作、设计与创意、虚拟助手与聊天机器人、教育与培训、新闻报道与文学创作等领域发挥着重要作用。 三、技术架构 ALGC产业生态体系通常呈现为上中下三层架构&#xff1a; 四、优势与挑战 优势&#xff1a; 挑战&#xff1a; 一、…...

深度学习:强化学习(Reinforcement Learning, RL)详解

强化学习&#xff08;Reinforcement Learning, RL&#xff09;详解 强化学习是机器学习的一个重要分支&#xff0c;它涉及到智能体&#xff08;agent&#xff09;通过与环境&#xff08;environment&#xff09;的交互学习如何做出决策。在强化学习中&#xff0c;智能体在不断…...

C语言笔记20

指针运算 #include <stdio.h>int main() {char ac[] {0,1,2,3,4,5,6,7,8,9,};char *p ac;printf("p %p\n", p);printf("p1%p\n", p1);int ai[] {0,1,2,3,4,5,6,7,8,9,};int *q ai;printf("q %p\n", q);printf("q1%p\n", q1)…...

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff…...

selenium案例——爬取哔哩哔哩排行榜

案例需求&#xff1a; 1.使用selenium自动化爬虫爬取哔哩哔哩排行榜中舞蹈类的数据&#xff08;包括视频标题、up主、播放量和评论量&#xff09; 2.利用bs4进行数据解析和提取 3.将爬取的数据保存在本地json文件中 4.保存在excel文件中 分析&#xff1a; 1.请求url地址&…...

HTML5教程(三)- 常用标签

1 文本标签-h 标题标签&#xff08;head&#xff09;&#xff1a; 自带加粗效果&#xff0c;从h1到h6字体大小逐级递减一个标题独占一行 语法 <h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5…...

【HCIE-Datacom考试战报】2024-08-21 深圳 SRv6

8月21日深圳考试战报&#xff08;SRV6&#xff09; 前言 大家好呀&#xff0c;我是来自誉天的学员---&#xff0c;我是今年4月份开始看集训、备考实验的&#xff0c;但是专业课比较多&#xff0c;又还有其他比赛&#xff0c;所以我刚开始的进度很慢&#xff0c;六月底才进入冲…...

【京准电钟】“安全卫士”:卫星时空安全隔离防护装置

【京准电钟】“安全卫士”&#xff1a;卫星时空安全隔离防护装置 【京准电钟】“安全卫士”&#xff1a;卫星时空安全隔离防护装置 当前&#xff0c;我国电力系统普遍采用北斗卫星或者GPS卫星授时来实现时间同步&#xff0c;但不加防护的授时装置存在卫星信号被干扰或欺骗的风险…...

优先级队列(2)_数据流中第k大元素

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 优先级队列(2)_数据流中第k大元素 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…...

【CSS】纯CSS Loading动画组件

<template><div class"ai-loader-box"><!-- AI loader --><div class"ai-loader"><div class"text"><p>AI智能分析中....</p></div><div class"horizontal"><div class&quo…...

rootless模式下istio ambient鉴权策略

环境说明 rootless模式下测试istio Ambient功能 四层鉴权策略 这里四层指的是网络通信模型的第四层&#xff0c;主要的传输协议为TCP和UDP。 用于限制服务间的通信&#xff0c;比如下面的策略应用于带有 app: productpage 标签的 Pod&#xff0c; 并且仅允许来自服务帐户 clus…...

超详细的总结!最新大模型算法岗面试题(含答案)来了!

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等&#xff0c;正成为未来商业环境的重要组成部分。 截至目前大模型已超过200个&#xff0c;在大模型纵横的时代&#xff0c;不仅大模…...

vmware-17pro全网最细安装教程(图文讲解,不需注册账户)

文章目录 一、下载安装包&#xff1a; 二、安装教程&#xff1a; 三、检查是否安装成功 四、许可证密匙 vmware安装教程 一、下载安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1yC610SU1-O9Jtk7nUrZuSA?pwdsKBy 提取码&#xff1a;sKBy 二、安装教程&…...

C/C++(二)C++入门基础

这一章会介绍C入门必须掌握的一些基础概念。 一、函数重载 1、什么是函数重载&#xff1f; 函数重载是C相比于C语言的一个重大改进。 即C允许在同一作用域内声明多个功能类似的同名函数&#xff0c;这些函数的参数类型 / 个数 / 类型顺序不同。&#xff08;注&#xff1a;返回…...

人工智能发展:一场从“被教导”到“自我成长”的奇妙冒险

说到人工智能&#xff08;AI&#xff09;&#xff0c;大家的第一反应往往是机器人、无人驾驶、或者那个让人害怕的AI会不会取代人类。其实&#xff0c;AI的进化过程简直像一部精彩的电影&#xff0c;有起伏、有高潮、有让人摸不着头脑的时刻。今天&#xff0c;我们就一起来“吃…...

企业级 RAG 全链路优化关键技术

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 邢少敏 | 阿里云智能集团高级技术专家 活动&#xff1a; 2024 云栖大会 - AI 搜索企业级 RAG 全链路优化关键技术 在2024云栖大会上&#xff0c;阿里云 AI 搜索研发负责人之一的…...

学习文档(5)

Redis应用 目录 Redis应用 Redis 除了做缓存&#xff0c;还能做什么&#xff1f; Redis 可以做消息队列么&#xff1f; Redis 可以做搜索引擎么&#xff1f; 如何基于 Redis 实现延时任务&#xff1f; Redis 除了做缓存&#xff0c;还能做什么&#xff1f; 分布式锁&…...

node.js下载安装以及环境配置超详细教程【Windows版本】

node安装以及环境变量配置 Step1&#xff1a;选择版本进行安装Step2&#xff1a;安装Node.jsStep3&#xff1a;环境配置Step4&#xff1a;检查node.js是否成功安装Step5&#xff1a;npm修改下载镜像 Step1&#xff1a;选择版本进行安装 Node.js 安装包及源码下载地址为 Node.…...

08_实现 reactive

目录 编写 reactive 的函数签名处理对象的其他行为拦截 in 操作符拦截 for...in 循环delete 操作符 处理边界新旧值发生变化时才触发依赖的情况处理从原型上继承属性的情况处理一个对象已经是代理对象的情况处理一个原始对象已经被代理过一次之后的情况 浅响应与深响应代理数组…...

finereport 中台 帆软 编码解码

帆软用的 post 方式编码不是用的 dict&#xff0c;而是二次 url 编码&#xff0c;需要二次解析 import time import urllib.parse import json# 原始字符串 encoded_string data "__parameters__%7B%22MANUFACTURER%22%3A%22%22%2C%22CATEGORY%22%3A%22%22%2C%22HHPN_L…...

Day15-数据库服务全面优化与PT工具应用

Day15-数据库服务全面优化与PT工具应用 1、数据库服务优化讲解1.2 数据库服务系统层面的优化1.3 数据库服务软件版本选择1.4 数据库服务结构参数优化1.4.1 数据库连接层优化1.4.2 数据库服务层优化1.4.3 数据库引擎层优化1.4.4 数据库复制相关优化1.4.5 数据库其他相关优化 1.5…...

开源限流组件分析(二):uber-go/ratelimit

文章目录 本系列漏桶限流算法uber的漏桶算法使用mutex版本数据结构获取令牌松弛量 atomic版本数据结构获取令牌测试漏桶的松弛量 总结 本系列 开源限流组件分析&#xff08;一&#xff09;&#xff1a;juju/ratelimit开源限流组件分析&#xff08;二&#xff09;&#xff1a;u…...

探索 SVG 创作新维度:svgwrite 库揭秘

文章目录 **探索 SVG 创作新维度&#xff1a;svgwrite 库揭秘**背景介绍库简介安装指南基础函数使用实战场景常见问题与解决方案总结 探索 SVG 创作新维度&#xff1a;svgwrite 库揭秘 背景介绍 在数字艺术和网页设计领域&#xff0c;SVG&#xff08;Scalable Vector Graphic…...

为什么要做PFAS测试?PFAS检测项目详细介绍

PFAS测试之所以重要&#xff0c;主要归因于PFAS&#xff08;全氟和多氟化合物&#xff09;的广泛存在、持久性、生物累积性和潜在的毒性。这些特性使得PFAS在环境和人体中可能长期存在&#xff0c;并对生态系统和人类健康构成威胁。以下是对PFAS检测项目的详细介绍以及进行PFAS…...

稀土阻燃协效剂的应用

稀土阻燃协效剂是一类利用稀土元素&#xff08;如铈、镧、钕、铕等&#xff09;具有的独特性质&#xff0c;来增强材料阻燃性能的化学物质。在聚合物材料燃烧时可催化酯花成碳&#xff0c;迅速在高分子表面形成致密连续的碳层&#xff0c;隔绝聚合物材料内部的可燃性气体与氮气…...

Java的异常处理

常见异常 ① 运行时异常 a、ClassNotFoundException b、FileNotFoundException c、IOException ② 编译时异常 a、ArrayIndexOutOfBoundsException b、NullPointerException c、ClassCastException d、InputFormatException e、InputMismatchException f、ArithmeticException …...

免费域名邮箱申请和使用教程:有哪些步骤?

免费域名邮箱设置指南&#xff1f;如何免费注册烽火域名邮箱&#xff1f; 对于个人和企业而言&#xff0c;拥有一个专属的域名邮箱不仅能提升专业形象&#xff0c;还能增强品牌识别度。烽火将详细介绍如何申请和使用免费域名邮箱&#xff0c;帮助您轻松拥有一个专属的电子邮件…...

Linux之实战命令45:swapon应用实例(七十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...