浏览器输入URL后的执行过程

浏览器输入URL后,在结果返回浏览器前,主要有以下过程:1、用户输入网址后,浏览器发起DNS查询请求;2、建立TCP连接;3、发送HTTP请求;4、服务器处理请求;5、返回HTTP响应;6、释放TCP连接;7、浏览器解析返回的资源和数据。

1、DNS查询过程

用户访问网页,DNS服务器(域名解析系统)会根据用户提供的域名查找对应的IP地址。域名解析服务器是基于UDP协议实现的一个应用程序,通常通过监听53端口来获取客户端的域名解析请求。
DNS查询过程如下:
(1) 当在浏览器中输入URL后,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
(2) 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
(3) 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
(4) 如果要查询的域名,不由本地DNS服务器区域解析,但本地DNS服务器缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
(5) 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找域服务器,重复上面的动作,进行查询,直至找到主机。
(6) 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
请添加图片描述

2、建立TCP连接

浏览器通过DNS获取待访问服务器IP地址后,便会向该服务器发起TCP连接请求,通过TCP三次握手后建立好套接字连接。
TCP是面向连接的通信协议,也就是说在进行通信前,发送方和接受方已建立了连接,并在完成通信后,释放连接。
TCP连接建立的过程就是三次握手的过程,因此也将建立TCP连接的过程称为三次握手。三次握手图示如下:
请添加图片描述
最初,客户端和服务器的TCP进程都处于CLOSED(关闭)状态。对于服务器端来说,为时刻准备接收客户端进程的连接请求,需提前进入LISTEN(监听)状态,注意,此时服务器的连接并未打开。
然后,客户端TCP进程在创建传输控制块TCB后,主动向服务器发出TCP连接请求报文。此时,报文头部中的同步标识位SYN=1,并设置一个初始序列号seq=x。发送完TCP连接请求报文后,客户端TCP进程进入到SYN-SENT(同步已发送状态)状态。注意,这个报文(SYN=1的报文)不能携带数据,且需要消耗掉一个序列号。
接着,服务器TCP进程接收到请求报文,如果同意连接,则发出确认报文。服务器端确认报文中确认标识位ACK=1,同步标识位SYN=1,确认号ack=x+1,同时也要初始化一个序列号 seq=y。发送完确认报文后,服务器TCP进程进入SYN-RCVD(同步收到)状态。注意,这个报文(ACK=1, SYN=1的报文)也不能携带数据,且同样需要消耗一个序号。
之后,客户端TCP进程接收到服务器端确认报文,并要向服务器给出确认。客户端确认报文的确认标识ACK=1,确认号ack=y+1,序列号seq=x+1。客户端发送完确认报文后,进入ESTABLISHED(已建立连接)状态。注意,这个报文(ACK=1的报文)可以携带数据,但如果不携带数据则不消耗序号。
此后,服务器TCP进程接收到客户端的确认报文后也进入ESTABLISHED状态。
最后,双方就可以开始通信。
建立TCP连接过程的三次握手可总结如下:
第一次握手:客户端TCP进程发送请求连接报文(SYN=1, seq=x)的数据包到服务器TCP进程。此时客户端TCP进程进入SYN_SEND状态,并等待服务器确认。注意,此时服务器端仍位LISTEN状态。
第二次握手:服务器TCP进程收到客户端请求连接报文后,发送确认报文,同时也发送一个SYN包(ACK=1, SYN=1, seq=y,ack=x+1),此时服务器进入SYN_RECV状态。注意,此时客户端仍为SYN_SEND状态。
第三次握手:客户端TCP进程收到服务器确认报文后,向服务器发送客户端确认保文(ACK=1, ack=y+1),并进入ESTABLISHED状态,服务器TCP进程在接收到客户端的确认报文后,也进入到ESTABLISHED状态。

3、发送HTTP请求

通过TCP三次握手建立好连接后,浏览器便可以将HTTP请求发送给服务器了。一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
HTTP 请求是客户端向服务端发送请求动作,告知服务器自己的要求。HTTP请求由状态行消息头空行消息正文四个部分组成。其中,状态行包括请求方式Method、资源路径URL、协议版本Version;消息头包括一些访问的域名、用户代理、Cookie等信息;消息正文就是HTTP请求的数据;空行位于消息头和消息正文之间,用于分隔消息头和消息正文。

4、服务器处理请求

