谈url输入到浏览器地址栏后发生了什么

宋正兵 on 2021-06-26

我们先来看一下 URL 的定义。

URL定义

URL 统一资源定位符,是用来表示从互联网上得到资源的位置和访问这些资源的方法。可以说互联网上的所有资源都有一个唯一确定的 URL。URL 的一般形式由以下四个部分组成:

1
<协议>://<主机>:<端口>/<路径>

其中协议现在比较常用的就是 http 或者 https,其次就是 ftp。协议后面的 :// 是规定的格式。

主机指该主机在互联网上的域名,也可以是 IP 地址。再后面的端口和路径有时可省略。


大致流程

那么当一个 URL 被输入到浏览器地址栏后发生了什么呢?

主要分为两个:HTML 页面加载和网页静态资源的加载

总体来讲分为以下六个步骤:

  1. DNS 解析
  2. TCP 连接
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回结果
  5. 浏览器解析渲染页面
  6. 连接结束

1. NDS解析

在浏览器的地址栏输入 URL 之后,浏览器首先会对 URL 进行解析。一个 URL 一般包括几大部分:

  • 协议头,比如 http、https 和 ftp 等
  • 主机,主机域名或者是 IP 地址
  • 端口号,一般都省略
  • 路径,所要访问资源所在的路径

拿访问 https://zbsong.top/article/ 为例,使用的协议是 https,主机是域名 zbsong.top,端口号 80 被省略,路径就是域名后面的 /article

对 URL 解析完成后就需要去进行 DNS 解析。

DNS 解析的目的就是从主机的域名解析出主机的 IP 地址。网络中的主机都是使用 IP 地址来标识的,IP 地址才是主机在网络中的位置,域名只是为了方便记忆使用的。

DNS 解析的过程:

  1. 浏览器拿到地址后首先搜索自身缓存的 DNS 记录,例如 Chrome 可以通过 chrome://net-internals/#dns 查看。

  2. 如果浏览器缓存中没有找到,则去查看 HOSTS 文件和操作系统的缓存

    1. 操作系统缓存,Windows 系统下可以使用 ipconfig /displaydns 查看
    2. HOSTS 文件的位置请百度查询,通过修改此文件内域名和 IP 地址的映射关系,可以实现科学上网
  3. 如果步骤 2 中也没有找到,就需要向域名服务器发送请求

    1. 域名服务器即网络设置中填写的 DNS 服务器
    2. 以 UDP 用户数据报方式发送给本地域名服务器
    3. 这一刻才算真正意义上的解析流程开始
  4. 如果本地域名服务器也没有相应的记录,就会开始递归查询+迭代查询

    1. 主机所询问地本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就会以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,所以是递归查询
    2. 当根域名服务器收到本地域名服务器发出地迭代查询请求报文时,要么给出索要查询的 IP 地址,要么告诉本地域名服务器下一步应该向哪一个域名服务器进行查询,然后让本地域名服务器进行后续的查询,所以是迭代查询

    根域名服务器是最高层次的域名服务器,它知道所有的顶级域名服务器的域名和 IP 地址(com 域名服务器、cn 域名服务器等),所以不管哪一个本地域名服务器,若要对互联网上的任何一个域名进行解析,只要自己无法解析,就首先要求助于根域名服务器。

  5. 查询到域名对应的 IP 地址后,根据查询的路径返回给浏览器。

2. 建立TCP连接

浏览器在知道服务器的 IP 地址后,会选择一个大于 1024 的本机端口向目标 IP 地址的 80 端口发起 TCP 连接请求,经过标准的 TCP 三次握手后,建立 TCP 连接。

选择大于 1024 的本机端口是因为 1024 以上的端口是专门留给没有熟知端口号的应用程序所使用的。

3. 发起HTTP请求

TCP 连接建立后,浏览器构建 HTTP 请求报文,将 HTTP 报文包裹在 TCP 报文段中,发送到服务器的指定端口(HTTP 协议 80 或者 8080,HTTPS 协议 443)。

HTTP 请求报文是由四部分组成:请求行、请求头部、空行和请求包体。

http请求报文

请求行:请求行由方法字段、URL 字段和 HTTP 协议版本字段 3 个部分组成,它们之间使用空格隔开。常见的 HTTP 请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;

  • GET:用于获取/查询资源信息。要求服务器将 URL 定位的资源放在响应报文的数据部分,回送给客户端,请求参数和对应的值附加在 URL 后面,利用问号 ? 代表 URL 的结尾与请求参数的开始,请求参数之间用 & 隔开。例如 http://localhost:8080/index.html?page=1&size=10
  • POST:用于更新资源信息。向服务器提交数据,POST 方法将请求参数封装在 HTTP 请求包体中,可以传输大量数据。

