HTML 基础 · 75/88
1. 微信小程序 bindtap 和 catchtap 的区别 2. Bootstrap 徽章 3. Bootstrap 按钮下拉菜单 4. Bootstrap 按钮组 5. Bootstrap 按钮激活与禁用 6. Bootstrap 文档类型声明 7. Bootstrap 下拉菜单 8. Bootstrap 表单帮助文本 9. Bootstrap 水平表单 10. Bootstrap 输入框组 11. Bootstrap 超大屏幕 12. Bootstrap 标签 13. Bootstrap 导航类型 14. Bootstrap 分页 15. Bootstrap 响应式表格 16. Bootstrap 垂直表单创建 17. 浏览器乱码问题及解决方案 18. Canvas 标签属性与 CSS 样式设置宽高的区别 19. Canvas、SVG、WebGL 对比 20. 网页验证码的作用 21. 前端跨页面通信方法 22. 圆形可点击区域实现 23. 浏览器多标签页通信方案 24. CSSOM 树和 DOM 树的解析时机 25. 设备的 DPR 是否可变 26. 禁用 a 标签的跳转和定位 27. DOM 和 BOM 的区别 28. DOM 发展历程 29. DOCTYPE 与文档模式 30. DNS 预解析优化网页加载速度 31. DOM 树的理解 32. Drag API 拖拽事件 33. 前端 SEO 优化要点 34. 标题与副标题的实现 35. HTML 元素分类 36. HTML 全局属性 37. HTML 页面渲染过程 38. HTML 语义化 39. HTML 语义化 40. HTML5 DOCTYPE 声明简化原因 41. HTML5 离线存储原理与使用 42. HTML5 新特性 43. HTML5 移除的元素 44. IconFont 字体图标 45. iframe 的优缺点与通信 46. 图片点击下载而非预览 47. HTML 和 CSS 中的图片加载与渲染规则 48. 浏览器预览待上传图片 49. img 标签 title 和 alt 的区别 50. input 标签触发拍照功能 51. 控制 input 输入框字数 52. img 的 srcset 属性 53. 禁止 input 显示历史记录 54. input 上传多个文件 55. JS 和 CSS 对 DOM 树构建的影响 56. label 标签的作用 57. link 和 @import 的区别 58. Meta 标签常用属性 59. Meta 标签自动刷新跳转 60. 小程序的双线程架构 61. 小程序页面间传递数据的方法 62. 小程序为什么没有 DOM API 63. 微信小程序的优劣势 64. Node 和 Element 的关系 65. 页面生命周期事件:DOMContentLoaded、load、beforeunload、unload 66. 渐进增强与优雅降级 67. 渐进式 JPEG 图片格式 68. PV 和 UV 的区别 69. Script 标签 defer 和 async 70. 实现点击回到顶部功能 71. script 标签能否使用自闭合语法 72. src 与 href 的区别 73. SSG 静态网站生成 74. style 标签位置对页面渲染的影响 75. 从输入 URL 到页面显示的过程 76. Web 标准与可访问性理解 77. 网页常用图片格式 78. 网页常用图片格式 79. Web 标准与 W3C 标准 80. WebSocket 低版本浏览器兼容方案 81. Web Worker 的作用与场景 82. 微信小程序事件传值 83. 微信小程序文件结构 84. 微信小程序的架构 85. 微信小程序原理 86. 页面白屏时间优化 87. 小程序 WXSS 与 CSS 的区别 88. XHTML 与 HTML 的区别

从输入 URL 到页面显示的过程

浏览器加载页面的完整流程,包括 DNS 解析、TCP 连接、HTTP 请求和页面渲染

问题

从浏览器输入网址到看到页面,中间经历了哪些步骤?

解答

整个过程可以分为 6 个阶段:DNS 解析、TCP 连接、HTTP 请求、服务器响应、页面渲染、连接结束。

DNS 解析

DNS 解析是将域名转换为 IP 地址的过程。比如输入 www.baidu.com,需要找到对应的 IP 地址才能访问服务器。

解析流程(递归查询):

  1. 浏览器缓存
  2. 系统缓存
  3. 路由器缓存
  4. ISP 服务器缓存
  5. 根域名服务器(.)
  6. 顶级域名服务器(.com)
  7. 主域名服务器(baidu.com)
  8. 子域名服务器(www.baidu.com)

找到 IP 后会缓存到本地,下次访问直接使用。

DNS 优化:

  • DNS 缓存:多级缓存机制减少查询时间
  • DNS 负载均衡:大型网站返回不同服务器 IP,根据负载量和地理位置分配流量

TCP 连接

TCP 通过三次握手建立可靠连接。

三次握手:

  1. 客户端发送 SYN 包(Seq=x),进入 SYN_SEND 状态
  2. 服务器返回 SYN+ACK 包(Seq=y, ack=x+1),进入 SYN_RECV 状态
  3. 客户端发送 ACK 包(ack=y+1),双方进入 ESTABLISHED 状态

连接建立后开始传输数据。

四次挥手:

  1. 客户端发送 FIN 包(seq=u),进入 FIN-WAIT-1 状态
  2. 服务器返回 ACK 包(ack=u+1),进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态
  3. 服务器发送 FIN 包(seq=w),进入 LAST-ACK 状态
  4. 客户端返回 ACK 包(ack=w+1),进入 TIME-WAIT 状态,等待 2*MSL 后进入 CLOSED 状态

服务器收到最后的 ACK 后立即进入 CLOSED 状态。

发送 HTTP 请求

构建 HTTP 请求报文,通过 TCP 连接发送到服务器指定端口。

请求报文结构:

  • 请求行:方法、URL、协议版本
  • 请求头:Host、User-Agent、Cookie 等
  • 请求体:POST 数据等

服务器处理请求

Web 服务器(如 Nginx、Apache、Tomcat)接收 TCP 连接,解析 HTTP 协议,处理请求并生成响应。

响应报文结构:

  • 状态行:协议版本、状态码、状态描述
  • 响应头:Content-Type、Set-Cookie 等
  • 响应体:HTML、JSON 等数据

浏览器渲染页面

浏览器(如 Webkit)按以下步骤渲染:

  1. 解析 HTML 生成 DOM 树
  2. 解析 CSS 生成 CSSOM 树
  3. 合并 DOM 树和 CSSOM 树生成渲染树
  4. 计算布局(Layout)
  5. 绘制页面(Paint)

连接结束

页面加载完成后,如果没有持久连接需求,通过四次挥手关闭 TCP 连接。

关键点

  • DNS 解析是递归查询过程,通过多级缓存优化性能
  • TCP 三次握手建立连接,四次挥手断开连接,保证数据可靠传输
  • HTTP 请求和响应都包含报文头和报文体,状态码表示处理结果
  • 浏览器渲染分为构建 DOM 树、CSSOM 树、渲染树,最后布局和绘制
  • DNS 负载均衡可以根据服务器负载和地理位置分配流量