服务器端收到请求后由Web服务器(准确说应该是http服务器,也称Web容器)处理请求,诸如Apache Tomcat、Ngnix、IIS等。Web服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过Web服务器返回给浏览器客户端。
当用户从浏览器向服务器发起一个请求,通常会包含如下信息:http://hostname:port/contextpath/servletpath,hostname 和 port 是用来与服务器建立 TCP 连接,而后面的 URL 才是用来选择服务器中那个子容器服务用户的请求。那服务器是如何根据这个 URL 来达到正确的 Servlet 容器中的呢?以Tomcat为例,Tomcat7.0 中这件事很容易解决,因为这种映射工作有专门一个类来完成的,这个就是 org.apache.tomcat.util.http.mapper,这个类保存了 Tomcat 的 Container 容器中的所有子容器的信息,当 org.apache.catalina.connector.Request 类在进入 Container 容器之前,mapper 将会根据这次请求的 hostnane 和 contextpath 将 host 和 context 容器设置到 Request 的 mappingData 属性中。所以当 Request 进入 Container 容器之前,它要访问那个子容器这时就已经确定了。
Http请求转发给Web容器,Web容器收集相关信息后,生成HttpServletRequest、HttpServletResponse对象并将请求信息存入其中,紧接着,web容器判断由哪一个servlet实例处理该请求,并将request、response对象传给该servlet实例的service方法进行中转。以Spring MVC为例,DispatchServlet分发到具体的Service上。

5、返回HTTP响应

Web服务器将资源复本写到TCP套接字,由客户端读取。一个响应报文由响应行、响应头部、空行和响应数据4部分组成。
HTTP 响应是服务器返回给客户端已发送HTTP请求的执行结果。HTTP 响应和HTTP请求一样,由四部分组成:状态行消息头空行消息正文。其中,状态行包括协议版本Version、状态码Status Code、状态消息等内容;消息头包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;消息正文就是HTTP响应的数据。空行位于消息头和消息正文之间,用于分隔消息头和消息正文。

6、释放TCP连接

为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建TCP连接的3次握手类似,关闭TCP连接,需要4次握手。
数据传输完毕后,双方都需释放连接。TCP释放建立的过程就是四次握手的过程,为与三次握手进行区分,将释放TCP连接的过程称为四次挥手。四次挥手图示如下:
请添加图片描述
最初,客户端和服务器都处于ESTABLISHED状态。然后客户端TCP进程发出连接释放报文,并且停止发送数据。此时释放连接报文头部中结束标识位FIN=1,并更新序列号seq=u(等于前面已传送数据的最后一个字节的序列号加1),发送完TCP连接释放请求报文后,客户端TCP进程进入FIN-WAIT-1(终止等待1)状态。 注意,这个报文(FIN=1的报文)即使不携带数据,也要消耗一个序列号。
然后,服务器TCP进程接收到连接释放报文后,发出确认报文,确认标识位ACK=1,确认号ack=u+1,并且初始化一个序列号seq=v。服务器TCP进程发送完确认报文后,进入到CLOSE-WAIT(关闭等待)状态。此时,客户端向服务器的连接就释放了,也就是处于半关闭状态:客户端已经没有数据要发送,但服务器若发送数据,客户端依然要接受。
接着,客户端TCP进程接收到服务器的确认请求后,进入到FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
之后,服务器TCP进程将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端确认。
在这之后,客户端TCP进程接收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(Maximum Segment Lifetime,最长报文段寿命)时间后,客户端TCP进程才进入CLOSED状态。
而服务器TCP进程在接到客户端的连接释放确认报文后,立即进入CLOSED状态。所以,服务器TCP进程结束TCP连接的时间要比客户端早一些。
释放TCP连接的四次挥手可总结如下:
第一次挥手:客户端TCP进程发送释放连接报文(FIN=1, seq=u) 到服务器TCP进程。此时客户端TCP进程进入FIN-WAIT-1(终止等待1)状态。注意,注意,此时,服务器端仍处于ESTABLISHED状态。
第二次挥手:服务器TCP进程收到客户端释放连接报文后,发送确认报文,同时也发送一个SYN包(ACK=1, ack=u+1, seq=v),然后服务器进入CLOSE-WAIT状态。注意,当前连接已处于半关闭状态。客户端已无法向服务器发送数据,但客户端仍可接收服务器发送到数据。
客户端TCP进程接收到服务器的确认请求后,进入到FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第三次挥手:服务器TCP进程确认最后的数据发送完毕后,向客户端发送连接释放报文(FIN=1, ack=u+1, seq=w),然后,服务器就进入了LAST-ACK(最后确认)状态,等待客户端确认。
第四次挥手:客户端TCP进程接收到服务器的连接释放报文后,返回确认报文(ACK=1, ack=w+1, seq=u+1),然后客户端就进入TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL时间后,客户端TCP进程才进入CLOSED状态。而服务器TCP进程在接到客户端的连接释放确认报文后,立即进入CLOSED状态。
四次挥手的状态转换过程如下:
客户端和服务器处于ESTABLISHED——客户端FIN-WAIT-1——服务器CLOSE-WAIT——客户端FIN-WAIT-2——服务器LAST-ACK——客户端TIME-WAIT——服务器和客户端CLOSED

