zhangzheng-zz / blog

1 stars 0 forks source link

http相关 #18

Open zhangzheng-zz opened 3 years ago

zhangzheng-zz commented 3 years ago

https://juejin.cn/post/6974529351270268958#heading-26

code

200 成功 301 永久重定向 302 临时重定向 304 资源未被修改 服务端不返回资源 客户端访问缓存资源 404 资源未被修改 资源找不到 403 无权限 服务端拒绝访问 500 服务端内部错误 504 网关超时 代理服务器未及时从远端服务器获取请求

Methods

get、post、head(获取报头)、put(更新)、delete、options(预检)

Request headers

accept 可接受数据格式 accept-encoding 可接受算法 gzip accept-language: 可接收的语言 zh-CN content-type: 发送数据的格式 application/json、formdata cookie: 接收到的cookie(服务端返回给浏览器Set-Cookie,并设置了超时,浏览器携带到请求头发送出去,存储用户信息,消耗内存,可被js更改,存储小4KB) eg: cookie session token jwt User-Agent: 用户浏览器信息,前端经常用到 host: 请求发去的原始主机(域名)和端口 origin: 请求来自于哪个站点域名加协议(CORS跨域请求) referer: 告诉服务器页面原始URI 协议+域名+查询参数

Response headers

content-type: 返回数据的格式 content-length: 返回数据的大小 字节 content-Encoding: 返回数据的压缩算法 gzip set-cookie: 服务端向客户端设置 cookie Access-Control-Allow-Origin: 服务端允许来自哪个域的请求( CORS跨域请求) Access-Control-Allow-Headers: 预检请求中,告诉浏览器正式需要携带的头部( 不被低版本浏览器识别) connection: keep-alive http2 一次TCP连接不断开

强缓存与协商缓存

强缓存:

根据 expires(http1.0) 和 cache-control(http1.1) 判断缓存是否过期,不过期直接取缓存。 expires: 服务端返回一个资源过期时间 cache-control: 服务端返回一个资源过期时间(max-age = 31536000) no-cache(不缓存,走服务端)no-store(不缓存也不暂存)private(只允许终端用户缓存)public(允许浏览器、代理、路由缓存)

强缓存的 expires 浏览器与服务器时间差距大时有误差 cache-control > expires

协商缓存:

强缓存命中失败后走协商缓存,协商缓存是一种服务端缓存策略。 两个资源标识: Last-Modified: 服务端返回的资源上次修改时间,浏览器存储到 If-Modified-Since Etag: 服务端返回的资源文件tag,浏览器存储到 If-None-Match 根据标识判断资源是否发生改变,是返回 304 并读取缓存,否则 返回 200。

协商缓存 Last-Modified 精确到秒级,资源频繁变动或者修改后资源不变有缺点。Etag 精确标识资源实际变动。

跨域

同源限制:

如果没有同源限制,A网站是登录状态,B网站可以直接诱导用户打开并向A发送请求获得数据(CSRF),不安全。 script link img 不受到同源限制。

跨域处理:

1、jsonp 利用 script 不受同源限制,缺点只能处理 get 请求

function jsonp ({url, params, cbName}) {
    return new Promise((resolve) => {
       const script = document.createElement('srcipt')
       window[cbName] = function(data) {
        resolve(data)
        document.body.removeChild(script)
       }
       const a = []
       const p = { ...params, cbName }
       for (key in p) {
          a.push(`${key}=${p[key]}`)
       }
       script.src = `${url}?${a.join(',')}`
       document.body.appendChild(script)
    })
}

// 使用
jsonp({
    url:'www.baidu.com',
    params: { key: 1 },
    cbName: 'show'
}).then(res => {
    console.log(res)
})

2、CORS 最常用 简单请求:

复杂请求: OPTIONS 预检请求 服务端指定 Access-Control-Allow-Headers (正式请求包含的参数) Access-Control-Allow-Origin (允许哪个源跨域) Access-Control-Allow-Methods (请求方法等)

