最新资讯

  • 【网络】传输层协议——TCP协议(初阶)

【网络】传输层协议——TCP协议(初阶)

2025-05-25 20:38:14 6 阅读

目录

1.TCP协议

1.1.什么是TCP协议

1.2.为什么TCP叫传输控制协议

1.2.TCP是面向字节流的

 2.TCP协议段格式

2.1.流量控制——窗口大小(16位)

2.2.确认应答机制

2.2.1.什么是确认应答机制

2.2.2.推导确认应答机制 

2.2.3.确认应答机制

2.2.4.确认号和序列号

2.3.六位标志位

 3.TCP的可靠策略

3.1.超时重传机制

 3.2.连接管理机制

3.2.1.如何理解TCP连接

3.2.2.连接——三次握手 

3.2.3.断开连接——四次挥手


1.TCP协议

1.1.什么是TCP协议

  1. TCP 是面向连接的运输层协议。应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接
  2. 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(一对一)
  3. TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达
  4. TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据
  5. 面向字节流。TCP 中的“流”指的是流入到进程或从进程流出的字节序列

1.2.为什么TCP叫传输控制协议

        我们之前创建的TCP套接字,实际上sockfd会指向一个操作系统给分配好的socket file control block(socket文件控制块),而这个socket文件控制块内部会维护网络发送和网络接收的缓冲区,我们调用的所有网络发送函数,write send sendto等实际就是将数据从应用层缓冲区拷贝到TCP协议层,也就是操作系统内部的发送缓冲区,而网络接收函数,read recv recvfrom等实际就是将数据从TCP协议层的接收缓冲区拷贝到用户层的缓冲区中,而实际双方主机的TCP协议层之间的数据发送是完全由TCP自主决定的,什么时候发?发多少?发送时出错了怎么办?

        这些全部都是由TCP协议自己决定的,这是操作系统内部的事情,和我们用户层没有任何瓜葛,这也就是为什么TCP叫做传输控制协议的原因,因为传输的过程是由他自己所控制决定的。

       c->s和s->c之间发送使用的是不同对的发送和接收缓冲区,所以c给s发是不影响s给c发送的,这也就能说明TCP是全双工的,一个在发送时,不影响另一个也再发送,所以网络发送的本质就是数据拷贝。

  • 应用层缓冲区是什么?

        说应用层缓冲区怕大家感觉到抽象,其实所谓的应用层缓冲区就是我们自己定义的buffer,可以看到下面的6个网络发送接收接口都有对应的buf形参,我们在使用的时候肯定要传参数进去,而传的参数就是我们在应用层所定义出来的缓冲区。

        这里多说一句,上面的六个接口在进行网络发送和网络读取数据的时候,都会做网络字节序和主机字节序之间的转换recvfrom和sendto是程序员自己显示做转换,其余的四个接口是操作系统自动做转换,这是铁铁的事实!  

1.2.TCP是面向字节流的

  • 为什么 TCP 是面向字节流的协议?

        当用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文,也就是一个完整的用户消息被拆分成多个 TCP 报文进行传输。

       这时,接收方的程序如果不知道发送方发送的消息的长度,也就是不知道消息的边界时,是无法读出一个有效的用户消息的,因为用户消息被拆分成多个 TCP 报文后,并不能像 UDP 那样,一个 UDP 报文就能代表一个完整的用户消息。

举个实际的例子来说明。

发送方准备发送 「Hi.」和「I am Xiaolin」这两个消息。

        在发送端,当我们调用 send 函数完成数据“发送”以后,数据并没有被真正从网络上发送出去,只是从应用程序拷贝到了操作系统内核协议栈中。

        至于什么时候真正被发送,取决于发送窗口、拥塞窗口以及当前发送缓冲区的大小等条件。也就是说,我们不能认为每次 send 调用发送的数据,都会作为一个整体完整地消息被发送出去。

        如果我们考虑实际网络传输过程中的各种影响,假设发送端陆续调用 send 函数先后发送 「Hi.」和「I am Xiaolin」 报文,那么实际的发送很有可能是这几种情况。

第一种情况,这两个消息被分到同一个 TCP 报文,像这样:

第二种情况,「I am Xiaolin」的部分随 「Hi」 在一个 TCP 报文中发送出去,像这样:

第三种情况,「Hi.」 的一部分随 TCP 报文被发送出去,另一部分和 「I am Xiaolin」 一起随另一个 TCP 报文发送出去,像这样。

类似的情况还能举例很多种,这里主要是想说明,我们不知道 「Hi.」和 「I am Xiaolin」 这两个用户消息是如何进行 TCP 分组传输的。

        因此,我们不能认为一个用户消息对应一个 TCP 报文,正因为这样,所以 TCP 是面向字节流的协议

当两个消息的某个部分内容被分到同一个 TCP 报文时,就是我们常说的 TCP 粘包问题,这时接收方不知道消息的边界的话,是无法读出有效的消息。

要解决这个问题,要交给上层的应用层。

 2.TCP协议段格式

 图中,每一行有 4 个字节(32位),解包步骤如下:

提取报头:

  • 除了选项之外的报头叫做标准报头,一共 20 字节。
  • 提取选项:根据 4 位首部长度获取报头的整体大小,减去 20 字节的标准报头(固定报头),得到选项。如果没有选项的话就能直接得到有效载荷。

提取有效载荷:有效载荷 = 报文-报头 (-选项)

  • 16位源端口:发送方主机的应用程序的端口号
  • 16位目的端口:目的主机的应用程序的端口号
  • 32位TCP序列号:表示本报文段所发送数据的第一个字节的编号
  • 32位TCP确认序号:接收方期望收到发送方下一个报文段的第一个字节数据的编号
  • 4位TCP首部长度:数据偏移是指数据段中的“数据”部分起始处距离TCP报文段起始处的字节偏移量。确定TCP报文的报头部分长度,告诉接收端应用程序,数据(有效载荷)从何处开始
  • 6位保留字段:为TCP将来的发展预留空间,目前必须全部为0 
  • 6位标志位:共有6个标志位,每个标志位占1个bit
  • 16位窗口大小:表示发送该TCP报文的接受窗口还可以接受多少字节的数据量。该字段用于TCP的流量控制
  • 16位校验和字段:用于确认传输的数据有无损坏 。发送端基于数据内容校验生成一个数值,接收端根据接受的数据校验生成一个值。两个值相同代表数据有效,反之无效,丢弃该数据包。校验和根据 伪报头 + TCP头 + TCP数据 三部分进行计算
  • 16位紧急指针字段: 仅当标志位字段的URG标志位为1时才有意义。指出有效载荷中为紧急数据的字节数。当所有紧急数据处理完后,TCP就会告诉应用程序恢复到正常操作。即使接收方窗口大小为0,也可以发送紧急数据,因为紧急数据无须缓存
  • 选项字段:长度不定,但长度必须是32bits的整数倍。内容可变,因此必须使用首部长度来区分选项的具体长度

        TCP 的报头是变长的,包括固定的 20 字节和变长的选项。其中,“数据偏移”也叫做“首部长度”,它占固定 4 位,作用是保存报头整体的长度,以便接收端能够正确解析报文中的字段。

        值得注意的是,虽然首部长度占 4 个比特位,4 个比特位能表示的范围 0~15。但是它的单位并不是1字节,而是4字节,所以它实际能表示的范围就是[0,60]字节。

  

      而我们看到,选项上面的报头是固定字节大小,也就是20字节,那么说明选项最大可以有40字节。但是我们今天不谈选项,因为固定首部20字节,所以选项字段最长40字节。当没有选项字段时,首部长度字段为5(20 = 5*4),即0101。

每层协议的学习,我们都应该掌握这两个问题:

  1. 协议报头和有效载荷如何分离?
  2. 有效载荷如何向上交付?
  • 第一个问题,协议报头和有效载荷如何分离。

        我们看到,TCP首部包括20字节的固定长度首部和选项字段,同时固定首部中有一个首部长度字段(4bits)。

        值得注意的是,虽然首部长度占 4 位,但是它的单位是 4 个字节,那么 4 个比特位能表示的范围 0~15,就能表示 0~60 字节。

        首部长度最大可表示15(因为4位比特位最大是1111,即是15),但是它的单位是 4 个字节,即TCP首部最长为15 x 4 =60字节。因为固定首部20字节,所以选项字段最长40字节。当没有选项字段时,首部长度字段为5(20 = 5*4),即0101。

提取报头:

  • 除了选项之外的报头叫做标准报头,一共 20 字节。
  • 提取选项:根据 4 位首部长度获取报头的整体大小,减去 20 字节的标准报头(固定报头),得到选项。如果没有选项的话就能直接得到有效载荷。

提取有效载荷:有效载荷 = 报文-报头 (-选项)

        这样子就 通过首部长度,我们就可以将TCP首部和有效载荷分离。

  • 第二个问题,有效载荷如何向上交付。

TCP是传输层的,上层是应用层。而应用层程序会绑定端口号,TCP首部中有16位目的端口号,根据端口号做到向上交付。

接下来我们要进入TCP协议的深入学习,下面会出现例如这样子的图

这个SYN和ACK是哪里的东西啊?

我们一定要注意:

        客户端和服务端基于TCP协议进行通信,每次互发消息的时候,发送的可是完整的tcp报文,即一定携带完整的TCP报头。

2.1.流量控制——窗口大小(16位)

说到可靠传输,那么不可靠传输是什么样的呢?

比如数据传输重复,出现乱序,出现丢包等等情况,都是不可靠。因此可靠的数据传输,一定要规避这些情况, 

在TCP协议段格式中,在标准报头中,我们看到有个16位窗口大小,这是什么呢?

我们先补充一点知识来, 

  • 什么是流量控制

我们知道,TCP协议有发送缓冲区和接收缓冲区,无论是用户端还是服务端都是。

        假设有一天,服务端太忙了,客户端在向服务端发送数据,但是服务端来不及调用read或者recv这样的接口来拿取数据,但是客户端并不清除服务端那边的情况,就一直向服务端发,服务端已经被写满了,依旧再发的话,那么就会导致出现大面积丢包现象。

          因此,为了规避这种情况,当服务端的接收缓冲区空间紧张的时候,我们应该想办法让用户端发送数据的速度慢点,或者直接不发了。

       所以,这种通过控制客户端发送数据的速度,以便能让服务端来得及处理数据,从而规避大面积丢包的情况,这种策略就叫做流量控制

        另外说下,TCP协议其实还有一个策略叫做数据重传,也就是如果数据丢包了,那么就重新传一份。

  • 那我们丢包了重传不行吗?为什么还要流量控制呢?

        因为我们也知道,一个TCP协议的报文,光是标准表头就是固定20字节大小,还不算选项和有效载荷,如果出现大面积丢包,重传确实可以解决问题,但是浪费的资源太多,效率太低效。

大家还需要理解一下:双方通信发送的每一条消息里面都会有TCP协议报头 

  • 如何实现流量控制?

        答案就是服务端在返回给客户端的响应中,16位窗口大小就是服务端的接收缓冲区当前还剩多少空间。客户端就可以根据这个剩余的空间来制定合理的发送数据的速度。

        并且,我们要能想到,服务端也可能会给客户端发消息,那么客户端也会给服务端响应,那么此时这个响应中的16位窗口大小就是客户端的接收缓冲区还剩多少空间。

