计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)

运输层协议概述

进程之间的通信 

        运输层向它上面的应用层提供通信服务。 

        当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时,都要使用协议栈中的运输层;而网络核心部分中的路由器在转发分组时只用到下三层的功能。

Q1:我们知道,IP 协议能够把源主机A发送出的分组,按照首部中的目的地址,送交到目的主机B,那么,为什么还需要运输层呢?


A1:真正进行通信的实体是在主机中的哪个构件是主机中的应用进程,是一台主机中的应用进程和另一台主机中的应用进程在交换数据(即通信)。

        因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。 

        在计算机网络中实际进行通信的真正实体,是位于通信两端主机中的进程;也就是说,端到端的通信是应用进程之间的通信
 

进程之间的通信图例说明 

        主机A的应用进程 AP1和主机B的应用进程AP2通信,而与此同时,应用进程AP3也和对方的应用进程AP4通信。这表明运输层有一个很重要的功能——复用(multiplexing)和分用(demultiplexing)。

  • 复用:发送方不同应用进程都可以使用同一个运输层协议传输数据
  • 分用:接收方运输层在去掉报文首部可以将数据正确交付目的的应用进程

         运输层向应用层实体屏蔽了下面网络核心的细节(例如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。

网络层与运输层的通信区别 

         网络层为主机之间的通信提供服务;而运输层则在网络层的基础上,为应用进程之间的通信提供服务。

        运输层还要对收到的报文进行差错检测。——在网络层,IP 数据报首部中的检验和字段,只检验首部是否出现差错而不检查数据部分。
 

运输层的两个协议 

  • 用户数据报协议UDP (User Datagram Protocol)
  • 传输控制协议 TCP (Transmission Control Protocol) 

        按照 OSI 的术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDU (Transport Protocol Data Unit)。但在TCP/IP体系中,则根据所使用的协议是TCP或UDP,分别称之为TCP报文段或UDP用户数据报

        传输控制协议TCP:为其上层提供的是面向连接的可靠的数据传输服务。

        使用TCP通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接。
        TCP为了实现可靠传输,就必须使用很多措施,例如TCP连接管理、确认机制、超时重传、流量控制以及拥塞控制等。
        TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多。


        用户数据报协议UDP:为其上层提供的是无连接的不可靠的数据传输服务。
        使用UDP通信的双方,在传送数据之前不需要建立连接
        UDP不需要实现可靠传输,因此不需要使用实现可靠传输的各种机制
        UDP的实现简单,UDP用户数据报的首部比较小。

运输层的端口 

         我们知道,运输层有分用和复用的功能,为了正确交付应用层所指明的应用进程,应当给每个应用进程赋予一个明确的标志。

运行在计算机上的进程是使用进程标识符(Process ldentification,PIlD)来标识的
        然而,因特网上的计算机并不是使用统一的操作系统,而不同操作系统(Windows、Linux、MacOS)又使用不同格式的进程标识符
        为了使运行不同操作系统的计算机的应用进程之间能够基于网络进行通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。

        应用进程的交互需要经过应用层和运输层的界面上一些“门”,而“门”设为通信的抽象终点。

        这些抽象终点的正式名称就是协议端口(protocol port),一般就简称为端口(port)。每一个端口用一个称为端口号(portnumber)的正整数来标志。主机的操作系统提供了接口机制,使得进程能够通过这种机制找到所要找的端口。

        请注意,这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的地点。不同的系统具体实现端口的方法可以是不同的(取决于系统使用的操作系统)。

               

        TCP/IP体系结构的运输层使用端口号来标识和区分应用层的不同应用进程。 

        TCP/IP的运输层用一个16位端口号来标志一个端口。但请注意,端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。

        在互联网不同计算机中相同的端口号是没有关联的

        16位的端口号可允许有65535个不同的端口号

服务器使用的端口号与客户端使用的端口号 

服务器使用的端口号 


客户端使用的端口号

 分用和复用的运行

UDP的复用分用

运输层端口号举例

1.用户pc在浏览器输入web服务器域名,向DNS客户进程发送请求报文 
 

2.DNS服务器收到报文后


3.PC收到DNS响应报文


4.用户PC中的HTTP客户进程向web服务器发送HTTP请求报文


5.Web服务器收到PC请求报文


6.PC接收到Web响应报文

数据协议报UDP 

UDP的特点 

(1)UDP是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表
(3)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,保留这些报文的边界

        这就是说,应用层交给UDP多长的报文,UDP 就照样发送,即一次发送一个报文

(4) UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。

        很多的实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP 正好适合这种要求。
(5)UDP支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小,只有8个字节,比 TCP的20个字节的首部要短。

UDP的传输特点

        主机H的操作系统为这三个进程分别指派了端口。

        应用层和运输层之间的小方框代表端口。在端口小方框中间还画有队列,表示端口具有缓存的功能,可以把收到的数据暂时存储一下

        在两个运输层之间有一条虚线,表示在两个运输层之间可以进行通信,而不是一条连接。但这种通信是不可靠的通信,即所发送的报文在传输过程中有可能丢失,同时也不保证报文都能按照发送的先后顺序到达终点。

         图上画出了多对一的通信(a→x, b→x)。如果改成a→x,a→y,则是一对多的情况了。

UDP的复用分用 

         主机H1中的3个应用进程,把用户数据通过各自的端口传送到了运输层后,就共用一个网络层协议,把收到的UDP用户数据报组装成不同的IP数据报,发送到互联网。这就是UDP的复用功能。

        主机H2的网络层收到3个IP数据报后,提取出数据部分(即 UDP用户数据报),然后根据其首部中的目的端口号,分别传送到相应的端口,以便上层的应用进程到端口读取数据。这就是UDP的分用功能。

UDP的首部格式 

        用户数据报UDP有两个字段:数据字段首部字段

        首部字段只有8个字节,由4个字段组成,每个字段的长度都是2字节


各字段意义如下:

(1)源端口
       
 源端口号。在需要对方回信时选用。不需要时可用全0。
(2)目的端口
        
目的端口号。这在终点交付报文时必须使用
(3)长度
        UDP用户数据报的长度,其最小值是8(仅有首部)。
(4)检验和
        检测UDP用户数据报在传输中是否有错。有错就丢弃

 


        伪首部:UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。

        所谓“伪首部”是因为这种伪首部并不是UDP用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP用户数据报前面,得到一个临时的UDP用户数据报。

        检验和就是按照这个临时的UDP用户数据报来计算的,伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。

接收方UDP报文的端口号不正确 

        如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送“端口不可达”差错报文给发送方。

     ICMP差错报文了解

UDP计算检验和 

 

二进制反码求和末尾进位会回卷

传输控制协议TCP 

 TCP的主要特点
  

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

        在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去;

        在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
        (5)面向字节流。TCP中的“流”(stream)指的是流入到进程或从进程中流出的字节序列

        “面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等)但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。

        TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。

        但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。

        (例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。

TCP传输报文的特点 

TCP与UDP传输报文的比较

        TCP和 UDP 在发送报文时所采用的方式完全不同。TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度,来决定一个报文段应包含多少字节。(UDP发送报文长度应用进程给出的)。

        如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分为短一些的数据块再传送。如果应用进程一次只发来一个字节,TCP也可以等待积累足够多的字节后再构成报文段发送出去。

TCP的连接 

        TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。 

        每一条TCP连接有两个端点,TCP连接的端点叫作套接字(socket)或插口。 

套接字socket的表示方式 

TCP连接的表示方式 

可靠传输的工作原理 

详情请看数据链路层的可靠运输

TCP报文段的首部格式 

        TCP虽然是面向字节流的,但 TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而 TCP的全部功能都体现在它首部中各字段的作用。 

首部部分字段

        (1)源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。

        (2)序号:占4字节。序号范围是[0,2^{32}-1],共2^{32}(即4294 967296)个序号。序号增加到2^{32}-1]后,下一个序号就又回到0。

        在一个 TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。

        例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个子节的序号是400。

        显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。

        这个字段的名称也叫作“报文段序号”。


        (3)确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。

        例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。

        于是B在发送给A的确认报文段中把确认号置为701。请注意,现在的确认号不是501,也不是700,而是701。



        (4)数据偏移:占4位,它指出 TCP报文段的数据起始处距离 TCP报文段的起始处有多远。这个字段实际上是指出 TCP报文段的首部长度。

        因此数据偏移的最大值是60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)。


        (5)保留:占6位,保留为今后使用,但目前应置为0。

        (6)紧急 URG (URGent):当URG=1时,表明紧急指针字段有效——它告诉系统此报