3、node 中间件代理 4、nginx 反向代理 5、postmessage 通信 6、websocket 双向通信

TCP/UDP

OIS七层结构:物理层、数据链路层、传输层、网络层、会话层、表示层、应用层 TCP/UDP五层结构:链路层(二进制、数据帧)、网络层(数据包IP)、传输层(TCP/UDP端对端)、应用层(HTTP、SMTP、FIP) TCP: 面向连接(三次握手)、可靠传输、顺序发送、按序到达、重发机制、流量控制(滑动串窗口)、拥塞控制 UDP: 无连接、不可靠传输、高速传输、实时性。广播、直播。

三次握手:

zhangzheng-zz commented 3 years ago

长连接

http1.0 不支持,一次TCP处理一次http请求应答 http1.1 一个TCP连接可以处理多个http请求 优点是处理时间快,减少内存CPU消耗,缺点是长时间保持连接也是消耗,队头阻塞。

优化

客户端 Connection: close 关闭长链接。服务端判断TCP状态或者设置超时。

管道化

建立在长连接上(GET、HEAD),一个请求发出后可以不等响应就发送下一个请求,响应还是按顺序返回,同样会造成队头阻塞。 优化:并发连接,域名分片可以并发多个TCP。

代理

正向代理工作在客户端:缓存,屏蔽,代理访问,用户授权。 反向代理工作在服务端:服务端缓存,负载均衡,日志,金丝雀发布。

https

对称加密:DES 3DES AES 私钥加解密 非对称加密:RSA DSA 公钥加密私钥解密 摘要算法:MD5 SHA1 输出128/160位的串

TSL 四次握手

C1: 请求 TSL版本套件信息 S2: 返回 公钥 + CA证书(身份信息加公钥)+ TSL信息 C3: CA 较验公钥, 成功之后利用公钥加密一串随机数(对称私钥) S4: 利用私钥解密出随机数,得到 对称私钥 finish 之后通信都利用对称私钥加密

对称加密的问题是私钥容易泄露 非对称加密的问题是公钥派发容易泄露被篡改,消耗时间。 对称+非对称+CA

CA 保证公钥派发的准确性。即使公钥被拦截到了,篡改后的无法通过客户端校验(C3)。 C3 客户端利用CA的公钥解密派发的公钥。由于三方不知道CA的私钥,所以伪造不了派发的公钥。

zhangzheng-zz commented 3 years ago

TCP/UDP

OIS七层结构:物理层、数据链路层、传输层、网络层、会话层、表示层、应用层 TCP/UDP五层结构:链路层(二进制、数据帧)、网络层(数据包IP)、传输层(TCP/UDP端对端)、应用层(HTTP、SMTP、FIP) TCP: 面向连接(三次握手)、可靠传输、顺序发送、按序到达、重发机制、流量控制(滑动串窗口)、拥塞控制 UDP: 无连接、不可靠传输、高速传输、实时性。广播、直播。

三次握手:

zhangzheng-zz commented 3 years ago

拥塞控制

拥塞窗口:一次性能够发送的数据包多少的窗口 指数增长:2、4、8 递增:1、2、3 拥塞控制:网络出现阻塞、丢包时,控制和传输数据包的策略。 阈值:达到阈值后出现拥塞避免(递增) 发送数据包的拥塞控制流程:

zhangzheng-zz commented 2 years ago

HTTP2: 1、二进制和流传输,头部和请求体都是二进制。请求体在 http1 也可以是二进制,例如图片文件。 2、多路复用,标记二进制序列,收到响应时重组,解决了http管线化的队头阻塞。 3、头部压缩 4、服务器推送

头部压缩: 静态字典表:一个字节表示一个键值对,一个字节表示一个键 动态字典表:根据需要更新 无记录的就哈夫曼编码

服务器推送 vs websocket server push 是推送到浏览器缓存的(如果浏览器有缓存那就是浪费,还是优先使用缓存),websocket 是与 web app 的全双工通信。