说白了这个16位窗口大小就是对方的接收缓冲区还剩多少空间

      也就是说,双方都可以进行流量控制。

2.2.确认应答机制

2.2.1.什么是确认应答机制

 TCP保证数据安全传输的时候最基本的一个特点就是确认应答机制。

  • 实际上为什么网络传输中会存在不可靠问题呢?

本质原因还是因为传输距离过长。

        比如我在内蒙给广东的网友发送消息,那数据包其实是要经过很多的路由器结点进行数据包转发,穿过很多的局域网,在局域网内部经过双绞线(以太网技术常用的物理介质)传输,还要经过运营商的基站,数据包在如此之长的传输距离中很有可能会丢失,数据里面的比特位翻转,又或是数据包中的字节乱序,又或是数据包重复发送给我的广东网友(发送方可能以为数据包丢失了)。

  • TCP应该如何解决网络传输时的不可靠问题呢?

需要确认应答(acknowledgement)机制

         客户端在向客户端发送数据的时候,每次发送完一个数据,客户端不会马上接着发数据,而是会等待从服务端传来的应答后,再发送数据,这样就能避免数据传输中不可靠的问题

        虽然数据包在网络中传输的距离过长,但只要我发送给我网友的消息有回复,有应答,那我就能判断我发的数据一定到达了我网友的主机上。

        比如我问我网友,你TCP/IP学的怎么样啊最近?我网友给我回复说,我最近正学TCP的确认应答机制呢!那我立马就可以肯定我发送的数据经过网络传输后,我的网友一定收到了,因为网友对我发送的消息做出了回复。同样的,如果我没回复我的网友,那网友也不敢确定他说的话,我一定收到了,因为我还没有给他发送的消息做出回复呢!而这就是典型的确认应答机制!

        但其实你可以发现,我和我的网友在发消息时,总会有最后一条消息是没有被确认的,无论最后一条消息是他发还是我发,所以我们可以得出结论TCP并没有绝对的可靠性,只有相对的可靠性!事实上,不只是TCP,所有的协议都是没有绝对的可靠性!

       所以TCP的可靠性永远不谈最新的消息,只谈论历史的消息,因为一定存在最新的一条消息是没有被应答的。

        但是话又说回来,我们其实只要保证客户端到服务端的数据完好就可以了,服务端没必要非要知道自己的响应是否完好送达,因此客户端发送数据后,只要一段时间内没收到来自服务端的响应,那么无论什么原因,都认为这次发送失败了,就会进行重发。

        总之,最新的一条消息(也就是应答),是没有应答的(看起来有点绕,也就是应答不需要应答)。

2.2.2.推导确认应答机制 

我们直接来看看我们预想的是怎么做的?

这样子可靠性就保证了 ,但是这样子效率太低了。

     难道我说一句话,你都要先回一句:“我听到了”,然后才说你想回应的话吗?这这个效率太低下了,正确的做法应该是将应答和想回复的消息一起发送回去

应该是下面这个

我们不保证最新一条信息的可靠性,我们只保证历史消息的可靠性! 

但是现在又有问题了,难道我发信息之前都要等你的应答吗?没有你的应答我是不发了吗?

        不可能。真实的TCP是发送消息时,会一次性发送一批数据段,确认应答时,也会一次性发送一批确认数据段。

        发送方可以同时发送多条数据,接收方根据收到的消息给出回复,但存在“后发先至”问题,接收方收到的数据顺序被打乱,这可能引起严重的歧义。

例如下面这种情况,双方最终会造成误解。 

针对“后发先至”问题,TCP的解决办法是给传输的数据和应答报文都进行编号。

2.2.3.确认应答机制

确认应答机制是发送方确保自己的数据要被对方收到。

        发送方发出数据以后,接收方要给发送方一个回复,确认自己已经收到数据了,这样的回复称为ACK,确认应答报文。

而发送方收到确认回复之后也知道自己的数据被对方收到了。

        TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。

        如下所示,在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端实现可靠传输。 

        未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到只是返回的确认应答在途中丢失。这种情况也会导致发送端因没有收到确认应答而认为数据没有到达目的地,从而进行重新发送。如下图所示。 

        此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也履见不鲜。此时,源发送主机只要按照机制重发数据即可。但是对于目标主机来说,这简直是一种“灾难”。它会反复收到相同的数据。而为了对上层应用提供可靠的传输,必须得放弃重复的数据包。

        为此,就必须引入一种机制,它能够识别是否已经接收数据,又能够判断是否需要接收。上述这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应容号,TCP可以实现可靠传输。

        TCP是面向字节流传输的,在编号的时候是给每个字节都编上序号,假设每次传输1000个字节,那么第一个字节的序号就是1,第二个字节的序号就是2...最后一个字节的序号就是1000。

由于这1000个字节是属于同一个TCP数据报的,TCP报头就只记录第一个字节的序号。

        上述说到的编号就需要用到TCP报文格式中的32位序号和32位确认序号,发送方利用32位序号记录发送的数据的第一个字节的序号,接收方读完数据之后,返回给发送方32位确认序号,即告之对方下一个数据的第一个字节应该从哪个序号开始。

        在TCP协议中,每一条数据都是有序号的,包括应答报文,一条数据是否是应答报文就要根据ACK标志位来确定,如过ACK为1那就是应答报文了,如果为0则不是应答报文了。

         TCP的可靠传输主要就是通过确认应答机制来保证的,通过应答报文就能让发送方清楚的知道传输是否成功,引入32位序号和32位确认序号进一步确保对多条数据有效的传输。

2.2.4.确认号和序列号

     客户端在接收到响应之前,还是会把数据存在缓冲区里。

       首先,我们客户端要发送的数据,已经存在TCP的发送缓冲区(内核里面的那个)中了,因为TCP是面向字节流的,这个缓冲区我们可以看作是char类型的大数组,那么每一个空间就是一个字节,并且还有对应的下标,那么也就是说,每一个字节天然就有自己的编号。

我们拷贝在缓冲区里的数据是按顺序存储的。

我们只需要在缓冲区里的数据是按顺序存储的即可!!!

序列号

  1. 含义:序列号是指一个TCP报文段中第一个字节的数据序列标识。它表示在一个TCP连接中,该报文段所携带的数据的开始位置。序号是用来保证数据传输的顺序性和完整性的。
  2. 作用:在TCP连接建立时,双方各自随机选择一个初始序列号(ISN)。随后传输的每个报文段的序号将基于这个初始值递增,其增量为该报文段所携带的数据量(字节数)。通过这种方式,接收方可以根据序号重组乱序到达的数据片段,确保数据的正确顺序和完整性。如果接收到的报文段不连续,接收方可以通过TCP的重传机制请求发送方重新发送缺失的数据。

例如,如果一个报文段被赋予了序号100,并且它包含100字节的数据,那么这个报文段就代表了从序号100到199的数据。随后的报文段将继续这个序列。继续上面的例子,下一个报文段可能会开始于序号200,如果它包含50字节的数据,那么它就代表了从序号200到249的数据。

我们可以简单的理解为数据里面每个字节都有唯一的标识——序列号。

补充知识

  • 在TCP中,当发送端的数据达到接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做ACK(确认应答,PositiveAcknowlegement) 
  • 在TCP中,当发送端的数据达到接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做ACK(确认应答,PositiveAcknowlegement)
  • 每一个 ACK(Acknowledge应答) 都带有对应的确认序列号,意思是告诉发送者,我已经收到了确认号之前的所有数据,下一次你从确认号开始发.
  • 服务器和客户端之间需要有办法能区分出, 当前这个报文是普通报文, 还是确认应答报文. 标志位中的 ACK 就可以解决, ACK 为 0 时, 表示这是一个普通的报文, 此时只有 32 位序号是有效的, 当 ACK 为 1 时, 表示这是一个应答报文, 这个报文的序号和确认序号都是有效的. 

确认号

        确认序号的定义却是这样的,确认序号的值表示接收方收到了确认序号之前的所有报文,而且是连续的报文,比如确认序号的值是11,那就代表接收方收到了10号及之前所有序号的报文,发送端下次从第11序号开始发送报文就可以了,所以确认序号的值从发送方的角度来理解,可以理解为发送方下一次发送报文时,报文的序号的值。

  1. 含义:确认应答号是接收方期望从发送方接收到的下一个报文段的序号。它实质上是接收方告诉发送方:“我已经成功接收到了哪个序号之前的所有数据,请从这个序号开始发送后续的数据。”
  2. 作用:确认应答号用于实现可靠性传输。当一个报文段被接收方正确接收时,接收方会发送一个ACK报文,其中包含的确认应答号是接收到的数据加上1(即接收方期望接收的下一个数据的序号)。通过检查这个确认应答号,发送方能够知道其发送的数据是否已被接收方正确接收,并据此决定是否需要重传某些数据段

  但是这里我们可以思考一个问题,

  • 在这个场景下,我们其实只需要一个32位序号就可以解决问题了,没必要再使用一个确认序号,那TCP为什么要设计两个序号呢?

可以从两个场景来理解:

  • 1.有时候,一个报文可能有双重身份,比如服务器除了返回应答,它还想给客户端传送数据,这种既是应答又是数据的响应,叫做捎带应答,那么此时确认序号就是为了告诉客户确认序号的前面的数据都已经收到了,序列号就是告诉客户端,从服务器发来的数据的第一个字节的序列号是多少的。
  • 2.有时候,并不是总是客户端给服务器发消息,服务器也会给客户端发消息,双方地位是对等的,如果只用一个序号位,就搞不清谁发谁收,因此还是需要两种序号位。

  另外我们要知道,服务端一般都是一批数据连着发,如果是发一个数据,还得等服务器返回一个应答之后再继续发,那样效率太低了。

         但是这里有一个问题,就是这批数据本来是按一定顺序发送的,但是服务器却不一定按相应顺序接收的。这就是数据乱序问题。UDP是没有办法的,毕竟是不可靠传输,那么TCP是如何解决的呢?

       这里还是得靠TCP报头中的32位序号,它除了能够确认应答,还能保证数据按序到达! 

序列号和确认序号的作用:

  • 将请求和应答一一对应起来;
  • 确认序号表示的是它之前的数据已经全部收到;
  • 允许部分确认应答丢失,或者不发送确认应答;
  • 保证了 TCP 的全双工通信。

2.3.六位标志位

标志位在哪里啊?

标志位字段共6bit,有6个标志位,每个标志位1bit,即只有0和1两种状态。 

有以下这6位标志位

TCP标志位

中文意思

作用

SYN

同步标志

用于建立连接

ACK

确认标志

用于确认收到数据

FIN

结束标志

用于关闭连接

RST

重连标志

用于重置连接

PSH

催促标志

用于立即传输数据

URG

紧急标志

用于指示紧急数据

接下来来详细介绍一下

