当前位置:首页 » 文件管理 » http分块上传

http分块上传

发布时间: 2023-01-16 20:16:07

1. HTTP通信

HTTP通信过程包括从客户端发往服务器端的请求以及从服务器端返回客户端的响应.

用于HTTP协议交互的信息成为HTTP报文. 请求端发送的HTTP报文成为请求报文,响应端的叫做响应报文.
HTTP报文分为报文首部+空行+报文主体,通常并不一定有报文主体.

请求报文首部的结构如下:

响应报文首部的结构如下:

HTTP在传输数据时可以按照数据的原貌传输, 也可以在传输过程中编码提升传输速率. 通过在传输时编码, 能有效地处理大量的访问请求. 但是编码是计算机来完成的, 因此会需要消耗更多的CPU等资源.

报文(message):是HTTP通信的基本单位,由8位组字节流组成,通过HTTP通信传输.
实体(entity):作为请求和响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成.
HTTP报文的主体用于传输请求和响应的实体主体.
通常,报文主体等于是实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异. 个人理解为实体主体是编码以后的报文主体.

HTTP协议中有一种被称为 内容编码 的功能可以实现压缩内容的效果,内容编码是在 实体内容 上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接收并负责解码.

内容编码的常见几种方式:

分块传输编码是将实体主体分割成多个部分(块), 每一块都会用十六进制来标记块的大小,而实体主体的最后一块会用"0"来标记.客户端负责解码,恢复到编码前的实体主体.

MIME(Multipurpose Internet Mail Extensions, 多用途因特网邮件扩展)机制, 允许邮件处理文本, 图片, 视频等各个不同类型的数据.
可以发送文本,图片,视屏等不同类型的数据.
HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可以包含多类型实体,通常在图片或文本上传时使用.

在HTTP报文中使用多部分对象集合时, 需要在首部字段中加上Content-type字段, Content-type字段说明了实体主体内对象的媒体类型.
使用boundary字段来划分多部分对象集合指明的各类实体, 在boundary字符串指定的各个实体的起始行之前插入"--"标记做为开始, 在多部分对象集合对应的字符串的最后插入"--"标记做为结束. 如上以"--AbB03x"做为开始, 以"--AbB03x--"做为结束.

状态码的职责是当客户端想服务器端发送请求时, 描述返回的请求结果. 借助状态码, 用户可以知道服务器端是正常的处理了请求还是出现了错误.

200:OK, 请求成功
204:No Content, 服务端接收的请求已经成功处理,但是返回的响应报文中不包含实体的主体部分,
另外也不允许返回任何实体的主体.
206:Partial Content, 客户端进行了范围请求,而服务器成功执行了这部分的GET请求.

3xx的响应表明客户端需要执行某些特殊的处理才能正确请求.

301:Moved Permanently, 永久性重定向, 表示请求的资源已经被分配到了新的URI, 以后请求都是用现在所指的URI.
302:Found, 临时性重定向, 表示请求的资源已被分配到新的URI, 希望用户(本次)能使用新的URI访问.和301状态类似,但是302状态码代表的资源不是被永久移动,只是临时性质的。
303:See Other,该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但是303状态码表明客户端应采用GET方法获取资源,这点与302状态码有区别。
304:Not Modified,改状态表示客户端发送附带条件的请求时,服务端允许请求访问资源,但未满足条件的情况。304状态码返回时不包含响应的主体部分。304虽然被划分在3XX,但是与重定向无关。
307:Temporary Redirect,临时重定向,与302有相同的含义,但是307不会将POST改为GET。

4xx的响应结果表明客户端是发送错误的原因所在.

400:Bad Request, 请求报文中存在语法错误.
401:Unauthorized, 请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的信息.
403:Forbidden, 表明对请求资源的访问被服务器拒绝了.
404:Not Found, 表明服务器上无法找到请求的资源.

5xx的响应结果表明服务器本身发送错误.

501:Internal Server Error, 表明服务器端在执行请求时发生了错误.
503:Service Unavailable, 表明服务器暂时处在超负荷或者正在进行停机维护,现在无法请求.如果事先得知解除以上状况需要的时间, 最好写入Retry-After首部字段返回给客户端.

HTTP协议的请求和响应报文中必定包含HTTP首部, 我们来看一下HTTP首部的结构以及各字段的用法.

