这个问题可以从浏览器和计算机网络两个角度考虑,让我们一起看看
一图流
这个一图流重浏览器而非计网
-
HTTP
- 浏览器首先会解析 URL ,获取 网址 & 参数
- 根据 HTTP 请求 URL 获取缓存
- 确定 Web 服务器网址和文件名后,生成 HTTP 请求头,并委托操作系统执行发送前操作
缓存
如果当前存在此 get 请求的缓存,则不用发送请求(200)。命中强制缓存
如果当前没有缓存,则发送请求,如果命中服务端缓存则是协商缓存 ( 304 )
-
DNS
- HTTP消息生成后,浏览器委托操作系统发送消息给 Web 服务器
- 首先通过 DNS 获取真实域名
获取 DNS 的过程可以大致分为个纬度 ,缓存纬度和获取拓扑纬度
- 缓存纬度: 浏览器 DNS 缓存 - 操作系统 DNS 缓存 - host 文件记录 - 请求
- 请求纬度:递归请求(一直向上请求到根服务器),迭代请求 (指路不带路)
-
协议栈
- 经过 HTTP 消息生成和 DNS 解析后,我们已经知道了发送到具体 IP,接下来的网络协议部分就是操作系统负责的了。具体一点,负责这部分传输工作的是操作系统的协议栈
-
应用程序调用 Socket 库,委托协议栈工作
-
协议栈负分为上下两半,上面负责接收应用层的委托
-
下半负责使用 IP 协议控制网络包的收发
- ICMP 错误信息传输协议
- ARP IP 到 MAC 到 DNS 协议
-
交由下层硬件执行具体发送操作
暂时无法在飞书文档外展示此内容
-
TCP - 端到端
详细的 TCP 内容也可看看我的文章。
建立连接之后浏览器发送一个初始的 HTTP GET 请求
TCP 流程拆分
- 确认4元组
- 三次握手建立起连接 (确保双方都有接收和发送信息的能力)
- TCP 分割数据 消息 > MSS 则需要分割
- 组装 TCP 报文
Maximum Segment Size MSS 是除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
Maximum Transmission Unit 即最大传输单元,指在计算机网络(以太网)中传输的数据包的最大长度。
TCP 属性要点
-
使用包序号保序
-
使用 ACK 解决丢包问题
-
使用状态位维护双方状态机
- ( SYN ACK RST FIN SYN_SENT SYN_RCVD ESTABLISHED)
-
使用滑动窗口做流量控制
-
使用慢启动做拥塞控制
TLS 协商
TLS 是(传输层安全 transition level securtiy) 已废弃的安全层套接字 SSL (Security socket layer) 的继任者
TLS 握手发生在 TCP 握手之后
- 握手和认证阶段:相互 hello 并发送随机数,并认证服务端 SSL /TLS 证书
- 生成预主密码,就是生成一个随机的密码给后端,并用随机数和密码生成会话密钥
- 完成和确认完成
-
IP - 点对点
TCP 委托 IP 模块将数据包封装成网络包发送
-
IP 头封装
-
IP 路由选择。
- 通过路由表的IP地址与其子网掩码的与运算结果与目标IP与当前子网掩码的与运算结果对比,如果一致,说明可以发送到这个子网
- 如果没有匹配上,则匹配默认路由方向。会走到 ISP (互联网服务提供商)
-
MAC
MAC 地址只在局域网中有效
局域网中路由到网关,或者局域网多设备连接到时候使用
-
读取发送方 MAC (内置设备中)
-
获取接收方 MAC (ARP \ Address Resolution Protocol )
- 尝试读缓存
- 广播获取 MAC 地址
-
生成和发送 MAC 报文
MAC 地址 (ARP 协议) 只在局域网通信和网关通信的时候需要,不会在外部互联网传播
-
网卡
将数字信号转化为电信号。
-
添加报头和起始帧分界符
-
通过 FCS 帧校验序列判断数据是否存在差错
- 其实就是循环冗余校验 CRC-32(只检测不纠正)
-
交换机 - 没有 IP
- 交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口
- 如果没有匹配的就全都发,等待返回并记录
广播地址
MAC FF:FF:FF:FF:FF:FF
IP 255.255.255.255
-
路由器 - 有 IP
工作和交换机相似(根据路由表 (交换机用MAC,路由器用 IP)转发数据包),又和网卡相似(有IP)
-
C&S
服务端和客户端相互解封装
-
浏览器
- 对数据包进行解码和解压缩
- 如果可以,则将返回的数据缓存 ( get 请求可缓存 )
- 根据资源判断如何处理 ( HTML/下载类类型 )考虑 HTML情况 👇
- 提交文档给浏览器进程
- 浏览器进程通知渲染进程,同时更改页面状态
- 渲染进程的GUI线程并行解析 HTML & CSS
- 生成 renderTree - 布局树
- 分层,绘制, 分块,光栅化 , 合成 , 展示
笔者才疏学浅,各位读者多多担待,不吝赐教。部分插图来自网络,侵删。