1.ACK    表示本报文前面的确认号字段是否有效:只有当ACK=1时,前面的确认号字段才有效;

        在TCP确认回复机制中,客户端和服务端任意一方发送数据后,另一方都需要给予应答以表明自己收到数据。在应答的报文中该标记位需要置1,同时应答的报文也可以携带数据。

        TCP规定,建立连接后,ACK必须为1

2. SYN    请求建立连接。携带SYN标识的称为同步报文段。

作为服务端,我怎么知道客户端是想发信息还是想和我建立连接呢?那就需要这个标志位了。

       SYN表示同步标记位,其实就是申请建立连接的标记位。

TCP是面向连接的协议,双方在正常通信之前需要先建立连接,建立连接是一个三次握手的过程。

  • 第一次,Client 给Server发送请求连接,报文中携带SYN标记位来表明当前报文是和建立连接相关的。 
  • 第二次,Server接受Client的连接,并询问何时建立连接,报文中也会携带SYN标记位,同时会携带ACK来回复上一条请求。
  • 第三次,Client 回复 Server,立马建立连接,这里只是单纯的回复,只要设置ACK即可。

        那么问题来了,站在Client的角度,什么时候认为连接已经建立起来了呢?答案是第二次握手以后,即收到Server的回复。

        然而站在Server的角度,建立连接的时候是在第三次握手,因为第二次握手只是Server端单方面同意了,Client端有没有同意是在第三次握手才知道。

注意:TCP虽然保证可靠性,但是TCP允许连接建立失败。

      

  • client向server请求建立连接:当SYN=1,ACK=0时,表示该报文为请求建立连接的报文;
  • server向client请求建立连接:当SYN=1,ACK=1时,表示同意建立连接;

只有在建立连接的前两次请求中SYN才为1。该报文称为同步报文段 

3.FIN   FIN表示结束标记位,可以理解为Finish,其实就是断开连接的标记位。

断开连接是一个四次挥手的过程。

  • 为什么会有四次呢?

Client 单方面断开连接需要两次;Server端单方面断开连接需要两次,加起来就是四次。

谁先断开连接,这个没有限制,下面就假设Client先断开。

  • 第一次挥手,Client 通知 Server 自己单方面断开连接,Client发送的报文中就会携带FIN标记位。( 注意:Client单方面断开连接以后,只是断开Client ->Server方向上的数据传输,此时Server可以给Client发送数据,反过来不行。)
  • 第二次挥手,Server收到Client的通知请求,并给Client发送应答报文,报文中携带ACK标记位。

  • 第三次挥手,Server 通知 Client 自己单方面断开连接,Server发送的报文中会携带FIN标记位。
  • 第四次挥手,Client收到Server的通知请求,并给Server发送应答报文,报文中携带ACK标记位。

4.RST      RST表示复位标记位。代表着重新建立连接。

        三次握手建立连接并不一定能够成功建立连接,没人说三次握手一定能够成功,同样四次挥手也一样,就算连接建立成功了,那也是有可能断开的,比如单方面的将服务器主机电源拔掉,那连接不就会自动断开吗?

        等服务器重启的时候,服务器不认为连接建立成功,但client还认为连接存在着,所以client就会给服务器一直发消息,服务器就会感觉很奇怪,连接都已经不存在了,你为什么还要和我通信呢?

        所以此时服务器就会给client发送一个复位报文段,其报头中的RST标志位被置为1,告诉client说,你别再给我发消息了,连接早就异常断开了,你再重新发起三次握手,重新和我建立连接吧。  

      所以复位标志位用于通信双方中,任何一方认为建立连接不一致时,认为连接异常的一方会发送复位报文段,告知对方我们需要重新建立连接。

我们看几个例子

  • 1.服务端过载导致重连

        客户端与服务器通过三次握手成功建立连接,但是正常通信时服务器端的操作系统资源满载,导致服务器无法对客户端做出应答,由于服务端建立连接后也要管理连接,操作系统描述管理这些连接数据结构,服务端OS为了解决资源满载的问题可能会释放掉建立的连接,服务端端必须重新发送RST标识为1的报文给对应客户端请求重新建立连接才可以进行通信。

        就像下面这样子。

  

  • 2.三次握手时第3次握手失败导致重连

        client在三次握手的时候,认为只要把三次握手中第3次报文发出,连接就建立好了!!!

但是要是真的第3次握手的时候失败了,就会是下面这种情况

5.PSH      PSH表示催促标记位,可以理解为Push。

        Client在不断发数据,Server在不断接收数据同时在给Client发送应答,应答报文中包含了16位窗口大小的字段,其实就是在告诉Client自己接收缓冲区剩余空间的大小,以便于Client及时调整自己的发送速度。

        但是,Server接收缓冲区快满了或者说已经满了,此时Client给在发送的报文里设置PSH标记位来催促对方尽快取走缓冲区的数据。(让对方上层应用程序立即把数据从TCP接收缓冲区读取,保证TCP接收缓冲区有能力接收新数据或清空TCP接收缓冲区)

补充:

  • (1) 为什么缓冲区会满了?

        缓冲区满了可能是因为Server应用层还在处理上一条数据,导致没有时间调用read接口函数来取走缓冲区里的数据。

  • (2) 如何理解“OS催促上层尽快取走数据”?

        缓冲区存在低水位和高水位标记,OS 催促上层取数据的依据便来源于此,低水位就代表当前数据太少了,先别急着读;高水位就代表缓冲区里的数据太多了,赶紧来取走。

        一般OS是让上层每次都读取一批数据,而不是每次只读取一个字节。因为上层是调用read接口函数来从缓冲区读取数据的,如果每次都只读取一个字节,那就需要频繁的调用read函数,也就需要频繁的在用户态和内核态之间切换,这样会降低效率。

6.URG    

        URG表示紧急标记位。表示本报文中发送的数据(有效载荷)是否包含紧急数据:URG=1时表示有紧急数据;当URG=1时,后续的16位紧急指针字段才有效。

        当发送方希望一些数据尽快被接收方的上层拿到的时候,就需要用到这个标记位。通常需要搭配16位紧急指针使用,要传递的紧急数据混在普通数据里,16位紧急指针指明了紧急数据在普通数据中的具体位置。

 URG的紧急指针字段在这里

        16位紧急指针表示的是紧急数据在有效载荷中的偏移量,TCP规定死紧急数据只能有1字节,当URG标志位被置为有效时,紧急指针就会派上用场,接收方在读取TCP报头之后,会首先从紧急指针表示的偏移量处读取1字节的紧急数据,然后再重新从有效载荷的起始位置读取完成剩余的数据,这1字节的紧急数据我们一般称为带外数据。

        实际上紧急指针和URG标志位我们在99.99%的情景下都用不到,如果真要是用带外数据,可能运维的一些人员会用到,比如服务器现在压力非常大,可以发送1字节的带外数据用于询问当前服务器的状态怎么样,有没有恢复到健康状态,服务器可以返回1字节的带外数据,用1字节的数据来对应状态码,返回服务器是因为什么原因而导致过载,因为带外数据不用经过冗长的数据流,可以直接在应用层读取。

        所以带外数据实际上并不在正常的数据流中,一般用带外数据的也就是UDP和TCP协议了。如果想要读取带外数据,可以将recv的flags标志位按位或上MSG_OOB,这样就可以读取带外数据了。

 这些标志位的组合和状态变化规则定义了TCP连接的建立、维护和关闭过程,以及在数据传输中的一些特定行为,确保了TCP连接的可靠性和稳定性。

 3.TCP的可靠策略

除了我们上面说的确认应答机制,实际上TCP还有很多策略来提高传输可靠性

3.1.超时重传机制

        我们得知道一台主机发了一条消息出去,他自己是不知道有没有发送成功的,是靠对方发回的回应知道自己上传发送的消息成功发送了的。

        确认应答机制讨论的前提是每条数据都能顺利传输的情况,那么在丢包(对方没有收到我发的信息或者我没有收到对方的回复)的情况下该如何应对呢,应对方法就是超时重传(隔一段时间重新发送)

        丢包存在两种情况,发的数据丢包了,返回的ACK丢包了,不管是哪种情况,只要没有收到ACK,都会在到达某个时间阈值之后进行重传。

  • 补充知识1——丢包是小概率事件

        数据丢包是一个概率事件,假设一条数据在传输的过程中丢包的概率是5%,传输成功的概率是95%,那么第一次传输丢包,第二次重传也丢包的概率是5%*5%=0.25%,第三次重传也丢包的概率可以忽略不计,在实际情况中,丢包的概率是一个非常小的数字,而上述假设的5%已经是一个很大的数字了,如果连续多次重传还是丢包的情况下,那么就要考虑是否是网线断了或是其他情况了。

  • 补充知识2——自己这里认为发出,但是没有收到对方回复的消息会先保存到滑动窗口

        我们知道发送的数据段是有可能没有收到ACK的,所以被发出的数据不应该立马被移除(计算机上的移除其实就是数据覆盖),应该先保存一段时间,如果发送的数据丢包了,则可以将保存的数据再重新发送,而像这样已经发送但没有收到ACK的数据,其实是存放在滑动窗口里面的,这个后面会讲,现在先提一下。

  • ACK丢包的情况下,其实接收端已经收到发送端传输过来的数据,发送端再次发送相同的数据过来该如何处理呢?

        TCP有一个特殊的处理功能,去重,TCP存在一个“接收缓冲区”的存储空间,接收端会将读到的数据放到对应的缓冲区,根据数据的序号,TCP就能识别是否有两条重复的数据,如果重复就把后面的这条数据给丢弃了。

  • 特定的时间间隔怎么定呢?TCP是否会进行无限次的重传?

        其实这个时间应该是随着网络情况动态变化的,如果网络情况好,超时时间设定的非常长,这其实就会影响网络传输的效率,因为数据包发送的速度非常快,可能数据包来回一次共需要50ms,但你将超时时间设定为500ms,那中间的450ms的时间就会被平白无故浪费掉,如果网络情况特别差,超时时间设定的非常短,那更离谱了,数据包正在传输的过程当中就被判定为丢包了,这同样也会影响数据传输的效率。

        所以最理想的情况,就是找出一个最短的时间,保证绝大部分的网络情况下,数据包都可以在这个最短的时间窗口内,发送过去,同时ACK报文能够发回来。

        在linux(unix和windows也一样)中,超时实际上是以500ms作为基本单位来进行控制的,如果第一次重发后,还没有得到确认,则会以2的指数幂×500ms的方式来逐渐增大超时的时间窗口,累计达到一定重传次数,则TCP会强制关闭双方建立的连接。

 3.2.连接管理机制

