计算机网络
HTTP3
介绍
基于udp并封装了一层quic协议进行实现
优点
彻底解决tcp阻塞
参考文章
HTTP2
优点
- 多路复用
- 使用二进制传输
- 头部压缩
- server push
缺点
- 依然存在TCP阻塞,部分情况下可能回避HTTP1.1还慢
✍️基于HTTPS协议,但是加密是可选的
HTTP
状态码
- 1xx 信息
- 101 切换协议
- 2xx 请求成功
- 200 成功
- 204 预见请求
- 206 范围请求,如果Range和if-range 将返回206
- 3xx 重定向
- 301 永久重定向
- 302 临时重定向
- 304 存在协商缓存
- 4xx 客户端错误
- 400 客户端错误
- 401 认证失败
- 403 服务端接受到了请求,但是拒绝访问
- 404 文件不存在
- 405 请求方式错误
- 415 未知的媒体类型
- 5xx 服务端错误
- 500 服务器异常
- 502 网关错误
- 503 服务器繁忙中
- 504 服务器废了
请求方式
- GET 传输数据
- POST 向服务端发送数据
- OPTIONS 检查服务器是否支持给请求,(握手)
- PUT 发送文件
- HEAD
- DELETE
- TRACE
- CONNECT
TCP 队头阻塞
- TCP 在传输的过程中,会通过滑动窗口的形式进行拥塞控制
原因
在传输的过程中,报文可能会因为网络原因导致传输失败,可能后面的已经接收到了,而前面的发生了丢失,这时候就会把断掉的报文后面的包丢失掉,然后重新传
解决方案
- 慢开始
- 阻塞避免
- 快重传
- 快恢复
HTTPS
在HTTP的基础上,增加了TLS/SSL协议进行加密传输、身份认证网络协议,通过数字证书、加密算法(RSA)、非对称加密进行传输
对称加密
客户端和服务端都采用一样的密钥,比如DES、AES
非对称加密
客户端和服务端都采用不用的密钥,一把作为私钥,一把作为公钥,公钥加密的信息只能被私钥加密,反之,私钥加密的信息,只能被公钥解密
安全
参考文章
HTTP和HTTPS握手(浏览器)
渲染过程
- 输入网址,浏览器交给浏览器进程开始处理你输入的内容
- 执行beforeUnload实践,卸载当前页面
- 如果不是网址,则开始跳到默认搜索引擎,执行搜索
- 如果是网址,判断是否存在缓存,是的话,读取缓存并渲染,否则向服务器发送请求
- 之后把控制权交给网络进程
- 网络进程会开始执行DNS解析,获取IP地址,并开始建立连接
- 请求会发送到对方服务器,然后交给nginx进行处理(如果有负载均衡,会发送到各地对应的服务器进行处理)
- 建立连接
- HTTP连接
- 客户端发送SYN到服务器
- 服务端接收到SYN,并生成ACK,发送给客户端
- 客户端接收到服务的SYN和ACK,标志连接建立成功
- HTTPS连接
- 客户端发送支持的加密协议和版本给服务端
- Client Hello
- 服务端找到适合的加密协议
- Sever Hello
- 服务端返回证书和公钥
- 客户端使用根证书验证证书合法性,生成对称密钥,通过证书的公钥加密,发送给服务端
- 服务端使用私钥解密,获取对称密钥,使用对称密钥加密数据
- 客户端解密数据,建立SSL连接
- 客户端发送支持的加密协议和版本给服务端
- HTTP连接
- 连接建立完成后,浏览器开始读取服务器返回的数据
- 读取HTTP或者HTTPS响应的状态码
- 是否返回301和302。如果是,浏览器将读取HTTP的Location字段,执行重定向,并执行beforeUnload之后的过程
- 返回200,开始读取Content-Type字段,判断文件MIMIE类型。并根据MIMIE构建其他请求进行请求渲染
- 返回404,nginx是否有404页面或者自定义nginx404内容
- 没有:执行浏览器默认的异常
- 有:nginx返回相关数据,开始渲染
- 其他异常
- 所有数据传输完成,断开连接
- HTTP
- 客户端发送FIN=1到服务器
- 服务器接收到后,发送ACK到客户端,进入等待关闭状态,此时依然可以发送接收数据
- 服务端发送FIN=1,表示数据已经发送完成
- 客户端收到内容,断开连接
- HTTPS
- 客户端断开连接,发送close_notify
- HTTP
- 渲染过程,将交给渲染进程和GPU进程去负责
- 解析的过程,其实是根据相关语义,通过词法分析和语法分析,开始构建Token,如果不合法,将会在解析过程中抛出异常
- 解析HTML,构建DOM树
- 解析CSS,构建stylesheets(可以通过document.styleSheets查看浏览器解析好的一个CSS结构,浏览器在CSS解析的时候,是从后往前进行解析的,这样做的好处是可以更快的找到对应的DOM)
参考文章
- 合并HTML、CSS,生成render tree
- 根据生成好的render tree,计算每个节点的层级,transform等,并生成layout tree
- 浏览器执行完分层后,会开始进行光栅化,并对每个渲染区域进行分块,这里浏览器做了优化(渲染的时候,并不是全部都渲染的,由于内容过多,所以浏览器只会渲染可视区域的部分)
- 重绘Repaint:只会改变颜色,不改变位置、宽高
- 重排(回流)Reflow:元素宽高、位置发生变化
✍️重绘一定会触发回流
- 浏览器通过显卡把需要显示的内容发送给显示器,显示器读取缓存区的内容,根据逐行扫描的方式进行渲染
- 渲染完成
- 其他问题
在渲染的过程中,CSS是否会阻塞渲染,还有js?
在渲染过程中,CSS会阻塞渲染,但不会阻塞解析,应该是因为需要计算样式的原因。js一定会阻塞解析和渲染,设置了async的script会进行下载,并立即执行,defer会在dom解析的时候下载,但是会等到完成后再去执行,所以head内的js尽量不要操作dom,也不要放,不然会等js下载完成才会继续解析dom,造成白屏。
CSS的解析规则是怎样的?
CSS的解析规则是从后往前进行解析的,这样的好处就是可以最快的找到被选择的样式。如果从前往后解析,可能会导致解析到一般发现不对,会再次重新解析
缓存
参考文章
跨域
- 原因:跨域主要是因为同源策略所引起的,同源策略要求域名、协议、端口三者一样属于同源
- 解决方案
CORS
nginx反向代理
document.domain
postMessage
jsonp
进程
- 渲染进程
- GPU进程
- 浏览器进程
- 插件进程
web安全
- 跨站脚本共计XSS(Cross Site Scripting)
- 跨站请求伪造CSRF(Cross-site request forgery)
- 内容安全策略CSP(Content Security Policy)
浏览器引擎
- webkit 苹果
- blink 谷歌
- gecko 火狐
TCP阻塞
参考文章
DNS
查询的时候,会向域名服务器进行查询,接收这个查询请求的域名服务器首先会在自己的数据库进行查找,如果有该域名的ip则返回,没有则继续上上一层根域名服务器进行查询,直到根域名服务器。解析器和域名服务器将最新的域名会缓存,方便下次查找。
OSI
应用层
为应用程序提供服务并规定通信的相关细节
表示层
将应用处理的信息转换为适合网络传输的格式,或者将下一层的数据转换为上一层能处理的格式,主要负责数据转换
会话层
负责建立和断开连接,以及书的分割等数据传输的相关内容
传输层
管理两个点的数据传输(确保数据被送达)
网络层
将数据传输到目标地址,目标地址可以是多个网络通过路由器连接而成的地址,主要负责寻址和路由选择
数据链路层
负责物理层上互联,节点之间的通信传输,将0、1序列划分为具有意义的数据帧传送给对方(数据帧的生成和接收)
物理层
负责0、1比特流与高压的高低、灯光闪灭的转换