Open zhangzheng-zz opened 3 years ago
http1.0 不支持,一次TCP处理一次http请求应答 http1.1 一个TCP连接可以处理多个http请求 优点是处理时间快,减少内存CPU消耗,缺点是长时间保持连接也是消耗,队头阻塞。
客户端 Connection: close 关闭长链接。服务端判断TCP状态或者设置超时。
建立在长连接上(GET、HEAD),一个请求发出后可以不等响应就发送下一个请求,响应还是按顺序返回,同样会造成队头阻塞。 优化:并发连接,域名分片可以并发多个TCP。
正向代理工作在客户端:缓存,屏蔽,代理访问,用户授权。 反向代理工作在服务端:服务端缓存,负载均衡,日志,金丝雀发布。
对称加密:DES 3DES AES 私钥加解密 非对称加密:RSA DSA 公钥加密私钥解密 摘要算法:MD5 SHA1 输出128/160位的串
C1: 请求 TSL版本套件信息 S2: 返回 公钥 + CA证书(身份信息加公钥)+ TSL信息 C3: CA 较验公钥, 成功之后利用公钥加密一串随机数(对称私钥) S4: 利用私钥解密出随机数,得到 对称私钥 finish 之后通信都利用对称私钥加密
对称加密的问题是私钥容易泄露 非对称加密的问题是公钥派发容易泄露被篡改,消耗时间。 对称+非对称+CA
CA 保证公钥派发的准确性。即使公钥被拦截到了,篡改后的无法通过客户端校验(C3)。 C3 客户端利用CA的公钥解密派发的公钥。由于三方不知道CA的私钥,所以伪造不了派发的公钥。
OIS七层结构:物理层、数据链路层、传输层、网络层、会话层、表示层、应用层 TCP/UDP五层结构:链路层(二进制、数据帧)、网络层(数据包IP)、传输层(TCP/UDP端对端)、应用层(HTTP、SMTP、FIP) TCP: 面向连接(三次握手)、可靠传输、顺序发送、按序到达、重发机制、流量控制(滑动串窗口)、拥塞控制 UDP: 无连接、不可靠传输、高速传输、实时性。广播、直播。
TCP一次发送丢包触发重传,服务端接收到重传的信号即刻建立连接,传输完数据关闭连接。如果丢失包再次发到服务端会导致其等待。
因为需要等待服务端传输完数据才能通知客户端,如果中间两次挥手合并为一次,会导致客户端长时间等待以为没有收到断开连接的信息。
发送端根据接收端缓存区的大小控制应该发送多少数据。 eg. 具体依赖滑动窗口,比如在三次握手之后,接收端发送端分别初始化200个字节的窗口, 发送端发送了100字节,但是接收端只能处理40个字节,剩下的60字节会被放到缓存区,这时候,接收端将窗口缩小到140个字节并通过ACK通知发送端,发送端同时将窗口缩小至140个字节。
拥塞窗口:一次性能够发送的数据包多少的窗口 指数增长:2、4、8 递增:1、2、3 拥塞控制:网络出现阻塞、丢包时,控制和传输数据包的策略。 阈值:达到阈值后出现拥塞避免(递增) 发送数据包的拥塞控制流程:
HTTP2: 1、二进制和流传输,头部和请求体都是二进制。请求体在 http1 也可以是二进制,例如图片文件。 2、多路复用,标记二进制序列,收到响应时重组,解决了http管线化的队头阻塞。 3、头部压缩 4、服务器推送
头部压缩: 静态字典表:一个字节表示一个键值对,一个字节表示一个键 动态字典表:根据需要更新 无记录的就哈夫曼编码
服务器推送 vs websocket server push 是推送到浏览器缓存的(如果浏览器有缓存那就是浪费,还是优先使用缓存),websocket 是与 web app 的全双工通信。
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 请求
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: 无连接、不可靠传输、高速传输、实时性。广播、直播。
三次握手:
为什么不能两次
TCP一次发送丢包触发重传,服务端接收到重传的信号即刻建立连接,传输完数据关闭连接。如果丢失包再次发到服务端会导致其等待。
四次挥手:
为什么不是三次挥手
因为需要等待服务端传输完数据才能通知客户端,如果中间两次挥手合并为一次,会导致客户端长时间等待以为没有收到断开连接的信息。
流量控制
发送端根据接收端缓存区的大小控制应该发送多少数据。 eg. 具体依赖滑动窗口,比如在三次握手之后,接收端发送端分别初始化200个字节的窗口, 发送端发送了100字节,但是接收端只能处理40个字节,剩下的60字节会被放到缓存区,这时候,接收端将窗口缩小到140个字节并通过ACK通知发送端,发送端同时将窗口缩小至140个字节。