添加了一点老师上课提及但没有讲解的概念
初识
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):目前流行的一种互联网软件架构风格,它结构清晰、符合标准、易于理解、扩展方便。
- 每一个URL代表一种资源
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过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。