• HTTP历史脉络


    HTTP协议最早由万维网之父Tim Berners-Lee提出。

    1991.8.6日,Tim Berners-Lee在位于欧洲粒子物理研究所(CERN)的NeXT计算机上,正式公开运行世界上第一个web网站(http://info.cern.ch),建立起基本的互联网基础概念和技术体系。

    HTTP 0.9:单行协议

    1991年,Tim根据自己的实现,写了一篇关于HTTP协议的文章,这篇文章后来被看成是HTTP/0.9版本。详见:https://www.w3.org/Protocols/HTTP/AsImplemented.html

     这篇文章相当简单,只有短短的四小节:

    • 规定了HTTP使用的TCP/IP连接
    • HTTP请求只有一个请求行
    • 只有一个GET方法加上请求的URI
    • HTTP响应则直接返回HTML文本,没有状态码,所以也没有办法区分错误消息和正常的文本

    HTTP/ 1.0:快速增长和Informational RFC

    在这之后,万维网经历了十分混乱的时期。由于Tim最初版本的HTTP和HTML并不完善,无法满足各种应用场景,因此很多公司和组织在其基础上做了各种扩展,但彼此并不兼容。

    1994年,Tim离开了CERN成立了W3C组织,致力于HTML的标准化工作。同年,IEFT成立了HTTP工作组(HTTPWorkingGroup:HTTP-WG),研究改进HTTP协议。

    一直到1996年5月发布了RFC1945,这就是现在的HTTP/1.0。

    HTTP/1.0在0.9的基础上做了大量的扩充和改进:

    • 请求和响应支持头域
    • 响应对象以一个响应状态行开始
    • 响应对象不只限于超文本
    • 开始支持客户端通过POST方法向web服务器提交数据,支持GET、HEAD、POST方法
    • 支持长连接(但默认还是使用短连接),缓存机制以及身份认证

    但同时,HTTP/1.0也存在不足,由于每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。所以,TCP连接的新建成本很高,版本性能比较差。

    HTTP/1.1:Internet标准

    与HTTP/1.0相比,拥有以下特点:

    1)引入了持久连接:

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

    2)引入了管道机制:

    即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。

    3)将Content-length字段的作用进行扩充:

    即声明本次回应的数据长度(一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的)。

    4)采用分块传输编码:

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

    5)新增动词方法PUT、PATCH、HEAD、OPTIONS、DELETE。另外客户端请求的头信息新增了Host字段,原来指定服务器的域名。

    虽然1.1版本允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头阻塞”(Head-of-line blocking)。

    为了避免这个问题,只有两种方法:i)减少请求数 ii)同时多开持久连接

    这导致了很多网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片等等。如果HTTP协议涉及得更好一些,这些额外的工作是可以避免的。

    HTTP/2:提高传输性能

    HTTP2主要目标在于提高传输性能,实现低延迟和高吞吐量。

    HTTP2至今无法普及的一个内在原因:HTTP/2协议本身并不要求必须加密传输,它可以基于TLS实现加密传输(HTTP/2 over TLS:h2),也可以使用明文传输(HTTP/2 without TLS:h2c),然而出于推广https的需要以及一些技术上的考虑,目前所有的浏览器都不支持h2c。

    所以如果要支持HTTP/2,必须基于TLS来部署,这也在一定程度上限制了HTTP/2的普及。

    想要了解HTTP/2的特点,可以参看这篇文章:https://hpbn.co/http2/

    为什么是HTTPS?

    一个完整的https的请求过程:

  • 相关阅读:
    JS 可选链操作符?. 空值合并运算符?? 详解,更精简的安全取值与默认值设置小技巧
    手写一个 Promise
    Leetcode 403 青蛙过河 DP
    Leeetcode 221 最大正方形 DP
    Leetcode 139 单词拆分
    Unity周记: 2021.07.26-08.15
    Unity周记: 2021.07.19-07.25
    Unity周记: 2020.07.12-07.18
    Unity周记: 2020.07.05-07.11
    线性规划
  • 原文地址:https://www.cnblogs.com/i-hard-working/p/11148897.html
Copyright © 2020-2023  润新知