首先我们看一些基础
五层模型
从下往上
物理层
主要是定义物理设备如何传输数据
数据链路层
在通信的实体间建立数据链路连接
网络层
为数据在节点之间传输创建逻辑链路
IP 协议就是在这一层
传输层
向用户提高可靠的端到端(End-to-End)服务
传输层向高层屏蔽了下层数据通信的细节
tcp,udp就在这一层
应用层
为应用软件提供了很多服务
屏蔽网络传输相关细节
http,ftp协议在这一层
http发展历史
http/0.9
只有一个命令GET
没有header等描述数据的信息
服务器发送完毕,就关闭了tcp连接
http/1.0
增加了很多命令
增加了status code和header
多字符集支持,多部分发送,拥有了权限、缓存等功能
http/1.1
支持持久连接
pipeline
增加host和其他一些命令
(我们现在用的大部分是http1.1)
http2
所有数据以二进制方式传输
同一个连接里面发送多个请求不在需要按照顺序来
头信息压缩以及推送等提高效率的功能
http属性
http code
定义服务器对请求的处理结果
各个区间的code有各自的语义
好的http服务可以通过code判断结果
content type
text/plain
application/json
multipart/form-data
application/x-www-form-urlencoded
Cache-Control
可缓存属性
public private nocache
到期属性
max-age=< seconds>
s-maxage=< seconds>(针对代理服务的缓存)
max-stale=< seconds>
重新验证
must-revalidate
proxy-revalidate
其他
no-store
no-transform
请求流程
发送一个http请求,先看浏览器本地是否有缓存,有而且没过期就返回。如果没有缓存,看代理服务器是否有缓存,有就返回,没有才最终请求后端。
客户端—>浏览器是否有缓存–>代理服务器是否有缓存–>后端服务器
验证头
Last-Modified
上次修改时间
配合If-Modified-Since或者If-Unmodified-Since使用
对比上次修改时间以验证资源是否有必要更新
Etag
数据签名
配合If-Match或者If-Non-Match使用
对比资源的签名判断是否使用缓存
Cookie和Session
Cookie
通过Set-Cookie设置
下次请求会自动带上
键值对,可以设置多个
max-age和expires设置过期时间
Secure只有在https的时候发送
HttpOnly无法通过document.cookie访问:防止xss跨站脚本攻击。
数据协商
分为请求和返回两类
Accept
Accept-Encoding
Accept-Language
User-Agent
Content-Type
Content-Encoding
Content-Language
Content-Security-Policy
csp
作用
限制资源获取
报告资源获取越权
资源类型
connect-src manifest-src img-src font-src media-src frame-src script-src style-src
限制方式
default-src限制全局
指定资源类型:如 img-src
举例
‘Content-Security-Policy’:‘default-src ‘self’’
详细介绍:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
https
https 握手过程
1、首先客户端生成随机数,并把能够支持的加密算法发送到服务端
2、服务端也生成随机数,确认加密算法并返回给客户端(在此同时证书也传递给过去)
3、客户端又生成了随机数(现在一共生成三个随机数了),使用公钥加密生成预主密钥,并发送到服务端
4、服务端使用私钥解密出预主密钥。解密成功,使用之前生成的三个随机数和公钥生成会话秘钥传给客户端
5、客户端又用之前生成的三个随机数和公钥生成回话秘钥传给服务端,
6、他们的通讯开始,能够使用会话秘钥加密和解密数据
简单图解:
给nginx加上https:
涂掉的是证书的位置
转发原来的页面到https:
http2
优势
信道复用
分帧传输
Server Push
(server push的话可以在原来返回的代码里面添加响应头部:link:’</test.jpg>;as-image;rel=preload’加载数据之后既会服务端就会自己把数据推送过来)
nginx添加http2
在nginx里面添加http2是最方便的改变我们的传输为http2的方法,完全不需要修改别代码
只需要在server里面
listen 443后面加一个http2也就是这样:
listen 443 http2;
然后要想server_push,在server里面添加http2_push_preload on;
判断http2 的效率
https://http2.akamai.com/demo/http2-lab.html
测试这一个,点击进去,
我们可以感受http2的速度:
网页请求的过程:
从前端角度来看:
redirect的目的是看看之前是否设置了301永久跳转,是的话跳转。
然后才去读缓存,缓存读不到就dns找到域名的ip然后建立tcp连接去请求。