我认为这无疑是最受欢迎的软件工程师的(Software Engineer) 面试问题 之一。最近有人说这个问题曾出现在 抖音Tiktok 的面试中。
要回答面试中的“当你在浏览器中输入 https://www.google.com 时会发生什么?”这个问题,可以按步骤详细说明整个过程,涉及 DNS 查找、TCP/SSL 握手、请求处理和页面渲染。以下是全面的解释:
URL 解析
当你输入 URL https://www.google.com 并按下回车时:
- 协议:浏览器识别出协议是 https,意味着它将使用 HTTP 加密传输(TLS)。
- 主机:浏览器识别出 www.google.com 是域名。
- 路径:默认路径是 /,因为没有提供具体路径,表示请求主页。
DNS 查找
浏览器需要将域名 www.google.com 转换为一个 IP 地址。这个过程分为几个步骤:
- 浏览器缓存:浏览器 首先检查自己的缓存,看看是否已有 www.google.com 的 IP 地址。
- 操作系统缓存:如果未找到,浏览器会向操作系统请求缓存。
- 路由器缓存:如果操作系统没有该 IP,路由器会检查它的缓存。
- ISP DNS 服务器:如果依然未找到,路由器会查询 ISP 的 DNS 服务器。
- 递归 DNS 查找:如果 ISP 没有缓存 IP,DNS 服务器会递归查询 DNS 层次结构(根 DNS 服务器、顶级域名服务器、权威 DNS 服务器)。最终,www.google.com 的 IP 地址被解析出来(例如,142.250.72.196)。
建立 TCP 连接
知道 IP 地址后,浏览器需要与 Google 服务器建立连接,使用以下步骤:
TCP 三次握手:
- SYN:客户端(浏览器)向服务器发送 SYN(同步)包,启动连接。
- SYN-ACK:服务器响应 SYN-ACK(同步确认)包。
- ACK:客户端发送 ACK 包,连接建立。
SSL/TLS 握手(针对 HTTPS)
由于使用的是 HTTPS,浏览器与服务器通过 SSL/TLS 建立加密连接:
- 浏览器与服务器协商加密协议(TLS 版本)并交换加密密钥。
- 服务器发送其 SSL 证书,浏览器验证该证书以确保服务器身份。
- 生成会话密钥,用于加密接下来的通信。
HTTP 请求
建立安全连接后,浏览器向服务器发送 HTTP GET 请求:
- 方法:GET
- 请求头:包括浏览器类型、cookies 和缓存信息。
- 主机:www.google.com
- 路径:/
服务器处理
Google 的服务器位于 负载均衡器 后面,接收请求:
请求可能会通过多个反向代理和负载均衡器处理,通常分布在多个数据中心,以确保可用性和性能。
Google 的 Web 服务器处理请求,检查所请求的资源(Google 的主页),并准备响应。
HTTP 响应
服务器返回一个 HTTP 200 OK 响应,并将必要的 HTML、CSS、JavaScript 和其他资源发送到浏览器。
响应包括响应头(如 Content-Type、Cache-Control)以及响应体(Google 主页的 HTML 内容)。
浏览器渲染
浏览器现在获取了 HTML 并开始渲染页面:
- HTML 解析:浏览器解析 HTML 以构建 DOM(文档对象模型)。
- CSS 解析:下载并应用任何链接或嵌入的 CSS 样式表以设置 DOM 元素的样式。
- JavaScript 执行:下载并执行 JavaScript。JavaScript 可能进一步修改 DOM 或发送额外的网络请求(如 AJAX)以动态更新页面。
- 渲染:浏览器的渲染引擎将解析和样式化的内容绘制到屏幕上,形成可见的网页。
附加资源请求
当浏览器解析 HTML 时,它会识别出额外的资源(图片、样式表、JavaScript 文件)需要加载:
这些资源通过额外的 HTTP/HTTPS 请求获取。这个过程会通过多个并行连接重复进行,以 快速下载和渲染资源。
浏览器缓存与优化
浏览器会根据缓存头(如 Cache-Control、ETag)缓存某些资源(图片、脚本、样式表)。
现代浏览器使用诸如 HTTP/2 多路复用等优化技术,通过单个 TCP 连接下载多个资源,从而减少延迟。
最终页面显示
一旦所有资源下载、解析和渲染完成,用户可以与完全加载的页面进行交互。进一步的用户操作(点击、输入等)可能会触发更多的网络请求(如提交表单、AJAX 更新)。
加分点
- CDN(内容分发网络):Google 使用 CDN 从地理位置较近的服务器提供内容,减少延迟并提高加载速度。
- 安全功能:HSTS(HTTP 严格传输安全)确保所有请求都通过 HTTPS 进行。Google 的证书绑定技术确保服务器的 SSL 证书未被篡改。
- Service Workers:如果启用,Service Worker 可能会拦截请求,提供缓存响应或启用离线功能。
这份详细的说明涵盖了从用户输入 URL 到浏览器最终渲染页面的所有关键步骤,涉及 DNS、TCP/IP、TLS、HTTP 和浏览器渲染等内容,适合系统设计或软件工程面试。
面试经历
- 写了十几年代码, 谷歌/Google认为我还不够Senior
- Jane Street第一轮一小时面试体验卡(伦敦软件工程师)
- Meta/Facebook四次面试经历
- 三次冲击谷歌软件工程师: 我的面试起伏录 (谷歌面试是不是一生只有三次机会?)
- 记两次伦敦抖音面试经历(Tiktok)
- 我的面试谷哥GOOGLE伦敦SRE的经验和教训
- 记Facebook的第一轮技术面试(伦敦脸书)
- 记微软Principal SE的第一轮面试
- 我的AMAZON面试经历与经验之谈(亚麻伦敦面经)
- 离伦敦脸书最近的一次 - 记FACEBOOK伦敦终面经历
面试题
- 软件工程师面试: TCP/IP协议是什么?
- 软件工程师经典面试题: 当你在浏览器的地址栏敲入google.com并按回车后发生了什么?
- 谷歌面试题: 迷宫随机生成算法
- 软件工程师数据库面试技巧之 SQL中的第二名记录
- 软件工程师面试技巧之 动态规化 - 整数拆分
- 软件工程师面试技巧之 如何检查数独的有效性
- 去年 Google 的面试题 - 打印消息
- 软件工程师面试技巧之 使用哈希表降复杂度
- 微软面试题: 三角形的面积是多少?
- 英国 IT公司 电话面试的一些技巧 (程序员)
- C/C++ 中的内存管理器(堆与栈)
- C++的 map 当键(Key)不存在的时候会发生什么?
- 随机数独游戏的算法设计 (Sudoku)
- 经典二叉树的镜像的递归算法
- 谷歌的扔鸡蛋问题
- 面经: Python 的 List 和 Dictionary 有啥区别?
- 逻辑测试系列 - 一种只有4种语句的编程语言 - (1)
- 逻辑测试系列之二 - DECR
- 逻辑测试系列之三 - SUBT
面试技巧
面试其它
- 产品设计和系统设计面的区别(Product Design vs System Design)
- 45 分钟模拟面试(编程、系统设计)+职业发展建议
- 英国和美国IT公司面试的主要区别
- 拒了甲骨文(Oracle)的 Offer
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK