浏览器从输入URL到页面展示这个过程中都经历了什么
一. URL输入
URL是统一资源定位符,用于定位互联网上的资源,俗称网址。我们在地址栏输入网址后敲下回车,浏览器会对输入的信息进行以下判断:
1. 检查输入的内容是否是一个合法的URL连接
2. 如果合法的话,则会判断URL是否完整,如果不完整的话,浏览器可能会对地址进行猜测,补全地址的前缀或者后缀。
3. 如果不合法的话,将输入内容作为搜索条件,使用用户设置的默认搜索引擎来进行搜索。大部分的浏览器会从历史记录,书签等地方开始查找我们输入的内容,并给出智能提示。
二. DNS域名解析
因为浏览器不能直接通过域名找到对应的服务器IP地址,所以需要进行DNS解析,找到对应的IP地址进行访问。DNS解析域名的过程如下:
首先用户在浏览器中输入域名,操作系统会检查浏览器缓存和本地hosts文件中是否有这个网址记录,有的话就从记录里面找到对应的IP地址,完成域名的解析。
没有的话,就用TCP/IP参数中设置的DNS服务器进行查询, 如果要查询的域名包含在本地配置区域资源中,则返回解析结果,完成域名解析。
如果还没有的话再接着检查本地DNS服务器是否缓存有该网址记录,有的话就返回解析结果,完成域名解析。
如果还没有的话,本地DNS服务器会发送查询报文到根DNS服务器,根DNS服务器收到请求后,返回顶级域DNS服务器地址,然后本地DNS服务器再发送查询报文到顶级域DNS服务器,顶级域DNS服务器收到请求后,返回权威DNS服务器的地址,然后本地DNS服务器再发送查询报文到权威DNS服务器,权威DNS服务器收到请求后,返回最终的IP地址,完成域名的解析。
三. TCP连接
当浏览器获取到服务器的IP地址后,浏览器会用一个随机的端口号向服务器的80端口发起TCP连接请求,连接请求到达服务器端后,通过TCP三次握手建立TCP连接。
TCP三次握手,其实就是建立一个TCP连接。客户端与服务器交互需要3个数据包,所以叫三次握手。握手的主要作用就是为了确认双方的接收和发送能力是否正常,初始序列包,交换窗口大小等信息。
第一次握手:客户端发送SYN报文,并进入SYN_SENT状态,等待服务器的确认。
第二次握手:服务器收到SYN报文,需要向客户端发送SYN+ACK报文,此时服务器进入SYN_RCVD状态。
第三次握手:客户端收到SYN+ACK报文,向服务器发送确认包,客户端进入ESTABLISHED状态。待服务器收到客户端发送ACK包也会进入ESTABLISHED状态,完成三次握手。
那为什么TCP采用三次握手,二次握手不可以吗?
主要是因为以下原因:
1. 确认双方的收发能力。TCP建立连接之前,需要确认客户端和浏览器双方的收包和发包的能力,最开始的一次握手,客户端发送网络包,服务端收到了,这样服务端就能得出结论:客户端的发送能力,服务端的接收能力是正常的。第二次握手,服务端发包,客户端收到了,这样客户端就能得出结论:服务端的接收,发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。第三次握手:客户端发包,服务端收到了,这样服务端就能得出结论:客户端的接收,发送能力正常,服务端自己的发送,接收能力也正常。所以,只有三次握手才能确认双方的接收与发送能力是否正常。
2. 确认序列号可靠同步。如果是两次握手,服务端无法确认客户端是否已经接收到了自己发送的初始序列号,如果第二次握手报文丢失,那么客户端就无法知道服务端的初始序列号,那TCP的可靠性也就无从谈起了。
3. 阻止重复历史连接的初始化。客户端由于某种原因发送了两个不同序号的SYN包,由于网络环境的复杂性,旧的数据包有可能先到达服务器。如果是两次握手,服务器收到旧的SYN就会立刻建立连接,那么就会造成网络异常。如果是三次握手,服务器需要回复SYN+ACK包,客户端会对比应答的序号,如果发现是旧的报文,就会给服务器发RST报文,直到正常的SYN到达服务器后才正常建立连接。所以要三次握手才有足够的上下文信息来判断当前连接是否是历史连接。
4. 安全问题。TCP新建连接时,内核会为连接分配一系列内存资源,如果采用两次握手,旧建立连接,那会放大DDOS攻击的。TCP作为一种可靠的传输控制协议,其核心思想是既要保证数据可靠传输,又要提高传输的效率,而三次握手恰好可以满足以上两方面的需求。
四. 发送HTTP请求
建立连接后,就可以通过HTTP进行数据的传输了。
如果是https的话,会在TCP和HTTP之间多添加一层协议作为加密及认证的服务,HTTPS使用SSL和TLS协议保障了信息的安全。SSL协议的作用是认证客户端和服务器,确保数据发送到正确的客户端和服务器,加密数据防止数据中途被窃取,维护数据的完整性,确保数据在传输过程中不被改变。TLS协议的作用是用于在两个通信应用程序之间提供保密性和数据完整性。TLS协议由两层组成:TLS记录协议和TLS握手协议。
五. 服务端响应请求
服务器收到请求后,将发回一个HTTP的响应报文,内容包括相关的响应头和HTML正文。
六. 浏览器解析渲染页面
不同的浏览器引擎渲染过程不太一样。以谷歌浏览器为例。
先请求服务器得到HTML文件,处理HTML标记并构建DOM树;
然后向浏览器发送请求得到CSS文件,处理CSS标记并构建CSSOM树;
接着将DOM树和CSSOM树合并为一颗渲染树,根据渲染树来布局。
布局就是获取渲染树的结构,节点位置和大小,是依据盒子模型来进行的,每个元素都用一个盒子来表示,然后这些盒子在页面上进行排列和和嵌套,以计算每个节点的几何信息,最后将各个节点渲染到屏幕上。
第一步,浏览器发送请求以后,服务器或者本地返回给浏览器HTML文件,解析HTML文件,并且构建DOM;
第二步,在解析HTML文件的时候遇到了link标签,浏览器就去请求CSS文件,请求CSS文件的同时会继续解析HTML文件,
第三步,此时遇到了script标签,浏览器就去请求JS文件,此时服务器或者本地就会陆续返回CSS和JS文件,实际操作中会先得到CSS还是JS文件要看具体情况。必须要等到CSSOM构建完成了才能执行JS文件。
七. HTTP请求结束,断开TCP连接
浏览器会默认开启持久连接,也就是标签页关闭的时候,TCP连接才会关闭。这个关闭的过程就是4次挥手。
最开始一次挥手,客户端发起FIN包,客户端进入FIN_WAIT_1状态。TCP规定,即使FIN包不携带数据,也要消耗一个序号。
第二次挥手,服务端端收到FIN包,发出确认包ACK,并带上自己的序号,服务器端进入了CLOSE_WAIT状态。这个时候客户端已经没有数据要发送了,不过服务器端有数据发送的话,客户端依然需要接收。客户端接收到服务端发送的ACK后,进入了FIN_WAIT_2状态。
第三次挥手,服务器端数据发送完毕后,向客户端发送FIN包,半连接状态下服务器可能有发送了一些数据。服务器此时进入了LAST_ACK状态。
第四次挥手,客户端收到服务器的FIN包后,发出确认包ACK,此时客户端就进入了TIME_WAIT状态。此时TCP连接还没有释放,必须经过两个MSL后,才会进入CLOSED状态。而服务器端收到客户端的确认包ACK后就进入了CLOSED状态,可以看出服务器端结束TCP连接的时间要比客户端早一些。
为什么建立连接握手三次,关闭连接时需要是四次呢?
其实在TCP握手的时候,接收端发送SYN+ACK的包是将一个ACK和一个SYN合并到一个包中,所以减少了一次包的发送,三次完成握手。
对于四次挥手,因为TCP是全双工通信,在主动关闭方发送FIN包后,接收端可能还要发送数据,不能立即关闭服务器端到客户端的数据通道,所以也就不能将服务器端的FIN包和对客户端的ACK包合并发送,只能先确认ACK,然后服务器等到无需发送数据时再发送FIN包,所以四次挥手时必须是四次数据包的交互。
相关文章:

