“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
作为一个前端人员,熟悉http网络的知识可以说是一项必不可少的技能了,http1.1到http2.0里面有很多的新特性,但是平时在使用的过程中并没有很好的进行总结,甚至有些点自己还没有实践过,在春招面试的过程中还真就给问到了,自己当然是把自己熟悉的地方重拳出击了,但是没有实践过的点在回答的过程中还是唯唯诺诺的,那么今天就来复盘一下自己知道的一些http,顺便动手实践一下。
在开始前,我们先梳理一下我们的理论知识,然后再一个个进行实践操作:
http1.1
- 长连接
- 缓存处理
- 带宽优化以及网络连接的使用
- host头处理-域名分片
- 错误通知的管理
http1.1
简单的开启一个服务器
1.长链接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以
传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-
alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
2.缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多
的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存
头来控制缓存策略。
强缓存
简单的修改下我们的服务器
我们知道,强缓存主要是通过http请求头中的Cache-Control和Expire两个字段控制。Expire是HTTP1.0标准下的字段,在这里我们可以忽略。我们重点来讨论的Cache-Control这个字段。
一般,我们会设置Cache-Control的值为“public, max-age=xxx”,表示在xxx秒内再次访问该资源,均使用本地的缓存,不再向服务器发起请求。这里的public是指中间服务器还可以缓存(设置为private则不行)。
很显然实践成功,接着我们再来看看协商缓存。
协商缓存
协商缓存,有ETag和Last-Modified两个字段。那当这两个字段同时存在的时候,以ETag优先
(这个可以自己修改)
我们开放一个公共资源区,然后设置强缓存失效,那么访问我public资源的时候就会直接走协商缓存了,当我文件没有变化的ETag不会改变(ETag是通过文件的hash计算得到),那么就会使用协商缓存,否则则会请求新的东西。
第一次请求
第二次请求--啥也不改变
第三次请求---改变index.html的内容
可以注意到只有我们改变了文件,我们的last-modify(根据我最后改变的时间来)和ETage才会改变,才会走200请求新的资源。这里的Etag就对应请求头中的If-none-mathch。
3.带宽优化以及网络连接的使用
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来
了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码
是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
具体实践点击这里http1.1带宽优化以及网络连接的使用。
4.host头处理-域名分片
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名
(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机
(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息
都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
这里不知道具体的实践是什么样子的,希望大佬可以补充下。
4.错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;
410(Gone)表示服务器上的某个资源被永久性的删除。