请求报文首部:请求行+请求首部字段+通用首部字段+实体首部字段+其他.
请求行包括方法(GET POST), URI, HTTP版本.

响应报文首部:状态行+响应首部字段+通用首部字段+实体首部字段+其他.
状态行包括HTTP版本, 状态码.

HTTP首部字段是构成HTTP报文的要素之一, 在客户端和服务端之间以HTTP协议通信的过程中, 首部字段起到传递额外重要信息的作用. 首部字段可以提供报文主体大小, 所使用的语言, 认证信息等内容.
HTTP首部字段的结构为 首部字段名: 字段值 , 指令的参数是可选的, 多个指令之间用","分隔, 例如首部字段'Cache-Control'的指令用于请求以及响应时:

HTTP首部字段分为: 通用首部字段, 请求首部字段, 响应首部字段, 实体首部字段.

通用首部字段是请求报文和响应报文都会用到的首部.

从客户端发送请求到服务端使用的首部.补充了请求的附加内容,客户端信息,响应内容优先级等信息.

从服务端向客户端返回响应报文时使用的首部.补充了相应的附加内容.

针对请求报文和响应报文的实体部分使用的首部.

HTTP协议中可能存在信息窃听或身份伪装等安全问题, 使用HTTPS通信机制可以有效地防止这些问题.

HTTP协议存在一下不足之处:

HTTP本身不具备加密的功能, 无法对通信整体进行加密, HTTP报文使用明文的方式进行传输.

互联网中都是相通的, 在通信线路上的某些网络设备, 光缆, 计算机都可能遭到恶意窥视, 窃取通信数据, 为了防止信息被恶意窃听, 可以使用加密技术.

通信的加密 : 将通信进行加密, HTTP通过和SSL或TLS的组合使用, 加密HTTP的通信, 使用SSL建立安全通信线路之后, 就可以在安全的通信线路上进行通信, 与SSL组合使用的HTTP称为HTTPS.

在HTTP通信时, HTTP协议中的请求和响应不会对通信方进行确认, 任何人都可以发起请求, 服务器接收到请求以后就会返回响应, 这里就存在安全问题, 客户端可能是冒充的客户端, 服务器可能是冒充的服务器.
使用SSL可以解决这个问题, SSL不仅提供加密处理, 还使用了一种被称为证书的手段. 证书是值得信任的第三方机构颁发, 用来证实服务器和客户端的身份, 证书伪造在技术上是异常困难的一件事, 所以只要能够确认通信方持有的证书, 就可以判断通信方的身份.

HTTP协议无法证明通信的报文完整性, 不能保证发送请求以后, 接收到的响应就是对应客户端的响应, 中间可能被拦截篡改.

添加了加密和认证机制的HTTP称为HTTPS.

HTTPS并非一种新协议, 只是在HTTP通信接口部分用SSL和TLS协议替换, 通常HTTP直接和TCP通信, 当使用SSL时, HTTP先和SSL通信, SSL再和TCP通信, HTTP就拥有了HTTPS的加密, 证书和完整性保护功能.

SSL采用一种叫做公开秘钥加密的加密方式, 加密算法是公开的, 秘钥是保密的. 加密和解密都用到秘钥, 如果秘钥被其他人窃取, 那么加密就无意义了.

加密和解密使用同一个秘钥的方式成为 共享密钥加密 , 也成为对称密钥加密. 以共享密钥方式加密时必须将密钥发送给对方, 问题来了, 怎么讲共享密钥安全发送给对方呢? 如果共享密钥在发送的过程中被拦截, 那么加密还有什么意义..

为了解决这个问题, 我们来引入 公开密钥 的概念, 公开密钥加密使用一对非对称的密钥, 一把是私有密钥一把是公开秘钥, 私有密钥只有自己知道, 公开密钥可以任意公开.
客户端和服务端各有一对密钥, 客户端发送请求的时候使用服务端的公开密钥对内容进行加密, 服务端接收到客户端的请求, 使用自己的私有密钥对内容进行解密, 然后使用客户端的公开密钥对响应进行加密, 客户端接收到响应以后使用自己的密钥对响应进行解密.

