【20221111每日面经】计算机网络 - 打开一个网页发生了什么?

每日面经(极为经典,面试必考)

  • 考察点:计算机网络、Nginx、前端
  • 难度: 较难
  • 题目:从在浏览器地址栏输入网址,到网页加载展示,打开一个网页的整个过程中发生了什么?请描述一下

之前面试整理的,现在回顾下。
1、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法;
2、浏览器先查看浏览器缓存一系统缓存一路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作;
浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
lSP缓存:若上述均失败,继续向lSP搜索。
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的ip地址;
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手;
5、握手成功后,浏览器向服务器发送http请求,请求数据包;
6、服务器处理收到的请求,将数据返回至浏览器;
7、浏览器收到HTTP响应;
8、浏览器解码响应,如果响应可以缓存,则存入缓存。
9、 浏览器发送请求获取嵌入在 HTML 中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框。
10、 浏览器发送异步请求。
11、页面全部渲染结束。

1 个赞

1.点击网址后,应用层的DNS协议会将网址解析为IP地址;

DNS查找过程:浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存(hosts文件)中是否有这个域名对应的DNS解析结果。若还没有,此时会发送一个数据包给DNS服务器,DNS服务器找到后将解析所得IP地址返回给用户。

2.在应用层,浏览器会给web服务器发送一个HTTP请求;

请求头为:GET http://www.baidu.com/HTTP/1.1

3.在传输层,(上层的传输数据流分段)HTTP数据包会嵌入在TCP报文段中;

TCP报文段需要设置端口,接收方(百度)的HTTP端口默认是80,本机的端口是一个1024-65535之间的随机整数,这里假设为1025,这样TCP报文段由TCP首部(包含发送方和接收方的端口信息)+ HTTP数据包组。

4.在网络层中,TCP报文段再嵌入IP数据包中;

IP数据包需要知道双方的IP地址,本机IP地址假定为192.168.1.5,接受方IP地址为220.181.111.147(百度),这样IP数据包由IP头部(IP地址信息)+TCP报文段组成。

5.在网络接口层,IP数据包嵌入到数据帧(以太网数据包)中在网络上传送;

数据帧中包含源MAC地址和目的MAC地址(通过ARP地址解析协议得到的)。这样数据帧由头部(MAC地址)+IP数据包组成。

6.数据包经过多个网关的转发到达百度服务器,请求对应端口的服务;

服务接收到发送过来的以太网数据包开始解析请求信息,从以太网数据包中提取IP数据包—>TCP报文段—>HTTP数据包,并组装为有效数据交与对应线程池中分配的线程进行处理,在这个过程中,生成相应request、response。

7.请求处理完成之后,服务器发回一个HTTP响应;

请求处理程序会阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上。处理完毕后,数据通过response对象给客户输出信息,输出信息也需要拼接HTTP协议头部分,关闭后断开连接。断开后,服务器端自动注销request、response对象,并将释放对应线程的使用标识(一般一个请求单独由一个线程处理,部分特殊情况有一个线程处理多个请求的情况)。响应头为:HTTP/1.1200 OK

8.浏览器以同样的过程读取到HTTP响应的内容(HTTP响应数据包),然后浏览器对接收到的HTML页面进行解析,把网页显示出来呈现给用户。

客户端接收到返回数据,去掉对应头信息,形成也可以被浏览器认识的页面HTML字符串信息,交与浏览器翻译为对应页面规则信息展示为页面内容。

这个操作可以涉及的「发生的事」范围太广了 :flushed:硬着头皮答一波

  1. 浏览器检查一下url地址是不是正确的,没准是个百度查询关键字呢,若正确继续往下 ↓
  2. DHCP 获取本机IP
  3. ARP 获取网关服务器的MAC地址
  4. 获取目标域名的IP地址,浏览器缓存→系统缓存→路由器缓存,若无缓存的DNS结果,基于UDP去ISP的DNS→根DNS逐级查询
  5. 有没有设置代理呀?是的话配置正确且代理运作正常
  6. 访问的网址是不是https的呀?是的话要获取一下秘钥
  7. TCP三次握手建立连接
  8. HTTP请求逐级封装成数据链路层传输的帧数据,发往服务器(运气好没丢包)
  9. 服务器有没有搞反向代理来转发、负载均衡呀?Nginx把流量转到对应的服务器/端口上(url没输错的话)
  10. 请求被路由到服务中具体某个方法,给处理完返回一个响应数据,通过http响应体返回给请求方
  11. 响应要不要编码压缩一下呀?
  12. 请求方发起断开TCP连接的请求,四次挥手
  13. 浏览器根解码应结果,对页面进行渲染

写得很粗糙,后续再整理完善下…

回复思路

1 个赞