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

TCP状态转换详解

1.什么是TCP的状态转换

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中,连接的状态会随着不同阶段的通信而发生变化,这些变化被称为状态转换。

在TCP进行三次握手,或者四次挥手的过程中,通信的服务器和客户端内部会发送状态上的变化,发生的状态变化在程序中是看不到的,这个状态的变化也不需要程序猿去维护,但是在某些情况下进行程序的调试会去查看相关的状态信息,先来看三次握手过程中的状态转换。

2.三次握手的状态转换

在第一次握手之前,服务器端必须先启动,并且已经开始了监听- 服务器端先调用了 listen() 函数, 开始监听- 服务器启动监听前后的状态变化: 没有状态 ---> LISTEN

当服务器监听启动之后,由客户端发起的三次握手过程中状态转换如下:

第一次握手
  • 客户端:

    • 操作: 调用 connect() 函数发送 SYN 包(同步包)。
    • 状态变化: CLOSED -> SYN_SENT
  • 服务器:

    • 操作: 监听状态下收到客户端的 SYN 包。
    • 状态变化: LISTEN -> SYN_RCVD
第二次握手
  • 服务器:

    • 操作: 向客户端发送 SYN-ACK 包(同步确认包),确认收到客户端的 SYN 包,并请求建立连接。
    • 状态变化: SYN_RCVD(保持不变)
  • 客户端:

    • 操作: 收到服务器的 SYN-ACK 包,确认连接请求。
    • 状态变化: SYN_SENT -> ESTABLISHED
第三次握手
  • 客户端:

    • 操作: 向服务器发送 ACK 包(确认包),确认服务器的 SYN-ACK 包。
    • 状态变化: ESTABLISHED(保持不变)
  • 服务器:

    • 操作: 收到客户端的 ACK 包,确认建立连接。
    • 状态变化: SYN_RCVD -> ESTABLISHED

三次握手完成之后,客户端和服务器都变成了同一种状态,这种状态叫:ESTABLISHED,表示双向连接已经建立, 可以通信了。在通过过程中,正常的通信状态就是 ESTABLISHED。

根据上面图片和描述,可以更直观地看到 TCP 三次握手过程中客户端和服务器的状态转换。通过三次握手,客户端和服务器从初始状态逐步进入 ESTABLISHED 状态,完成连接建立。

  • 客户端:

    • CLOSED -> SYN_SENT -> ESTABLISHED
  • 服务器:

    • LISTEN -> SYN_RCVD -> ESTABLISHED

3.四次挥手的状态转换

关于四次挥手对于客户端和服务器哪段先断开连接没有要求,根据实际情况处理即可。下面根据上图中的实例描述一下四次挥手过程中TCP的状态转换(上图中主动断开连接的一方是客户端):

第一次挥手
  • 客户端:

    • 操作: 调用 close() 函数,将 TCP 协议中的 FIN 设置为 1,请求与服务器断开连接。
    • 状态变化: ESTABLISHED -> FIN_WAIT_1
  • 服务器:

    • 操作: 收到客户端的 FIN 包,表示客户端请求断开连接。
    • 状态变化: ESTABLISHED -> CLOSE_WAIT
第二次挥手
  • 服务器:

    • 操作: 回复 ACK 包,同意断开连接的请求。
    • 状态变化: CLOSE_WAIT(保持不变)
  • 客户端:

    • 操作: 收到服务器的 ACK 包,确认服务器已同意断开连接。
    • 状态变化: FIN_WAIT_1 -> FIN_WAIT_2
第三次挥手
  • 服务器:

    • 操作: 调用 close() 函数,发送 FIN 包给客户端,请求断开连接。
    • 状态变化: CLOSE_WAIT -> LAST_ACK
  • 客户端:

    • 操作: 收到服务器的 FIN 包,确认断开连接请求。
    • 状态变化: FIN_WAIT_2 -> TIME_WAIT
第四次挥手
  • 客户端:

    • 操作: 回复 ACK 包给服务器,确认断开连接。
    • 状态变化: TIME_WAIT -> CLOSED
  • 服务器:

    • 操作: 收到客户端的 ACK 包,确认客户端已同意断开连接。
    • 状态变化: LAST_ACK -> CLOSED

根据上面图片和描述,可以更直观地看到 TCP 四次挥手过程中客户端和服务器的状态转换。通过四次挥手,客户端和服务器从 ESTABLISHED 状态逐步进入 CLOSED 状态,完成连接断开。

  • 客户端:

    • ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
  • 服务器:

    • ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

