浏览器发出请求到服务器响应的流程

用户输入 URL

用户在浏览器地址栏中输入要访问的网址(URL),或者点击页面上的链接。浏览器内部代码将url进行拆分解析。
20231003155125

当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html 这些文件,这样就不会发生混乱了。

DNS解析

浏览器通过DNS(域名系统)将输入的域名解析为对应的IP地址。这是为了确定要请求的服务器的位置。

DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限。

在域名中,越靠右的位置表示其层级越高。

域名的层级关系类似一个树状结构:

  • 根 DNS 服务器(.)
  • 顶级域 DNS 服务器(.com)
  • 权威 DNS 服务器(server.com)

域名解析的工作流程——

  • 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
  • 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  • 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
  • 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
  • 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  • 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
  • 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
  • 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

建立TCP连接

浏览器使用HTTP或HTTPS协议,与目标服务器建立TCP连接。这是通过使用服务器的IP地址和端口号来实现的。它为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地还原报文信息。TCP协议通过“三次握手”等方法保证传输的安全可靠。

发起HTTP请求

浏览器构建HTTP请求,包括请求方法(GET、POST等)、请求头部(包括User-Agent、Accept、Cookies等信息)、请求体(对于POST请求)等。然后将请求发送给服务器。

服务器拦截请求(Spring MVC的执行流程)

当客户端发起一个HTTP请求时,Web容器(例如Tomcat)会拦截该请求并根据请求的URL来确定如何处理它。URL通常包括协议(http://或https😕/)、主机名(域名或IP地址)、端口号(默认是80或443)、路径(URL的一部分,用于定位资源或控制器)、查询参数等。

在基于 Spring 的 Web 应用中,通常会使用 Spring MVC框架。Spring MVC 的核心组件是 DispatcherServlet,它充当了请求的前置控制器。当请求到达时, DispatcherServlet 通过 Handler Mapping 负责分发请求到适当的处理程序(Controller)。

视图阶段(JSP)
20231003203812

  • 用户发送出请求到前端控制器DispatcherServlet
  • DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
  • HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet
  • DispatcherServlet调用HandlerAdapter(处理器适配器)
  • HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
  • Controller执行完成返回ModelAndView对象
  • HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
    DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
  • ViewReslover解析后返回具体View(视图)
  • DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  • DispatcherServlet响应用户

前后端分离阶段(接口开发,异步请求)
20231003205858

  • 用户发送出请求到前端控制器DispatcherServlet
  • DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
  • HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet
  • DispatcherServlet调用HandlerAdapter(处理器适配器)
  • HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
  • 方法上添加了@ResponseBody
  • 通过HttpMessageConverter来返回结果转换为JSON并响应

服务器处理请求

服务器接收到HTTP请求后,根据请求的内容和URL,执行相应的处理,可能包括查询数据库、处理业务逻辑等。

服务器发送HTTP响应

服务器构建HTTP响应,包括响应状态码、响应头部(包括Content-Type、Content-Length等信息)和响应体(包含请求的实际内容)。然后将响应发送回浏览器。

浏览器接收响应

浏览器接收到服务器的HTTP响应,然后根据响应的内容进行解析和渲染。如果响应是一个HTML页面,浏览器会渲染页面并显示给用户。

关闭连接

一旦请求和响应完成,浏览器和服务器之间的TCP连接通常会被关闭,以释放资源。

页面渲染

浏览器会解析HTML,执行JavaScript代码(如果有),加载并显示页面上的资源(例如图像、样式表等),最终呈现完整的页面给用户。

用户与页面交互

用户可以与页面交互,点击链接、填写表单、触发事件等。这些操作可能导致新的HTTP请求被发送到服务器,从而开始新的请求和响应周期。

posted @ 2023-10-07 12:50  岸南  阅读(488)  评论(0)    收藏  举报