设为首页收藏本站language 语言切换
查看: 1828|回复: 0
收起左侧

[分享] “在百度输入www之后……”这道经典网工面试题,火遍全网

[复制链接]
发表于 2022-5-6 14:50:14 | 显示全部楼层 |阅读模式
本帖最后由 网络工程师-老杨 于 2022-5-6 14:52 编辑

大家好,我是老杨。咱们来唠点有意思的


“在浏览器输入 URL 回车之后,你想过发生了什么吗?”


也正是因为这道题的灵活性,很多面试官都把这个题目作为压轴来考,程序员、运维和网工可能都有遇到。


虽然题干类似,但时候考点不同。


对你来说,登录某网站只是0.1秒不到的时间,但是背后却涉及了很多原理。


今天,老杨带你从网络角度来看看,这背后到底是个什么过程



注意:本文的步骤是建立在,请求的是一个简单的 HTTP 请求,没有 HTTPS、HTTP2、最简单的 DNS、没有代理、并且服务器没有任何问题的基础上,尽管这是不切实际的。


文章思路:URL 解析→DNS 查询→TCP 连接→处理请求→接受响应

01地址解析


首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。


HSTS


由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。详见:你所不知道的 HSTS[1]。


其他操作


浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。


检查缓存

1.png






02 DNS 查询

基本步骤


1. 浏览器缓存:浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。


2. 操作系统缓存:操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。


3. 路由器缓存:路由器也有自己的缓存。


4. ISP DNS 缓存:ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。


根域名服务器查询


在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:

2.png

需要注意的点:


递归方式:一路查下去中间不返回,得到最终结果才返回信息(浏览器到本地DNS服务器的过程)


迭代方式,就是本地DNS服务器到根域名服务器查询的方式。




03 TCP 连接

TCP/IP 分为四层,在发送数据时,每层都要对数据进行封装:

3.png

file:///C:/Users/SPOTO/AppData/Local/Temp/ksohtml11292/wps1.jpg

应用层:发送 HTTP 请求


在前面的步骤我们已经得到服务器的 IP 地址,浏览器会开始构造一个 HTTP 报文,其中包括:



请求报头(Request Header):请求方法、目标地址、遵循的协议等等



请求主体(其他参数)



其中需要注意的点:



浏览器只能发送 GET、POST 方法,而打开网页使用的是 GET 方法



传输层:TCP 传输报文


传输层会发起一条到达服务器的 TCP 连接,为了方便传输,会对数据进行分割(以报文段为单位),并标记编号,方便服务器接受时能够准确地还原报文信息。

在建立连接前,会先进行 TCP 三次握手。


“关于 TCP/IP 三次握手,网上已经有很多段子和图片生动地描述了。


网络层:IP协议查询Mac地址


将数据段打包,并加入源及目标的IP地址,并且负责寻找传输路线。


判断目标地址是否与当前地址处于同一网络中,是的话直接根据 Mac 地址发送,否则使用路由表查找下一跳地址,以及使用 ARP 协议查询它的 Mac 地址。

“注意:在 OSI 参考模型中 ARP 协议位于链路层,但在 TCP/IP 中,它位于网络层。”


链路层:以太网协议


以太网协议


根据以太网协议将数据分为以“帧”为单位的数据包,每一帧分为两个部分:



标头:数据包的发送者、接受者、数据类型



数据:数据包具体内容





Mac 地址


以太网规定了连入网络的所有设备都必须具备“网卡”接口,数据包都是从一块网卡传递到另一块网卡,网卡的地址就是 Mac 地址。每一个 Mac 地址都是独一无二的,具备了一对一的能力。


广播


发送数据的方法很原始,直接把数据通过 ARP 协议,向本网络的所有机器发送,接收方根据标头信息与自身 Mac 地址比较,一致就接受,否则丢弃。


注意:接收方回应是单播。


服务器接受请求


接受过程就是把以上步骤逆转过来,参见上图。




04 服务器处理请求

大致流程

4.png

file:///C:/Users/SPOTO/AppData/Local/Temp/ksohtml11292/wps2.jpg

HTTPD


最常见的 HTTPD 有 Linux 上常用的 Apache 和 Nginx,以及 Windows 上的 IIS。


它会监听得到的请求,然后开启一个子进程去处理这个请求。


处理请求


接受 TCP 报文后,会对连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证:



验证是否配置虚拟主机


验证虚拟主机是否接受此方法


验证该用户可以使用该方法(根据 IP 地址、身份信息等)



重定向


假如服务器配置了 HTTP 重定向,就会返回一个 301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)


URL 重写


然后会查看 URL 重写规则,如果请求的文件是真实存在的,比如图片、html、css、js文件等,则会直接把这个文件返回。


否则服务器会按照规则把请求重写到 一个 REST 风格的 URL 上。


然后根据动态语言的脚本,来决定调用什么类型的动态文件解释器来处理这个请求。


以 PHP 语言的 MVC 框架举例,它首先会初始化一些环境的参数,根据 URL 由上到下地去匹配路由,然后让路由所定义的方法去处理请求。




05 浏览器接受响应

浏览器接收到来自服务器的响应资源后,会对资源进行分析。


首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。

5.png

file:///C:/Users/SPOTO/AppData/Local/Temp/ksohtml11292/wps3.jpg

如果响应资源进行了压缩(比如 gzip),还需要进行解压。


然后,对响应资源做缓存。


接下来,根据响应资源里的 MIME[3] 类型去解析响应内容(比如 HTML、Image各有不同的解析方式)。



■ 文章来源:本篇文章转载自网络,做了部分删减

微信图片_20211203090946.png


您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-5-9 07:19 , Processed in 0.193390 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表