4.TCP状态转换图

在下图中同样是描述TCP通信过程中的客户端和服务器端的状态转,图片中主要关注两条主线:红色实线(客户端状态)和绿色虚线(服务器端状态)。黑色实线表示的是一些特殊情况下的状态切换,在此不做分析。因为三次握手是由客户端发起的,据此分析红色的实线表示的客户端的状态,绿色虚线表示的是服务器端的状态。

客户端状态转换

  1. 第一次握手:

    • 操作: 发送 SYN 包。
    • 状态变化: CLOSED -> SYN_SENT
  2. 第二次握手:

    • 操作: 收到服务器回复的 SYN-ACK 包。
    • 状态变化: SYN_SENT -> ESTABLISHED
  3. 主动断开连接,第一次挥手:

    • 操作: 发送 FIN 包,请求断开连接。
    • 状态变化: ESTABLISHED -> FIN_WAIT_1
  4. 第二次挥手:

    • 操作: 收到服务器的 ACK 包,确认服务器同意断开连接。
    • 状态变化: FIN_WAIT_1 -> FIN_WAIT_2
  5. 第三次挥手:

    • 操作: 收到服务器的 FIN 包,确认断开连接请求。
    • 状态变化: FIN_WAIT_2 -> TIME_WAIT
  6. 第四次挥手:

    • 操作: 回复 ACK 包给服务器,确认断开连接。等待 2 倍报文时长后,连接关闭。
    • 状态变化: TIME_WAIT -> CLOSED

服务器端状态转换

  1. 启动监听:

    • 操作: 服务器启动监听,等待客户端连接。
    • 状态变化: CLOSED -> LISTEN
  2. 第一次握手:

    • 操作: 收到客户端的 SYN 包。
    • 状态变化: LISTEN -> SYN_RCVD
  3. 第三次握手:

    • 操作: 收到客户端的 ACK 包,确认连接建立。
    • 状态变化: SYN_RCVD -> ESTABLISHED
  4. 收到断开连接请求,第一次挥手:

    • 操作: 收到客户端的 FIN 包,请求断开连接。
    • 状态变化: ESTABLISHED -> CLOSE_WAIT
  5. 第三次挥手:

    • 操作: 发送 FIN 包,请求与客户端断开连接。
    • 状态变化: CLOSE_WAIT -> LAST_ACK
  6. 第四次挥手:

    • 操作: 收到客户端的 ACK 包,确认断开连接。
    • 状态变化: LAST_ACK -> CLOSED

TIME_WAIT 状态的作用

在 TCP 通信中,主动断开连接的一方在收到被动断开连接一方发送的 FIN 包和最终的 ACK 包(即第三次挥手完成)后,必须处于 TIME_WAIT 状态并持续 2 倍 MSL(Maximum Segment Lifetime)时间。这么做的目的是:

  1. 确保 ACK 包能被正确接收:

    • 如果最终的 ACK 包丢失,服务器会重传 FIN 包,客户端在 TIME_WAIT 状态期间可以重新发送 ACK 包。
  2. 防止旧连接影响新连接:

    • TIME_WAIT 状态确保旧连接在消失前,有足够的时间让延迟的报文在网络中完全消失,避免旧连接的数据影响新连接。

5.Linux查看网络状态相关命令

$ netstat 参数
$ netstat -apn	| grep 关键字
参数:
-a (all)显示所有选项
-p 显示建立相关链接的程序名
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服务状态
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项

6.半关闭

TCP连接只有一方发送了FIN,另一方没有发出FIN包,仍然可以在一个方向上正常发送数据,这中状态可以称之为半关闭或者半连接。当四次挥手完成两次的时候,就相当于实现了半关闭,在程序中只需要在某一端直接调用 close() 函数即可。套接字通信默认是双工的,也就是双向通信,如果进行了半关闭就变成了单工,数据只能单向流动了。比如下面的这个例子:

服务器端:

调用了close() 函数,因此不能发数据,只能接收数据
关闭了服务器端的写操作,现在只能进行读操作 –> 变成了读端
客户端:

没有调用close(),客户端和服务器的连接还保持着

客户端可以给服务器发送数据,也可以接收服务器发送的数据 (但是,服务器已经丧失了发送数据的能力),因此客户端也只能发送数据,接收不到数据 –> 变成了写端