3.2.1.如何理解TCP连接

  • 1.如何理解TCP连接?

        事实上,我们说的TCP的三次握手建立的这个连接,其实是端到端的这个连接,也就是客户端的应用层到服务端的应用层的连接只要我客户端的应用层没和服务端的应用层连接上,我们就可以说这个TCP连接是失败的。

        当上层(如应用层)调用connect函数时,它实际上是请求传输层(TCP协议层)来建立TCP连接。TCP协议层随后会进行三次握手过程,以在客户端和服务端之间建立连接。在这个过程中,SYN报文是由客户端的TCP协议层(传输层)发出的,用于发起连接请求。

        需要注意的是,虽然我们说TCP连接是端到端的,但在实际的网络传输过程中,数据会经过多个网络设备和协议层的处理。然而,这些处理对上层应用来说是透明的,它们只需要关注TCP连接是否成功建立,以及数据是否能够在应用层之间可靠地传输。

  • 因此,我们在下面如果看到了,明明一方和另一方断开连接了(实质是它们之间的应用层断开连接),但是其他层还可能存在联系,后面还能发SYN这类报头的,都是传输层在发的
  •  2.TCP连接是要维护的,会消耗资源的

        我们知道,TCP 在『端对端』之间建立的信道,为上层『端』对应的进程提供服务,它由客户端和服务端的套接字(socket)以及它们之间交换的数据包(segment)组成。TCP 连接的建立、维持和终止都需要遵循一定的协议和状态机制。 

        另外,中心化的 Client-Server 模式使得大量不同的 Client 将会与同一台 Server 建立连接,那么 Server 端势必要对这些来源不同的连接进行管理。

        从数据结构的角度理解:我们知道,TCP 是处于传输层的协议,也就是说,TCP 的各种逻辑由操作系统(特指 Linux)维护,那么这些数据就得按照操作系统的规则组织,即先描述,后组织。

        现在我们知道了,这些连接在操作系统眼里,只不过内核中的数据结构类型(通过结构体组织),当连接成功被建立时,内存中就会创建对应的『连接对象』。管理不同的连接,即对这些连接对象进行增删查改等操作。

       既然组织连接相关的数据结构需要操作系统维护,那么维护是需要成本的,主要是CPU 和内存资源。这是许多网络攻击方式的切入点。

  

      当然,TCP 连接需要维护一些状态信息和参数,例如序号、确认号、窗口大小、重传计时器等。这些信息和参数被存储在一个称为传输控制块(Transmission Control Block,TCB)的数据结构中。每个 TCP 连接都有一个唯一的 TCB 与之对应,操作系统用一张表来存储所有的 TCB。TCB 中的信息和参数会随着连接的状态变化而更新。

  • 为什么说在学习网络之前一定要先学好操作系统呢?

        最重要的原因就如刚才所说,两个具有代表性的协议:TCP 和 UDP 都是传输层的协议,而传输层由操作系统内核维护,那么协议的实现必须符合操作系统中的规则。

        另外,在 Linux 中,传输控制块(Transmission Control Block,TCB)和线程控制块(Thread Control Block,TCB)或者进程控制块(Process Control Block,PCB)之间的关系是不同的,它们分别属于不同的层次(前者是传输层,后两者是内核),它们之间的联系是:

  1. 一个进程可以创建多个线程,这些线程共享进程的资源,如内存空间、文件描述符等。因此,线程控制块中有一个指针指向所属进程的进程控制块。
  2. 一个进程或者线程可以创建多个套接字,这些套接字用于与其他进程或者线程进行通信。因此,进程控制块或者线程控制块中有一个文件描述符表,其中包含了指向套接字对应传输控制块的指针。

TCP是面向有连接的,

  1. 要在连接的情况下进行数据的传输,通常情况下要进行三次握手建立连接
  2. 断开连接时,要进行四次挥手断开连接。

3.2.2.连接——三次握手 

  • 怎么触发三次挥手?

用户端调用connect函数,然后操作系统就会自动在内部完成3次握手

TCP是面向连接的协议,双方在正常通信之前需要先建立连接,建立连接是一个三次握手的过程

  • 第一次,Client 给Server发送请求连接,报文中携带SYN标记位来表明当前报文是和建立连接相关的。 
  • 第二次,Server接受Client的连接,并询问何时建立连接,报文中也会携带SYN标记位,同时会携带ACK来回复上一条请求。
  • 第三次,Client 回复 Server,立马建立连接,这里只是单纯的回复,只要设置ACK即可。

        有人可能会疑问,客户端最开始不是没和服务端建立连接吗?那客户端为什么能发送SYN给服务端呢? 

        事实上,我们说的TCP连接,其实是端到端的这个连接,也就是客户端的应用层到服务端的应用层的连接只要我服务端的应用层没和服务端的应用层连接上,我们就可以说这个TCP连接是失败的。

        当上层(如应用层)调用connect函数时,它实际上是请求传输层(TCP协议层)来建立TCP连接。TCP协议层随后会进行三次握手过程,以在客户端和服务端之间建立连接。在这个过程中,SYN报文是由客户端的TCP协议层(传输层)发出的,用于发起连接请求。

        需要注意的是,虽然我们说TCP连接是端到端的,但在实际的网络传输过程中,数据会经过多个网络设备和协议层的处理。然而,这些处理对上层应用来说是透明的,它们只需要关注TCP连接是否成功建立,以及数据是否能够在应用层之间可靠地传输。

  • 因此,我们在下面如果看到了,明明一方和另一方断开连接了(实质是它们之间的应用层断开连接),后面还能发SYN这类报头的,都是传输层在发的

        那么问题来了,站在Client的角度,什么时候认为连接已经建立起来了呢?答案是第二次握手以后,即收到Server的回复。

        然而站在Server的角度,建立连接的时候是在第三次握手,因为第二次握手只是Server端单方面同意了,Client端有没有同意是在第三次握手才知道。

这些包使用 TCP 首部用于控制的字段来管理 TCP 连接,建立一个 TCP 连接需要发送 3 个包,形象的称为“三次握手”。

注意:

  1. 图中虽然以 SYN 等标记位请求和应答(包括下文常用标志位代替报文),但实际上两端交换的是报文,而不是标记位报文可能携带数据,也可能只含有报头。理论上在建立连接时,每个报文都应该有回应(就像打电话一样),在奇数次握手中,最后一个报文在连接建立之前一定没有回应的。
  2. 客户端和服务端都要向对方发送建立连接的请求(SYN),并且需要接收到对方的确认应答(ACK)后,才能认为『这个方向』的通信信道建立成功。这是因为 TCP 要实现『全双工』通信,就必须要保证双方通信的信道是畅通的。
  3. 有的时候把这个建立连接的过程叫做“四次握手”,这是因为这种说法把第二次握手 ACK+SYN 拆分成了两次握手,实际上都是一样的。

        有人想说,TCP只能保证历史消息的可靠性,永远不谈最新一条消息的可靠性,这句话没问题,比如三次握手的最后一次握手,这个消息的确就是不可靠的,因为客户端发送的ACK报文段,server是否收到,客户端是不知道的!

        但这没有关系,就算ACK报文段丢失了,那server不会认为连接建立成功,此时如果client给server发送消息,则server会感觉很奇怪,既然连接不建立成功,你还给我发消息,那就说明我们双方产生了认为连接建立不一致的情况,那server就会给client发送复位报文段,请求重新三次握手,重新建立连接,因为我们现在连接的建立是不一致的,client认为连接建立成功,但server不认为成功。

       或者还有另一种情况,server发送的SYN报文段超时没有确认应答,则server就会进行超时重传,当client收到重复的捎带应答报文段时,client就会意识到自己给server发送的确认应答报文段可能丢失了,此时client就会重发ACK报文段。

  •  为什么是三次握手?不是一次或者二次……

这是一个经典的问题,有很多不同的解释和角度。可以从几个方面来回答,在这里仅从效率角度讨论,在『再次理解“三次握手”中』会从多个角度回答这个问题。

  • 为什么不能用 1 次呢?

        如果只用 1 次,那么客户端发送一个 SYN 后就认为连接建立成功,但是如果这个 SYN 丢失了或者被延迟了,那么服务器端就无法知道客户端的请求,也无法给客户端发送数据。除此之外,每次连接都会占用服务端一定的 CPU 和内存资源,只用 1 次握手就认为建立连接成功,那么当服务端在短时间内接收到大量 SYN 连接请求,会造成服务端异常,即 SYN 洪水攻击。

  • 为什么不用2次呢?

        那么如果是两次握手就建立连接的情况下,当服务器将第二次的握手的信息发出去之后,默认连接已经建立,并且开辟空间资源等待接收数据。但如果第二次握手的信息丢包了呢,服务端认为二次握手已经完成,建立了连接,而客户端呢,由于什么也没有收到,所以会进行超时重传,当服务器又收到连接请求,认为有新的客户端发起连接,于是同意连接请求,并开辟空间资源等待接收数据,如果出现大量上述情况,便会造成服务端的崩溃。这种情况下,如果客户端重复地向服务端发送 SYN 请求,也会造成服务端的 SYN 洪水。

  • 为什么用3次呢?

        a.三次握手能够以最小成本验证全双工通信。全双工通信指的是server和client各自都能够进行数据的接收和发送,发送和接收是解耦的,client可以发送SYN报文段,也能接收来自server的ACK报文段,server可以发送SYN报文段,也能接收来自client的ACK报文段,话说回来,四次握手可以验证全双工通信吗?当然也可以,但既然三次握手行,为什么要四次握手呢?第四次握手不是平白无故的消耗网络资源吗?所以三次握手是以最小成本来验证全双工通信的。
 

        b.三次握手可以防止产生单主机对服务器SYN洪水攻击的漏洞。


        在三次握手中,server单方面对client建立连接的前提是client已经单方面向server建立好连接了。而客户端在服务端第一次返回SYN+ACK的时候,就client已经单方面向server建立连接,而这需要消耗客户端内部资源。在这之后客户端向服务端发送ACK后,服务端才会消耗资源来维护连接。这样子连接失败的成本嫁接到客户端上了。

            这样 SYN 洪水攻击也就失效了,因为三次握手会让发出 SYN 的一方(即服务端)接收等量的 ACK 响应,而大部分情况下服务器的配置要比client高很多,所以如果双方在不停的以相同成本进行消耗,那也一定是client先扛不住,而不是server,所以单主机的情况下,client想要SYN洪水攻击服务器,这是不现实的!这样服务端就能承担最小程度的连接失败成本。

  • 为什么不用 4 次或更多呢?

        前面我们说过三次握手已经可以最小成本验证全双工通信了,那四次,五次握手肯定也可以。

        但四次握手也存在SYN洪水攻击的漏洞,最后一次握手是server发送给client的,让client来建立连接的,但client可以忽略掉这个报文段,只让server自己建立连接,去承担维护连接需要的成本。

           同时五次握手由于最后一次是client发送给server的,所以server建立连接之前,client也会建立连接,双方是同等成本的消耗,则可以避免单主机的SYN洪水攻击。

        所以三次握手之后的其他握手,偶数次依旧存在SYN洪水攻击,奇数次不存在SYN洪水攻击,但他们都不是最小成本验证全双工通信信道,所以使用三次握手,而不是其他握手!

        其实从理论上讲,只要最后一次是客户端发送一个 ACK 给服务器端就行(为啥?因为要嫁接连接失败成本)就可以,即 5/7/9 次。

        … 但是这样做没有必要,因为第三次握手已经足够保证双方的同步和确认信息了,再多发送一次或多次只会增加网络开销和延迟。也就是说,三次握手是验证双方通信信道连接成功的最小次数。

