从键入网址到显示页面全流程(超详细版)
网络
👨🏫 小林coding 键入网址到网页显示,期间发生了什么
- HTTP【端口:80】
- 解析
URL
- 协议
- Web服务器地址
- 目录 + 文件名
- 生成请求报文
- 请求行
- 请求方法(get、post …)
- 请求路径
- 协议的版本(HTTP/1.1)
- 消息头
- 键值对
- 首部字段名
- 首部字段值
- 键值对
- 消息体
- 数据
- 请求行
- 扩展:响应报文
- 状态行
- 版本(HTTP/1.1)
- 状态码
- 状态短语(OK)
- 消息头
- 键值对
- 首部字段名
- 首部字段值
- 键值对
- 消息体
- 数据
- 状态行
- 解析
- DNS(域名转IP地址)
- 前置须知:下面的步骤没有就往下,找到就返回
- 浏览器域名的缓存
- 操作系统缓存
- hosts 文件
- 本地 DNS 服务器
- 发送 DNS 请求【UDP,端口:53】
- 根域名服务器(不用于域名解析,指出顶级域名服务器地址)
- 顶级域名服务器(.com)
- 权威域名服务器(server.com)
- 最终把域名转换为
IP
地址返回给本地DNS
- 协议栈
- 应用程序(浏览器)调用
Socket
库 - 委托操作系统的协议栈建立
TCP
连接- TCP 协议
- UDP 协议
- IP(传送网络包、确定路由)
- ICMP
- ARP
- 网卡驱动程序
- 物理网卡
- 应用程序(浏览器)调用
- TCP(可靠传输)
- TCP 报文
- 源端口号(16位)
- 目标端口号(16位)
- 序号(32位)
- 确认序列号(32位)
- 首部长度(4位)
- 保留位(6位)
- 状态位
- SYN (Synchronize,同步序列号)
- ACK (Acknowledgment,确认)
- RST (Reset,重置)
- FIN (Finish,结束)
- PSH (Push,推送)
- URG (Urgent,紧急)
- 窗口大小(16位)【流量控制】
- 校验和(16位)
- 紧急指针(16位)
- 选项
- 数据【会把
HTTP
报文包装在这里】
- TCP 三次握手建立连接
- TCP 报文
- IP(远程定位)
- IP 包格式
- 版本(4位)
- 首部长度(4位)
- 服务类型 TOS(8位)
- 总长度(16位)
- 标识(16位)
- 标志(3wei)
- 片偏移(13位)
- TTL(8位)
- 协议号(8位)
- 首部检验和(16位)
- 源 IP 地址(32位)
- 一个网卡绑定一个IP地址,多个网卡会有多个 IP地址
- 路由表选 IP
- 根据
目标IP
与路由表项的子网掩码
进行与运算 - 与运算的结果 和 路由表项的
目的IP
进行匹配- 成功,选择此网卡绑定的IP
- 失败,匹配下一个表项
- 都没匹配成功,则走默认的网卡,子网掩码位
0.0.0.0
,目的IP也是0.0.0.0
- 根据
- 目标 IP 地址(32位)
- 选项
- 数据(会把
TCP数据包
包装在这里)
- IP 包格式
- MAC(两点传输)
- MAC 包头部格式
- 接收方 MAC 地址(48位)
- 网卡生产时就写入
ROM
里的
- 网卡生产时就写入
- 发送方 MAC 地址(48位)
ARP协议
根据IP地址
获取MAC地址
- 先查询
ARP缓存
- 没查到则
ARP广播查询
- 先查询
- 协议类型(16位)
- 接收方 MAC 地址(48位)
- MAC包的数据
- IP 数据包
- MAC 包头部格式
- 网卡(数字信息 转 电信号)
- 数据链路层
- 数据帧格式
- 交换机
- 路由器
Spring MVC
[Spring基础 - SpringMVC请求流程和案例](https://pdai.tech/md/spring/spring-x-framework-springmvc.html#spring-mvc%E7%9A%84%E8%AF%B7%E6%B1%82%E6%B5%81%E7%A8%8B)- 请求发给
DispatcherServelet
,**<font style="color:rgb(44, 62, 80);">DispatcherServlet</font>**
进行全局的流程控制- 通过
HandlerMapping
把 请求 映射成HandlerExecutionChain
【策略设计模式】- 一个处理器对象(页面控制器)
- 多个
<font style="color:rgb(44, 62, 80);">HandlerInterceptor</font>
对象(或拦截器)
- 通过
<font style="color:rgb(44, 62, 80);">HandlerAdapter</font>**<font style="color:rgb(44, 62, 80);"> </font>**
将处理器包装成适配器【适配器设计模式】<font style="color:rgb(44, 62, 80);">HandlerAdapter </font>
根据适配的结果调用真正的处理器方法返回一个<font style="color:rgb(44, 62, 80);">ModelAndView</font>
对象- 模型数据
- 逻辑视图名
- 通过
ViewResolver
把<font style="color:rgb(44, 62, 80);">ModelAndView</font>
的逻辑视图名解析成具体的<font style="color:rgb(44, 62, 80);">view</font>
- 通过
<font style="color:rgb(44, 62, 80);">View</font>
对<font style="color:rgb(44, 62, 80);">model</font>
数据模型进行渲染然后返回给DispatcherServelet
- 通过
<font style="color:rgb(44, 62, 80);">DispatcherServlet</font>
返回响应给用户
MySQL
[MySQL - 一条 SQL 的执行过程详解](https://pdai.tech/md/db/sql-mysql/sql-mysql-execute.html)- server层的连接器
- 解析器
- 优化器
- 执行器
- 从磁盘加载缓存数据到内存中的 Buffer Pool
- 记录 undo日志
- 执行SQL更新内存 Buffer Pool中的数据
- 写 redo日志到 Redo Log Buffer
- redo日志(prepare阶段)刷入磁盘【XA事务的参与者】
- 先刷入 os cache
- 再输入磁盘
- 提交事务,binlog 文件写入磁盘【记录XA事务参与者的 ID】
- redolog 写入 commit 标记
前端
渲染……