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

【面试八股总结】传输控制协议TCP(一)

一、什么是TCP协议

TCP是传输控制协议Transmission Control Protocol

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

  • 面向连接的:每条TCP连接杜只能有两个端点,每一条TCP连接只能是点对点的(一对一)
  • 可靠的:可靠交付
  • 基于字节流的
    • TCP中的“流”的概念是流入或流出进程的字节序列
    • 基于字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流
    • TCP不保证接收方应用程序收到的数据块和发送方应用程序所发出的数据块具有对应的大小关系,但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。

二、TCP的连接建立

1. 三报文握手

  • TCP 建立连接的过程叫做握手。
  • 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手。
  • 三报文握手主要作用是为了确认通信双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
  • 采用三报文握手可以防止已失效的连接请求报文段突然又传送到了,因而产生错误。

1) 初始状态:

        客户端处于 closed(关闭) 状态,服务器处于 listen(监听) 状态。

2) 第一次握手:

        客户端给服务器发⼀个 SYN 报⽂,指明客户端的初始化序列号 ISN(c)。此时客户端处于SYN_SEND 状态

        该报文首部的同步位 SYN = 1,初始序号 seq = x,SYN = 1。

        该报文段不能携带数据,但要消耗掉⼀个序号。

3) 第二次握手:

        服务器收到客户端的 SYN 报文之后,以自己的 SYN 报⽂作为应答,并且指定自己的初始化序列号 ISN(s)。同时把客户端的 ISN + 1 作为 ACK 的值,表示已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态

        在确认报文段中 SYN = 1,ACK = 1,确认号 ack = x + 1,初始序号 seq = y。

4) 第三次握手:

        客户端收到 SYN 报文之后,会发送⼀个 ACK 报⽂,把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报⽂,此时客户端处于 ESTABLISHED 状态服务器收到 ACK 报⽂ 之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。

        确认报文段 ACK = 1,确认号 ack = y + 1,序号 seq = x+1(初始为 seq = x,第⼆个报文段所以要+1)

        该ACK报文段可以携带数据,不携带数据则不消耗序号。

2. 为什么需要三次握手?

1) 阻止重复历史连接的初始化

        网络阻塞时,客户端向服务器发送两次SYN请求报文,旧的SYN报文先到达服务器,服务器回复一个ACK+SYN报文,客户端根据自身上下文判断这是一个历史连接(序列号过期或者超时),那么客户端就会发送RST报文给服务端,终止这次连接,服务器收到RST报文后,释放连接。这样新的SYN报文到达后,客户端与服务器就可以正常进行三次握手。

        若采用两次握手,服务器在收到SYN报文后,进入ESTABLISHED状态,服务器并不知道这是历史连接,直接与客户端建立并向客户端发送数据,造成资源浪费,但是客户端会判定这次连接是历史连接,忽略客户端确认消息,也不发送数据,服务端一直等待客户端发送数据。

2) 同步双方初始序列号

TCP协议的通信双方,都必须维护一个序列号,序列号是可靠传输的一个关键因素。

  • 接收端 -> 去除重复元素 ,并且按照序列号顺序接收数据
  • 发送端 -> 确认发送的数据包哪些已经被收到

三次握手确认初始化序列过程:

  • 第一次握手:客户端发送携带客户端初始化序列号的SYN报文;
  • 第二次握手:服务器发送携带服务器初始化序列号以及客户端初始化序列号+1的ACK + SYN应答报文,表示收到客户端SYN报文;
  • 第三次握手:客户端发送携带服务器初始化序列号+1的ACK应答报文。

        两次握手只能保证服务器成功接收了客户端的初始化序列号,但无法确认服务器的初始化序列号是否被成功接收。

3. 半连接队列

        半连接队列(SYN队列)⽤于存放已经发送了 SYN(同步)包,但还未完成三次握⼿的连接。服务器第⼀次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双⽅还没有完全建⽴其连接,服务器会把此种状态下请求连接放在⼀个队列⾥,我们把这种队列称之为半连接队列。

        全连接队列(Accept队列)⽤于存放已经完成三次握⼿,处于完全建⽴连接状态的连接。