请求头部 :请求头部由 头部字段名称:值 对组成,每行一对。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

  • User-Agent:产生请求的浏览器类型;
  • Accept:客户端可识别的响应内容类型列表;
  • Accept-Language:客户端可接受的自然语言;
  • Accept-Encoding:客户端可接受的编码压缩格式;
  • Accept-Charset:可接受的应答的字符集;
  • Host:请求的主机名;
  • connection:连接方式(close 或 keep-alive);
  • Cookie:存储客户端扩展字段;

空行 :最后一个请求头之后是一个空行,发送回车和换行符,通知服务器以下不再有请求头;

请求包体 :请求包体不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需要提交数据的场合。与请求包体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length;

4. 服务器处理请求并返回结果

服务器从固定的端口收到 TCP 报文,对 HTTP 协议进行解析,按照报文格式进一步封装成 HTTP Request 对象,供上层使用,这一部分工作一般由 Web 服务器(如 Tomcat)去进行。

请求被处理完成后返回结果,即 HTTP 响应报文。

HTTP 响应报文由状态行、响应头部、空行和响应包体 4 个部分组成,

HTTP响应报文

状态行 :状态行由 HTTTP 协议版本字段、状态码和状态码描述文本 3 个部分组成,它们之间使用空格隔开;

  • 状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类:
    • 1xx:表示服务器已经接收了客户端请求,客户端可继续发送请求;
    • 2xx:表示服务器已成功接收到请求并进行处理;
    • 3xx:表示服务器要求客户端重定向;
    • 4xx:表示客户端的请求有非法内容;
    • 5xx:表示服务器未能正常处理客户端的请求而出现意外错误;
  • 状态码描述文本:
    • 200 OK:表示客户端请求成功;
    • 400 Bad Request:表示客户端请求有语法错误,不能被服务器理解;
    • 401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用;;
    • 403 Forbidden:表示服务器收到请求,但是拒绝提供服务;
    • 404 Not Found:表示请求的资源不存在;
    • 500 Internal Server Error:表示服务器放生了不可预期的错误,导致无法完成客户端的请求;
    • 503 Service Unavailable:表示服务器当前不能够处理客户端的请求,过一段时间后可能会恢复正常;

响应头部 :响应头部由 头部字段名称:值 对组成,每行一对。

  • Location:用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回 Location 响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源;
  • Server:包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。
  • Vary:指示不可缓存的请求头列表;
  • Connection:连接方式;
    • 对于请求来说:
      • close:告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了
      • keep-alive:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求
    • 对于响应来说:
      • close:连接已经关闭
      • keep-alive:连接保持着,在等待本次连接的后续请求);
    • WWW-Authenticate:必须被包含在 401(未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了 Authorization 报头域的请求;

空行 :最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。

响应包体 :服务器返回给客户端的文本信息;

通常 html、css、js 和图片等文件就包含在服务器返回给浏览器的文本信息中。

5. 浏览器解析渲染页面

浏览器收到 HTML\CSS\JS 文件后,会边解析边渲染。

6. 连接结束

完成请求之后,会经历四次挥手释放 TCP 连接,标志着客户端浏览器和服务器断开连接。

总结

客户端

(应用层)获取 URL,通过负责域名解析的 DNS 服务获得网址的 IP 地址,根据 HTTP 协议省成 HTTP 请求报文。

(传输层)浏览器客户端和网站服务器(通过三次握手)建立 TCP 连接,根据 TCP 协议把 HTTP 请求报文按序号分割成多个报文段发送。

(网络层)根据 IP 协议(传输数据),ARP 协议(获取硬件地址),内部网关协议(路由信息协议 RIP、开放最短路径优先 OSPF)和外部网关协议(边界网关协议 BGP)(寻找合适的路径进行转发),把报文段封装成 IP 数据报传输。

(数据链路层)把网络层交下来的 IP 数据包封装成帧,利用 CSMA/CD(载波监听多点接入/碰撞检测)协议尽最大努力的交付数据帧,并且提供透明传输和差错检测。

(物理层)利用物理介质进行传输。

服务器

服务器就是反过来,自下而上的顺序把客户端传送的数据呈现到应用程序进行处理。处理的结果同样的根据刚才客户端的流程发送给客户端。