http 即超文本传输协议。
网络7层模型:xx xx xx xx xx
应用层:http
传输层:tcp udp
超文本传输协议
考点:三次握手,四次挥手
http相对于tcp来说,就是多了一些头,学习http就是学习头。
管线化:同时可以发送N个请求
http分请求与响应:
请求:
请求行, GET / HTTP/1.1
请求头, 非常多
请求正文,是扔给服务器的数据
响应:
响应行, HTTP/1.1 200 OK
响应头,非常多
响应正文,服务器扔给客户端数据
http状态码:
1xx 101 双向通信 websocket
2xx 200 成功 204 没有响应体 206 断点续传
3xx 301 永久重定向 302 临时重定向 304 缓存
4xx 401 没有权限 403 登录了没有权限 404 找不到对应的资源 405请求方法不存在,不支持
5xx 502 负载均衡
请求方式:
RestfulApi
get 获取资源
post 新增资源
put 上传文件
delete 删除资源
options 只会在跨域的时间出现,或在复杂请求时出现
通过Http向服务器传输数据:
请求行 url
请求头 自定义header
请求正文
响应行 状态码
响应头 设置cookie
响应体 返回给浏览器数据
http的优化策略:压缩、缓存。
客户端要支持压缩,服务器就可以把内容压缩完后返回给浏览器,一个文件到底压不压缩,看请求头中有没有Accept-Encodeing(有的话浏览器访问时会自动压缩)。如果数据中重复性东西非常多,非常适合压缩// 音乐 电影数据 不适合使用gzip来压缩
如果服务器返回给浏览器一个文件,如果浏览器认识这个文件,就解析这个文件,如果不认识,就以下载的方式进行处理
缓存有: 强制缓存 、 对比缓存。

强制缓存: 不走网络,首页是不能设置强制缓存。一个网站的首页面是不可能走缓存的。这里说的是强制缓存
res.setHeader("Cache-Control","max-age=20")时间不到,不能访问服务器,直接走缓存。20表示时间,时间结束才会重新请求。(在这期间如果内容改变也获取不到新内容,而是获取缓存的旧内容)
// 设置响应头 20秒之内不要再访问
// res.setHeader("Cache-Control","max-age=20")
//另外一种设置方式
// res.setHeader("Expires",new Date(Date.now()+1000*20).toGMTString())
// res.setHeader("Cache-Control","no-cache"); // 还请求服务器 但是有缓存
// res.setHeader("Cache-Control","no-store"); // 还请求服务器 不缓存
// 时间设置的足够长,一直从缓存中拿数据
// res.setHeader("Cache-Control","max-age=20000000000000000000000000000000")
对比缓存:也叫协商缓存: 如果一个文件没有发生改变,走缓存,否则 走网络, res.setHeader("Cache-Control","no-cache"),访问时内容没有改变,后面就会走缓存。通过检测文件的LastModified和ifModifiedSince来判断文件内容是否改变,改变的话就走网络重新请求。这就导致了一些不足--1,文件的内容没有变化,但是修改的时间变了2,时间上不够非常精确,可能在极短的时间修改内容

摘要算法:根据内容摘要判断是否需要缓存,
// Etag是响应头
res.setHeader("Etag",Etag)
// if-none-match 当你修改服务器上的文件时,请求头上面会自动添加这个头
// console.log(req.headers['if-none-match'],"match")
// console.log(Etag)
// if-none-match: NISthsES8P9vzWjdFT/xyg== match
// console.log(req.headers['if-none-match'])
// T9hRJPsOY4/I9QhWp+NFlQ==
// 如果if-none-match存在,说明你改动服务器上的文件中的内容
// T9hRJPsOY4/I9QhWp+NFlQ==
不可逆(对于一些简单的加密后的字符,哟一些网站还是能破解)
长度是固定
const crypto = require("crypto")
let r = crypto.createHash("md5").update("123456").digest("base64")
// console.log(r) // 4QrcOUm6Wau+VuBX8g+IPg== 3*8 == 4*6
//二次加密
let r2 = crypto.createHash("md5").update(r).digest("base64")
// console.log(r2) // DIjVZpTC+zvMQW4SLBBy6w==
三次加密后基本不能破解
let r3 = crypto.createHash("md5").update(r2).digest("base64")
console.log(r3) // b4rIw1jjpLVbp5v8AbBBag==
相同的内容的摘要相同,不同内容的摘要不同 MD5加密
HTTP中的头:
请求头:
accept-encoding 告诉服务器,我接收的数据支持压缩格式
if-modified-since: 对比缓存 修改时间
if-none-match: 摘要缓存 和Etag配对使用的
user-agent: 不同设备自动带上这个头 判断什么样的设备,重定向到同的项目
响应头:
Content-Type 告诉浏览器 我给你的内容的类型
Content-Encoding 告诉浏览器 我给你的内容的压缩格式
Cache-Control 强缓 告诉浏览器,你多长时间之间,不要来访问我
Expires 强缓 告诉浏览器,你多长时间之间,不要来访问我
Last-Modified: 对比缓存 和 if-modified-since 配对使用
Etag 根据摘要做缓存 和 if-none-match 配对使用
Lotaion 重定向到 某个地方