4. 三次握手可以携带数据吗?

        三次握手中,第一次和第二次连接不可以携带数据,第三次连接可以携带数据。主要原因是如果第一次握手如果携带数据,会让服务器更加容易被攻击,但是第一次握手会消耗一个序列号,对于第三次握手,客户端已经处于ESTABLISHED状态,确认服务器接收、发送能力没有问题,可以发送数据。

5. SYN洪泛攻击

        SYN攻击指Client在短时间内伪造大量不存在的IP地址,并向Server不断发送SYN包,Server则回复确认包,等待Client确认。由于源地址不存在,因此Server需要不断重新发送直到超时,这些伪造的SYN包会长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而导致网络拥塞甚至系统瘫痪。

        检测SYN攻击:在服务器上发现大量半连接状态,特别其源地址IP是随机的,基本确认为SYN攻击。Linux系统下可使用 netstats 命令检测:

netstat -n -p TCP | grep SYN_RECV

防御SYN攻击:

  • 缩短超时(SYN Timeout)时间

  • 增加最大半连接数

  • 过滤网关防护

  • SYN Cookies技术

 三、TCP的连接释放

1. 四报文挥手

  • 数据传输结束后,通信的双方都可释放连接。
  • TCP 连接释放过程是四报文握手。
  • TCP的半关闭(half-close):TCP提供了连接的⼀端在结束它的发送后还能接收来⾃另⼀端数据的能力
  • 客户端和服务器均可以主动发起挥手。

1) 初始状态:

        双方都处于 ESTABLISHED 状态 (假设客户端发起挥手)

 2) 第一次挥手:

        客户端发送⼀个 FIN 报⽂,报⽂中会指定⼀个序列号(FIN=1,序号seq=u)。此时客户端停止再发送数据,主动关闭TCP连接,进⼊FIN_WAIT1状态,等待服务端的确认。

 3) 第二次挥手:

        服务端收到以后,向客户端发送ACK应答报文,且把客户端的 序列号值+1 作为 ACK 报文的序列号值(ACK=1,确认号ack=u+1,序号seq=v),表明已经收到客户端的报文,服务器处于 CLOSE_WAIT 状态,此时TCP处于半关闭状态,客户端到服务端的连接释放。

        客户端收到服务端的确认后,进⼊FIN_WAIT2状态,等待服务端发出的连接释放报文段。

 4) 第三次挥手:

        如果服务器也想断开连接了,和客户端的第⼀次挥手⼀样,发出 FIN 连接释放报文(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),且指定⼀个序列号。此时服务器处于LAST_ACK 的状态,等待客户端的确认。

 5) 第四次挥手

        客户端收到 FIN 之后,发送⼀个 ACK 报文作为应答,且把服务器的序列号值 +1 作为自己 ACK 报文的确认号值(ACK=1,seq=u+1,ack=w+1),客户端处于 TIME_WAIT 状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。

        服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态

2. 为什么需要四次挥手?

        关闭连接时,客户端发送FIN报⽂,表示其不再发送数据,但还可以接收数据。服务端收到FIN报文,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是⽤来同步的。但是关闭连接时,服务端可能还有数据需要处理和发送,所以先回⼀个ACK应答报文,等到其不再发送数据时,才发送 FIN报文给客户端表示同意关闭连接。

        服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN⼀般都会分开发送,因此需要四次挥手。

3. 为什么TIME_WAIT状态时间为2MSL?

1)MSL是Maximum Segment Lifetime,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

2)网络中可能存在发送方的数据包,当这些发送方的数据包被接收方处理后⼜会向对方发送响应,所以⼀来⼀回需要等待 2 倍的时间。

3)1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端;1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报⽂,那么 2MSL 时间将重新计时

4. 为什么需要 TIME_WAIT 状态(2MSL状态)?     

1) 防止历史连接中的数据,被后面相同四元组的连接错误的接收

        如果网络出现拥塞或延迟,数据包可能会在网络中滞留⼀段时间,甚⾄超过了原始连接关闭的时间。如果没有 TIME_WAIT 状态,客户端直接进入到CLOSE状态,这些滞留的数据包可能会被传递给新连接,导致新连接的数据被旧连接的数据干扰。经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络都自然消失,再出现的数据包⼀定都是新建立连接所产生的。