浏览器从输入URL到页面展示这个过程中都经历了什么
一. URL输入 URL是统一资源定位符,用于定位互联网上的资源,俗称网址。我们在地址栏输入网址后敲下回车,浏览器会对输入的信息进行以下判断: 1. 检查输入的内容是否是一个合法的URL连接 2. 如果合法的话,则会判断URL…...
2023-09-22 monetdb-事务管理-乐观并发控制-记录
摘要: 2023-09-22 monetdb-事务管理-记录 相关文档: Transaction Management | MonetDB Docs https://en.wikipedia.org/wiki/Optimistic_concurrency_control monetdb事务管理: MonetDB/SQL 支持以 START TRANSACTION 标记并以 COMMIT 或 ROLLBACK 关闭的多语句事务方案。如果…...
蓝桥等考Python组别四级008
第一部分:选择题 1、Python L4 (15分) 字符“D”的ASCII码值比字符“F”的ASCII码值小( )。 1234正确答案:B 2、Python L4 (15分) 下面的Python变量名正…...

SpringMVC 学习(二)Hello SpringMVC
3. Hello SpringMVC (1) 新建 maven 模块 springmvc-02-hellomvc (2) 确认依赖的导入 (3) 配置 web.xml <!--web/WEB-INF/web.xml--> <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee…...

