- 1.简介
http是能够获取html、js、css、图片等资源的通讯协议,是web和服务器进行数据交换的基础;
http是一个client-server协议,请求通过一个实体发出,实体也就是用户代理,多数情况下,用户代理只浏览器;
在浏览器和服务器之间有许多设备,转发了http消息,表现在应用层的,称为代理,代理主要有以下几个作用:缓存(比如浏览器缓存)、过滤、负载均衡(让多个服务器服务不同的请求)、认证(对不同的资源进行权限管理)、日志记录(允许储存历史信息)。
http是无状态的,同一次连接中的两个执行成功的请求之间是没有联系的,使用http头部扩展,http cookie就可以解决这个问题,http将cookie添加到头部,创建一个会话让每次请求,都能共享相同的上下文,达成相同的状态。
客户端与服务器端进行交互前,必须在两者之间建立一个tcp链接,http在演变中1.0版本短连接,1.1长连接,2.0 流水线连接
- 2.http可以控制什么
缓存:文档缓存可以通过http控制,服务器端能告诉代理和客户端,哪些文档可以缓存,缓存多久。
开放同源策略:浏览器同源策略,http可以修改头部信息来开放限制。
认证:一些页面,仅让指定用户进行访问。
代理:通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。
会话:通过cookie
- 3.http流
打卡一个tcp连接(打开一个新的连接,或者重用一个之前的连接)--->发送http报文--->收到服务器端报文--->关闭连接或给下一次连接重用
- 4.基于http的api:
xmlHttpRequest、Fetch、用于user agent 和服务器端数据交互,
EventSource用于服务器端向客户端传输事件
- 5.http报文结构,首部,请求方法,上送字段意思,状态码分类
报文分为请求报文,响应报文;格式相同,请求报文包括,起始行,请求头 ,空行,请求体;
起始行包括请求方法 url http版本。请求头可以分为三组,general headers(请求报文和响应报文都可以用的头部),reques headers(例如 user-agent,accept-type referer),entity headers例如content-type content-length
请求方法 get post head put delete connet options trace patch
响应状态码分为5类:信息响应(100-199),成功响应(200-299),重定向(300-399)、客户端错误(400-499)、服务端错误(500-599)
- 6.cors跨域(跨域资源共享)
出于安全的考虑,浏览器限制从脚本内发出跨源的http请求,除非请求头中包含了正确的cors请求头。
以下需要使用跨域,脚本内发出的跨域xmlHttpReques 请求,字体的加载,webGl贴图,使用drawImage将vedio和image画到canvas;
跨域资源共享标准新增了一组http首部字段,允许服务器申明哪些源站可以访问资源。
跨域请求中某些请求 会触发cors预检请求,从而知道服务器是否允许跨域请求,若允许,才会发送http请求。
Access-Control-Allow-Origin
Access-Control-Request-Method
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
- 7.浏览器缓存
缓存是是一种保存资源副本,并在下次请求的时候直接使用资源副本。缓存分为私有缓存(即浏览器缓存)和共享代理缓存。
http缓存通常只能缓存get请求。
通过Catch-Control用来区分对缓存的支持情况。
no-store禁止缓存;
no-catch,每次发送请求会带着与本地缓存相关的验证字段,服务端会验证缓存是否过期,未过期,则返回304,则缓存才使用本地缓存;http1.0中定义Pragma,1.1定义用于兼容1.0
max-age = 2222(s)表示资源被缓存的最大时间,max-age表示距离请求发起时间
must-revalidate缓存验证确认
判断缓存是否需要更新 If-None-Match If-Modified-Since
首先判断max-age ;没有就判断expires,和date进行比较;都没有在比较Last-Modified和date,缓存寿命等于(date-last-modified)/10
Etags 作为缓存的一种强校验器,如果资源请求的响应头里含有ETag, 客户端可以在后续的请求的头中带上 If-None-Match
头来验证缓存。
Last-Modified
响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since
来验证缓存。
文档后加版本号,用于请求新的资源,加速缓存更新。
vary 用于判断是使用新的资源还是缓存文件,只有当前的请求和原始的缓存和缓存的响应头里的vary字段都相等,才可以使用缓存。