TCP 的三次握手,主要是为了在保证连接可靠性和双向性的同时,尽量减少网络开销和延迟。

3.2.3.断开连接——四次挥手

  • 怎么触发四次挥手?

        建立连接是由一方主动发起,大部分都是客户端主动向服务器发起连接请求,但断开连接可以由任意一方主动发起,发起的上层条件,其实就是调用close()关闭套接字文件描述符sockfd。

 断开连接是一个四次挥手的过程。

  • 为什么会有四次呢?

Client 单方面断开连接需要两次;Server端单方面断开连接需要两次,加起来就是四次。

谁先断开连接,这个没有限制,下面就假设Client先断开。

  • 第一次挥手,Client 通知 Server 自己单方面断开连接,Client发送的报文中就会携带FIN标记位。( 注意:Client单方面断开连接以后,只是断开Client ->Server方向上的数据传输,此时Server可以给Client发送数据,反过来不行。)
  • 第二次挥手,Server收到Client的通知请求,并给Client发送应答报文,报文中携带ACK标记位。

  • 第三次挥手,Server 通知 Client 自己单方面断开连接,Server发送的报文中会携带FIN标记位。
  • 第四次挥手,Client收到Server的通知请求,并给Server发送应答报文,报文中携带ACK标记位。

        注意:所谓的TCP连接,其实是端到端的这个连接,也就是客户端的应用层到服务端的应用层的连接只要我客户端的应用层没和服务端的应用层连接上,我们就可以说这个TCP连接是失败的。但是其他层还可能保持着联系。

我们说断开连接,也就是断开客户端应用层和服务端应用层的连接。我们下面说断开连接之后,还能发ACK等信息,都是传输层(操作系统)在发送。

          我们这里所说的不发送消息,指的是不发应用层的数据了,并不代表传输层自己不能发送该层的管理报文段,例如FIN,ACK等等报文段。

        可能有读者会敏锐的发现, 这里的 “四次挥手” 过程似乎与 “三次握手” 的过程差别不大, 三次握手可以将中间的 ACK 和 SYN 合并为一次, 为什么这里的四次挥手没有将 ACK 和 FIN 合并为一个步骤呢?

        我们直接公布答案, 四次挥手有的时候确实可以三次完成, 但是大部分时候都是分为四次完成的, 因为中间这两次挥手过程, 不一定能够被合并.

        与握手不同, 三次握手的过程都是在内核中, 系统自行控制的, 可以说是中间的 SYN 和 ACK 是瞬发的, 而我们四次挥手时发送的 FIN 则是由用户代码来控制的. 只有调用 close 方法, 或者用户进程结束, 才会触发 FIN, 相比之下, ACK 是由内核控制, 第一次收到 FIN 时, 就会立马返回 ACK.

未完待续…… 

本文地址:https://www.vps345.com/12227.html

搜索文章

Tags