HTTPS采用共享密钥加密和公开密钥两者并用的 混合加密机制 , 公开密钥加密相比共享密钥加密, 公开密钥加密的处理速度相对较慢, 所以我们来考虑共享密钥的加密处理, 共享密钥的加密处理的问题在于我们如何将密钥安全的传达给对方.
我们可以考虑使用公开密钥的加密方式将共享密钥作为内容传递给对方, 对方使用自己的密钥将内容解密以获取到共享密钥, 这样共享密钥就被安全传达, 以后的通信就使用共享密钥加密的方式进行通信.

至此, 还有一个问题需要考虑, 我们在使用公开密钥进行加密时, 如何 保证公开密钥的正确性 ?
比如我们在和某台服务器在公开密钥加密的方式下通信时, 如何确保我们收到的公开密钥就是我们要通信的那台服务器的公开密钥呢? 很可能在公开密钥传输的过程中, 公开密钥已经被篡改了.
为了解决这个问题, 我们要让公开密钥和我们所说的这台服务器最对应, 可以使用由数字证书认证机构(CA, Certificate Authority)和其相关机关颁发的公开密钥证书.

数字证书认证机构是在客户端和服务器都信赖的第三方认证机构的立场上. 服务器的运营认证人员向数字证书认证机构提出公开密钥的申请, 数字证书认证机构在确定申请者的身份后对公开密钥进行签名, 生成数字证书, 或者叫做证书. 然后分配这个已签名的公开密钥.
在通信的时候, 服务器会将这个证书发送给客户端, 客户端接收到这个证书, 使用服务器的公开密钥对证书进行验证, 如果验证通过, 客户端可以确认服务器的公开密钥是值得信赖的, 此处服务器的公开密钥必须安全的转交给客户端, 如何安全的将公开密钥转交是一件很困难的事情, 因此, 很多浏览器开发商发布版本时, 会事先在内部植入常见认证机构的公开密钥, 那么上边我们所说的保证公开密钥正确性的问题就解决了.

客户端已经完成了对服务端身份的验证, 那么服务端是否可以对客户端的身份做验证呢?
HTTPS中可以使用客户端证书, 使用客户端证书可以对客户端进行认证, 其作用和服务器证书类似.
但是这里存在一个问题, 就是客户端证书的获取以及证书的发布. 由于客户端证书是收费的, 也就是有多少用户就要购买多少客户端证书, 这个在大天朝来说是不太现实的. 而且购买完证书以后, 客户端需要手动安装, 这个对不同的用户来说也是不太容易实现的.
但是对于一些安全性要求很高的业务来说, 客户端认证还是有必要的, 比如银行的网上银行就采用了客户端证书.

2. HTTP CHUNK分块传输

HTTP协议之chunk编码(分块传输编码)

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由应用服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。

通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。通常数据块的大小是一致的,但也不总是这种情况。

3. HTTP协议(HyperText Transfer Protocol)

通过HTTP或者HTTPS协议请求的资源由统一资源标识符来标识,以发布和接收HTML页面的方法为目的在互联网上广泛应用的网络协议。

HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

向指定资源位置上传其最新内容。

请求服务器删除Request-URI所标识的资源。

回显服务器收到的请求,主要用于测试或诊断。

HTTP/1.1协议中预留给能够将连接改为渠道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

假如在不考虑诸如错误或者过期等问题的情况下,若干次请求的副作用与单次请求相同或者根本没有副作用,那么这些请求方法就能够被视作“幂等”的

PUT是幂等方法,POST不是。所以PUT用于更新、POST用于新增比较合适。

HTTP协议详解

HTTP状态码

持续连接-分块传输编码

put or post?

4. http协议分块编码(Transfer-Encoding: chunked)

Transfer-Encoding,是一个 HTTP 头部字段(响应头域),字面意思是“传输编码”。最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。
分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。
具体方法
在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。
每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。
最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。

例:

Content-Encoding 和 Transfer-Encoding 二者经常会结合来用,其实就是针对 Transfer-Encoding 的分块再进行 Content-Encoding压缩。
注意 :如果最末尾 不是以0\r\n\r\n结束 的话,会导致 解析失败 (此处是一个坑!!)。

附:java解析十六进制的chunked类型报文

原文地址: https://www.cnblogs.com/xuehaoyue/p/6639029.html

5. HTTP——报文和实体