半关闭的工作机制

TCP 提供了一种半关闭机制,通过调用 shutdown() 函数来实现。shutdown() 函数允许应用程序分别关闭一个 TCP 连接的读或写操作,而不是完全关闭连接。

#include <sys/socket.h>
int shutdown(int sockfd, int how);
sockfd:套接字描述符。
how:SHUT_RD:关闭读取功能。SHUT_WR:关闭写入功能。SHUT_RDWR:同时关闭读取和写入功能。

半关闭的示例

以下是一个示例,展示了客户端如何实现半关闭,通知服务器它已经完成了数据发送,但仍然可以接收来自服务器的数据。

//服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_in address;int opt = 1;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};// 创建套接字if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置端口复用if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");close(server_fd);exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定套接字if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");close(server_fd);exit(EXIT_FAILURE);}// 监听套接字if (listen(server_fd, 3) < 0) {perror("listen");close(server_fd);exit(EXIT_FAILURE);}// 接受连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {perror("accept");close(server_fd);exit(EXIT_FAILURE);}// 接收来自客户端的数据read(new_socket, buffer, BUFFER_SIZE);printf("Server received: %s\n", buffer);// 发送数据给客户端const char *response = "Hello from server";send(new_socket, response, strlen(response), 0);// 继续接收来自客户端的数据memset(buffer, 0, BUFFER_SIZE);read(new_socket, buffer, BUFFER_SIZE);printf("Server received: %s\n", buffer);close(new_socket);close(server_fd);return 0;
}
//客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int sock = 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};// 创建套接字if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {printf("\n Socket creation error \n");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 将地址转换为二进制形式if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {printf("\nInvalid address/ Address not supported \n");return -1;}// 连接服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {printf("\nConnection Failed \n");return -1;}// 发送数据给服务器const char *message = "Hello from client";send(sock, message, strlen(message), 0);// 半关闭,关闭写入功能,但仍保持读取功能shutdown(sock, SHUT_WR);// 接收来自服务器的响应read(sock, buffer, BUFFER_SIZE);printf("Client received: %s\n", buffer);// 尝试再发送数据(会失败,因为写入功能已关闭)const char *another_message = "This will not be sent";ssize_t bytes_sent = send(sock, another_message, strlen(another_message), 0);if (bytes_sent == -1) {perror("send after shutdown");}close(sock);return 0;
}

相关文章:

TCP状态转换详解

1.什么是TCP的状态转换 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中&#xff0c;连接的状态会随着不同阶段的通信而发生变化&#xff0c;这些变化被称为状…...

SimMIM:一个类BERT的计算机视觉的预训练框架

1、前言 呃…好久没有写博客了&#xff0c;主要是最近时间比较少。今天来做一期视频博客的内容。本文主要讲SimMIM&#xff0c;它是一个将计算机视觉&#xff08;图像&#xff09;进行自监督训练的框架。 原论文&#xff1a;SimMIM&#xff1a;用于掩码图像建模的简单框架 (a…...

数据精度丢失

js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题&#xff0c;现总结一下 在开发过程中&#xff0c;发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查&#xff0c;怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…...

Element UI DatePicker选择日期范围区间默认显示前一个月和本月

要求&#xff1a;点击el-date-picker选择时间范围时&#xff0c;默认展开当月和上个月。 但是Element UI的组件默认展开的是本月和下一个月&#xff0c;如下图所示&#xff1a; 改为 <span click"changeInitCalendarRange"><el-date-picker v-model"r…...

C++:聚合类、嵌套类、局部类、union类详细介绍与分析

聚合类 (1)What&#xff08;什么是聚合类&#xff09; 本质是一个自定义类型的数据结构&#xff08;结构体或类&#xff09;&#xff0c;但聚合类有以下特性&#xff1a; 所有的成员都是public没有任何构造函数没有基类类内部没有初始值 (2)Why&#xff08;聚合类的作用&…...

MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统

MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统...

C++:左值/右值引用、移动语义/std::move、万能引用/完美转发std::forward 详解

你能学到 左值 与 右值左值引用 与 右值引用 基本用法与作用拷贝构造函数 与 移动构造函数移动语义 与 std::move万能引用 与 引用折叠完美转发&#xff1a;std::forward 前言 本文代码片段中变量命名规则如下&#xff1a; 小写字母&#xff1a;一般类型的变量&#xff08;非…...

