这一次彻底弄懂,在浏览器输入URL,按下回车之后发生了什么?

目录

1. URL 解析

2. DNS 域名解析

3. 建立 TCP 连接

4. 发送 HTTP 请求

5. 服务器对请求进行处理并做出响应

6. 浏览器解析渲染页面

7. 断开 TCP 连接


在浏览器输入URL,按下回车之后做了些什么呢?

总体流程图如下:

1. URL 解析

浏览器首先对 URL 解析,解析出协议、域名、端口、资源路径、参数等。

2. DNS 域名解析

一般而言,域名比 IP 地址更好记,因而我们更习惯在浏览器输入域名而不是 IP,而计算机网络通信所识别的计算机标识是 IP 地址,因而首先需要将一个域名转化为相应的 IP 地址,这就是 DNS 协议所要做的事。

DNS 就像我们手机中的通讯录一样,通讯录中备注的是对方的姓名(类似于域名),但是打电话的时候实际需要的是电话号码(类似于 IP 地址),利用通讯录将一个姓名转化为对应的电话号码。

3. 建立 TCP 连接

一般在浏览器输入 URL,应用层的协议为 HTTP/HTTPS,其需要的是可靠的服务,所使用的传输层协议为 TCP。

通过域名解析后,浏览器获得了服务器的 IP,则向服务器发起 TCP 连接,这时候就会发生三次握手行为。

  • 第一次握手:客户端应用进程主动打开,并向服务器端发送请求
  • 第二次握手:服务端应用进程被动打开,若同意客户端的请求,则返回一个确认报文
  • 第三次握手:客户端接收到确认报文后,通知上层应用进程连接已经建立,并向服务器发送一个确认报文。服务器接收到客户端的请求也通知其上层应用进程连接已建立。

客户端与服务器端的三次握手简而言之:

  • 浏览器向服务器发送想建立连接的请求
  • 服务器向浏览器发送同意建立连接的响应
  • 浏览器向服务器发送确认收到响应的请求,客户端和服务器建立连接

4. 发送 HTTP 请求

当浏览器与服务器建立连接后,就可以进行数据通信过程,浏览器会给服务器发送一个 HTTP 请求报文,请求报文包括请求行、请求头、请求空行和请求体。在请求行中会指定方法、资源路径以及 HTTP 版本,其中资源路径是指定所要操作资源在服务器中的位置,而方法是指定要对这个资源做什么样的操作。

从浏览器输入 URL,资源路径在第一步就已经被解析出来了,而方法为 GET,表明要获取资源,相当于增删改查中的查询。

HTTP响应也由四个部分组成,分别是状态行、消息报头、空行和响应正文。
状态行:由HTTP协议版本号, 状态码, 状态消息三部分组成。
状态码规律:
   • 1xx:指示信息–表示请求已接收,继续处理。
   • 2xx:成功–表示请求已被成功接收、理解、接受。
   • 3xx:重定向–要完成请求必须进行更进一步的操作。
   • 4xx:客户端错误–请求有语法错误或请求无法实现。
   • 5xx:服务器端错误–服务器未能实现合法的请求。
平时遇到比较常见的状态码有:200, 301, 302, 304, 401, 403, 404, 500

  • 200 (OK): 找到资源并成功返回数据。
  • 301:永久重定向。
  • 302:临时重定向。
  • 304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
  • 401 (UNAUTHORIZED): 未经授权。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
  • 403 (FORBIDDEN): 没有权限。这通常是在401之后输入了不正确的用户名或密码。
  • 404 (NOT FOUND): 在指定的位置不存在所申请的资源。找不到页面
  • 500:服务器内部出错。

5. 服务器对请求进行处理并做出响应

当收到浏览器发送的请求报文后,服务器会对此请求报文进行相应的处理,并返回响应报文给浏览器。比如请求报文想要获取(GET) index.html 这个文件,那么服务器就会找到 index.html 文件,然后将此文件作为响应报文中的响应体发送给浏览器。

响应报文包括响应行、响应头、响应空行和响应体。在响应行中会指定 HTTP 版本、状态码和对状态码的解释信息,比如 HTTP/1.1 200 OK ,其中 200 是响应码,指请求被正常处理,也就是成功 OK 的意思。

6. 浏览器解析渲染页面

浏览器收到服务器的响应报文后,从响应体中得到相应资源,如 HTML 文件、图片、视频等,并进行渲染,然后将结果呈现给用户。

浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-5过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,这是因为渲染引擎和js引擎是互斥的。要等到文档中JS文件加载执行完毕,才会继续HTML的渲染过程。原因边渲染页面边执行js时js 有可能修改DOM结构,所以应该等js执行完毕再继续页面的渲染,否则起初渲染好的页面结构可能被js的解析执行破坏,所以js脚本一般放在页面最底部。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。

7. 断开 TCP 连接

当数据完成请求到返回的过程之后,根据请求/相应头中 Connection 的 Keep-Alive 属性可以选择是否断开 TCP 连接,如果不需要再进行数据通信,即可以关闭连接,此时则会发生四次挥手行为。

  • 第一次挥手:客户端的应用程序发出连接释放的报文,并停止发送数据。
  • 第二次挥手:服务端接收到连接释放的报文后,发出确认报文。此时连接处于半封闭状态,客户端不再继续向服务端发送数据,但是服务端继续向客户端发送数据。
  • 第三次挥手:若服务端没有了要向客户端发送的数据,其应用进程会通知服务器释放TCP连接
  • 第四次挥手:客户端接收到释放报文后,必须确认。再经过2MSL(最长报文寿命)s后,本次TCP连接正式结束。

客户端与服务器端的四次挥手简而言之:

  • 浏览器向服务器发送想断开连接的请求
  • 服务器向浏览器发送收到请求的响应
  • 服务器向浏览器发送断开连接的请求
  • 浏览器断开连接并向服务器发送一个反馈请求,服务器收到后断开连接

注意:

  • 浏览器为了提升性能,在 URL 解析之后,实际会先查询是否有缓存,如果缓存命中,则直接返回缓存资源。

  • 如果是 HTTPS 协议,在建立 TCP 连接之后,还需要进行 SSL/TLS 握手过程,以协商出一个会话密钥,用于消息加密,提升安全性。

相关文章 👉     百度安全验证

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值