http面试简单总结

·  阅读 619

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 重定向到 某个地方

在PC端和移动端输入同一个网址https://www.taobao.com/,会出现两套不一样的项目。

代理:反向代理 正向代理

分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改