蜂窝物联云平台:一站式服务,智能生活从此开始!

蜂窝云平台 一、PC端展示与管理 GIS地图整合 在GIS地图上精确展示地块&#xff0c;轻松点选查看详细设备信息、实时监控和控制功能&#xff0c;以及基地的全方位介绍。 个性化定制界面 界面布局与功能展示均可按需求定制&#xff0c;打造独一无二的用户体验。 数据集中看板 将…...

【中项】系统集成项目管理工程师-第3章 信息技术服务-3.3服务生命周期

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

【iOS】——消息传递底层实现

消息传递是什么 Objective-C是一种动态类型语言&#xff0c;这意味着在编译时并不确定对象的具体类型&#xff0c;而是在运行时决定。消息传递机制允许程序在运行时向对象发送消息&#xff0c;对象再决定如何响应这些消息。 当你通过对象调用方法时&#xff0c;例如像这样[ob…...

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…...

恶补,先验分布,后验分布 ,似然估计

恶补&#xff0c;打一遍增加印象 先验分布后验分布&#xff0c;似然估计 声明&#xff1a;仅记录个人学习&#xff0c;并无其他用途。 先验分布 后验分布&#xff0c; 似然估计 隔壁小哥的故事&#xff1a; 隔壁小哥要去15公里外的一个公园里玩&#xff0c;小哥可以选择步行…...

JS之数组中的reduce方法

文章目录 基本语法&#xff1a;callbackFn 的参数:例子1. 数组求和2. 数组求积3. 扁平化数组4. 数组元素计数5. 使用对象解构和展开运算符合并数组中的对象6. 求最大值和最小值 函数组合异步操作中的 reduce总结 reduce 是 JavaScript 中 Array 对象的一个方法&#xff0c;非常…...

在win10上通过WSL和docker安装Ubuntu子系统,并配置Ubuntu可成功使用宿主机GPU

本文主要记录win10系统上,通过WSL的Ubuntu系统以及Docker使用GPU的全部过程。 文章目录 1、 启用hyper-v2、 安装docker3、 安装WSL3.1 安装WSL23.1.1 检查是否安装了WSL23.1.1 安装和配置 WSL 23.2 安装Ubuntu 子系统3.3 检查并修改WSL版本4、docker配置ubuntu20.04 LTS5、下…...

python需要掌握那些语法

1-list数据类型 内置方法查看长度len&#xff08;list&#xff09; 2.array数据类型 查看形状 3.tuple 取出元组 t (1, 2, 3, 4, 5) # 取出第一个元素 2first_element t[0] 3print(first_element) # 输出&#xff1a;1 4 5# 取出第三个元素 6third_element t[2] 7pr…...

CentOS Mysql8 数据库安装

添加mysql yum仓库 这里安装的是8.0版本&#xff0c;如需其他版本在此查看mysql版本列表 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm安装mysql sudo yum install mysql-server …...

新手教程---python-函数(新添加)

一、递归函数 在Python中&#xff0c;递归函数是指一个函数调用自身的过程。递归函数一般包括两个部分&#xff1a;基本情况和递归情况。 基本情况是指在递归过程中终止递归的条件。如果不满足基本情况&#xff0c;递归函数将进入递归情况&#xff0c;调用自身&#xff0c;并缩…...

Windows tasklist命令详解,Windows查看进程

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 tasklist 可以…...

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点&#xff0c;就使整个单链表形成一 个环&#xff0c;这种头尾相接的单链表称为单循环链表&#xff0c;简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…...

深度剖析机构号矩阵系统:如何根据业务需求做出明智选择

在数字化营销的浪潮中&#xff0c;短视频平台如抖音、快手等已成为品牌传播和用户互动的重要渠道。为了更高效地管理这些平台的账号&#xff0c;机构号矩阵系统应运而生。本文将深度剖析机构号矩阵系统&#xff0c;并探讨如何根据业务需求做出明智的选择。 机构号矩阵系统概述…...

go语言的基础语法

基础语法 与python、vue等类似&#xff0c;go语言也分常量和变量等&#xff0c;常量用const(不可变)和变量var(可变)定义 常量 常量中的数据类型只可以是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型&#xff0c;值不可更改&#xff0c;表达式只支…...

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块&#xff08;XD-MDEP100&#xff09;是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包&#xff0c;实现不同厂家的设备之间的数据交换和共享。在汇川P…...

