- 博客(79)
- 收藏
- 关注

原创 数据结构(汇总)
一、线性表的定义(逻辑结构)1.线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时,线性表是一个空表。若用L命名线性表,一般表示为: L=(a1,a2,,,,ai,ai+1,,,,,an)(1)ai是线性表中的“第i个”元素线性表中的位序。(2)a1是表头元素;an是表尾元素。(3)除第一个元素外,每个元素有且仅有一个直接前驱;除去最后一个元素外,每个元素有且仅有一个直接后继。二、线性表的基本操作。
2024-11-26 11:06:06
2748
3
原创 数据结构--红黑树
红黑树在插入删除时,不会破坏红黑树的特效,无需频繁调整树的形态,即便需要调整,一般可在常数级时间完成。红黑树查找操作时间复杂度=0(log2^n)-------------查找效率与AVL树同等数量级。红黑树是二叉排序树-------左子树结点值<=根结点值<=右子树结点值。⑤对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同。与二叉排序树相同,从根节点查找,小于根节点向左,大于根节点向右。③叶结点(外部结点、NULL结点、失败结点)均是黑色的。要求:(左根右,根叶黑,不红红,黑路同)
2025-03-25 00:08:04
655
原创 数据结构--二叉排序树
否则,若关键字k小于根节点,则插入到左子树,若关键字k大于根节点的值,则插入的右子树。3.若结点z有左右子树,则令z的直接后继(或者直接前驱)代替z,然后从二叉排序树中删除这个直接后继(或直接前驱),这样就变成了前两种情况。利用二叉排序树的性质,如果树空,或者等于根节点的值,则结束循环,小于则在左子树上查找,大于,在右子树上查找。查找长度--在查找运算种,需要对比关键字的次数成为查找长度,反映了查找操作时间的复杂度。2.若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,代替z的位置。
2025-03-24 11:30:27
358
原创 数据结构--分块查找
对于块内无序,块间有序的顺序表,我们可以构建一个索引表,将顺序表分成几个顺序的大小区间,利用这个索引表来对查找元素大小进行快速对比,若查找元素处于这个范围区间,则到顺序表中该块范围内再依次查找,如果超出分块范围,则查找失败。我们在索引表中使用折半查找的方式来进行查找, 若索引表中不包含关键字,则折半查找索引表最终会停在low>high,要在low所指分块中查找。再在顺序表中顺序查找。拓展思考: 如果需要插入新元素,我们要在块间插入新元素,就会要移动所有顺序表中的元素。(特点:块内无序、块间有序)
2025-03-24 11:06:25
512
原创 数据结构--折半查找
再用mid指针指向(low+high)/2的位置,然后对比该元素和查找元素的大小,如果查找元素大于mid元素,则可以将low指针指向mid+1的位置(如果小于则将high指针指向mid-1的位置)。再次将(low+high)/2的位置与查找元素做对比,重复以上步骤,当low指向位置与high指向位置相同时,则查找成功,当low指针跑到high指针右边时,或high指针跑到low指针左边时,则查找失败。折半查找的判定树一定是平衡二叉树,元素个数为n的树高H=[log2^(n+1)]。二、算法实现(升序)
2025-03-24 10:47:08
546
原创 数据结构--顺序查找
这时候数组长度和数组下标对应,再利用循环从最后一个数组元素进行查找对比,与第一个元素相同则查找成功。1.当查找表中元素有序排放时(递增/递减),查找时只需要多查找一次就可以判断出该元素存不存在。通过for循环,从数组开头依次向后查找,同时要注意循环不能越界,查找成功,返回下标元素。查找效率分析: ASL成功 = (n+1)/2 ASL失败 = n+1。优点:在循环中只需要判断一次被查找元素是否相同,无需判断越界,效率更高。2.当每个元素被查找的概率不相等时,可以将被查找概率大的放在靠前的位置。
2025-03-22 15:35:40
309
原创 数据结构--Dijkstra算法
第一轮:循环遍历结点数组信息,找到没有确定最短路径(fina为false,且dist值最小),从4号开始,将fina设置为true。(0-4的路径长度为5).再检查所有与4相连的顶点,若相连的顶点final值为false,则更新dist与path。初始化3个数组,fina记录各个顶点是否已找到最短路径,dist记录最短路径长度,path记录路径前驱。将起点fina设置为0,起点到其他能到达的顶点在路径长度填入dist中,并使用path记录前驱。(BFS算法的局限性:各个边有自己的权值,则不再适用)
2025-03-22 12:22:33
432
原创 数据结构——最短路径BFS算法
从2号顶点开始,将第一个数组(d)值全部设置为无穷,第二个数组(path)全部设置为-1,再将二号结点的d的值设置为0(起始顶点),再将visited数组中2号的值改为true。执行while循环,如果队列非空则弹出队列(2号),再从2号开始,找到与它相邻的所有顶点,如果其中有没有访问过的顶点,也就是visited值为false,则更改d++,再修改path,将2号结点填入,修改visited为true。设置两个数组,一个记录各个顶点到原始顶点的最短值,另一个记录每一个顶点在这各最短路径上的直接前驱。
2025-03-22 12:06:01
412
原创 数据结构---最小生成树
对于一个带权连通无向图G=(,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若7为R中边的权值之和最小的生成树,则T称为G的最小生成树(Minimum-Spanning-Tiee,MST)(生成树:连通图的生成树是包含图中全部顶点的一个极小连通子图,若图中顶点数为n,则它的生成树含有n-1条边。每次选择一条权值最小的边,使这条边的两头连通,(原本已经连通的就不选),直到所有结点都连通。第一轮处理:循环遍历哥哥节点,找到代价最低的还没有加入树的顶点。
2025-03-22 11:41:06
359
原创 每日一题--C与C++的差别
类型检查较宽松,允许隐式类型转换(可能导致未定义行为)。代码通过函数和顺序步骤组织,适合底层系统开发。(需注意语法差异,如强制类型转换)。需要构建大型应用或利用高级抽象?手动管理内存,无构造/析构函数。需要直接操作硬件或极致性能?(C 不支持类、模板等特性)。适合构建复杂的大型应用。,支持构造函数和析构函数。关键字、类型转换运算符(,强调函数和结构化编程。类型检查更严格,支持。函数式编程(部分支持)
2025-03-21 23:47:07
627
原创 数据结构---图的深度优先遍历(DFS)
重新读取数组,查看是否还有false的顶点,有,则进行访问,没有则结束。先设置一个数组,初始值全部设置为false,先访问一个结点,在用一个循环,依次检查和这个结点相邻的其他结点,在进行更深一层的访问。同一个图邻接表方式不唯一,深度优先遍历序列不唯一,深度优先生成树也不唯一。同一个图的邻接矩阵表示方式唯一,深度优先遍历唯一,深度优先生成树也唯一。对于无向图:进行BFS/DFS遍历调用BFS/DFS函数的次数=连通分量数。和广度优先遍历相同, 同一个图的邻接矩阵表示方式唯一,深度优先遍历唯一。
2025-03-21 23:42:28
470
原创 每日一题--内存池
减少频繁申请/释放内存的系统开销,提升程序性能。高并发处理请求时,用内存池管理连接缓冲区(如每个 TCP 连接的接收/发送缓冲区)。将大块内存划分为不同规格的块(如 8B、16B、32B...),按需分配最接近的块。高频创建/销毁游戏对象(如子弹、粒子特效),使用内存池可将性能提升 10 倍以上。将大块内存划分为多个固定或可变大小的内存单元,由程序自行分配和回收。| | 块1 | 块2 | 块3 | ... |
2025-03-19 23:50:48
1322
原创 数据结构-图的广度优先遍历
再用二层循环,遍历找到与二号结点相邻的所有节点,再判断其数组值是否为false,为false,则未访问,接下来访问这个顶点,再对数组进行访问标记为true,再将其入队(队尾)。增加一个函数(图中上面的),将数组全部设置为false,再进行初始化一个辅助队列,接下来利用循环扫描数组,找到数组当中第一个值为false的顶点,从这个顶点出发,再利用上面的方法进行依次访问顶点。从某个顶点开始,会有一个访问顶点的顺序,把第一次访问新结点的路径留下来,删除多余的路径,这个图就变成了树。邻接矩阵从左至右,顺序为递增。
2025-03-19 23:49:58
842
原创 每日一题--计算机网络
(建立 TCP 连接):客户端发送 SYN(同步请求)。服务端返回 SYN-ACK(确认 + 同步)。客户端发送 ACK(最终确认)。
2025-03-18 20:41:09
1265
原创 MySQL--DDL
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];差异: char----性能高 varchar-----性能较差 因为它会计算实际空间。字段1 字段1类型[COMMENT 字段1注释],字段1 字段1类型[COMMENT 字段1注释],字段1 字段1类型[COMMENT 字段1注释],
2025-03-18 20:23:50
475
原创 每日一题--进程与协程的区别
选择进程:需要强隔离性、多核 CPU 并行计算时。选择协程:追求高并发、低延迟、资源高效利用时(尤其是 I/O 密集型任务)。
2025-03-17 22:00:25
402
原创 每日一题---
浅拷贝是指只复制对象本身和其内部的值类型字段,但不会复制对象内部的引用类型字段。换句话说,浅拷贝只是创建一个新的对象,然后将原对象的字段值复制到新对象中,但如果原对象内部有引用类型的字段,只是将引用复制到新对象中,两个对象指向的是同一个引用对象。深拷贝是指在复制对象的同时,将对象内部的所有引用类型字段的内容也复制一份,而不是共享引用。换句话说,深拷贝会递归复制对象内部所有引用类型的字段,生成一个全新的对象以及其内部的所有对象。
2025-03-15 20:53:41
238
原创 数据结构--线性表,栈,串,树
一、线性表的定义(逻辑结构)1.线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时,线性表是一个空表。若用L命名线性表,一般表示为: L=(a1,a2,,,,ai,ai+1,,,,,an)(1)ai是线性表中的“第i个”元素线性表中的位序。(2)a1是表头元素;an是表尾元素。(3)除第一个元素外,每个元素有且仅有一个直接前驱;除去最后一个元素外,每个元素有且仅有一个直接后继。二、线性表的基本操作。
2025-03-14 23:27:18
1710
原创 每日一题--面试
关键字来实现继承,子类可以直接使用父类中已定义好的属性和方法,还可以添加自己特有的属性和方法,实现功能的扩展。继续也具备传递性,如果类 C 继承自类 B,类 B 继承自类 A,那么类 C 不仅继承了类 B 的属性和方法,也间接继承了类 A 的属性和方法。例如,同样是 “发声” 这个操作,“狗” 类的对象调用会发出 “汪汪” 声,“猫” 类的对象调用会发出 “喵喵” 声。:方法重载(Overload),同一类中有同名不同参数的方法,例如,一个。重写这个方法后实现自己特有的 “汪汪” 叫的声音。
2025-03-14 23:24:12
344
原创 数据结构--图的基本操作
7.NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。时间复杂度为O(v).有向图:邻接矩阵时间复杂度 O(v) 邻接表时间复杂度出边: O(1)~~ O(v) 入边:O(E)与判断图G是否存在边类似,邻接矩阵时间复杂度 O(1) 邻接表时间复杂度 O(1)~~O(v)对于邻接表,出边为O(1), 入边时间复杂度为O(1)~~O(E)时间复杂度为O(1)~~O(V)
2025-03-14 23:19:52
542
原创 图的存储--十字链表与邻接多重表
1.十字链表中对于弧节点总共有4个节点 A、B、C、D、分别指向弧尾顶点的编号、弧头顶点的编号、弧头相同的下一条弧、弧尾相同的下一条弧。如图:顺着橙色的一直找,可以找到从该顶点出发可以到达的其他顶点的所有的边,因为他是无向图,所以绿色也一样。对于顶点结点,则是数据域(编号)、该顶点作为弧头的第一条弧、该顶点作为弧尾的第一条弧。边结点: 两个顶点编号 i j 依附于顶点i的下一条边、依附于顶点j的下一条边。如图:顺着结点的绿色指针一直走,能找到从当前结点出发,所能发射出的所有的弧。
2025-03-13 23:49:08
314
原创 每日一题--数据库
每一层父节点的索引值都会出现在下层子节点的索引值中,因此在叶子节点中,包括了所有的索引值信息,并且每一个叶子节点都有两个指针,分别指向下一个叶子节点和上一个叶子节点,形成一个双向链表。将 5 与根节点的索引数据 (1,10,20) 比较,5 在 1 和 10 之间,所以根据 B+Tree的搜索逻辑,找到第二层的索引数据 (1,4,7);在第二层的索引数据 (1,4,7)中进行查找,因为 5 在 4 和 7 之间,所以找到第三层的索引数据(4,5,6);这条语句使用了主键索引查询 id 号为 5 的商品。
2025-03-13 21:31:11
467
原创 数据结构--邻接表
无向图: 用一维数组存储顶点信息,使用指针存储顶点的第一条边/弧。回顾上节: 邻接矩阵--数组实现的顺序存储,空间复杂度高,不合适存储稀疏图。无向图: 边界点的数量是2|E|,整体空间复杂度为 O(|V|)+ 2|E|有向图:边结点的数量是|E|,整体空间复杂度为 O(|V|)+|E|入度:只能遍历所有结点的边链表。有向图: 出度:遍历这个顶点相关的边链表。无向图的度:遍历这个顶点相关的边链表。思考:如何求顶点的度、出度、入度。注意: 图的邻接表表示方式不唯一。一、邻接表法(顺序+链式存储)
2025-03-13 21:21:40
379
原创 数据结构--图的存储
总度数==第i行、第i列的非零元素个数之和。对于有向图:入度==行的非零元素个数 出度==列的非零元素个数。时间复杂度为O(N)^2 只和顶点数相关,和实际的边数无关。对于无向图: 第i个结点的度==第i行(列)的非零元素个数。也就是说 如果元素为1,所对应的边或者弧是存在的,0反之。邻接矩阵法求顶点的度/出度/入度的时间复杂度为O(|V|)计算从一个顶点到另一个顶点长度为n的路径的数目。和线性代数的矩阵差不多,一看就懂,就不解释了。思考 :如何求顶点的度、入度、出度?
2025-03-13 20:02:15
472
原创 每日一题------面试
如果数据在内存中 + 高频增删 ,选择红黑树更合适,如果数据在磁盘 + 随机/范围查询均需 ,选择B+树更合适。:树高更低(相同数据量下树高度可能仅为红黑树的1/3),显著减少磁盘I/O次数。:通过批量调整(分裂/合并节点)减少频繁操作,更适合海量数据。的叶子节点通过指针形成链表,范围遍历效率极高(如查询。:范围查询需回溯父节点或频繁调整指针,效率较低。,但树深度较高(如1亿数据需约30次查找)。需频繁旋转和变色,维护规则复杂。非叶节点存多个键,仅叶节点存值。多分叉,叶节点额外链表连接。
2025-03-12 23:51:32
255
原创 每日一题————面试
接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,就会导致接收端的缓冲区溢出,进而导致丢包。为了避免上述情况的发生,TCP支持根据接收端的处理能力,来决定发送端的发送速度。可以得出,发送端的发送速度,受限于滑动窗口和拥塞窗口中的最小值。:超时重传主要有两种场景:数据包丢失:在指定时间后,若发送端仍未收到确认应答,就会启动超时重传,向接收端重新发送数据包。:接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况。:即三次握手和四次挥手。
2025-03-11 22:08:58
178
原创 每日一题-----面试
非法请求的限制:当有大量恶意请求访问不存在的数据的时候,也会发生缓存穿透,因此在 API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是。(从数据库读取数据,再将数据更新到 Redis 里),当缓存构建完成后,再释放锁。
2025-03-10 21:09:59
286
原创 2025-3-10图的基本概念
vn),则用|V表示图G中顶点的个数,也称图G的阶,E={(u,v)|u V,v V},用|E|表示图G中边的条数。点到点的距离--从顶点u出发到顶点v的最短路径若存在,则此路径的长度称为从u到v的距离若从u到v根本不存在路径,则记该距离为无穷(∞)。设两个图G=(V,E)和G1=(V1,G1),V1是V的子集,且E1是E的子集,则G1是G的子图。有向图中,若从顶点v到顶点w和从顶点w到顶点v之间都有路径,则称这两个顶点是强连通的。对于有向图的入度:入度是以顶点v为终点的有向边的数目,记为ID(v)
2025-03-10 21:08:17
1322
原创 2025-3-9哈弗曼树
由哈夫曼树得到哈夫曼编码--字符集中的每个字符作为一个叶子结点,各个字符出现的频度作为结点的权值,根据之前介绍的办法构造哈夫曼树。2.构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左、右子树上根结点的权值之和。2.结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。1.每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大。3. 树的带权路径长度:树中所有叶结点的带权路径长度之和。2.哈夫曼树的结点总数为2n-1。
2025-03-09 21:22:11
228
原创 2025-3-9 树和森林的遍历
先访问根节点,再依次对每棵子树进行先根遍历。-----等同于对各个树进行后根遍历。-----效果等同于依次对各个树进行先根遍历。-----树的后根遍历序列与这棵树相应的二叉树的中序序列相同。-----树的先根遍历序列与这颗树相对应的先序序列相同。若树非空,先依次对每棵子树进行后根遍历,再访问根节点。中序遍历除去第一棵树之后剩余的树构成的森林。先序遍历除去第一棵树之后剩余的树构成的森林。中序遍历森林中第一棵树的根结点的子树森林。若森林非空,访问森林中第一棵树的根结点。2.后根遍历--深度优先遍历。
2025-03-09 20:57:29
387
原创 每日一题-----面试
2.僵尸进程是指一个进程已经执行完了它的主要任务,进入了终止状态,但由于某些原因,它的父进程没有调用相应的系统函数(如 wait () 或 waitpid ())来收集它的退出状态信息,导致该进程虽然已经停止运行,但在系统进程表中仍然保留着一个记录,占据着一定的系统资源。此时,这些子进程会被系统的 init 进程(在 Linux 系统中,进程 ID 为 1)所收养,init 进程会负责回收它们的资源等工作。一、什么是孤儿进程?
2025-03-09 20:33:41
323
原创 20250-3-8 树的存储结构
1.因此:我们可以用链式存储的方法,给每一个存储数据设置一个指针,指向它的父节点(每个结点都只有一个父结点----非根结点的双亲指针==父节点在数组中的下标),其中根节点的双亲指针设置为-1。每个结点用stract结构体保存,除了包含结点的数据,还有两个指针,一个指向当前节点第一个孩子,另一个指针指向右兄弟。也就是对每个结点设置一个链表的头指针,如果这个结点有孩子,用链表保存每个孩子结点的编号,这样就可以根据链表来查找其孩子节点。因此也可以对森林进行存储,只需要将每棵树的根节点双亲指向-1即可。
2025-03-08 19:46:07
295
原创 每日一题———面试
1.HTTP是超文本传输协议,信息是文明传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入SSL/TLS安全协议,使得报文能够加密传输。2.HTTP连接建立相对简单,TCP三次握手之后便可进行HTTP的报文传输。而HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才可进入加密报文传输。3.两者的默认端口不一样,HTTP默认端口号是 80,HTTPS默认端口号是 443。一、http和https的区别是什么?
2025-03-08 16:51:05
290
原创 2025-3-7二叉树的线索化
总结:其核心其实还是遍历算法的改造。并且注意处理最后一个被访问的节点。代码其实就是和中序遍历相似,增加了两个标志位 ltag rtag。
2025-03-07 20:23:02
168
原创 面试-----每日一题
匿名管道是半双工通信方式,数据单向流动,通常用于有亲缘关系的进程,如父子进程间的临时通信,如果要双向通信,一般需两个管道。4.信号量:是一个计数器,用于控制多个进程对共享资源的访问,常作为锁机制,防止进程同时访问共享资源,主要用于进程间及同一进程内不同线程间的同步。5.共享内存:允许多个进程访问同一块内存区域,进程直接读写该区域进行通信,是最快的进程间通信方式,但需配合信号量等同步机制避免数据竞争和一致性问题,可分为匿名共享内存和基于文件的共享内存。6.套接字:可用于本地进程间通信和不同机器间的进程通信。
2025-03-07 20:10:59
277
原创 2025-3-6线索二叉树的概念
因此有人提出了线索二叉树: n个结点的二叉树,有n+1个空链域;将没有子树的结点的左指针指向前驱,右指针指向后继。综上所述: 思路----从根节点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针pre记录上一个被访问的结点。答:不能,它只有指向孩子的指针,没有指向父母的。线索二叉树对比二叉树还需要设置两个线索标志,用来区分其指针指向的是孩子还是“线索”也就是前驱后继结点。答:不能,没一个结点只有向下的指针,没有向上的指针。三种线索二叉树的对比: 中序前驱是 中序遍历下某个结点的前驱。
2025-03-06 21:51:54
565
原创 2025-3-6由遍历序列构造二叉树
接下来,根据前序遍历序列可知 D为左子树的根节点。结论:若只给出一颗二叉树的 前、中、后、层序遍历序列中的一种,不能唯一确定一棵二叉树。此外:前序、后序、层序序列的两两组合时无法唯一确定一棵二叉树的。给出前序遍历序列: ADBCE 中序遍历序列: BDCAE。如果给一个二叉树,这个二叉树的中序遍历序列唯一的。但 给出中序遍历+其他任意一种,就可推导出一个二叉树。但给一个中序遍历序列,就会有多种形态的二叉树。同样的前序遍历,后序遍历,层序遍历也是相同的。一、不同二叉树的中序遍历序列。
2025-03-06 21:15:32
168
原创 面试-----每日一题
HashMap 哈希冲突是通过拉链法来解决的,当有新的键值对要插入到HashMap中时,就会先计算键的哈希值,然后根据哈希值确定在数组中的位置。如果该位置已经有元素了,就会将新的元素插入到该位置的链表尾部(在Java 8及之后的版本中,当链表长度到达一定阈值时就会转换为红黑树)。当链表的长度大于等于8时,并且HashMap的容量大于等于64,会将链表转化为红黑树。1.当哈希冲突较少,链表长度较短时,链表的插入、删除和查找操作相对简单,空间开销也较小,性能表现好。二、追问 链表和红黑树在其中的性能表现如何?
2025-03-06 17:10:59
341
原创 2025-3-5二叉树的层序遍历
首先初始化一个辅助队列,使用链队列,因为不知道访问的树有多少个结点。并且,在入队过程中,并不需要保存结点的真实数据,只需保存结点指针就可以了。这样可以节省大量空间。使用while循环,当队列不为空时,进行循环,让队头元素出队,访问出队结点,有左右孩子的话让其入队,依次循环。3.若队列非空,则对头结点出队,访问该结点,并将其左、右孩子插入队尾(有的话)层序遍历:从第一层开始,一层一层的遍历整个二叉树。一、二叉树的层序遍历(一层一层的遍历二叉树)1.初始化一个辅助队列。4.不断重复3操作。
2025-03-06 00:18:36
212
原创 面试-----每日一题
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文TCP首部ACK标志位置为1,其次【确认应答号】字段填入sever-sin+1,最后把报文发送给服务端,这次报文可携带客户到服务端的数据,之后客户端处于ESTABLISHED状态。从上面的过程可知,是否要发送第三次挥手的控制权不在内核,二十在被动关闭方的应用程序,因为应用程序可能还有数据要发送,由应用程序决定什么时候调用关闭连接的函数,当调用了关闭连接的函数,内核就会发生FIN报文了,所以服务端的ACK和FIN一般都会分开发送。
2025-03-05 14:05:01
1152
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人