HTTP实用指南|青训营

64 阅读8分钟

添加了一点老师上课提及但没有讲解的概念

初识

HTTP(Hyper Text Transfer Protocol)超文件传输协议,超文件意为可以传输多种题材,比如说HTML,CSS等等,HTTP是应用层协议,基于TCP协议。TCP是以太网协议和IP协议的上层协议,也是应用层协议的下层协议,最底层的以太网(Ethernet)规定了电子型号如何组成数据包(packet),解决了子网内部的点对点通信。

每一个HTTP协议都会分成请求和响应两个部分

HTTP无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。

每一个请求都是孤立的,不知道之前的请求携带过什么信息,所以是无状态的。当然在后面的发展中,我们会想方法让这些请求带上一些信息

HTTPS(Hyper Text Transfer Protocol Secure),经过了TSL/SSL加密

提到加密就要提到对称加密和非对称加密:加密分为两端,浏览器端和服务器端 对称加密:加密和解密都是使用同一个密钥; 非对称加密:加密和解密需要使用两个不同的密钥:公钥和私钥

协议分析

发展

HTTP/0.9单行协议:请求由单行指令构成,以唯一可用方法 GET 开头,只有HTML文件可以传送

HTTP/1.0构建可扩展性:

HTTP/1.1标准化协议

HTTP/2:

  • HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。实际上它们被划分为帧,帧是HTTP/2最小的通信单位,以二进制编码的形式进行传送
  • 帧可以交错发生,接收方进行重组织,把与逻辑请求或响应消息对应的完整的一系列帧称为消息,已建立的连接内的双向字节流可以承载一条和多条消息,称为数据流
  • 这是一个多路复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。
  • 每一个连接都是永久的不需要像HTTP/1一样建立新的连接,仅需要每个来源一个连接
  • 压缩了标头。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
  • 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。

HTTP/3草案

GET请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据
POST用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
PUT用请求有些荷载替换目标资源的所有当前表示
DELETE删除指定的资源
HEAD请求一个与GET请求的响应相同的响应,但没有响应体
CONNECT建立一个到由目标资源标识的服务器的隧道
OPTIONS用于描述目标自动的通信选项
TRACE沿着到目标资源的路径执行一个消息环回测试
PATCH用于对资源应用部分修改

其中GET、HEAD、OPTIONS不会修改服务器数据的方法,它们是安全的;GET、HEAD、OPTIONS、PUT、DELETE同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的,所有safe的方法都是Idempotent(幂等)的

状态码

状态码的设计都是以三位来表示,不同的开头,每一个阶段都有不同的含义。

  • 1xx:指示信息,表示请求已计数,继续处理
  • 2xx:成功,表示请求已经被成功接收、理解、接受;200 OK——客户端请求成功
  • 3xx:重定向,要完成请求必须进行更进一步的操作;301——资源(网页等)被永久转移到其他URL;302——临时跳转
  • 4xx:客户端错误,请求有语法错误或请求无法实现;401——请求未经授权;404 Unauthorized——请求资源不存在,可能是输入了错误的URL
  • 5xx:服务器端错误,服务器未能实现合法请求;500——服务器内部发生了不可预期的错误;504 Gateway Timeout——网关或者代理的服务器无法早规定的事件内获得想要的响应

REST(Representational State Transfer):目前流行的一种互联网软件架构风格,它结构清晰、符合标准、易于理解、扩展方便。

  1. 每一个URL代表一种资源
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过HTTP method,对服务器端资源进行操作,实现"表现层状态转化"

常用请求头

ACCEPT接收类型,表示浏览器支持的MIME类型 (对标服务端返回的CONTENT-TYPE)
Content-Type客户端发送出去实体内容的类型
Cache-Control指定请求和响应遵循的缓存机制,如no-cache
If-Modified-Since对应服务端的Last-Modified,用来匹配看文件是否变动,只能精确到1s之内
Expires缓存控制,在这个时间内不会请求,直接使用缓存,服务端时间
Max-age代表资源在本地缓存多少秒,有效时间内不会请求,而是使用缓存
If-None-Match对应服务端的ETag,用来匹配文件内容是否改变 (非常精确)
Cookie有cookie并且同域访问时会自动带上
Referer该页面的来源URL(适用于所有类型的请求,会精确到详细页面地址,csrf拦截常用到这个字段)
Origin最初的请求是从哪里发起的 (只会精确到端口)Origin比Referer更尊重隐私
User-Agent用户客户端的一些必要信息,如UA头部等

常用响应头

CONTENT-TYPE服务端返回的实体内容的类型
Cache-Control指定请求和响应遵循的缓存机制,如no-cache
Last-Modified请求资源的最后修改时间
Expires应该在什么时候认为文档已经过期,从而不再缓存它
Max-age客户端的本地资源应该缓存多少秒,开启了Cache-Control后有效
ETag资源的特定版本的标识符,Etags类似于指纹
Set-Cookie设置和页面关联的cookie,服务器通过这个头部把cookie传给客户端
Server服务器的一些相关信息
Access-Control-Allow-Origin服务器端允许的请求Origin头部 (警如为*)

缓存

缓存分为强缓存和协商缓存,强缓存指的是本地有的话,直接用就好了;协商缓存要和服务端进行一个通信,这个缓存到底能不能用

那么这两个缓存有没有优先级之分呢?

首先浏览器发起一个get请求,然后去查看是否有缓存,如果强缓存是新鲜的,那就使用强缓存。否则的话就去看协商缓存

cookie中的set-cookie是服务器端为浏览器设置的,携带了名称和值的键值对,其次还有控制相关的字段,比如说这个cookie的有效期,还有路径和域名等等。

常见场景

静态资源

静态资源:使用静态网页开发技术(HTML、CSS、JavaScript)发布的资源

如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器,浏览器中内置了静态资源的解析引擎,可以解析静态资源(浏览器只能解析静态资源!)

静态资源方案:缓存+CDN+文件名hash(保证用户拿到的是最新的)

CDN(Content Delivery Network),通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务

登陆

狭义的同源就是指,域名、协议、端口均为相同。跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

跨域解决方案:

  • CORS
  • 代理服务器,同源策略是浏览器的安全策略不是HTTP的
  • Iframe,诸多不便

下一次进入页面为什么可以记住登陆态呢?

跳转后的网站为什么自动登录? SSO(single sign on)单点登录

假设访问了A站点,询问服务端是否有登录态,如果没有就需要登录,这个登录是在SSO的站点上进行登录,登录之后在SSO站点种下cookie,这个站点发起重定向请求,然后在A站点增加cookie,这个时候就可以识别登录态,进行登录。再打开B站点,查看B站点是否有登录态,然后去SSO站点,SSO站点已经登录过了,发起重定向,B站点种下cookie。