2) 保证被动关闭连接的⼀方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。

        如果最后的⼀次ACK报文丢失(第四次挥手),客户端没有 TIME_WAIT 状态,直接进⼊ClOSE,服务端⼀直在等待 ACK状态,⼀直没有等到,就会重发FIN报文,客户端已经进入到关闭状态,在收到服务端重传的 FIN 报⽂后, 就会回 RST 报文,服务端收到这个 RST 并将其解释为⼀个错误,。为了防止这种情况出现,客户端必须等待足够长的时间,确保服务端能够收到 ACK,如果服务端没有收到 ACK,那么就会触发 TCP 重传机制,服务端会重新发送⼀个 FIN,这样⼀去⼀来刚好两个 MSL 的时间。

相关文章:

【面试八股总结】传输控制协议TCP(一)

一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的:每条TCP连接杜只能有两个端点,每一条TCP连接只能是点对点的(一对一)可靠的&#xff1a…...

【系统架构师】-第13章-层次式架构设计

层次式体系结构设计是将系统组成一个层次结构,每一层 为上层服务 ,并作为下层客户。 在一些层次系统中,除了一些精心挑选的输出函数外, 内部的层接口只对相邻的层可见 。 连接件通过决定层间如何交互的协议来定义,拓扑…...

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…...

AtCoder Grand Contest 066 B. Decreasing Digit Sums(构造 打表找规律)

题目 给定一个n(n<50)&#xff0c;记f(x)是x各数位的加和&#xff0c;例如f(331)3317 要求输出一个x()&#xff0c;且对于任意i∈[1,n]&#xff0c;均有成立 思路来源 jiangly B站讲解 题解 首先n没啥用&#xff0c;构造一个n50成立的case即可&#xff0c; 给定一个x…...

Hadoop系列总结

一、Hadoop linux基本操作 前提掌握Linux基本操作 参考 Linux基本操作-CSDN博客 1、查看hadoop指定路径下文件大小前6的文件信息 hdfs dfs[hadoop fs] -du -h /path/to/directory|sort -hr|head -n 6...

【第三方登录】Twitter

创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…...

C++经典面试题目(十七)

1、请解释拷贝构造函数的作用&#xff0c;并说明其调用时机。 拷贝构造函数是一种特殊的构造函数&#xff0c;用于创建一个新对象&#xff0c;其内容与另一个对象相同。它将一个已存在的对象作为参数&#xff0c;并使用该对象的值来初始化新创建的对象。拷贝构造函数的调用时机…...

DFS2 C++

一、指数型枚举 1、题目&#xff1a; 从 1∼n1∼ 这 n 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列&#xff0c;相邻两个数用恰好 11 个空格隔开。 对于没有选任何…...

2021-08-06

yarn的简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; 速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因此安装速度更快。超级安全。 在执行代码…...

Centos服务器Open Gauss 部署

近期很多的项目由于信创要求使用一些国产的数据库&#xff0c;比如OpenGauss。OpenGuass是华为高斯DB的开源版&#xff0c;内核还是PostgreSQL&#xff0c;商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARM&#xff…...

Vue与Electron融合之道:从Web App到桌面App的华丽转身

Vue与Electron融合之道&#xff1a;从Web App到桌面App的华丽转身 引言Vue 与 Electron 的天然契合共享技术栈高效开发与部署用户体验升级 Vue 与 Electron 融合实战初始化项目调整Vue项目结构利用 Electron API 增强功能定制桌面应用外观构建与部署 结语 引言 Vue.js 作为一款…...

Higress 基于自定义插件访问 Redis

作者&#xff1a;钰诚 简介 基于 wasm 机制&#xff0c;Higress 提供了优秀的可扩展性&#xff0c;用户可以基于 Go/C/Rust 编写 wasm 插件&#xff0c;自定义请求处理逻辑&#xff0c;满足用户的个性化需求&#xff0c;目前插件已经支持 redis 调用&#xff0c;使得用户能够…...

Mysql的库函数

