以javaweb项目为例,用户在搜索网页域名的过程到网页响应到底经过了什么?

用户用浏览器访问一个网站的时候背后的过程与步骤是怎样的?


前言:
首先要知道能用域名访问的前提是用户端可以连接网络,硬件设备是必须有的,在传输过程中,自然是电信号转化为模拟信号,模拟信号在终端又转回电信号才得实现。其传输具体过程可参考现在业内OSI的七层模型和TCP/IP的四层模型等理论,才可以从端到端连接传输。
可参考以下博客进行研究:
七层网络模型和四层模型的参考博文
而我们搜索网站域名实际是使用的HTTP协议,是处于一个应用层层面,当然其实用层级来说,或者记忆确实是太过于生硬,那么当我们的javaweb应用访问域名,例如访问百度究竟走了什么?

首先要知道:
TCP共有6个标志位,分别是:
SYN(synchronous),建立联机。
ACK(acknowledgement),确认。
PSH(push),传输。
FIN(finish),结束。
RST(reset),重置。
URG(urgent),紧急。

当然我们需要还需要知道的便是现在javaweb的主要使用设计模式,即是MVC思想,即是模型,视图,控制器,模型指的便是数据模型,视图则是包含动态和静态的视图,而视图的显示则是由控制器通过与数据模型层面交互得出,然后通过处理器和解析器将视图先渲染,再静态化,就出现我们访问的页面啦

那接下来我们就去探讨一下吧。

1.用户访问网站的流程

用户访问网站的流程 用户在浏览器中输入 www.baidu.com 到显示页面的过程
大体流程如下:
1.1 访问流程
1.2 利用DNS协议进行域名解析
1.3 建立tcp协议三次握手过程
1.4 客户端发出访问网站相应页面请求(发出http协议请求报文)
1.5 服务端发出相应访问页面的请求信息(发出http响应报文)
1.6 断开tcp协议四次挥手过程

1.1 访问流程

利用DNS协议进行域名解析   -->   
建立tcp协议三次握手过程   -->  
客户端发出访问网站相应页面请求(发出http协议请求报文) -->   服务端发出相应访问页面的请求信息(发出http)   -->
断开tcp协议四次挥手过程

1.2 利用DNS协议进行域名解析

DNS称为域名系统,主要作用是负责把域名解析对应的IP地址。就是把www.baidu.com 解析为对应的IP地址 14.215.177.39,有了IP地址就相当于知道百度服务器在哪了,接下来就是去找它。

DNS体系中,查找记录,分为两种查找方式:递归查询和迭代查询。

  1. 递归查询:由DNS客户端发起,一级一级的向上提交查询申请,直至查询终止

  2. 迭代查询:一般情况下由DNS服务器之间完成,即本地DNS向上一级DNS提交查询,上级DNS并不直接返回查询结果,而是告知DNS应该向哪里去查找。

  3. 在这里插入图片描述
    在真正的DNS查询过程中,是包含递归查询和迭代查询的。无论任何方式的查找过程,在每个环节,都会先查找缓存。DNS服务器如果没有了缓存就失去了意义。。。

请记住查询顺序

HOSTS表–> 本地DNS -->上层DNS(包括根DNS)

1.3 建立tcp协议三次握手过程

好了经过DNS解析,现在我们已经知道了百度服务器的地址( 14.215.177.39),可以访问它了。

约会也得先发个邀请吧,网络也一样。先建立连接,才可以传输数据呢。接下来看看怎么和百度服务器约会吧。

1.3.1 简单说明TCP协议

IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。
IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。
简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。
TCP三次握手建立过程简单说明:

  1. 客户端(用户)发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的。并且还将报文中SYN字段置为1,表示需要建立TCP连接请求

  2. 服务端(就是百度服务器)会回复客户端(用户)发送的TCP连接请求报文,其中包含seq序列号,也是由回复端随机生成的,并且将回复报文的SYN字段置1,而且会产生ACK验证字段,ACK验证字段数值是在客户端发过来的seq序列号基础上加1进行回复:

并且还会回复ack确认控制字段,以便客户端收到信息时,知晓自己的TCP建立请求已得到了确认

  1. 客户端收到服务端发送的TCP建立请求后,会使自己的原有序列号加1进行再次发送序列号,

并且再次回复ACK验证请求,在B端发送过来的seq基础上加1,进行回复;同时也会回复ack确认控制字段,

以便B收到信息时,知晓自己的TCP建立请求已经得到了确认。
在这里插入图片描述
不要认为很难理解,计算机思维是人设计,所以其会话也会具备人的特点,三次握手就好比打一次电话,而http访问的无级别的,所以当请求服务器的时候服务器是不知道你是谁,相当于你打别人,而你的电话是匿名的。你打给别人正常来说都应该是先开口吧,你不说话,人家不得把你电话挂了,是不是人家那么忙(服务器说臭小子没事别乱打我电话)
,不得和人家说你说谁,你要找他干点什么事对吧,那就计算机不会说话只能生成报文,生成随机的seq,发送过去SYN字段置为1,服务器端看到了,也回来同样操作,但是不放心,就像你说你谁就谁吗?会不会突然换了人或者是冒充的,那我就生成个验证,就你发的seq+1,还告诉他知道了,说吧干嘛。那人家问你,你不得回你答案,是我是我,计算机不会说话,那就seq再加1呗,知道你在听了,所以连接就正式确认了。

