在网页上点击一个按钮到服务器的整个流程-

2 篇文章 0 订阅
1 篇文章 0 订阅

也可以理解为一个http请求的完整流程,一般点击按钮交互分为超链接跳转、表单提交、或者异步的获取数据。下面以超链接跳转 https://www.baidu.com为例

  1. 域名解析(DNS解析):逐级从浏览器、本地操作系统、路由器、电信运营商缓存,还找不到,电信运营商会根据域名去对应的域名服务器查找IP信息
  • 浏览器缓存中查找,不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)(可以通过chrome://net-internals/#dns查看)
  • 系统缓存:如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。( ipconfig /displaydns 来查看)
  • 路由器缓存:接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
  • ISP DNS 缓存(电信运营商缓存):接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
  • 递归搜索: 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了
  1. TCP三次握手(已经DNS解析了域名对应IP,请求URL地址了面有端口,默认80,这样就可以实现TCP连接了)

  2. 成功建立TCP连接开始通讯

  3. 浏览器发起HTTP请求,一个完整的http请求信息由3部分组成:请求行、请求头部、请求数据

  • 请求行:Request Method(GET、POST、PUT、DELETE等)、Request URL、请求的协议(http1.0、http1.1,现在浏览器大部分默认都是http1.1协议)
  • 请求头部:Connection属性、Accept Encoding(服务端可以发送的压缩数据的格式)、Accept Charset等信息
  • 请求数据:get请求的话就是空的,post请求里面就会有请求的相关参数和参数值
  1. 服务器处理收到的请求
  • 一般第一层是nginx服务器,Nginx根据URL在Nginx本地查找是否有代理层本地缓存,如果没有缓存,再根据反向代理的规则,分配给对应的资源来处理
  • 如果有用到Zuul的话,可能还需要第二层网关,来找到对应的后台来处理请求
  • 普通动态请求的话,如果Spring MVC框架,流程如下,主要是DispatcherServlet控制器,控制整个流程。
    1. 客户端用户发送请求至前端控制器DispatcherServlet。
    2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    3. HandlerMapping处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    4. DispatcherServlet调用HandlerAdapter处理器适配器,HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
    5. Controller控制器执行完成返回ModelAndView,HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
    6. DispatcherServlet前端控制器将ModelAndView传给ViewReslover视图解析器。
    7. ViewReslover解析后返回具体View,会根据配置的不同而使用不同的ViewReslover,比如JSP文件的InternalResourceViewResolver、FreeMaker文件的FreeMarkerViewResolver 
    8. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中),并返回给客户端用户
  • MVC的过程中会调用Controller层的代码(忽略了一些MVC如何配置的一些细节:比如web.xml中DispatcherServlet的配置,和component-scan、InternalResourceViewResolver的配置,MVC的Bean的暴露,和参数的传递)

  • Controller层又是通过Spring IOC的依赖注入,注入了Server层的Bean,这里包括三个知识点:1. Spring MVC基于父子容器的实现(Mvc子容器可以任意注入Spring 父容器中的Bean,但是父容器无法引用MVC子容器里面注入的Bean)2. Spring IOC注册Bean的原理 3. Spring 框架如何在Tomcat等web容器下启动原理

  • 引用了Service层的Bean,处理业务,再到Dao层,通过ORM框架,比如Mybatis(原理还是封装的JDBC连接)和数据库交互

  • 静态资源请求的话(html、css、图片等),可能就直接从对应的文件路径里面返回了

  1. 服务器返回一个响应报文,响应报文包括:状态行、响应头部、响应正文
  • 状态行:请求协议、状态码、状态码描述 ,比如 HTTP1.1 200 OK
  • 响应头部:Content-Type(Server: Apache/2.2.8 PHP/5.2.5)、Content-Length、Content-Charset等信息
  • 响应正文:内容可能是html、js、css等等
  1. 浏览器解析html代码并请求html中的js/css/图片等资源
  2. 浏览器进行页面渲染呈现给用户
  3. 数据传输完毕,TCP 4次挥手断开连接。因为现在的浏览器默认都是Http1.1协议(长连接,keepalive=true),这样可以避免传输一个多段的数据频繁的创建TCP连接。而连接的断开一般是由服务器来控制的,最后发送一个空白行表示一个消息数据全部发送完成,然后四次挥手断开TPC连接。

参考资料

https://blog.csdn.net/wuhenliushui/article/details/20038819
https://blog.csdn.net/yezitoo/article/details/78193794

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值