MySQL是一个流行的开源关系型数据库管理系统&#xff0c;它提供了大量的内置库函数&#xff0c;用于在查询时执行各种操作。这些函数可以帮助开发者在数据检索、转换和处理过程中实现更复杂的逻辑。 1 字符串函数 函数描述ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。CHA…...

绿联 安装onlyoffice容器并启用Cloudreve的office在线预览与编辑功能

原文&#xff1a;绿联 安装onlyoffice容器并启用Cloudreve的office在线预览与编辑功能 本篇教程以配合Cloudreve扩展文档预览/编辑为目的编写&#xff0c;OnlyOffice的其他用途未深入研究也不做探讨&#xff0c;仅使用WOPI能力。 硬件要求 镜像大小&#xff1a;2.91Gb或更大 …...

金钱卦起卦

前言 本文目的&#xff1a; 1.了解什么是《易经》 2.了解什么是八卦/六十四卦 3.金钱卦起卦方法 4.如何解卦 一、什么是易经&#xff1f; 1、易经就是一本书、一本著作 2、它的成书经历了三个阶段 第一阶段&#xff1a;在5000多年前&#xff0c;由人类的始祖伏羲通过观察时…...

学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)

这是 学透 Spring Boot 专栏 的第三篇&#xff0c;欢迎关注我&#xff0c;与我一起学习和探讨 Spring Boot 相关知识&#xff0c;学透 Spring Boot。 从面试题说起 今天我们通过一道和Spring Boot有关的常见面试题入手。 面试题&#xff1a;说说 Spring Boot 中有哪些常用注解…...

新能源汽车充电桩常见类型及充电桩站场的智能监管方案

随着新能源汽车市场的迅猛发展&#xff0c;充电桩作为支持其运行的基础设施&#xff0c;也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异&#xff0c;更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩&#xff08;交…...

让工作自动化起来!无所不能的Python

文章目录 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书赠书活动 前言 随着我国企业数字化和信息化的深入…...

Facebook轮播广告是什么?投放过程中有哪些需要注意的吗?

轮播广告是Facebook广告形式中的一种&#xff0c;可以把3—5个广告合并到一个可滚动的广告单元中。轮播广告会出现在新鲜事即News Feed中&#xff0c;是独立站卖家常用的一种广告形式 为什么选择轮播广告&#xff1f; 转化率更高&#xff1a;相较于单图广告&#xff0c;轮播广…...

3、jvm基础知识(三)

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的优点是实现简单&#xff0c;缺点有两点&#xff1…...

leetcode414-Third Maximum Number

这道题目求第三大数&#xff0c;如果第三大数不存在则返回最大数&#xff0c;且该数字最大值不超过2^31-1。从这个提示上就可以看出这个数字是用int类型表示的。我们当然可以通过排序的方式先给数组排序然后很容易的就能求解。但是有没有什么更好的办法呢&#xff1f;对于数组来…...

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns

解决Quartus与modelsim联合仿真问题&#xff1a;# Error loading design解决&#xff0c;是tb文件中没加&#xff1a;timescale 1&#xff0c;一直走下来&#xff0c;在modelsim中出现了下面问题2&#xff0c;rtl文件、tb文件2.1&#xff0c;rtl代码2.2&#xff0c;tb测试2.3&a…...

vue使用elementui组件的的对话框;使用ref

1.第一步&#xff0c;先在父组件中引用&#xff0c;设置ref的值 <el-dialog :visible.sync"dialogEditVisible"append-to-body width"1000px" title"编辑":close-on-click-modal"false"><dialog-edit v-if"dialogEditV…...

第十四届蓝桥杯(八题C++ 题目+代码+注解)

目录 题目一&#xff08;日期统计 纯暴力&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;01串的熵 模拟&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;治炼金属&#xff09;&#xff1a; 代码&#xff1a; 题目四&#xff08;飞机降落 深度…...

HTTP协议格式详解之报头(HTTP header)、请求正文(body)

在之前文章中我们已经介绍了HTTP的首行信息&#xff0c;HTTP协议格式详解之首行信息解析-CSDN博客这篇文章中我们继续介绍HTTP协议的报头部分。 一、报头(HTTP header) a&#xff09;请求头部&#xff08;Request Headers&#xff09;&#xff1a; Host&#xff1a;指定服务器…...

