21天 - 说说 TCP 的四次挥手?TCP 的粘包和拆包能说说吗?说说 TCP 拥塞控制的步骤?
-
说说 TCP 的四次挥手?
TCP 协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,它通过著名的 “三次握手” 来建立连接。相对地,TCP 协议通过四次挥手来断开连接。以下是四次挥手的详细过程:
第一次挥手(Client → Server)
- 步骤描述:客户端发送一个带有
FIN
标志位的数据包给服务器,表示客户端已经没有数据要发送了,希望关闭连接。此时,客户端进入FIN_WAIT_1
状态。 - 状态变化:客户端从
ESTABLISHED
状态变为FIN_WAIT_1
状态。 - 数据传输:客户端停止发送数据,并发送
FIN
包。
第二次挥手(Server → Client)
- 步骤描述:服务器收到客户端的
FIN
包后,发送一个带有ACK
标志位的数据包作为应答,表示已经收到了客户端的关闭请求。服务器进入CLOSE_WAIT
状态。 - 状态变化:服务器从
ESTABLISHED
状态变为CLOSE_WAIT
状态。 - 数据传输:服务器发送
ACK
包,确认序号为收到的序号加1。
第三次挥手(Server → Client)
- 步骤描述:服务器在完成自己的数据发送后,也发送一个带有
FIN
标志位的数据包给客户端,表示服务器也没有数据要发送了,希望关闭连接。服务器进入LAST_ACK
状态。 - 状态变化:服务器从
CLOSE_WAIT
状态变为LAST_ACK
状态。 - 数据传输:服务器发送
FIN
包。
第四次挥手(Client → Server)
- 步骤描述:客户端收到服务器的
FIN
包后,发送一个带有ACK
标志位的数据包作为应答,表示已经收到了服务器的关闭请求。客户端进入TIME_WAIT
状态,等待一段时间后,连接正式断开。 - 状态变化:客户端从
FIN_WAIT_1
状态变为TIME_WAIT
状态,最后变为CLOSED
状态。 - 数据传输:客户端发送
ACK
包,确认序号为收到的序号加1。
总结
- 客户端:发送
FIN
→ 收到ACK
→ 发送ACK
→ 收到ACK
→ 进入TIME_WAIT
→ 进入CLOSED
- 服务器:收到
FIN
→ 发送ACK
→ 发送FIN
→ 收到ACK
→ 进入CLOSED
通过这四次挥手,TCP 连接被优雅地断开,确保了数据传输的完整性和可靠性。
- 步骤描述:客户端发送一个带有
-
TCP 的粘包和拆包能说说吗?
在 TCP 通信中,粘包和拆包是两个常见的问题,它们是由于 TCP 协议的特性所导致的。TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议,它将数据视为一连串的字节流,而不关心数据的边界。这就可能导致了粘包和拆包的现象。
粘包(Packet Coalescing)
粘包是指当多个小的数据包连续发送时,TCP 可能会将这些小包合并成一个较大的数据包进行传输。这通常是为了提高网络传输效率,减少发送和接收的次数。然而,这对于接收端来说,可能会导致难以区分不同的数据包,因为接收端无法直接知道每个小包的边界。
拆包(Packet Fragmentation)
拆包是指一个较大的数据包在传输过程中被分割成多个较小的数据包。这通常发生在数据包的大小超过了网络中某个设备的 MTU(最大传输单元)时。拆包后的数据包在到达接收端时需要重新组装,这同样可能导致数据的边界问题。
解决方法
为了解决粘包和拆包的问题,通常需要在应用层协议中添加额外的机制来明确数据的边界。以下是一些常见的解决方法:
1. 固定长度的消息格式
- 原理:规定每条消息的长度为固定值。接收端根据这个固定长度来读取数据,从而避免粘包和拆包的问题。
- 示例:如果每条消息的长度固定为 100 字节,那么接收端每次读取 100 字节的数据,就可以正确地解析出每条消息。
2. 添加特殊分隔符
- 原理:在每条消息的末尾添加一个特殊的分隔符(如换行符
\n
、回车符\r
或其他自定义的特殊字符)。接收端在读取数据时,根据这个分隔符来判断消息的边界。 - 示例:在发送数据时,在每条消息后添加
\n
,接收端在读取数据时,每当遇到\n
就认为是一条完整的消息。
3. 长度前缀
- 原理:在每条消息的前面添加一个表示消息长度的字段(如 2 字节或 4 字节的长度信息)。接收端先读取长度字段,然后根据这个长度来读取完整的消息。
- 示例:如果每条消息的前面 2 字节表示消息的长度,接收端先读取这 2 字节,得到长度值后,再读取相应长度的数据,从而正确解析出消息。
4. 使用自定义的协议头
- 原理:设计一个自定义的协议头,包含消息的长度、类型等信息。在每条消息的前面添加这个协议头,接收端根据协议头中的信息来解析消息。
- 示例:协议头可以包含消息长度、消息类型等字段,接收端根据协议头中的消息长度来读取消息内容。
通过以上方法,可以在应用层对数据进行适当的处理,从而解决 TCP 通信中的粘包和拆包问题,确保数据的正确解析和处理。
-
说说 TCP 拥塞控制的步骤?
TCP 拥塞控制是 TCP 协议为了提高网络性能、避免网络拥塞而采用的一系列算法。以下是 TCP 拥塞控制的主要步骤和算法:
1. 慢开始(Slow Start)
- 目的:慢开始的目的是在 TCP 连接建立之初,通过逐渐增加拥塞窗口的大小来探测网络的可用带宽,避免网络出现拥塞。
- 过程:
- 初始时,拥塞窗口(cwnd)被设置为一个较小的值,通常是 1 个最大报文段(MSS)的大小。
- 每当收到一个ACK确认,拥塞窗口就会增加 1 个 MSS 的大小。这意味着每经过一个往返时间(RTT),拥塞窗口会呈指数级增长。
- 这种指数增长会一直持续,直到拥塞窗口达到一个称为慢开始阈值(ssthresh)的值。
2. 拥塞避免(Congestion Avoidance)
- 目的:当拥塞窗口增长到慢开始阈值后,进入拥塞避免阶段。此时,拥塞窗口的增长方式从指数增长变为线性增长,以更谨慎地探测网络的拥塞情况。
- 过程:
- 在拥塞避免阶段,每当收到一个 ACK 确认,拥塞窗口会增加 1/cwnd 个 MSS 的大小。这意味着每经过一个 RTT,拥塞窗口会增加 1 个 MSS 的大小。
- 这种线性增长会一直持续,直到网络出现拥塞的迹象。
3. 快速重传(Fast Retransmit)
- 目的:快速重传是一种机制,用于在检测到数据丢失时快速重新发送丢失的数据,减少因等待超时重传而导致的延迟。
- 过程:
- 当发送方收到三个重复的 ACK 确认(即同一个序列号的 ACK 被收到三次),它认为对应的报文段可能已经丢失。
- 发送方立即重传丢失的报文段,而不需要等待重传计时器超时。
- 同时,发送方将慢开始阈值设置为当前拥塞窗口的一半,并将拥塞窗口重置为 1 个 MSS,进入慢开始阶段。
4. 快速恢复(Fast Recovery)
- 目的:快速恢复是在快速重传之后进入的一个阶段,用于更有效地恢复拥塞窗口的大小,避免网络长时间处于低效利用状态。
- 过程:
- 在快速重传后,发送方进入快速恢复阶段。此时,拥塞窗口被设置为慢开始阈值的一半。
- 发送方每收到一个 ACK 确认,拥塞窗口会增加 1 个 MSS 的大小。
- 当拥塞窗口达到慢开始阈值时,发送方退出快速恢复阶段,进入拥塞避免阶段。
总结
TCP 拥塞控制通过慢开始、拥塞避免、快速重传和快速恢复这四个步骤,动态调整拥塞窗口的大小,以适应网络的拥塞情况,提高网络性能和数据传输的可靠性。这些算法共同作用,使得 TCP 能够在不同的网络条件下有效地利用带宽,减少丢包和重传,提供可靠的端到端数据传输服务。
相关文章:
21天 - 说说 TCP 的四次挥手?TCP 的粘包和拆包能说说吗?说说 TCP 拥塞控制的步骤?
说说 TCP 的四次挥手? TCP 协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,它通过著名的 “三次握手” 来建立连接。相对地,TCP 协议通过四次挥手来断开连接。以下是四次挥手的详细过程: 第一次挥手(Clien…...
LeetCode:93. 复原 IP 地址(DFS Java)
目录 93. 复原 IP 地址 题目描述: 实现代码与解析: DFS 原理思路: 93. 复原 IP 地址 题目描述: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0)…...
Flutter_学习记录_device_info_plus 插件获取设备信息
引入三方库device_info_plus导入头文件 import package:device_info_plus/device_info_plus.dart;获取设备信息的主要代码 DeviceInfoPlugin deviceInfoPlugin DeviceInfoPlugin(); BaseDeviceInfo deviceInfo await deviceInfoPlugin.deviceInfo;完整案例 import package…...
详解CISC与RISC及其区别
CISC(Complex Instruction Set Computing,复杂指令集计算机)和RISC(Reduced Instruction Set Computing,精简指令集计算机)是两种不同的计算机架构理念,主要区别在于指令集的设计和处理方式&…...
偶然发现了 setTimeout 的隐藏彩蛋
最近在看《JavaScript高级程序设计(第4版)》,运行书中的一个代码示例时,偶然发现了 setTimeout 的一些之前没注意到的特性,觉得挺有意思的,就来记录一下。 书中代码如下: for (var i 0; i &l…...
zerotier搭建免费moon服务器
🌟 前言 ZeroTier是一种基于P2P的虚拟组网工具,通过搭建Moon服务器可大幅提升跨运营商/跨国节点的连接质量。本文使用云服务演示部署流程。 📋 准备工作 注册三丰云账号 创建CentOS 8.5实例 (这里选择centos8以上&a…...
Unity Timeline 扩展
这里认为大家已经会timeline的基本使用了,只介绍怎么自定义扩展。 第一步.自定义Track 首先要自定义一条轨道。剪辑是要在轨道里跑的,系统自带的轨道我们加不了自定义剪辑,得新建自己用的。这个很简单。 [TrackClipType(typeof(TransformTw…...
HarmonyOS第21天:解锁分布式技术,开启跨设备协同新体验
一、HarmonyOS 分布式技术:开启万物互联新时代 在物联网蓬勃发展的今天,设备之间的互联互通不再是遥不可及的梦想,而是真切融入日常生活的现实。从智能家居设备的联动控制,到智能办公场景中的高效协作,再到智能出行中的…...
BUUCTF Pwn [ZJCTF 2019]EasyHeap unlink+freehook做法
checksec exeinfo : IDA64打开: delete_heap函数已经将指针清零 无UAF edit_heap允许自己输入读取字节 存在堆溢出 同时 存储的指针位于bss段 那接下来就想到unlink方法: 图示: 后续修改0x6020E0的位置为freehook 再修改一次 让其…...
【解决方案】RAGFlow部分问题清单及解决方案备忘1
一、长时间显示:Task is queued 多半是因为模型确实在队列中排队的原因,要么是内存一直在被占用中,要么是CPU或GPU一直在被占用中,可以首先检查硬件利用率: 如果是内存导致的队列缓慢,可以将.env文件中的M…...
Linux笔记---文件系统硬件部分
1. 文件系统 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。 1.1 基本组成 索引节点(inode)ÿ…...
低成本抗衡DeepSeek-R1!QwQ-32B本地部署教程:消费级硬件可部署
QwQ-32B是阿里通义千问团队在3月6日发布的开源大模型,这款仅有320亿参数的模型,在数学、代码、通用能力等核心场景里,几乎跟满血版DeepSeek-R1(6710亿参数)不相上下。可以说实现了开源领域的降维打击。 参数规模与性能…...
二叉树中堆的实现
1 堆的声明和定义 typedef int HPDateType; typedef struct Heap {HPDateType* arr;int size;int capcity; }HP; 与顺序表相似,我们需要一个数组,有效空间大小,有效元素个数 2 堆的初始化 void HPInit(HP*php) {assert(php);php->arr …...
概率论的基本知识
逆概率还不懂,改天再想想。 联合概率 联合概率(Joint Probability) 是概率论中的一个重要概念,用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。...
LVDS(Low Voltage Differential Signaling)电平详解
一、LVDS的定义与核心特性 LVDS(低压差分信号)是一种 低功耗、高速、抗干扰 的差分信号传输技术,通过一对互补的电压信号(正负端差值)传递数据。其核心特性包括: 电气特性 电压摆幅:差分电压约…...
2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈
蓝桥杯原题: 题目描述: “在五子棋的对弈中,友谊的小船说翻就翻? ” 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着 “ 友谊第一,比赛第二…...
OpenRewrite配方之import语句的顺序——org.openrewrite.java.OrderImports
org.openrewrite.java.OrderImports 是 OpenRewrite 工具库中的一个重要规则(Recipe),专为 Java 项目设计,用于自动化调整 import 语句的顺序,使其符合预定义的代码规范。从而提高代码的一致性和可读性。 核心功能 排序规则: 静态导入优先:默认将静态导入(import stati…...
数字电子技术基础(二十八)——TTL门电路的静态功耗和动态功耗
1 静态功耗 门电路的工作需要直流电压源的支持,无论在模拟电路还是在数字电路中,只有在外加直流电源的作用下,半导体二极管具有单向导电性,晶体管的放大能力以及开关特性才能体现出来芯片的电源端正负级。芯片的电源端正负极如果…...
RISC-V汇编学习(四)—— RISCV QEMU平台搭建(基于芯来平台)
RISCV汇编学习系列: RISC-V汇编学习(一)—— 基础认识 RISC-V汇编学习(二)—— 汇编语法 RISC-V汇编学习(三)—— RV指令集 RISC-V汇编学习(四)—— RISCV QEMU平台搭建…...
链表的定义、节点结构、基本操作(C++)
1. 链表的基本概念 链表是一种动态数据结构,它的元素(节点)在内存中不一定是连续存储的。每个节点通过指针连接到下一个节点,形成一个链式结构。链表分为单向链表、双向链表和循环链表等,这里主要介绍单向链表。 2. …...
deepseek使用记录21——脑图记录
我们有比前人更先进的工具,为何不利用起来呢? 工作的时候,问问自己,这个问题是理论问题?还是实践问题?如何在系统中劈开一条可实践路径?系统中的缝,系统中的力量(人先进…...
[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现
标题:[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点:二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…...
【时时三省】(C语言基础)输入输出的概念
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 有关数据输入输出的概念 从前面的程序中可以看到:几乎每一个C程序都包含输入输出。因为要进行运算,就必须给出数据,而运算的结果当然需要输出,…...
基于ragflow中deepdoc对pdf文档的rag系统
基于ragflow中deepdoc对pdf文档的rag系统 一、安装 conda环境安装到指定的路径 conda create 包名/环境的名字 rag就是包的名字,ragflow就是环境名; 怎样激活环境?–我是在百度飞桨上面跑的 conda activate /home/aistudio/rag/ragflow …...
基于WebRTC技术的EasyRTC嵌入式音视频SDK:多平台兼容与性能优化
在当今数字化、智能化的时代背景下,实时音视频通信技术已成为众多领域不可或缺的关键技术。基于WebRTC技术的EasyRTC嵌入式音视频SDK,凭借其在ARM、Linux、Windows、安卓、iOS等多平台上的兼容性,为开发者提供了强大的工具,推动了…...
Linux驱动开发实战(四):设备树点RGB灯
Linux驱动开发实战(四):设备树点RGB灯 文章目录 Linux驱动开发实战(四):设备树点RGB灯前言一、驱动实现1.1 驱动设计思路1.2 关键数据结构1.3 字符设备操作函数1.4 平台驱动探测函数1.5 匹配表和平台驱动结…...
大模型架构记录5-向量数据库
一 倒排索引、KNN、PQ 1.1 基础版本 query -> requery 对问题做处理,处理上下文 对query 做 refined query 1.2 向量数据库 二 搜索逻辑 2.1 knn 2.2 近似KNN 先和N个空间的均值比较再和空间内部的所有点比较,计算最近值。 优化一: …...
【 Fail2ban 使用教程】
Fail2ban 使用教程 1. 安装 Fail2ban2. 配置 Fail2ban2.1 创建 jail.local 文件2.2 基本配置参数说明2.3 配置具体服务的监控规则2.3.1 SSH 服务2.3.2 Apache 服务 3. 启动和管理 Fail2ban3.1 启动 Fail2ban 服务3.2 设置 Fail2ban 开机自启3.3 检查 Fail2ban 服务状态3.4 重新…...
Django系列教程(8)——函数视图及通用类视图
目录 什么是视图(View)及其工作原理 接近现实的函数视图 更复杂的案例: 视图处理用户提交的数据 基于函数的视图和基于类的视图 Django通用类视图 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小结 Django的视图(view)是处理…...
【C#学习笔记04】C语言格式化输出
引言 printf()函数不仅可以将数据输出到控制台,还可以通过格式化字符串灵活地控制输出的格式。printf()函数的使用规则,包括标志说明、字段宽度、转换精度、长度修饰、转换说明、转义字符。 1. printf()函数概述 printf…...
九点标定和十二点标定的区别
九点标定和十二点标定是机器视觉中常用的两种手眼标定方法,用于建立图像坐标系与机械坐标系之间的映射关系。它们的核心区别在于标定点的数量、变换模型和适用场景。以下是详细对比: 1. 九点标定 特点 标定点数量:9 个点,通常排…...
qt+opengl 播放yuv视频
一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…...
【揭秘测绘艺术】从基础到法律,绘制地球的智慧蓝图
在人类探索与塑造世界的征途中,有一门古老而又现代的科学默默发挥着基石作用——测绘。它不仅仅是地图的绘制,更是对地球空间信息的精准捕捉与智慧应用。今天,让我们一起走进测绘的世界,解码“测绘”与“基础测绘”的内涵…...
基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战
一、引言 当前,工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网,当大模型开始设计蛋白质结构,这个驱动大国重器研发的核心领域,却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…...
NetAssist 5.0.14网络助手基础使用及自动应答使用方案
以下是NetAssist v5.0.14自动应答功能的详细使用步骤: 一、基础准备: 工具下载网址页面:https://www.cmsoft.cn/resource/102.html 下载安装好后,根据需要可以创建多个server,双击程序图标运行即可,下面…...
MySQL中有哪几种锁?
大家好,我是锋哥。今天分享关于【MySQL中有哪几种锁?】面试题。希望对大家有帮助; MySQL中有哪几种锁? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中,锁是用来控制并发访问的机制,确…...
vue2的webpack(vue.config.js) 怎么使用请求转发 devServer.proxy
首先用 express 搭建后端服务器,注意使用中间件解析json格式的请求体,才会获取到 post 参数 app.use(express.json()); app.js const express require(express) const app express() app.use(express.json()); const port 3000app.post(/api/vue2, …...
【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search
大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…...
CSS中固定定位
1.如何设置为固定定位? 给元素设置position: fixed 即可实现固定定位. 可以使用left, right, top ,bottom 四个属性调整位置 2.固定定位的参考点在哪里? 参考他的视口 视口-->对于PC浏览器来说,视口就是我们看网页的那扇"窗户". 3.固定定位元素的特点 1.脱离文档…...
Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南
高效实现:强调代码的性能优化。Android ViewPager2:明确技术栈。顶部导航:核心功能点。动态配置与性能优化指南:突出动态配置的灵活性和性能优化的重点。 在 Android 开发中,使用 ViewPager2 实现高效的顶部导航&…...
MFCday01、模式对话框
对话框类和应用程序类。 MFC中 Combo Box List Box List Control三种列表控件,日期控件Date Time Picker...
C++ 布尔类型(bool)深度解析
引言 在 C 编程里,布尔类型(bool)是一种基础且极为关键的数据类型。它专门用于表达逻辑值,在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来,我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...
新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架
图片来自于官方README.md 一、什么是OpenAI Agents SDK? OpenAI Agents SDK是一个轻量级但功能强大的框架,专为构建多智能体工作流而设计。作为OpenAI之前实验项目Swarm的生产级升级版本,该SDK提供了极少但高效的抽象概念,使开发…...
单例模式的五种实现方式
1、饿汉式 ①实现:在类加载的时候就初始化实例 ②优点:线程安全 ③缺点:实例在类加载的时候创建,可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...
行为模式---状态模式
概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…...
统一 Elastic 向量数据库与 LLM 功能,实现智能查询
作者:来自 Elastic Sunile Manjee 利用 LLM 功能进行查询解析,并使用 Elasticsearch 搜索模板,将复杂的用户请求转换为结构化的、基于模式的搜索,从而实现高精度查询结果。 想象一下,你在搜索“距离 Belongil Beach 25…...
(Lauterbach调试器学习笔记)一、首次连接TriCore开发板调试
Lauterbach调试器学习笔记 文章目录 Lauterbach调试器学习笔记前言一、Lauterbach调试器介绍二、调试步骤三、常用代码四、不常用代码,但是很有意思总结 前言 第一篇简单记录一下Lauterbach调试器的使用过程,主要是想写第二篇python api。 一、Lauterba…...
HTML星球大冒险之路线图
第一章:欢迎来到 HTML 星球! 1.1 宇宙的基石:HTML 是什么? 🌍 比喻:HTML 是网页世界的「乐高积木」,用标签搭建一切可见内容🎯 目标:理解 HTML 的作用,掌握…...
网络安全与七层架构
网络安全与七层架构 随着互联网技术的迅猛发展,网络安全问题日益凸显。网络安全不仅影响到个人用户的信息安全,更是企业及国家安全的重要组成部分。而七层架构(OSI模型)为网络通信提供了理论支撑,能够有效地帮助我们理…...
2025-03-13 学习记录--C/C++-PTA 练习2-17 生成3的乘方表
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习2-17 生成3的乘方表 输入一个非负整数n,生成一张3的乘方表,输出3^0~$$3^n$$的值…...