通俗点就是打电话,喂,谁谁谁在吗?我是XXX,怎么了,你真的是XXX吗?噢在啊,你是的话,等等告诉我?噢你说谁谁谁是吧,我XXX啊对啊,没错
总结出现上述情况原因,http请求的无级别的,它不知道谁是谁,第二个建立的连接是TCP连接,是安全的,需要确认身份。+1表确认,而且seq都是随机生成的,只有你我知道,所以相当于一个凭证。

1.4 客户端发出访问网站相应页面请求(发出http协议请求报文)

建立连接后,发送请求报文,想看什么数据。 输入www.baidu.com时,默认请求的是index.html首页文件

1.4.1 请求报文结构:
  1. 请求行:

①. 请求的方法(get post)

②. 请求的数据信息(默认请求index.html首页文件)

③. 请求http协议版本

    tcp协议分为长连接(http1.1)和短连接(http1.0)
  1. 请求头:
  2. 空行:
  3. 请求主体:get方法没有请求主体内容 post方法会有请求主体信息

1.5 服务端发出相应访问页面的请求信息(发出http响应报文)

1.起始行(响应行)

①. HTTP协议版本信息

②. 响应的状态码信息(请求成功状态码 200)

③. 响应状态码说明信息

2.响应头部:

3.空行:

4.响应主体内容:一般为html css js 等等代码信息

1.6 断开tcp协议四次挥手过程

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。

第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:
Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:
Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
在这里插入图片描述
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

到此步其实是渲染完毕响应出百度首页了。

2.javaweb工程内部与服务器的交互

javaweb项目每一次请求和响应其实在三次握手和四次挥手之间,在服务器访问期间在web项目里面配置找index页面,通过MVC架构,与数据库数据交互,将数据返回页面,如果百度现在有一些热点排名等,通过适配器还有处理器以及解析器等待然后解析渲染返回视图。
在这里插入图片描述
在这里插入图片描述

controller<=>service=>dao<=>domain=>dao<=>domain
在这里插入图片描述
而现在都是spring接管
在这里插入图片描述

渲染页面:

  • 遇见HTML标记,浏览器调用HTML解析器解析成Token 并构建成dom树
  • 遇见style/link 标记,浏览器调用CSS解析器,处理CSS标记并构建cssom树
  • 遇见script标记,调用JavaScript解析器,处理script代码(绑定事件:修改dom树,cssom树)
  • 将dom树和cssom树合并成一个渲染树
  • 根据渲染树来计算布局,计算每个节点的几何信息
  • 将节点的颜色绘制到屏幕上(渲染)
    注意:这五个步骤不一定是按照顺序执行,如果dom树或cssom树被修改,可能会执行多次渲染和布局。
    往往实际页面中,这些步骤都会执行多次的。

所以哈哈其实现在的情况是发起请求,然后spring管理一切哈哈哈,页面渲染完事。手动滑稽,嘻嘻!至此以javaweb项目为例,用户在搜索网页域名的过程到网页响应到底经过了什么大体就结束了。如有错误欢迎指出。

以下是本文参考博客:
https://blog.csdn.net/bjbz_cxy/article/details/80393511
https://www.jianshu.com/p/cd801d1b3147
https://www.cnblogs.com/root0/articles/8682658.html
https://blog.csdn.net/xieanna123/article/details/105800955
https://blog.csdn.net/u010359398/article/details/82142449

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将写好的 Java Web 项目网页中启动显示,需要进行以下步骤: 1. 将 Java 项目打包成 WAR 文件(Web Application Archive)。 2. 将 WAR 文件部署到 Web 服务器上,如 Tomcat、Jetty 等。 3. 启动 Web 服务器,在浏览器中输入服务器地址和端口号(如 http://localhost:8080/),访问部署的应用。 具体步骤如下: 1. 打包成 WAR 文件 在 Eclipse 或者其他 IDE 中,可以使用 Export 功能将项目打包成 WAR 文件。具体步骤: - 在 Eclipse 中,选择 File -> Export -> Web -> WAR file,然后按照提示填写相关信息,最后导出 WAR 文件。 - 如果使用 Maven 或 Gradle 构建项目,则可以在 pom.xml 或 build.gradle 文件中配置 WAR 插件,然后使用 mvn package 或 gradle build 命令打包项目。 2. 部署 WAR 文件到 Web 服务器 将 WAR 文件复制到 Web 服务器的 webapps 目录下,如 Tomcat 的 webapps 目录。Web 服务器会自动解压 WAR 文件并将应用部署到相应的路径下。如,如果 WAR 文件名为 myapp.war,则应用的路径为 http://localhost:8080/myapp。 3. 启动 Web 服务器并访问应用 启动 Web 服务器,然后在浏览器中输入应用的路径,如 http://localhost:8080/myapp,即可访问应用。如果一切正常,应该可以看到应用的首页或者登录页面。 以上是将 Java Web 项目部署到 Web 服务器上的基本步骤。当然,具体的步骤可能因为 Web 服务器或者项目的不同而有所差异。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值