[yolox]ubuntu上部署yolox的ncnn模型

首先转换pytorch->onnx->param模型&#xff0c;这个过程可以查资料步骤有点多&#xff0c;参考blog.51cto.com/u_15660370/6408303&#xff0c;这里重点讲解转换后部署。 测试环境&#xff1a; ubuntu18.04 opencv3.4.4(编译过程省略&#xff0c;参考我其他博客) 安装…...

YOLOv9改进策略 :IoU优化 | 提出一种新的Shape IoU,更加关注边界框本身的形状和尺度,对小目标检测也很友好

💡💡💡本文改进:一种新的Shape IoU方法,该方法可以通过关注边界框本身的形状和尺度来计算损失,解决边界盒的形状和规模等固有属性对边界盒回归的影响。 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 《YOLOv9魔术师专栏》将从以下各个方向进…...

如何使用KST指标进行多头交易,Anzo Capital一个条件设置

在之前的文章中&#xff0c;我们进行分享了以下知识&#xff1a;什么是KST指标&#xff0c;以及如何进行计算KST指标。有聪明的投资者就在后台进行咨询Anzo Capital昂首资本了&#xff0c;我们知道这些知识有什么用呢&#xff1f; 当然有用了&#xff0c;只要理解背后的逻辑知…...

【QT进阶】第十三章QT动画类的使用QAbstractAnimation

❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️专栏目录:【零基础学QT】文章导航篇 ❤️专栏资料:https://pan.baidu.com/s/192A28BTIYFHmixRcQwmaHw 提取码:qtqt ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过…...

【机器学习】揭秘无监督学习:机器如何自我学习发现数据奥秘

无监督学习&#xff1a;全面解析 引言 在机器学习的众多分支中&#xff0c;无监督学习因其在未标记数据上发现隐藏模式的能力而独树一帜。它不依赖于事先标记的输出&#xff0c;而是通过分析数据本身的结构和分布来揭示内在的关系和分类。本文深入探讨无监督学习的核心概念、…...

做h5游戏的网站/怎么引流推广自己的产品

Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥&#xff1a;YKCW6-BPFPF-BT8C9-7DCTH-QXGWC&#xff1b;KCW6-BPFPF-BT8C9-7DCTH-QXGWC转载于:https://www.cnblogs.com/RogerLu/p/10070312.html...

做ic销售的各种网站/重庆网站制作公司哪家好

https://blog.tengshe789.tech/2018/08/04/springboot/?hmsrtoutiao.io&utm_mediumtoutiao.io&utm_sourcetoutiao.io 这是一篇优雅的使用...

太原手机网站建设/今日军事新闻头条打仗

首先申明标题党&#xff01; 前几天&#xff0c;有一张图片访问404&#xff08;从第三方站点拉去&#xff09;&#xff0c;后来查到原因是下载超过5s&#xff08;wget带了超时参数--timeout5&#xff09;&#xff0c;所以下载失败。但是直接访问原图又是非常快&#xff0c;基本…...

建设医院网站ppt/杭州seo渠道排名

sqlserver2005连接远程服务器报错&#xff0c;以前用得好好的。今天上班来了就报错。郁闷&#xff01;&#xff01;&#xff01;转载于:https://www.cnblogs.com/dreamstill/archive/2006/07/21/456793.html...

宁夏电力建设工程公司外部网站/青岛seo排名收费

[ 中关村在线 原创 ] 有很多的朋友们在问我&#xff1a;“交换机和路由器到底有什么区别”&#xff0c;其实这个不是什么很难理解的事情&#xff0c;这两个设备的区别主要在功能上区别大了些&#xff0c;那么我们最好先了解一下什么是交换机和什么是路由器的最基本的常识。现在…...

手机网站有什么区别是什么/洛阳seo网站

input[type"file"]上传文件原理详解 最近又搞了一下上传文件功能&#xff0c;用别人的插件不大符合自己要求&#xff0c;还是用HTML5的input[type"file"]比较好控制&#xff0c;现在重新回顾一下使用input[type"file"]上传文件 【1】修改input…...