7、浏览器解析返回的资源和数据

服务器返回资源和数据给浏览器后,浏览器需要加载解析html、css、js,以及图片、视频等其他媒体资源。
浏览器通过解析html,生成dom树,解析css,生成css规则树,然后通过dom树和css规则树生成渲染树。渲染树与dom树不同,渲染树中并没有head、display为none等不必显示的节点。
要注意的是,浏览器的解析过程并非是串行的,比如在解析css的同时,可以继续加载解析html,但在解析执行js脚本时,会停止解析后续thml,这就会出现阻塞问题。
这里重点介绍下html、css、js解析过程。
(1) html文档解析dom树
在浏览器没有完整接受全部html文档时,它就已经开始显示这个页面了。生成解析树即dom树,是由dom元素及属性节点组成,树的根是document对象。
(2) 浏览器发送获取嵌入在html中的对象
加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。
但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。
(3) css解析Parser Render Tree
浏览器下载css文件,将css文件解析为样式表对象,并用来渲染dom树。该对象包含css规则,该规则包含选择器和声明对象。css元素遍历的顺序,是从树的低端向上遍历。
(4) js解析
浏览器UI线程:单线程,大多数浏览器(比如chrome)让一个单线程共用于执行javascrip和更新用户界面。
js阻塞页面:浏览器里的http请求被阻塞一般都是由js所引起,具体原因是js文件在下载完毕之后会立即执行,而js执行时候会阻塞浏览器的其他行为,有一段时间是没有网络请求被处理的,这段时间过后http请求才会接着执行,这段空闲时间就是所谓的http请求被阻塞。
js阻塞原因:之所以会阻塞UI线程的执行,是因为js能控制UI的展示,而页面加载的规则是要顺序执行,所以在碰到js代码时候UI线程会首先执行它。

参考

https://blog.csdn.net/root_robot/article/details/53872812 DNS的工作原理及解析
https://www.cnblogs.com/developing/articles/10828890.html 输入URL后的全过程
https://www.jianshu.com/p/f0763a49d64c 浏览器输入一个网址(www.baidu.com)后执行的全过程
https://www.cnblogs.com/Leo_wl/p/3364231.html 页面生命周期
https://www.cnblogs.com/licheng/p/6687326.html 【Tomcat】Servlet 工作原理解析
https://blog.csdn.net/weixin_38753309/article/details/84524937 Web容器处理请求的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/114701.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux操作系统的权限的深入学习

1.Linux权限的概念 Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“#”,普通用户…

骨传导耳机会影响听力吗?这是真的吗?

首先正常的使用骨传导耳机并不会影响我们的听力!那是为什么呢?? 因为骨传导是一种声音传导方式,可以通过人的颅骨、骨迷路、内耳淋巴液传递、螺旋器、听神经、听觉中枢来传递声波。 相对于通过耳道声波的经典声音传导方式&#x…

哪吒汽车“三头六臂”之「浩智电驱」

撰文 / 翟悦 编审 / 吴晰 8月21日,在哪吒汽车科技日上,哪吒汽车发布“浩智战略2025”以及浩智技术品牌2.0。根据公开信息,主编梳理了以下几点:◎浩智滑板底盘支持400V/800V双平台◎浩智电驱包括180kW 400V电驱系统和250kW 800…

【Vue3 知识第五讲】条件渲染、列表渲染知识详解

文章目录 一、条件渲染1.1 概述1.2 演示代码 二、列表渲染2.1 使用 指令 v-for 遍历数组2.2 **使用 指令 v-for 遍历对象** 十、案例作业十一、总结 在前端开发过程中,条件和循环是经常被用到的逻辑。vue中封装了自己的组件渲染指令,可以更加方便的帮助开…

ARM寄存器组

CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0-R7,通用目的寄存器 R0-R7也被称为低组寄存器,所有指令可以访问它们,它们的字长为32位,复位后的初始值是不可预料的。 R8-R12,通用目的寄存器 R8-R12也被称…

LeetCode(力扣)700. 二叉搜索树中的搜索Python

LeetCode20. 有效的括号 题目链接代码 题目链接 https://leetcode.cn/problems/search-in-a-binary-search-tree/ 代码 递归法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val #…

基于stm32的烟雾浓度检测报警proteus仿真设计(仿真+程序+讲解)

基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解) 1.主要功能2.仿真3. 程序4. 资料清单&下载链接 基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号&a…

只考一门数据结构!安徽工程大学计算机考研

安徽工程大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文992字,预计阅读:3分钟 2023考情概况 安徽工程大…

乱糟糟的YOLOv8-detect和pose训练自己的数据集

时代在进步,yolo在进步,我还在踏步,v8我浅搞了一下detect和pose,记录一下,我还是要吐槽一下,为啥子这个模型就放在了这个文件深处,如图。 以下教程只应用于直接应用yolov8,不修改。…

内网实战1

1、信息收集: 使用nmap做端口扫描: nmap -sV -Pn -T4 192.168.26.174重要端口:80、445、139、135、3306 目录扫描: 访问80端口:发现一个网站是phpstudy搭建的; 发现一个mysql数据库,那我们…

BTC价格预测:灰度突如其来的胜利是否会打破“九月魔咒”?

加密市场即将进入第三季度交易的最后阶段,由于9月份被视为是比特币的下跌时期,大多数投资者都预测加密货币之王将会进一步下跌。然而,事情却发生了逆转,灰度突如其来的胜利是否会打破“九月魔咒”? 受该事件影响&#…

解决win10 wsl子系统安装的ubuntu环境中lsof,netstat命令查看端口没有任何输出的问题

最近有个以前的ssm项目需要在新电脑上运行测试一下,发现需要redis环境,看了官网说:有两种选择: 1. 要么在虚拟机比如vmware安装linux基础环境,然后再安装redis 2. 要么可以利用win10的wsl linux子系统安装ubuntu&…

JVM-性能优化工具 MAT

一、MAT下载和安装 1、概述 MAT(Memory Analyzer Tool)工具是一款功能强大的]ava堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用…

022-从零搭建微服务-短信服务(二)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

(笔记一)利用open_cv在图像上进行点标记,文字注记,画圆、多边形、椭圆

(1)CV2中的绘图函数: cv2.line() 绘制线条cv2.circle() 绘制圆cv2.rectangle() 绘制矩形cv2.ellipse() 绘制椭圆cv2.putText() 添加注记 (2)注释 img表示需要绘制的图像color表示线条的颜色,采用颜色矩阵…

使用 Amazon Lambda 进行无服务器计算:云架构中的一场革命

引言 十年前,无服务器架构还像是痴人说梦。不再如此了! 有了 Amazon Lambda,我们现在可以建构和运行应用程序而不需要考虑服务器。云供应商会无缝地处理所有服务器的供应、扩展和管理。我们只需要关注代码。 这为云部署带来了前所未有的敏捷性、自动化和优化。但是,要发挥它的…

Flink SQL你用了吗?

分析&回答 Flink 1.1.0:第一次引入 SQL 模块,并且提供 TableAPI,当然,这时候的功能还非常有限。Flink 1.3.0:在 Streaming SQL 上支持了 Retractions,显著提高了 Streaming SQL 的易用性,使…

Spring框架知识点汇总

01.Spring框架的基本理解 关键字:核心思想IOC/AOP,作用(解耦,简化),简单描述框架组成; Spring框架是一款轻量级的开发框架,核心思想是IOC(反转控制)和AOP&a…

Ubuntu 20.04.5 怎么安装微信

这是我的ubutun版本号 在这个系统装桌面版微信很多功能不健全。搜索了很多方法,这个算是不错的一个法子。 1.添加仓库 首次使用时,你需要运行如下一条命令将移植仓库添加到系统中。 wget -O- https://deepin-wine.i-m.dev/setup.sh | sh 2.应用安装 …

【01】弄懂共识机制PoW

基于工作量证明机制的共识机制PoW(Proof of Work) 特点就是多劳多特 共识过程 一个区块链系统中,交易历经多个步骤才能得以上链,并且需要经过多个节点的验证。以下是这些步骤的详细叙述: 交易进入交易池(内…