写在前面:
由于工作的需要,最近一段时间对HTTP文档传输协议进行深入,本文的资料整理自网络及参考书籍,希望能够增强知识的连贯性,以后便于查询和理解,由于是初次接触本块内容,文中若有不足请各位指正。
前言:
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。
一次HTTP操作称为一个事务,其工作过程可分为四步:
- 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始;
- 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内文件的容;
- 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容;
- 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接
HTTP协议用于文件传输时,文件内容放在消息体中。作为TCP之上的流式传输协议,发送端和接收端可以对大文件进行流式的发送和接收。(流式传输:实现流式传输的方法主要有两种:实时流式传输(Realtime streaming)和顺序流式传输(progressive streaming)。流式传输时,声音、影像或动画等时基媒体由音视频服务器向用户计算机的连续、实时传送,用户不必等到整个文件全部下载完毕,而只需经过几秒或十数秒传输,待数据达到一定的数量后,即可进行观看,可以大大缩短用户需要等待的时间。)
文件传输的步骤可以概括为:
- 首先确定需要传输文件的大小,消息头部的Content-Length字段表示文件的长度;
- 如果文件大小无法确定则采用分块传输的方式,将文件分成多个部分进行发送,此时在头部增加Transfer-Encoding:chunked,存在这个头部时不允许再加上Content-Length头,即使有也会被忽略。
- 原始的POST请求消息体中是URL编码后的表单,格式为key=value,不同的key、value之间用&分隔。上传二进制的文件时,可以用multipart/form-data的方式。
- 支持断点续传与多线程传输,这里仍然是采用分块传输的思想:如果传输中途终端,接下来可以从中断的地方重新开始避免从头开始的浪费,在多线程程序中,各个线程可以分别负责传输一个文件块,然后将他们合并恢复成为原始文件。
写到这里,太上皇对分块传输编码的方案感到迷惑,现在就去查一下相关的资料吧。
https://baike.baidu.com/item/%E5%88%86%E5%9D%97%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81/8359216?fr=aladdin
前面所述的方案为HTTP文档的传输方案,而在实际设备应用中,很多是利用API接口对文件进行传输。在API接口中,Socket(套接字)起到重要的作用。对于API接口文档传输的方案在下一篇文档中进行详细介绍。