跳至主要內容

Net2 - 重要知识点2 (浏览器访问网页全过程)

codeNet八股约 1408 字大约 5 分钟

基础

浏览器访问网页全过程

整体流程

  1. 在浏览器中输入指定网页的 URL
  2. 浏览器通过 DNS 协议,获取域名对应的 IP 地址
  3. 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求 (三次握手)
  4. 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容
  5. 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器
  6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示
  7. 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求 (TCP 四次挥手)

详细过程

应用层

一切的开始——打开浏览器,在地址栏输入 URL,回车确认

URL

URL(Uniform Resource Locators),即统一资源定位器

网络上的所有资源都靠 URL 来定位,每一个文件就对应着一个 URL,就像是路径地址

理论上,文件资源和 URL 一一对应

实际上也有例外,比如某些 URL 指向的文件已经被重定位到另一个位置,这样就有多个 URL 指向同一个文件

URL 的组成结构

alt text
alt text
  1. 协议
    • URL 的前缀通常表示了该网址采用了何种应用层协议,通常有两种——HTTP 和 HTTPS
    • 当然也有一些不太常见的前缀头,比如文件传输时用到的ftp:
  2. 域名
    • 域名便是访问网址的通用名,这里也有可能是网址的 IP 地址
    • 域名可以理解为 IP 地址的可读版本,毕竟绝大部分人都不会选择记住一个网址的 IP 地址。
  3. 端口
    • 如果指明了访问网址的端口的话,端口会紧跟在域名后面,并用一个冒号隔开。
  4. 资源路径
    • 域名(端口)后紧跟的就是资源路径,从第一个/开始,表示从服务器上根目录开始进行索引到的文件路径
    • 上图中要访问的文件就是服务器根目录下/path/to/myfile.html
    • 早先的设计是该文件通常物理存储于服务器主机上,但现在随着网络技术的进步,该文件不一定会物理存储在服务器主机上
    • 有可能存放在云上,而文件路径也有可能是虚拟的(遵循某种规则)。
  5. 参数
    • 参数是浏览器在向服务器提交请求时,在 URL 中附带的参数
    • 服务器解析请求时,会提取这些参数
    • 参数采用键值对的形式key=value,每一个键值对使用&隔开。参数的具体含义和请求操作的具体方法有关。
  6. 锚点
    • 锚点顾名思义,是在要访问的页面上的一个锚
    • 要访问的页面大部分都多于一页,如果指定了锚点,那么在客户端显示该网页是就会定位到锚点处,相当于一个小书签。值得一提的是,在 URL 中,锚点以#开头,并且不会作为请求的一部分发送给服务端

DNS

键入了 URL 之后,第一个重头戏登场——DNS 服务器解析。DNS(Domain Name System)域名系统,要解决的是 域名和 IP 地址的映射问题 。毕竟,域名只是一个网址便于记住的名字,而网址真正存在的地址其实是 IP 地址

HTTP/HTTPS

利用 DNS 拿到了目标主机的 IP 地址之后,浏览器便可以向目标 IP 地址发送 HTTP 报文,请求需要的资源了。在这里,根据目标网站的不同,请求报文可能是 HTTP 协议或安全性增强的 HTTPS 协议

传输层

由于 HTTP 协议是基于 TCP 协议的,在应用层的数据封装好以后,要交给传输层,经 TCP 协议继续封装。

TCP 协议保证了数据传输的可靠性,是数据包传输的主力协议

  • TCP 三次握手和四次挥手(传输层)
  • TCP 传输可靠性保障(传输层)
网络层

网络层的核心功能——转发与路由

  • 转发:将分组从路由器的输入端口转移到合适的输出端口。
  • 路由:确定分组从源到目的经过的路径。

此时我们的主机不再是和另一台主机进行交互了,而是在和中间系统进行交互。也就是说,应用层和传输层都是端到端的协议,而网络层及以下都是中间件的协议了

应用层/传输层(端到端):
主机A ←→ 主机B  (两个端点直接通信)

网络层及以下(中间件):
主机A ←→ 路由器1 ←→ 路由器2 ←→ 路由器3 ←→ 主机B
      (和中间的路由器一个个交互)

简单说:

  • 你发的 HTTP 请求是从你电脑直接到目标服务器(端到端)
  • 但这个请求在网络上跳跃时,每经过一个路由器,都要和那个路由器"握手"(中间件)
上次编辑于: