这是我参与「第四届青训营 」笔记创作活动的的第8天,对 HTTP 相关知识学习与总结。
了解 Web 与网络基础
网络基础 TCP/IP
通常使用的网络是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于它内部的一个子集。
按协议分为4层:应用层、协议层、网络层和数据链路层。
DNS
DNS 服务是和 HTTP 协议一样位于应用层的协议。提供域名到 IP 地址之间的解析服务
TCP
TCP 位于传输层,提供可靠的字节流服务。
字节流服务:为了方便传输,将大块数据分割成报文段为单位的数据包进行管理。
可靠的传输服务:能够把数据准确地传给对方(三次握手策略)。
IP
IP 网际协议位于网络层。IP的作用是把各种数据包传送给对方。
条件是知道 IP 地址和 MAC地址,可以通过ARP协议实现。
ARP是一种用于解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
HTTP 的发展
HTTP 0.9
HTTP问世之初并没有作为标准建立,被正式制定为标准是在1996年公布的HTTP/1.0协议。因此,在这之前的协议被称为HTTP/0.9。 request只有一行且只有一个GET命令,命令后面跟着的是资源路径。
GET /index.html
reponse仅包含文件内容本身
<html>
<body>HELLO WORLD!</body>
</html>
HTTP 1.0
1996年5月HTTP/1.0诞生,被正式定义为标准。其内容和功能都大大增加了。对比与HTTP/0.9,新的版本包含了以下功能:
- 在每个 request 的 GET 一行后面添加版本号
- 在 response 第一行中添加状态行
- 在 request 和 response中添加header的概念
- 在 header 中添加 content-type 以此可以传输任意类型的文件
- 在 header 中添加 content-encoding 来支持不同编码格式文件的传输
- 引入了 POST 和 HEAD 命令
- 支持长连接(默认短连接)
GET /index.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK //状态行
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html;charset=utf-8 // 类型,编码。
<HTML>
A page with an image
<IMG src="/image.gif">
<HTML>
存在的主要缺点:
队头阻塞(Head-of-Line Blocking,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接默认是短连接,即每个HTTP请求都要使用TCP协议通过三次握手和四次挥手实现- 仅定义了16种状态码
HTTP 1.1
只比 HTTP/1.0 晚了半年,是对其的进一步完善,一直到今天都是最流行的版本。 对比之前的版本,其主要更新如下:
- 可以重复使用连接(keep-alive),从而节省时间,不再需要多次打开才能显示嵌入在单个原始文档中的资源
- 添加了Pipeline,这允许在第一个请求的答案完全传输之前发送第二个请求这降低了通信的延迟
- chunked机制,分块响应
- 引入了额外的缓存控制机制
- 引入了内容协商,包括语言、编码和类型,客户端和服务器现在可以就交换哪些内容达成一致
- 由于
Host标头,从同一 IP 地址托管不同域的能力允许服务器搭配
同时在 HTTP/1.0的基础上又增加了5种请求方法,所以HTTP/1.1一个支持下面这8种请求方法
存在的主要缺点:
- 高延迟,带来页面加载速度的降低,(网络延迟问题只要由于队头阻塞,导致宽带无法被充分利用)
- 无状态特性,带来巨大的Http头部
- 明文传输,不安全
- 不支持服务器推送消息
具体可以参考这篇http/1.1
HTTP 2
谷歌在 2010 年代初实施了一个实验性协议 SPDY。鉴于SPDY的成功,HTTP/2也采用了SPDY作为整个方案的蓝图进行开发。HTTP/2 于 2015 年 5 月正式标准化。
主要改进:
- 采用多路复用降低延迟
- 请求优先级,避免多路复用带来的关键请求阻塞
- header 压缩
- 基于 HTTPS 的加密协议传输,大大提高了传输数据的可靠性
- 服务端推送
存在的主要缺点:
-
TCP以及TCP+TLS建立连接的延迟(握手延迟)
-
http2.0中TCP的队头阻塞依然没有彻底解决,连接双方的有任一个数据包丢失,或任一方的网络中断,整个TCP连接就会暂停,丢失的数据包需要被重新传输,从而阻塞该TCP连接中的所有请求,反而在网络较差或不稳定情况下,使用多个连接表现更好。
HTTP 3
在限定条件下,TCP下解决队头阻塞的问题相当困难,但是随着互联网的爆炸式发展,更高的稳定性和安全性需要得到满足,谷歌在2016年11月国际互联网工程任务组(IETF)召开了第一次QUIC(Quick UDP Internet Connections)工作组会议,制定的一种基于UDP的低时延的互联网传输层协议,HTTP-over-QUIC于2018年11月更名为HTTP/3。
HTTP 报文
用于 HTTP 协议交互的信息称为 HTTP 报文。
HTTP 报文的结构
响应报文和请求报文的结构
常见的请求头
常见响应头
HTTP 缓存
我们认为浏览器存在一个缓存数据库,用于储存一些不经常变化的静态文件(图片、css、js等)。我们将缓存分为强制缓存和协商缓存。
两类缓存机制可以同时存在,强制缓存的优先级高于协商缓存,当执行强制缓存时,如若缓存命中,则直接使用缓存数据库数据,不在进行缓存协商。
强缓存
当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。
协商缓存
又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务端验证是否失效(新鲜),如果没有失效服务端会返回304,此时客户端直接从缓存中获取所请求的数据,如果标识失效,服务端会返回更新后的数据。
缓存的优点
- 减少了冗余的数据传递,节省宽带流量
- 减少了服务器的负担,大大提高了网站性能
- 加快了客户端加载网页的速度 这也正是HTTP缓存属于客户端缓存的原因。
总结
完整流程:
参考链接
HTTP史记 - 从HTTP/1到HTTP/3
《图解 HTTP》
《青训营- HTTP 实用指南》
Http系列(-) Http发展历史
HTTP----HTTP缓存机制
(建议精读)HTTP灵魂之问,巩固你的 HTTP 知识体系