美文网首页
HTTP深入讲解

HTTP深入讲解

作者: vinterx | 来源:发表于2019-05-14 00:28 被阅读0次

    一、HTTP简介

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于在万维网(WWW:World Wide Web )上服务端和客户端之间传送数据的协议。

    二、HTTP历史

    HTTP 建立之初,主要是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的 WEB 服务器上,用户端通过浏览器访问url地址来获取网页的显示内容,但是到了 WEB2.0 以来,我们的页面变得复杂,不仅仅单纯的是一些简单的文字和图片,同时我们的 HTML 页面有了 CSS,Javascript,来丰富我们的页面展示,当 ajax 的出现,我们又多了一种向服务器端获取数据的方法,这些其实都是基于 HTTP 协议的,于是前后端逐渐分离。到了移动互联网时代,我们页面可以跑在手机端浏览器里面,但是和 PC 相比,手机端的网络情况更加复杂,这对HTTP请求有了更高的要求,因此在不断的优化与完善。


    image.png

    HTTP/0.9(1990)

    HTTP/0.9 是个相当简单的协议。它只有一个方法(GET),请求和响应没有首部,其设计目标只是获取 HTML格式字符串(没有图片,只有文本)。

    HTTP/1.0(1996)

    相对于HTTP/0.9增加了大量的内容,建立了现代HTTP的基本架构,如今被大家受熟悉。

    • 增加了首部,除了请求数据体部分,传输还需携带头部信息(请求和响应头)
    • 支持多种格式传输,如:图片、视频、二进制文件等
    • 增加响应码(status code)
    • 支持重定向
    • 增加了POST和HEAD请求方法
    • 多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等

    相对于 0.9 版本来说,HTTP/1.0 是一个巨大的飞跃,但仍存在很多瑕疵,主要是每次TCP的建立都只能发送一个请求,数据响应完毕就关闭连接,由于客户端和服务端每次连接都要三次握手,所以每次发送一个请求,开始都是比较耗费时间,发送速率比较慢。其次缺少强制的 Host 首部,并且缓存的选择也相当简陋,主要是Expires强缓存、Last-Modified/If-Modified-Since协商缓存这两种。

    HTTP/1.1(1999)

    HTTP/1.1是当前主流的HTTP协议版本,相比1.0版本主要有以下的特点

    • 支持持久连接:connection:keep-alive,默认支持打开的,即客户端和服务端建立一次连接,可以被多个请求复用。客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。

    • 管道机制(pipelining):即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

    • Content-length字段扩充:Content-length表示HTTP消息实体的传输长度,即经过压缩后传输的实体长度(如gzip压缩等),如果响应为204(不返回实体),304(使用协商缓存内容),head请求(没有实体返回)则直接忽略掉消息实体内容。其次如果有\color{red}{Transfer-Encoding}(Transfer-Encoding: chunked),则不会有Content-length,有也会忽略掉。HTTP1.0不支持长连接,所以Content-length可有可无,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了。但是HTTP1.1版本则\color{red}{content-length和Transfer-Encoding必须是二选一},因为HTTP1.1一个TCP连接可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。

    Content-Length: 1024
    

    上面代码告诉客户端,本次回应的长度是1024个字节,后面的字节就属于下一个回应了。

    • 分块传输编码:对于一些很耗时的动态操作,服务器需要等到所有操作完成,才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)即Transfer-Encoding: chunked。

    • 新增请求方法:PUT、PATCH、HEAD、 OPTIONS、DELETE。

    • 客户端请求头新增Host字段:用来指定服务器的域名,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求头增加Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

    • 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag(Etag),If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

    • 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

    不足:1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为\color{red}{队头堵塞}(Head-of-line blocking)。为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。

    HTTP/2(2015)

    HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。

    • HTTP/2 的头信息是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
    • HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一 一对应,这样就避免了"队头堵塞"。
    • HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。
    • HTTP协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
    • HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。服务端接收到客户端主请求(如html页面等),并将主请求的依赖资源(图片,css,js等),在响应主请求的同时,主动并发推送依赖资源至客户端。具体参考浏览器缓存机制的深入解析 Push Cache。

    HTTP/3(暂未发布)

    三、参考链接

    [HTTP协议入门](http://www.ruanyifeng.com/blog/2016/08/http.html

    相关文章

      网友评论

          本文标题:HTTP深入讲解

          本文链接:https://www.haomeiwen.com/subject/hbbhaqtx.html