docker 容器 运维 java-rabbitmq java PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP centos python linux 机器学习 服务器 深度学习 人工智能 ubuntu 无人机 机器人 macos MacMini Mac 迷你主机 mini Apple 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 ai nlp 自动化 ROS 自动驾驶 pytorch javascript 前端 chrome edge Deepseek Deepseek-R1 大模型 私有化部署 推理模型 ssh漏洞 ssh9.9p2 CVE-2025-23419 数据库 oracle 关系型 安全 分布式 DeepSeek Linux ddos android 网络安全 web安全 jvm 虚拟机 windows 游戏 网络工程师 网络管理 软考 2024 2024年上半年 下午真题 答案 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 CH340 单片机 嵌入式硬件 串口驱动 CH341 uart 485 harmonyos 华为 部署 https 面试 职场和发展 MCP 学习 笔记 开发语言 音视频 物联网 vite vue3 云计算 ssh flutter Google pay Apple pay vue.js spring boot nginx c++ 计算机外设 bug 网络 tcp/ip 网络协议 经验分享 神经网络 计算机视觉 卷积神经网络 redis YOLO 目标检测 FTP服务器 deepseek DeepSeek-R1 API接口 github git 数据库系统 云原生 iventoy VmWare OpenEuler django conda 操作系统 UEFI Legacy MBR GPT U盘安装操作系统 notepad gnu 具身智能 强化学习 缓存 鸿蒙 arkUI arkTs 鸿蒙系统 opencv webpack 权限 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 程序 编程 内存 性能分析 AIGC 人工智能生成内容 Dify gitee node.js kubernetes prometheus grafana react.js 前端面试题 持续部署 opengl stm32 游戏引擎 ansible springsecurity6 oauth2 授权服务器 前后端分离 vscode yolov5 jdk 后端 udp 语言模型 远程桌面 http 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 excel 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 学习方法 程序人生 cursor ssl 自然语言处理 华为云 华为od linux环境变量 hadoop 命令 maxkb ARG svn 大数据 Ubuntu20.04 GLIBC 2.35 Linux 维护模式 tensorflow DNS 负载均衡 ui golang k8s qt arm nvm 阿里云 腾讯云 vue 智能体开发 AI 镜像源 嵌入式 ollama 压力测试 大模型压力测试 EvalScope debian RTSP xop RTP RTSPServer 推流 视频 远程连接 Ollama 模型联网 API CherryStudio npm rsyslog kafka llama deepseek-r1 大模型本地部署 microsoft 进程 进程控制 Ubuntu USB转串口 arm开发 架构 ubuntu20.04 开机黑屏 list 数据结构 数据分析 pycharm ide AI编程 mysql 远程工作 ArkUI ArkTS 移动端开发 计算机网络 adb Python教程 Python pycharm安装 bash pygame php ip协议 vnc 7z axure 富文本编辑器 cron crontab日志 Alexnet 工具分享 apache dash json 正则表达式 qps 高并发 微服务 eureka gitlab unity chatgpt oneapi 实时音视频 gitea rust腐蚀 mcu c语言 系统安全 IIS服务器 IIS性能 日志监控 tomcat uni-app kylin oracle fusion oracle中间件 jupyter 性能优化 电脑 NVML nvidia-smi C 环境变量 进程地址空间 wsl 算法 rag ragflow 大模型部署 Qwen2.5-coder 离线部署 mysql安装报错 windows拒绝安装 python2 ubuntu24.04 程序员创富 智能手机 1024程序员节 nohup 异步执行 MobaXterm 文件传输 postgresql intellij-idea visualstudio WSL2 IP 地址 策略模式 spring cloud 爬虫 网络爬虫 iftop 网络流量监控 gcc centos 7 spring dify 知识库 本地化部署 计算生物学 生物信息学 生物信息 基因组 ros ros1 Noetic 20.04 apt 安装 DevOps 软件交付 数据驱动 应用场景 数据安全 devops CPU 使用率 系统监控工具 linux 命令 智能路由器 linuxdeployqt 打包部署程序 appimagetool 命名管道 客户端与服务端通信 unix ACL 流量控制 基本ACL 规则配置 rocketmq SRS 流媒体 直播 升级 CVE-2024-7347 漏洞 回显服务器 UDP的API使用 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 dell服务器 AutoDL 服务器配置 audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 YOLOv8 NPU Atlas800 A300I pro asi_bench Flask FastAPI Waitress Gunicorn uWSGI Uvicorn RAID RAID技术 磁盘 存储 fastapi flask web3.py go file server http server web server typescript 信息与通信 IM即时通讯 QQ 微信 企业微信 剪切板对通 HTML FORMAT websocket 镜像下载 freebsd es6 qt6.3 g726 区块链 密码学 mcp mysql离线安装 ubuntu22.04 mysql8.0 私有化 本地部署 Cursor 虚拟显示器 远程控制 vim 英语 本地环回 bind vmware 卡死 jellyfin nas xcode 编辑器 kotlin android studio iphone VMware Tools vmware tools安装 vmwaretools安装步骤 vmwaretools安装失败 vmware tool安装步骤 vm tools安装步骤 vm tools安装后不能拖 vmware tools安装步骤 mac gpu算力 linux驱动开发 burpsuite 安全工具 mac安全工具 burp安装教程 渗透工具 diskgenius export env 变量 chromium dpi elasticsearch 打不开xxx软件 无法检查其是否包含恶意软件 图像处理 快捷键 旋转屏幕 自动操作 Ubuntu 22.04 MySql 算家云 算力租赁 安装教程 zip unzip cuda Bug解决 Qt platform OpenCV 材料工程 Maxkb RAG技术 本地知识库 selenium LLM langchain 产品经理 AI-native Docker Desktop 大模型应用 C++ 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 ip命令 新增网卡 新增IP 启动网卡 sql openssl eclipse 指令 ffmpeg 视频编解码 pip 国产数据库 瀚高数据库 数据迁移 下载安装 Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 gpt ip compose JDK Java LInux Windows 图形化界面 VMware ci/cd 防火墙 端口号 开放端口 访问列表 tcpdump 测试工具 rpa Apache Flume 数据采集 安装部署 配置优化 高级功能 大数据工具集成 IPMI agi 大模型微调 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 ipython rpc filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 反向代理 adobe 外网访问 内网穿透 端口映射 硬件工程 asm 串口服务器 GPU 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 vu大文件秒传跨域报错cors 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 jar jmeter Chatbox outlook 错误代码2603 无网络连接 2603 虚拟化 智能电视 华为OD 华为OD机试真题 可以组成网络的服务器 昇腾 大模型训练/推理 推理问题 mindie css css3 html5 shell web 交互 chatbox Agent big data 云计算面试题 visual studio code 网络结构图 protobuf 序列化和反序列化 安装 并查集 leetcode PX4 MAVROS 四旋翼无人机 开发环境 matplotlib fonts-noto-cjk .net 运维开发 QT 5.12.12 QT开发环境 Ubuntu18.04 隐藏文件 虚拟局域网 open webui 链表 pdf IP配置 netplan ollama api ollama外网访问 低代码 进程间通信 grep python3.11 冯诺依曼体系 openjdk maven firewall 智能驾驶 BEVFusion 数据集 腾讯云大模型知识引擎 产测工具框架 IMX6ULL 管理框架 perf glibc mamba Vmamba GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 virtualenv webdav jenkins 框架搭建 ubuntu 18.04 flash-attention 报错 虚拟现实 多线程 单例模式 html fstab 开源 milvus centos-root /dev/mapper yum clean all df -h / du -sh k8s部署 MySQL8.0 高可用集群(1主2从) tar remote-ssh 安装MySQL rdp 远程服务 显卡驱动持久化 GPU持久化 docker desktop 镜像 卸载 软件 列表 京东云 matlab SSE 网络攻击模型 risc-v mcp-proxy mcp-inspector fastapi-mcp agent sse C语言 c# 集成学习 集成测试 交换机 硬件 设备 PCI-Express FTP 服务器 科技 个人开发 阻塞队列 生产者消费者模型 服务器崩坏原因 自定义客户端 SAS 雨云 NPS 常用命令 文本命令 目录命令 NAT转发 NAT Server ping++ 华为认证 react next.js 部署next.js xrdp 做raid 装系统 BMC 银河麒麟 环境迁移 IMM ESP32 NAS Termux Samba PVE 银河麒麟操作系统 国产化 opensearch helm 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 gaussdb grub 版本升级 扩容 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 驱动开发 C# MQTTS 双向认证 emqx 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 微信小程序 rustdesk lighttpd安装 Ubuntu配置 Windows安装 性能测试 服务器优化 录音麦克风权限判断检测 录音功能 录音文件mp3播放 小程序实现录音及播放功能 RecorderManager 解决录音报错播放没声音问题 postman spark hive Qualcomm WoS QNN AppBuilder asp.net大文件上传 asp.net大文件上传下载 asp.net大文件上传源码 ASP.NET断点续传 信号处理 ftp服务 文件上传 gunicorn p2p 智能合约 哈希算法 匿名FTP 邮件传输代理 SSL支持 chroot监狱技术 HTTP状态码 客户端错误 服务器端错误 API设计 安卓 软件需求 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 ArcTS 登录 ArcUI GridItem 多层架构 解耦 灵办AI Redis Desktop VMware安装mocOS macOS系统安装 java-ee ios 重启 排查 系统重启 日志 原因 Mac内存不够用怎么办 高级IO epoll openvpn server openvpn配置教程 centos安装openvpn sublime text linux内核 智慧农业 开源鸿蒙 团队开发 shell脚本免交互 expect linux免交互 其他 iNode Macos deep learning 桌面环境 iot 教程 环境搭建 Maven mongodb vmamba sqlserver 终端工具 远程工具 sublime text3 Linux find grep GPU训练 向量数据库 milvus安装 图文教程 VMware虚拟机 macOS系统安装教程 macOS最新版 虚拟机安装macOS Sequoia photoshop vm js 图论 appium 软件测试 自动化测试 功能测试 docker run 数据卷挂载 交互模式 开发 onlyoffice 实时互动 大模型面经 大模型学习 minicom 串口调试工具 Reactor 设计模式 k8s集群资源管理 云原生开发 政务 分布式系统 监控运维 Prometheus Grafana ue4 着色器 ue5 虚幻 目标跟踪 OpenVINO 推理应用 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer miniapp 真机调试 调试 debug 断点 网络API请求调试方法 读写锁 AI大模型 大模型技术 本地部署大模型 kali 共享文件夹 ROS2 burp suite 抓包 课程设计 kernel 5G 网易邮箱大师 Linux Vim 一切皆文件 Kali 渗透 Claude Desktop Claude MCP Windows Cli MCP RDP n8n 工作流 xml powerpoint 计算机学习路线 编程语言选择 Docker Docker Compose Kubernetes DrissionPage prompt AI提示词优化 RagFlow 搜索引擎 程序员 企业风控系统 互联网反欺诈 DDoS攻击 SQL注入攻击 恶意软件和病毒攻击 dns llm oceanbase 传统数据库升级 银行 多线程服务器 Linux网络编程 stm32项目 webrtc zotero WebDAV 同步失败 代理模式 pillow IIS .net core Hosting Bundle .NET Framework vs2022 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 live555 rtsp rtp VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 odoo 服务器动作 Server action 数据挖掘 知识图谱 大模型教程 opcua opcda KEPServer安装 ssrf 失效的访问控制 孤岛惊魂4 安全威胁分析 统信 国产操作系统 虚拟机安装 DeepSeek行业应用 Heroku 网站部署 ecmascript nextjs reactjs 宝塔面板 同步 备份 建站 监控 自动化运维 Hyper-V WinRM TrustedHosts 大语言模型 LLMs string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 WebRTC 大文件秒传跨域报错cors firefox Unity Dedicated Server Host Client 无头主机 测试用例 火绒安全 express rust 统信UOS 麒麟 bonding 链路聚合 transformer 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 CDN llama.cpp 媒体 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 蓝桥杯C++组 蓝桥杯 HP Anyware numpy ECT转485串口服务器 ECT转Modbus485协议 ECT转Modbus串口服务器 安全漏洞 信息安全 行情服务器 股票交易 速度慢 切换 股票量化接口 股票API接口 券商 股票交易接口api 类型 特点 zabbix mariadb 系统架构 海康 samba 支持向量机 商用密码产品体系 localhost NFS 前端框架 ECS服务器 sse_starlette Starlette Server-Sent Eve 服务器推送事件 宠物 毕业设计 免费学习 宠物领养 宠物平台 HarmonyOS Next linux安装配置 harmonyOS面试题 系统 黑苹果 MacOS录屏软件 混合开发 环境安装 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 Ark-TS语言 Linux PID iperf3 带宽测试 yum docker-compose docker compose 进程优先级 调度队列 进程切换 Reactor反应堆 隐藏目录 文件系统 管理器 通配符 安卓模拟器 工具 多产物 elk nohup后台启动 HarmonyOS Tabs组件 TabContent TabBar TabsController 导航页签栏 滚动导航栏 iTerm2 动静态库 wps Office Ardupilot 车载系统 设备树 毕设 WSL resolv.conf 进程信号 termux hdc Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 mac设置host fpga开发 node 创业创新 管道 匿名管道 Github加速 Mac上Github加速 Chrome浏览器插件 流程图 mermaid SPI 切换root nano 蓝耘科技 元生代平台工作流 ComfyUI 离线部署dify JAVA 中间件 可信计算技术 安全架构 网络用户购物行为分析可视化平台 大数据毕业设计 VMware安装Ubuntu Ubuntu安装k8s ragflow 源码启动 efficientVIT YOLOv8替换主干网络 TOLOv8 vr CrewAI ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 springboot etcd RBAC 监控k8s集群 集群内prometheus WebUI DeepSeek V3 聚类 主从复制 监控k8s 监控kubernetes 文心一言 word Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 dubbo 思科 tcp ebpf uprobe scikit-learn GameFramework HybridCLR Unity编辑器扩展 自动化工具 Mermaid 可视化图表 自动化生成 ubuntu安装 linux入门小白 make命令 makefile文件 esp32 蓝牙 3d 数学建模 电子信息 通信工程 毕业 sdkman 命令行 基础入门 ufw 进程程序替换 execl函数 execv函数 execvp函数 execvpe函数 putenv函数 ICMP rtc 磁盘挂载 新盘添加 partedUtil UFW WSL2 上安装 Ubuntu gru ranger MySQL8.0 超级终端 多任务操作 提高工作效率 fabric RAGflow 实验 Trae IDE AI 原生集成开发环境 Trae AI MCP server C/S 王者荣耀 嵌入式实习 c MS Materials RustDesk自建服务器 rustdesk服务器 docker rustdesk aws openEuler 云电竞 云电脑 todesk 大模型入门 intellij idea EasyConnect LDAP MQTT 消息队列 cpu 实时 使用 echarts 信息可视化 网页设计 豆瓣 追剧助手 迅雷 云服务器 HAProxy 多个客户端访问 IO多路复用 TCP相关API vSphere vCenter 软件定义数据中心 sddc 音乐服务器 Navidrome 音流 源码剖析 rtsp实现步骤 流媒体开发 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 Kali Linux 黑客 渗透测试 信息收集 ukui 麒麟kylinos openeuler Netty 即时通信 NIO DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 r语言 数据可视化 SSH sysctl.conf vm.nr_hugepages KingBase 鲲鹏 Dell R750XS 群晖 文件分享 java-rocketmq gateway Clion Nova ResharperC++引擎 Centos7 远程开发 micropython mqtt asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 KylinV10 麒麟操作系统 Vmware MQTT协议 消息服务器 代码 TCP WebServer 话题通信 服务通信 windows 服务器安装 浪潮信息 AI服务器 代码规范 CNNs 图像分类 视频监控 网站 .netcore 小智 锁屏不生效 deepseak 豆包 KIMI 腾讯元宝 PyQt PySide6 显示器 c/s 软件开发 信任链 日志分析 系统取证 pyside6 界面 shard finebi 教育电商 游戏程序 源代码管理 notepad++ SoC 概率论 考研 Claude 路径解析 webgl 小游戏 五子棋 neo4j 数据仓库 数据库开发 database AI写作 远程 执行 sshpass 操作 chrome devtools chromedriver 小艺 Pura X 单元测试 sonoma 自动更新 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 微信分享 Image wxopensdk edge浏览器 kvm Hive环境搭建 hive3环境 Hive远程模式 Attention NLP cnn threejs 3D DevEco Studio cmos SenseVoice conda配置 conda镜像源 safari CentOS Stream CentOS trea idea 键盘 系统开发 binder framework 源码环境 Ubuntu22.04 开发人员主页 基础环境 开机自启动 软件工程 软件构建 CLion IO 宝塔面板无法访问 华为证书 HarmonyOS认证 华为证书考试 跨平台 perl 大屏端 System V共享内存 进程通信 su sudo sudo原理 su切换 frp Isaac Sim 虚拟仿真 用户管理 电脑桌面出现linux图标 电脑桌面linux图标删除不了 电脑桌面Liunx图标删不掉 linux图标删不掉 yolov8 mybatis 高德地图 鸿蒙接入高德地图 HarmonyOS5.0 llamafactory 微调 Qwen 空间 查错 lio-sam SLAM macbook SecureCRT mybase 裸机装机 linux磁盘分区 裸机安装linux 裸机安装ubuntu 裸机安装kali 裸机 Charles systemctl composer 接口返回 devmem rabbitmq RockyLinux mac安装软件 mac卸载软件 mac book uni-app x 深度求索 私域 eNSP 网络规划 VLAN 企业网络 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 健康医疗 互联网医院 环境配置 SSH 密钥生成 SSH 公钥 私钥 生成 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 firewalld P2P HDLC DenseNet PPI String Cytoscape CytoHubba cudnn anaconda docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos Docker Hub docker pull daemon.json Linux的权限 流水线 脚本式流水线 实战案例 log4j 飞牛nas fnos minio 容器技术 设置代理 实用教程 WLAN selete rancher redhat nftables 图片增强 增强数据 K8S k8s管理系统 生活 Docker快速入门 换源 国内源 Debian 免密 公钥 私钥 远程过程调用 Windows环境 VGG网络 卷积层 池化层 WireGuard 异地组网 SystemV 硬件架构 计算机科学与技术 fiddler 信号 ajax trae 网卡 LVM 磁盘分区 lvresize 磁盘扩容 pvcreate 内存管理 考试 autoware ros2 Alist rclone mount 挂载 网盘 软考设计师 中级设计师 SQL 软件设计师 智能体 autogen openai coze linux子系统 忘记密码 Masshunter 质谱采集分析软件 使用教程 科研软件 桥接模式 windows虚拟机 虚拟机联网 hosts hosts文件管理工具 开源软件 UOS 桌面快捷方式 LLaMA-Factory isaacgym Cline Kylin-Server 服务器安装 HistoryServer Spark YARN jobhistory EMQX 通信协议 Xterminal 华为机试 H3C VSCode 物联网开发 ruoyi Invalid Host allowedHosts kind ftp 云服务 vscode1.86 1.86版本 ssh远程连接 个人博客 技术 win11 无法解析服务器的名称或地址 vasp安装 kylin v10 麒麟 v10 ocr rc.local 开机自启 systemd 单一职责原则 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 压测 ECS 查询数据库服务IP地址 SQL Server 银河麒麟服务器操作系统 系统激活 移动云 windows日志 kamailio sip VoIP 磁盘监控 直播推流 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 X11 Xming mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 项目部署到linux服务器 项目部署过程 三级等保 服务器审计日志备份 银河麒麟高级服务器 外接硬盘 Kylin cpp-httplib 弹性计算 KVM 计算虚拟化 弹性裸金属 显示管理器 lightdm gdm 雨云服务器 模拟退火算法 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 裸金属服务器 弹性裸金属服务器 创意 社区 思科模拟器 Cisco IPMITOOL 硬件管理 执法记录仪 智能安全帽 smarteye uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 wsgiref Web 服务器网关接口 playbook 剧本 博客 代码调试 ipdb sqlite3 LORA 网站搭建 serv00 VMware创建虚拟机 矩阵 GCC aarch64 编译安装 HPC 视觉检测 毕昇JDK 工业4.0 域名服务 DHCP 符号链接 配置 繁忙 服务器繁忙 解决办法 替代网站 汇总推荐 AI推理 微信开放平台 微信公众平台 微信公众号配置 db CPU 主板 电源 TrueLicense Qwen2.5-VL vllm 云桌面 微软 AD域控 证书服务器 互信 云耀服务器 浏览器自动化 React Next.js 开源框架 视频平台 录像 视频转发 视频流 clickhouse 硅基流动 ChatBox visual studio 服务器部署 本地拉取打包 宝塔 笔灵AI AI工具 内网渗透 靶机渗透 负载测试 高效I/O 充电桩平台 充电桩开源平台 umeditor粘贴word ueditor粘贴word ueditor复制word ueditor上传word图片 ueditor导入word ueditor导入pdf ueditor导入ppt web3 区块链项目 金仓数据库 2025 征文 数据库平替用金仓 金仓数据库概述 金仓数据库的产品优化提案 AimRT 飞腾处理器 #STC8 #STM32 框架 nvidia 技术共享 rsync qwen2vl 机架式服务器 1U工控机 RK3588 国产工控机 web开发 bigdata 大模型推理 fpga gitee go OpenGL 图形渲染 accept issue linq GPU状态 粘包问题 多端开发 智慧分发 应用生态 鸿蒙OS VR手套 数据手套 动捕手套 动捕数据手套 医疗APP开发 app开发 僵尸进程 deekseek 捆绑 链接 谷歌浏览器 youtube google gmail alias unalias 别名 crosstool-ng 模拟器 飞牛NAS 飞牛OS MacBook Pro 中兴光猫 换光猫 网络桥接 自己换光猫 Ubuntu Server Ubuntu 22.04.5 在线office bcompare Beyond Compare keepalived 分析解读 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 代理服务器 嵌入式系统开发 ESXi Typore 向日葵 AList fnOS 模拟实现 Ubuntu共享文件夹 共享目录 Linux共享文件夹 webstorm 版本 c/c++ 串口 强制清理 强制删除 mac废纸篓 okhttp Xinference top Linux top top命令详解 top命令重点 top常用参数 ArkTs uv 沙盒 DIFY 软链接 硬链接 Linux权限 权限命令 特殊权限 磁盘清理 curl wget CosyVoice 内核 fork wait waitpid exit 网络文件系统 双系统 cmake Mac软件 csrutil mac恢复模式进入方法 SIP 恢复模式 MVS 海康威视相机 stable diffusion AI作画 lvm 终端 linux上传下载 MDK 嵌入式开发工具 论文笔记 wpf pyicu initramfs Linux内核 Grub gpt-3 推荐算法 zookeeper retry 重试机制 玩游戏 实时内核 大版本升 升级Ubuntu系统 Xshell rime wsl2 Echarts图表 折线图 柱状图 异步动态数据 鸿蒙开发 可视化效果 CUPS 打印机 Qt5 vsxsrv csrf OpenCore 需求分析 提示词 miniconda PostgreSQL15数据库 顽固图标 启动台 jdk11安装 jdk安装 openjdk11 openjdk11安装 互联网实用编程指南 AppLinking 应用间跳转 ubuntu24 vivado24 苹果电脑装windows系统 mac安装windows系统 mac装双系统 macbook安装win10双 mac安装win10双系统 苹果电脑上安装双系统 mac air安装win yum换源 树莓派项目 Bluetooth 配对 direct12 cocoapods mac cocoapods macos cocoapods Mac部署 Ollama模型 Openwebui 配置教程 AI模型 OpenHarmony RK3568 编译 烧录 npu YOLOv12 IO模型 ceph GoogLeNet TRAE fd 文件描述符 ollama下载加速 SSH 服务 SSH Server OpenSSH Server RAGFlow 本地知识库部署 DeepSeek R1 模型 跨域 热榜 ubuntu24.04.1 workflow 办公自动化 pdf教程 3GPP 卫星通信 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 DBeaver kerberos pyautogui Logstash 日志采集 ssh远程登录 AnythingLLM AnythingLLM安装 浏览器开发 AI浏览器 openstack Xen DocFlow 拓扑图 seatunnel HiCar CarLife+ CarPlay QT yum源切换 更换国内yum源 rnn 自动化编程 多进程 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 虚幻引擎 moveit 机器人运动 x64 SIGSEGV xmm0 springcloud 端口 查看 ss Node-Red 编程工具 流编程 GRUB引导 Linux技巧 easyui docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 mq qemu libvirt 网络建设与运维 网络搭建 神州数码 神州数码云平台 云平台 免费域名 域名解析 OpenManus wireshark 显示过滤器 Wireshark安装 openwrt WebVM NLP模型 电视剧收视率分析与可视化平台 copilot lb 协议 import save load 迁移镜像 计算机 Helm k8s集群 netlink libnl3 Apache Beam 批流统一 案例展示 数据分区 容错机制 软件卸载 系统清理 ShapeFile GeoJSON Nginx 网络编程 底层实现 分子对接 autodock mgltools PDB PubChem 机械臂 全文检索 图搜索算法 论文阅读 EVE-NG IPv4/IPv6双栈 双栈技术 网路规划设计 ensp综合实验 IPv4过渡IPv6 IPv4与IPv6 相机 kubeless pthread client-go k8s二次开发 Trae叒更新了? Crawlee Playwright 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 轮播图 MLLMs VLM gpt-4v 集成 scrapy python高级编程 Ansible elk stack dns是什么 如何设置电脑dns dns应该如何设置 libreoffice 转换 飞书 工作流自动化工具 bushujiaocheng 部署教程 AI算力 租算力 到算家云 网卡的名称修改 eth0 ens33 AD域 v10 armbian u-boot LLM Web APP Streamlit autodl SSL证书 code-server 流式接口 junit unity3d HCIE 数通 CORS 游戏机 pyqt 游戏服务器 TrinityCore 魔兽世界 open Euler dde deepin 我的世界 我的世界联机 数码 Wi-Fi 统信操作系统 深度优先 并集查找 换根法 树上倍增 Spring Security googlecloud 内网环境 相差8小时 UTC 时间 token sas 国标28181 监控接入 语音广播 流程 SDP iis TCP服务器 qt项目 qt项目实战 qt教程 聊天服务器 套接字 客户端 Socket ux llama3 Chatglm 开源大模型 远程看看 远程协助 thingsboard 聊天室 联想开天P90Z装win10 崖山数据库 YashanDB nfs 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 mosquitto 能力提升 面试宝典 IT信息化 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 大数据平台 算力 致远OA OA服务器 服务器磁盘扩容 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 温湿度数据上传到服务器 Arduino HTTP 服务器主板 AI芯片 我的世界服务器搭建 minecraft W5500 OLED u8g2 camera Arduino XCC Lenovo 半虚拟化 硬件虚拟化 Hypervisor 树莓派 VNC 田俊楠 智能音箱 智能家居 AD 域管理 iBMC UltraISO 服务器管理 配置教程 网站管理 迁移指南 Windsurf 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 gradle 超融合 安防软件 AI员工 banner 机柜 1U 2U Web服务器 多线程下载工具 PYTHON 服务器扩容没有扩容成功 Carla Web应用服务器 授时服务 北斗授时 联机 僵尸毁灭工程 游戏联机 开服 语音识别 zerotier 弹性服务器 联网 easyconnect 代理 arcgis nacos netty 配置原理 VPN wireguard 跨域请求 solidworks安装 servlet 电路仿真 multisim 硬件工程师 硬件工程师学习 电路图 电路分析 仪器仪表 laravel 分布式账本 共识算法 wordpress element-ui 上传视频并预览视频 vue上传本地视频及进度条功能 vue2选择视频上传到服务器 upload上传视频组件插件 批量上传视频 限制单个上传视频 文件存储服务器组件 规格说明书 设计规范 Webserver 异步 Qt QModbus 计算机系统 OpenManage LVS rtcp CPU架构 服务器cpu vue在线预览excel和编辑 vue2打开解析xls电子表格 浏览器新开页签或弹框内加载预览 文件url地址或接口二进制文档 解决网页打不开白屏报错问题 muduo 静态NAT 全栈 Java进程管理 DevOps自动化 脚本执行 跨平台开发 远程运维 Apache Exec JSch openssh av1 电视盒子 机顶盒ROM 魔百盒刷机 apt navicat 移动开发 元服务 应用上架 输入法 邮件APP 免费软件 EMUI 回退 降级 Linux24.04 源码 prometheus数据采集 prometheus数据模型 prometheus特点 合成模型 扩散模型 图像生成 Linux的基础指令 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 交叉编译 历史版本 下载 边缘计算 用户缓冲区 本地部署AI大模型 ArtTS HarmonyOS NEXT 原生鸿蒙 稳定性 看门狗 ShenTong 支付 微信支付 开放平台 etl can 线程池 查看显卡进程 fuser Cookie MacOS vpn MAC ELF加载 xfce g++ g++13 beautifulsoup 线程 子系统 星河版 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 NVM Node Yarn PM2 物理地址 页表 虚拟地址 Obsidian Dataview 可执行程序 react native STL Linux的基础开发工具 cpolar 欧拉系统 mvc harmonyosnext 导航栏 nac 802.1 portal wifi驱动 GKI KMI IP地址 IPv4 IPv6 计算机基础 影视app 系统内核 Linux版本 多路转接 进程池实现 word转pdf charles clipboard 剪贴板 剪贴板增强 路径规划 技能大赛 影刀 #影刀RPA# 企业网络规划 华为eNSP jina yaml Ultralytics 可视化 fast 实习 AI代码编辑器 Open WebUI cd 目录切换 TCP协议 USB网络共享 xpath定位元素 子网掩码 公网IP 私有IP bot docker命令大全 docker部署Python 序列化反序列化 linux 命令 sed 命令 自动化任务管理 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 显卡驱动 抗锯齿 searxng dity make bat 金融 telnet 远程登录 ruby AI Agent 字节智能运维 proxy模式 钉钉 DeepSeek r1 cfssl 自学笔记 小米 澎湃OS Android 端口聚合 windows11 image virtualbox 网页服务器 web服务器 scapy AzureDataStudio qt5 客户端开发 Zoertier 内网组网 GeneCards OMIM TTD IPv6测试 IPv6测速 IPv6检测 IPv6查询 脚本 GRE webview post.io 企业邮箱 搭建邮箱 postgres Dify重启后重新初始化 less 静态IP 命令模式 Qwen3 qwen3 32b 可用性测试 线程同步 线程互斥 条件变量 d3d12 android-studio deepseek-v3 ktransformers 动态库 GCC编译器 -fPIC -shared 医院门诊管理系统 Modbus TCP 4 - 分布式通信、分布式张量 百度云 springboot容器部署 springboot容器化部署 微服务容器化负载均衡配置 微服务容器多节点部署 微服务多节点部署配置负载均衡 通用环境搭建 MySQL 热键 代理配置 企业级DevOps 服务注册与发现 电脑操作 podman registries pppoe radius Radius Kylin OS SVN Server tortoise svn UDP RTMP 应用层 ecm bpm 根服务器 hibernate 内网服务器 内网代理 内网通信 es 恒源云 bootstrap h.264 Headless Linux 无桌面 XFS xfs文件系统损坏 I_O error SSL 域名 黑客技术 MNN vscode 1.86 api VPS SEO 社交电子 iDRAC R720xd 直流充电桩 充电桩 jetty undertow 网工 Nuxt.js nuxt3 服务器部署ai模型 MI300x uniapp HTTP 服务器控制 ESP32 DeepSeek URL 宕机切换 服务器宕机 FunASR ASR tailscale derp derper 中转 DOIT 四博智联 业界资讯 AISphereButler Minecraft Anolis nginx安装 linux插件下载 网络穿透 游戏开发 SWAT 配置文件 服务管理 网络共享 加解密 Yakit yaklang chfs ubuntu 16.04 状态管理的 UDP 服务器 Arduino RTOS vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 SysBench 基准测试 skynet Dell HPE 联想 浪潮 idm 北亚数据恢复 oracle数据恢复 embedding OD机试真题 服务器能耗统计 搭建个人相关服务器 pgpool lua VS Code 欧标 OCPP 状态模式 小智AI服务端 xiaozhi TTS 音乐库 飞牛 dba 信创 信创终端 中科方德 win服务器架设 windows server 端口测试 Jellyfin UOS1070e saltstack 服务器正确解析请求体 代码托管服务 powerbi WINCC 服务器ssl异常解决 NFC 近场通讯 智能门锁 Pyppeteer 动态规划 glm4 程序化交易 量化交易 高频交易 massa sui aptos sei 7-zip java-zookeeper 三次握手 Python 视频爬取教程 Python 视频爬取 Python 视频教程 EMC存储 NetApp存储 paddle AWS Putty 花生壳 OpenSSH PTrade QMT 量化股票 pxe pyscenic 生信教程 能源 制造 动态域名 惠普服务器 惠普ML310e Gen8 惠普ML310e Gen8V2 h.265 腾讯云服务器 轻量应用服务器 linux系统入门 linux命令 anonymous 风扇散热策略 曙光 海光 宁畅 中科可控 socket 站群服务器 分布式数据库 集中式数据库 业务需求 选型误 5090 显卡 AI性能 科勘海洋 数据采集浮标 浮标数据采集模块 Svelte OpenAI aiohttp asyncio 性能监控 分类 语法 移动魔百盒 服务网格 istio sequoiaDB deepseek r1 regedit 开机启动 玩机技巧 软件分享 软件图标 风扇控制软件 嵌入式Linux IPC xshell termius iterm2 Linux环境 whistle macOS 极限编程 archlinux kde plasma brew comfyui comfyui教程 华为鸿蒙系统 ArkTS语言 Component 生命周期 条件渲染 Image图片组件 对比 meld DiffMerge win向maOS迁移数据 数据库管理 bert swift Bandizip Mac解压 Mac压缩 压缩菜单 软件商店 livecd systemtools 实时日志 logs NTP服务器 orbslam2 端口开放 lvs ANDROID_HOME zshrc easyTier 组网 function address 函数 地址 broadcom 截图 录屏 gif 开发工具 基础指令 pipe函数 管道的大小 匿名管道的四种情况 ps命令 手动分区 本地不受DeepSeek C/C++ chrome历史版本下载 chrominum下载 Linux的进程概念 cuda驱动 时间轮 flink IMX317 MIPI H265 VCU figma Python基础 Python技巧 运维监控 烟花代码 烟花 元旦 增强现实 沉浸式体验 技术实现 案例分析 AR dock 加速 软负载 seleium 项目部署 deployment daemonset statefulset cronjob 问题解决 性能调优 安全代理 抓包工具 达梦 DM8 接口优化 Sealos 集群管理 零售 输入系统 solr 源代码 watchtower VM虚拟机 docker search anythingllm open-webui docker国内镜像 finalsheel MinIO 漏洞报告生成 mapreduce 定义 核心特点 优缺点 适用场景 红黑树封装map和set web环境 文件共享 LSTM Python学习 Python编程 GPUGEEK 基本指令 模板 openresty 仓库 共享 设置 软路由 Linux指令 影刀证书 分享 亲测 线程安全 CodeBuddy首席试玩官 sql注入 Ubuntu 24.04.1 轻量级服务器 GIS 遥感 WebGIS 僵尸世界大战 游戏服务器搭建 银河麒麟桌面操作系统 服务器时间 AI agent ISO镜像作为本地源 ldap 线性代数 电商平台 佛山戴尔服务器维修 佛山三水服务器维修 大大通 第三代半导体 碳化硅 triton 模型分析 sqlite swoole ai工具 Erlang OTP gen_server 热代码交换 事务语义 备选 调用 示例 xss hugo sentinel 干货分享 黑客工具 密码爆破 流量运营 分布式训练 midjourney 架构与原理 ardunio BLE IDEA hexo 存储维护 西门子PLC 通讯 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 阿里云ECS nosql mcp服务器 client close yashandb 网络原理 免费 logstash vCenter服务器 ESXi主机 监控与管理 故障排除 日志记录 lrzsz 火山引擎 矩池云 数据下载 数据传输 cocos2d 3dcoat 泛型编程 工厂方法模式 自定义登录信息展示 motd 美化登录 实时云渲染 云渲染 3D推流 openvino 环境 非root 站群 多IP 证书 签名 MCP 服务器 JADX-AI 插件 RNG 状态 可复现性 随机数生成 光电器件 LED 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 AGI 系统架构设计 软件哲学 程序员实现财富自由 gitlab服务器 客户端-服务器架构 点对点网络 服务协议 网络虚拟化 网络安全防御 零日漏洞 CVE 机架式 IDC Cache Aside Read/Write Write Behind 生成对抗网络 搜狗输入法 中文输入法 鸿蒙NEXT NVIDIA GRANT REVOKE qtcreator java毕业设计 微信小程序医院预约挂号 医院预约 医院预约挂号 小程序挂号 mujoco OS Ubuntu 24.04 搜狗输入法闪屏 Ubuntu中文输入法 能效分析 nginx默认共享目录 ubantu 青少年编程 自定义shell当中管道的实现 匿名和命名管道 latex IT 护眼模式 文件权限 重置密码 dnf 进程等待 内存泄漏 Navigation 路由跳转 鸿蒙官方推荐方式 鸿蒙原生开发 泰山派 根文件系统 代码复审 codereview code-review 文件清理 环境部署 李心怡 解决方案 CAD瓦片化 栅格瓦片 矢量瓦片 Web可视化 DWG解析 金字塔模型 知行EDI 电子数据交换 知行之桥 EDI homeassistant 智能问答 Spring AI Milvus Multi-Agent 蜂窝网络 频率复用 射频单元 无线协议接口RAN 主同步信号PSS 手机 学习路线 烟雾检测 yolo检测 消防检测 Web3 Telegram tar.gz tar.xz linux压缩 nmcli 网络配置 5分钟快速学 docker入门 dockerfile 高可用 恒玄BES nacos容器环境变量 docker启动nacos参数 nacos镜像下载 dify部署 安全性测试 写时拷贝 Linux的进程调度队列 活动队列 Linux的进程控制 带外管理 Unity插件 tidb ABAP 数字证书 签署证书 caddy authing pythonai PlaywrightMCP 网络库 aac mcp协议 go-zero Async注解 事件驱动 access blocked 破解 vmware tools 流量 排序算法 选择排序 jQuery 物理服务器 服务器租用 云服务器租用 物理机租用 网络接口 时间间隔 所有接口 多网口 事件分析 边缘服务器 利旧 AI识别 DELL R730XD维修 全国服务器故障维修 独立服务器 实时传输 linux cpu负载异常 slave 网络IO 队列 数据库占用空间 MateBook Metastore Catalog 更换镜像源 红黑树 迁移 SFTP CTE AGE gerrit 三维重建 FS bootfs rootfs linux目录 数字比特流 模拟信号 将二进制数据映射到模拟波形上 频谱资源 振幅频率相位 载波高频正弦波 容器化 Serverless BCLinux containerd 访问公司内网 MobileNetV3 Linux系统编程 深度强化学习 深度Q网络 Q_Learning 经验回收 微信自动化工具 微信消息定时发送 Jenkins流水线 声明式流水线 华为昇腾910b3 janus rtmp http状态码 请求协议 机器人仿真 模拟仿真 地平线5 asp.net 电子信息工程 EF Core 客户端与服务器评估 查询优化 数据传输对象 查询对象模式 多媒体 低成本 服务器托管 云托管 数据中心 idc机房 网络带宽 问题排查 量子计算 电子器件 二极管 三极管 raid OSB Oracle中间件 SOA RHEL eventfd 高性能 视频服务器 万物互联 工业自动化 工厂改造 debezium 数据变更 android-ndk 嵌入式实时数据库 pow 指数函数 优化 lstm LSTM-SVM 时间序列预测 AOD-PONO-Net 图像去雾技术 A2A 去中心化 AI导航站 Windows 11 重装电脑系统 相机标定 鼠标 proto actor actor model Actor 模型 系统完整性 越狱设备 Arduino下载开发板 esp32开发板 esp32-s3 Autoware 辅助驾驶 rxjava 过期连接 LangGraph 模型上下文协议 MultiServerMCPC load_mcp_tools load_mcp_prompt 若依 内存不足 outofmemory Key exchange 主包过大 开启黑屏 磁盘IO iostat Unlocker 笔记本电脑 原子操作 AXI teamspeak C++11 lambda Windows应急响应 应急响应 webshell 网络攻击防御 网络攻击 linux/cmake 回归 软件安装 权限掩码 粘滞位 信创国产化 达梦数据库 illustrator dsp开发 MinerU HBase分布式集群 HBase环境搭建 HBase安装 HBase完全分布式环境 NAT Agentic Web NLWeb 自然语言网络 微软build大会 服务发现 模块测试 bug定位 缺陷管理 Featurize Mobilenet 分割 分布式总线 记账软件 容器部署 ICMPv6 VUE Mysql Makefile nvidia驱动 Tesla显卡