【玩转python】入门篇day11-位运算

1、位运算语法 计算机中所有的数据都是以二进制的形式存储在设备中。即 0、1 两种状态&#xff0c;计算机对二进制数据进行的运算(、-、、/)都是叫位运算&#xff0c;相比在代码中直接使用(、-、、/)运算符&#xff0c;合理的运用位运算更能显著提高代码在机器上的执行效率。 …...

【Gitlab】记一次升级 Gitlab 后 API 失效的问题

背景 前段时间&#xff0c;因内部使用的 Gitlab 版本存在漏洞&#xff0c;需要进行升级&#xff0c;于是乎&#xff0c;将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。 然后&#xff0c;今天&#xff0c;突然发现这个接口获取不到…...

2024.7.19 作业

1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…...

python如何创建SQLite 数据库连接,如何将数据库存储在内存中?

嗨&#xff0c;大家好&#xff0c;我是兰若姐姐。今天给大家说下如何创建SQLite 数据库连接,并将数据库存储在内存中,这是一种临时的、私有的数据存储空间&#xff0c;一般用于以下情形&#xff1a; 什么都不说&#xff0c;先上代码&#xff1a; import sqlite3创建数据库连接…...

机器学习-20-基于交互式web应用框架streamlit的基础使用教程

参考简洁而优雅地展示你的算法和数据——streamlit教程(一) 原理介绍与布局控制 参考Streamlit 讲解专栏(二):搭建第一个应用 Streamlit 讲解专栏(三):两种方案构建多页面 Streamlit 讲解专栏(五):探索强大而灵活的 st.write() 函数 1 streamlit 1.1 运行原理 im…...

基于luckysheet实现在线电子表格和Excel在线预览

概述 本文基于luckysheet实现在线的电子表格&#xff0c;并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述

3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 以下是文档的核心内容总结&#xff1a; UAV系…...

sqlalchemy_dm

1、参考文档&#xff1a; https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…...

记事本做网站/专门看网站的浏览器

题图摄于北京奥利匹克公园注&#xff1a;微信公众号不按照时间排序&#xff0c;请关注公众号“亨利笔记”&#xff0c;并加星标以置顶&#xff0c;以免错过更新。本文作者为VMware研发工程师&#xff0c;KubeFATE开源项目维护者。KubeFATE 日志聚合从 KubeFATE v1.5.1开始支持对…...

莱州教研室网站/百度云盘资源

git mercurialJDK团队希望通过Project Skara来研究JDK源代码管理的替代方案&#xff0c;该替代方案自2008年以来一直在使用Mercurial存储库。 “退休” Mercurial并选择Git是个好主意吗&#xff1f; 投票表决&#xff0c;看看Java冠军Stephen Colebourne对这次讨论要说些什么。…...

最靠谱的网站建设公司/广告传媒公司主要做什么

参加认证考试是相当多的人寻求职业发展的必经之路。对于绝大多数人来说&#xff0c;没有证书&#xff0c;是"万万不能"的。在国外&#xff0c;每增加一个认证证书都会带来薪水的提高。国内的薪资水平虽然没有国外那么高&#xff0c;但是相比较国内其他行业&#xff0…...

委托做的网站版权归属/软文代写平台

Windows下vagrant up出现蓝屏的解决办法 版权声明&#xff1a;尊重原创喔&#xff0c;转载请注明 https://blog.csdn.net/lgyaxx/article/details/79333462今天在Windows 10下装了个docker for windows&#xff0c;结果发现问题多多&#xff0c;虽然说container有优势&#xff…...

网站建设的简洁性/百度智能建站系统

AngularJS路由报错&#xff1a; Unknown provider: $routeProvider根据先知们的指引&#xff0c;在网上爬贴&#xff0c;有翻到官方的解决文章。原来在AgularJS1.2.0及其之后的版本中,ngRoute已经移动到单独的文件当中&#xff0c;再使用则需要载入angular-route.js这一文件&am…...

前端会员中心wordpress/杭州百度开户

【算法分析】 简单而言&#xff0c;将中缀表达式转换为后缀表达式的算法需要注意以下两点。 ● 操作数始终入操作数栈。 ● 操作符入操作符栈时&#xff0c;比较与操作符栈的栈顶元素的优先级&#xff0c;然后选择入操作符栈还是入操作数栈。直至将操作符栈的所有元素入操作数栈…...