交换机之间配置手动|静态链路聚合
两台交换机,配置链路聚合: 1、禁止自动协商速率,配置固定速率 int G0/0/1 undo negotiation auto speed 100int G0/0/2 undo negotiation auto speed 100 2、配置eth-trunk int eth-trunk 1 mode manual | lacp-staticint G0/0/1 eth-trun…...

Shiro高级及SaaS-HRM的认证授权
Shiro在SpringBoot工程的应用 Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安全框架,保证项目的平稳运行。 在之前的讲解中只是单独的使用shiro&…...

eclipse svn插件安装
1.进入eclipse的help->Eclipse Marketplace,如下图所示: 2.输入“svn”,再按回车,如下图: 3.这我选择的是 Subversive,点击后面的“install”按钮,如下图 Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive &…...

C语言 cortex-A7核 UART总线 实验
一、C 1)uart4.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h&quo…...

不同走向地下管线的地质雷达响应特征分析
不同走向地下管线的地质雷达响应特征分析 前言 以PVC管线为例,建立不同走向(水平倾斜、垂直倾斜、水平相邻)的三维管线地质模型,进行三维地质雷达数据模拟,分析不同走向地下管线的地质雷达响应特征。 文章目录 不同…...

Nginx负载均衡详解
一、负载均衡介绍 1、负载均衡的定义 单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多…...

基于Spring Boot的宠物咖啡馆平台的设计与实现
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 看护师信息管理 宠物寄养管理 健康状况管理 点单 宠物体验 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已…...
TYVJ P1026 犁田机器人
描述 Farmer John為了让自己从无穷无尽的犁田工作中解放出来,於是买了个新机器人帮助他犁田。这个机器人可以完成犁田的任务,可惜有一个小小的缺点:这个犁田机器人一次只能犁一个边的长度是整数的长方形的田地。 因為FJ的田地有树和其他障碍…...

软件测试面试经验分享,真实面试题
前言 本人普通本科计算机专业,做测试也有3年的时间了,讲下我的经历,我刚毕业就进了一个小自研薪资还不错,有10.5k(个人觉得我很优秀),在里面呆了两年,积累了一些的经验和技能&#…...

计算机网络 - 链路层
计算机网络 - 链路层 计算机网络 - 链路层 基本问题 1. 封装成帧2. 透明传输3. 差错检测 信道分类 1. 广播信道2. 点对点信道 信道复用技术 1. 频分复用2. 时分复用3. 统计时分复用4. 波分复用5. 码分复用 CSMA/CD 协议PPP 协议MAC 地址局域网以太网交换机虚拟局域网 基本问题…...

5.wifi开发【智能家居:上】,开发准备:智能开关灯,智能采集温湿,智能调彩灯
一。wifi智能家居项目开发 【开发准备1】:继电器控制开发 1.智能开关 器件准备:wifi(esp8266,使用CP2102)继电器 结果: 2.继电器工作原理 (1)继电器是一种自动电气开关 ÿ…...

26523-2022 精制硫酸钴 随笔练习
声明 本文是学习GB-T 26523-2022 精制硫酸钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制硫酸钴的要求、试验方法、检验规则、标志、标签、包装、运输和贮存。 本文件适用于精制硫酸钴。 注:该产品主要用于…...

企业该如何选择数字化转型工具?_光点科技
随着科技的不断进步和数字化的浪潮席卷全球,企业数字化转型已经成为了保持竞争力和持续增长的关键因素之一。无论企业规模大小,数字化转型都可以提高效率、降低成本、改善客户体验,从而实现更好的业务结果。然而,要成功进行数字化…...

算法与数据结构-Trie树
文章目录 什么是“Trie 树”?如何实现一棵 Trie 树?Trie 树真的很耗内存吗?Trie 树与散列表、红黑树的比较 什么是“Trie 树”? Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符…...
语音助手开发小记(2023.9.25)
通道问题 在使用函数swr_alloc_set_opts给SwrContext传递输入输出的音频参数时,需要设置通道,这里通道为2,但是通道布局不能传递2.比如AV_CH_LAYOUT_STEREO 实际值为3 如果要计算通道布局的通道数使用函数av_get_channel_layout_nb_channels…...

FastestDet---模型训练
代码:https://github.com/dog-qiuqiu/FastestDet 一、构造数据集 数据集格式YOLO相同,每张图片对应一个txt标签文件。标签格式:“category cx cy wh”,category为类别id,cx, cy为归一化标签框中心点的坐标,w, h为归一化标签框的宽度和高度, .txt标签文件内容示例如下: 0…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...