本文为《图解HTTP》第三章摘录+总结。
HTTP报文本身是由多行数据构成的 字符串文本 ,由报文首部和报文主体构成,并不一定要有报文主体。首部是请求或响应的内容及属性,主体是应被发送的数据。
首先弄清两个概念, 报文 实体 。可将报文看作传输中的“箱子”,而实体是“箱子”里的“货物”,即我们真正想要传送给对方的东西本身,也就是数据。实体由实体首部和实体主体构成,实体首部主要是一些有关实体主体的描述性信息。

在实际中,通过编码来提升传输的速率。有两种编码方式:压缩传输的内容和分块传输。
HTTP协议中有一种被称为内容编码的功能可以对实体信息进行压缩,压缩后的实体由客户端接收并进行解码。
在传输大量内容时,通过把数据分割成多块,让浏览器逐步显示。这种编码方式被称为分块传输编码。

HTTP协议中采用 多部分对象集合 (Multipart)的方法,来容纳多份不同的类型的数据。发送的一份报文可含有 多类型实体 。通常是在图片或文本文件等上传时使用。Multipart集合包含的对象有:

首部字段Range用来指定资源内的byte范围。而使用了Range发送的请求被称为 范围请求 ,即只请求某个资源的一部分。用于应对网络中断的情况,可以从中断处继续加载,而不是从头开始。
针对范围请求,响应会返回状态码为206 Partial Content的响应报文。另外,对于多重范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。
如服务器无法响应范围请求,则返回状态码200 OK和完整的实体内容。

同一个web网站可能存在多份相同内容的页面,例如英文版和中文版。当浏览器的默认语言为英语或中文时,web页面对应显示相应语言。这样的机制称为内容协商。内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。
包含在请求报文中的某些首部字段就是判断的基准:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。

内容协商技术有3种类型:

6. 什么是HTTP协议响应流

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

第二部分:消息报头,用来说明客户端要使用的一些附加信息

第二行和第三行和第四行为消息报头,

Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1

第三部分:空行,消息报头后面的空行是必须的

第四部分:响应正文,服务器返回给客户端的文本信息。

空行后面的html部分为响应正文。

7. http能传输500g的文件吗

可以。早期互联⽹上传输的基本上都是只有⼏ K ⼤⼩的⽂本和⼩图⽚,现在的情况则⼤有不同。⽹页⾥包含的信息实在是太多了,随随便便⼀个主页 HTML 就有可能上百 K,⾼质量的图⽚都以 M 论,更不要说那些电影、电视剧了,⼏ G、⼏⼗ G 都有可能。
数据压缩
浏览器在发送请求时都会带着 Accept-Encoding 头字段,⾥⾯是浏览器⽀持的压缩格式列表,例如 gzip、deflate、br 等,这样服务器就可以从中选择⼀种压缩算法,放进 Content-Encoding 响应头⾥,再把原数据压缩后发给浏览器。如果压缩率有 50%,那么 100k 的数据压完之后只剩 50k,相当于在带宽不变的情况下⽹速快了⼀倍。
分块传输
除了压缩⽂件之外,另⼀种办法就是分块传输。它们的原理差不多,都是把⼤⽂件变⼩传输。分块传输会把⼀个⼤⽂件切成很多⼩块,把这些⼩块依次发给浏览器,浏览器收到之后再组装复原。这样浏览器和服务器都不⽤在内存中保存全部⽂件,每次只收发⼀⼩部分,⽹络也不会被⼤⽂件长时间占⽤,内存、带宽等资源也就节省下来了。

热点内容
vbodbc连接的数据库连接 发布:2025-09-09 10:03:35 浏览:88
锐思数据库 发布:2025-09-09 09:59:16 浏览:736
编程车螺纹 发布:2025-09-09 09:57:18 浏览:542
苹果电脑和安卓电脑哪个办公好 发布:2025-09-09 09:46:10 浏览:355
两台服务器搭建传奇微端架设 发布:2025-09-09 09:26:58 浏览:832
我的世界哪个服务器有dream模式 发布:2025-09-09 09:18:14 浏览:937
微信清除照片缓存 发布:2025-09-09 09:12:11 浏览:309
pythonrefresh 发布:2025-09-09 09:08:23 浏览:914
手机密码锁要多少钱 发布:2025-09-09 09:02:13 浏览:412
阿里云服务器端搭建 发布:2025-09-09 08:55:17 浏览:698