文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序传送

        当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。

        例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。

        因此用户从键盘发出中断命令(Control-C)。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了许多时间。

        (7)确认ACK:仅当 ACK =1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。


        (8)推送 PSH (PuSH):当两个应用进程进行交互式的通信时,有时在一端的应用进程
希望在键入一个命令后立即就能够收到对方的响应。

        在这种情况下,TCP 就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。

        接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。


        (9)复位RST (ReSeT):当RST =1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

        将RST置为1,还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。


        (10)同步SYN(SYNchronization):在连接建立时用来同步序号。

        当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK =1。

        因此,SYN置为1就表示这是一个连接请求或连接接受报文。


        (11)终止FIN (FINish):用来释放一个连接。

        当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

        (12)窗口:占2字节。窗口值是[0,2^{16}-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。

        窗口值告诉对方:从本报文确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的:

  • 例如,发送了一个报文段,其确认号是701,窗口字段是1000。
    • 这就是告诉对方:“从701号算起,我(即发送此报文段的一方)的接收缓存空间还可接收1000个字节数据(字节序号是701~1700),你在给我发送数据时,必须考虑到我的接收缓存容量。”

        总之,窗口值作为接收方让发送方设置其发送窗口的依据。


        (13)检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。
        和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部
,伪首部的格式与UDP用户数据报的伪首部一样。

        但应把伪首部第4个字段中的17改为6(TCP 的协议号是6),把第5字段中的UDP长度改为TCP长度。

        接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用IPv6,则相应的伪首部也要改变。


        (14)紧急指针:占2字节,紧急指针仅在URG =1时才有意义,它指出本报文段中
的紧急数据的字节数(紧急数据结束后就是普通数据)。

        因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。


        (15)选项:长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度
是20字节。选项功能有如下:


        (16)填充:最后的填充字段仅仅是为了使整个TCP首部长度是4字节的整数倍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401961.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql windows安装与远程连接配置

安装包在主页资源中 一、安装(此安装教程为“mysql-installer-community-5.7.41.0.msi”安装教程,安装到win10环境) 保持默认选项,点击”Next“。 点开第一行加号展开一路展开找到“MySQL Server 5,7,41 - X64”点击选中点击一下中间只想右侧的箭头看到…

Attention注意力机制

神经网络注意力机制代码实现 import torch import torch.nn as nn import torch.nn.functional as F# MyAtt类实现思路分析 # 1 init函数 (self, query_size, key_size, value_size1, value_size2, output_size) # 准备2个线性层 注意力权重分布self.attn 注意力结果表示按照指…

简单测试AOP五种增强执行时机

1. 目标方法类,spring代理bean Component public class Test {public void test(){System.out.println("test 目标方法");}public void testException(){throw new RuntimeException();} } 2. 配置类 Configuration ComponentScan EnableAspectJAutoPr…

unity项目打包为webgl后应用于vue项目中(iframe模式)的数据交互

参考文章: 1.Unity打包WebGL: 导入Vue 2.unity文档-WebGL:与浏览器脚本交互 3.unity与vue交互(无第三方插件) 目录 一、前期工作1.新建.jslib文件2.新建.cs脚本3. 新建一个Text对象和button按钮对象4.添加脚本空对象UIEvent5.导出unity为w…

Windows配置开机直达桌面并跳过锁屏登录界面在 Windows 10 中添加在启动时自动运行的应用

目录 Win10开机直达桌面并跳过锁屏登录界面修改组策略修改注册表跳过登录界面 在 Windows 10 中添加在启动时自动运行的应用设置系统级别服务一、Windows下使用sc将应用程序设置为系统服务1. 什么是sc命令?2. sc命令的基本语法3. 创建Windows服务的步骤与示例创建服…

CANoe软件中Trace窗口的筛选栏标题不显示(空白)的解决方法

文章目录 问题描述原因分析解决方案扩展知识总结问题描述 不知道什么情况,CANoe软件中Trace窗口的筛选栏标题突然不显示了,一片空白。现象如下: 虽然不影响CANoe软件的使用,但是观感上非常难受,对于强迫症患者非常不友好。 原因分析 按照常规思路,尝试了: 1、重启CAN…

K8S中使用英伟达GPU —— 筑梦之路

前提条件 根据不同的操作系统,安装好显卡驱动,并能正常识别出来显卡,比如如下截图: GPU容器创建流程 containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvid…

MoExtend: 模态和任务扩展调整的新专家

MoExtend: Tuning New Experts for Modality and Task Extension GitHub - zhongshsh/MoExtend: ACL 2024 (SRW) https://arxiv.org/pdf/2408.03511 大型语言模型(LLM)在各种任务中表现出色,然而其应用范围受限于主要在文本数据上进行训练。…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅰ—— 初识和了解 vSphere证书

目录 引子1. vCenter Server 证书服务1.1 vSphere 安全证书(1)vSphere 安全证书的类型和有效期 1.2在 vSphere Client 中初识 vSphere 证书(1)vCenter 8.0.3 的 vSphere Client 界面(2)vCenter Server 7.0 …

TCP/UDP实现网络通信

TCP实现网络通信 1.服务端 #include<myhead.h>//1服务端定义:端口号\id号 #define SER_PIPR 6666 #define SER_IP "196.168.111.186" //通过ifconfig查看ip int main(int argc, const char *argv[]) {//1创建套接字int sfd socket(AF_INET,SOCK_STREAM,0);…

深度解析Edge SCDN与CDN:安全加速,全面防护

在现代互联网应用中&#xff0c;CDN已成为提高网站和应用性能不可或缺的技术之一。然而&#xff0c;随着网络安全威胁的日益严峻&#xff0c;单纯依靠CDN提供的加速服务已经不足以满足企业的安全需求。因此&#xff0c;Edge SCDN出现了&#xff0c;它不仅具备CDN的加速特性&…

解锁客户增长新密码:“老带新”策略的深度剖析与实战指南

客户推荐是什么&#xff0c;为何那么重要&#xff1f; 客户推荐是指满意的客户自愿地将其认为优质的产品或服务推荐给他们的社交网络成员&#xff0c;如朋友、家人或同事&#xff0c;这种推荐行为可以是自发的口碑传播&#xff0c;也可以是通过产品方推出的“老带新”奖励计划来…

OpenCV图像滤波(12)图像金字塔处理函数pyrDown()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数主要是对图像进行模糊处理并将其降采样。 默认情况下&#xff0c;输出图像的大小计算为 Size((src.cols1)/2, (src.rows1)/2)&#xff0c;但…

汽车维修预约服务系统的设计与实现

TOC springboot317汽车维修预约服务系统的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔…

【大模型】多模态的原理简述

多模态的原理 多模态模型目前基本就是文生图、图生图、图生视频、文生视频这些&#xff0c;其底层逻辑其实还是先从生图片这一源头。因为毕竟视频也是若干帧的图片组成。 所以在生图片的这个环节上&#xff0c;我们把比较火的这个stablediffusion用的这个diffusion扩散模型理…

第T8周:使用TensorFlow实现猫狗识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据 二、数据预处理1、加载数据2、再次检查数据3. 配置数据集4…

mysql写个分区表

因为表量已经达到1个亿了。现在想做个优化&#xff0c;先按照 create_time 时间进行分区吧。 create_time 是varchar类型。 CREATE TABLE orders (id varchar(40) NOT NULL ,order_no VARCHAR(20) NOT NULL,create_time VARCHAR(20) NOT NULL,amount DECIMAL(10,2) NOT NULL,…

springboot使用aop或Jackson进行数据脱敏

1.aop 启动类加EnableAspectJAutoProxy 自定义注解&#xff0c;在实体类中使用表示被脱敏字段 建立aop切面类 可能这里gpt会建议你用Pointcut("execution(public * com.xx.aop..*.get*(..))")这种方式拦截&#xff0c;这种我试了&#xff0c;拦截不住。猜测在mvc返…

FPGA开发——UART回环实现之接收模块的设计

一、简介 因为我们本次进行串口回环的实验的对象是FPGA开发板和PC端&#xff0c;所以在接收和发送模块中先编写接收模块&#xff0c;这样可以在后面更好的进行发送模块的验证。&#xff08;其实这里先编写哪个模块&#xff09;都不影响&#xff0c;这里看自己心情&#xff0c;反…

【SpringBoot】【autopoi】java生成word,基于模版生成(文本、图片、表格)

基于模版生成word 1、引入maven2、word模版编写3、java代码4、效果5、word转pdf AutoPoi的主要特点 参考文献 https://help.jeecg.com/autopoi/autopoi/prequel/test.html 1.设计精巧,使用简单 2.接口丰富,扩展简单 3.默认值多,write less do more 4.spring mvc支持,web导出可以…