互联网是如何运作的?以前端角度出发(b站objtube的卢克儿听课笔记)

news2024/11/27 2:28:15
1、你是如何用你的计算机设备发送数据和接受数据的呢?

例如我们是如何访问到哔哩哔哩的数据的

当你的设备开始连接到互联网时,会被分配一个IP地址。

而哔哩哔哩的服务器也接入到互联网,它也将被分配一个IP地址。

我们常说你访问某个网站,其实是在访问这个网站的服务器。

如果说你想访问index.html,则此时你的电脑被称为客户端,而哔哩哔哩服务器为服务端。

顾名思义,客户端是面向用户的应用程序。

而服务器端是在远程计算机上运行的应用程序。

客户端可以在需要时通过互联网与服务端进行通信,你的电脑发信息给哔哩哔哩服务器,你要获取index.html的内容,请把它传给我。消息将会被转化成电子信号,通过电缆发送给哔哩哔哩服务器,在服务器端再将电子信号转化为计算机可以使用的文本数据。(这是通过TCP/IP协议来做到的)

什么是协议?

协议是一组规则,用于指定计算机如何通过网络来相互通信。

TCP/IP协议族共分为4层

应用层含义解释:负责浏览器和网络服务器相互通信的http协议,负责文件传输的FTP协议,负责电子邮件客户端检索邮件的IMAP协议。

在我们想要访问index.html的例子中:

step1、我们使用应用层的http协议,请求获取html文本,这时候需要发送一个请求消息,消息会在发送前被分解为许多片段,我们称之为数据包。

step2、通过应用层进入tcp层(传输控制层)后,每个数据包都会被分配一个端口号,端口号用来确定目标计算机的哪一个应用程序要接受并使用该数据包。

TCP是一种面向连接可靠字节流服务协议。

TCP必须经过三次握手建立连接之后才能交换数据,每个收到的数据包都会像发送方发送ack确认,已保证发送成功。

进入IP层(网络层)后,每个数据包将会赋予目标计算机的IP地址。IP是不可靠的无连接协议,它并不关心数据包是否到达目的地,也不关心连接和端口号。它的工作是发送数据包并将其路由到目标计算机,其中每个数据包都是独立的互不依赖的,所以有可能会乱序到达目标地址,或者在传输途中丢失。

那如何保证数据包达到和顺序正确呢?这些都交给了TCP,这也就体现了分层的作用,当数据包过大时,在ip层会进行分包,由于每个数据包在物理链路层走的物理链路不一样,传输速度也不一样,导致数据包没有按顺序到达目的地,但TCP会根据数据包上携带的序列号来排序重组,并且发送方在一个特定时间内没有接受到接收方的ack确认时,则发送方会重新传送该数据包。

注意:不要把IP等同于IP地址,IP是网络层协议,而IP地址是一串数字。

IP地址有两种标准:

1、IPv4:

IPv4采用的是32位地址,即4字节,因此地址空间只有2的32次方,约40亿个地址。

所以说可以在互联网上使用的地址是有限的。

一些地址是为特殊用途所保留的,如专用网络、多播地址。

随着互联网爆炸式的发展,地址不断被分配使用,IPv4地址枯竭的问题也随之产生。

于是IPv6应运而生。

2、IPv6

IPv6采用128位的地址,因此新增的地址空间支持2的128次方,约3.4x10的38次方个地址。

 

有了IP地址和端口号之后,链路层将数据包的文本信息转译成电子信号。

⬇️

然后通过电缆传输。在电缆的另一端的路由器检查每个数据包中的目标地址,并确定将其发送到何处,最终数据包到达服务器,然后数据包从TCP/IP协议族的底部开始向上运行。

当数据包向上通过协议族时,客户端添加的所有路由数据,例如IP地址和端口号都将从数据包中剥离出来,当数据到达栈顶时(应用层),数据包已经恢复成最初始的形式。

通过端口号可以将数据传递给当前服务器,监听该端口的应用程序,应用程序根据当前请求数据作出反应。

比如现在我们想获取index.html,服务器则会将路径index.html的数据通过刚才的方式返回给你的电脑,也就是客户端,这样你就看见了b站的首页内容。到这里我们就完成了客户端和服务器在互联网中的一次数据交互。

你的电脑和哔哩哔哩服务器之间的互联网是怎么构成的?

总的来说,互联网是一个全球性的、基于TCP/IP的分布式计算机网络,它允许设备之间的连接和数据交换。它依赖于众多的协议、路由器、DNS、ISP和其他关键组成部分,以实现设备之间的通信。这些原理和技术的共同作用构成了互联网的基础,使其成为全球通信和信息传递的支柱

因为IP地址不是固定的,所以想要能访问到固定的网站,就有了域名,bilibili.com就是一个域名。

这里使用到了domain names service,简称DNS,DNS是一个分布式数据库,上面记录了域名和其IP地址的对应关系。

step1、输入网址时,浏览器首先连接DNS服务器,DNS返还该域名的IP地址。

step2、浏览器再连接访问该IP的服务器

有了DNS之后,就算IP地址有了变化,再重新绑定一下域名和新IP地址即可。

接受到数据之后,数据时如何展示在你的屏幕上的?

这就涉及到浏览器的工作原理

浏览器结构图:

大致分为用户界面、浏览器引擎、渲染引擎。

浏览器引擎:在用户界面和渲染引擎之间有个浏览器引擎,用于在用户界面和渲染引擎之间传递数据。

渲染引擎:负责渲染用户请求的页面内容,渲染器下面还有很多小的功能模块,负责请求网络请求的的网络模块,用于解析和执行js的js解释器,还有数据存储持久层,帮助浏览器存储各种数据,比如cookie等。

 我们往往把渲染引擎成为浏览器的内核。

现在浏览器结构通常是多进程的,根据进程功能不同来拆卸浏览器。

浏览器进程:其中浏览器进程负责控制chrome浏览器除标签页外的用户页面,包括地址栏,书签,后退和前进按钮。以及负责与浏览器的其他进程协调工作。

网络进程:负责发起接受网络请求。

GPU进程:负责整个浏览器界面的渲染。

插件进程:负责控制网站使用的所有插件,例如flash。这里的插件并不是指的chrome市场里安装的扩展。

渲染器进程:用来控制tab标签内的所有内容,浏览器在默认情况下会为每个标签页都创建一个进程。

当你在浏览器地址栏中输入内容时,浏览器内部会发生什么?

step1、浏览器进程的UI线程会捕捉你的输入内容,如果访问的是网址,则UI线程会启动一个网络线程来请求DNS进行域名解析,接着开始连接服务器获取数据。

如果你的输入不是网址而是一串关键词,于是就会使用默认配置的搜索引擎来查询。

网络线程获取到数据之后会发生什么事?

1、当网络线程获取到数据后,会通过SafaBrowsing(谷歌内部的一个站点安全系统)来检查站点是否事恶意站点。(如果是则会展示一个警告页面,告诉你这个站点有安全问题。比如通过查看该站点的IP是否在谷歌的黑名单之内)

2、当返回数据准备完毕并且安全校验通过时,网络线程会通知UI线程说我就要准备好了。然后UI线程就会创建一个渲染器进程来渲染页面,浏览器进程通过将IPC管道将数据传递给渲染器进程。

正式进入渲染流程,渲染进程接受到的数据也就是html,渲染器进程的核心任务就是html、css、js、image等资源渲染成用户可以交互的web页面。

渲染器进程的主线程将html进行解析,构造dom数据结构,dom也就是文档对象模型,是浏览器对页面在其内部的表现形式,是web开发程序员可以通过js与之交互的数据结构和API。

html首先经过Tokeniser标记化,通过词法分析将输入的html内容解析成多个标记,根据识别后的标记进行dom树构造,在dom树构造过程中会创建document对象。

然后以document为根结点的dom树不断进行修改,向其中添加各种元素。

html代码中往往会引入一些额外的资源,比如图片、css、js脚本等。图片和css这些资源需要通过网络下载或者从缓存中直接加载。这些资源不会阻塞html的解析,因为她们不会影响dom的生成,但是在html解析过程中遇到script标签就会停止解析,转而去加载解析并执行js,因为浏览器并不知道js执行是否会改变当前页面html结构,如果js代码里调用了document.write方法来修改html,那么之前的html解析就没有任何意义了。

这也就是为什么我们一直说要把script标签放在合适的位置,或者使用async或者defer属性来异步加载执行js。

在html解析完成后,我们就会获得一个DOM Tree,但我们还不知道DOM树上的每个节点应该长什么样子,主线程需要解析css并确定每个DOM节点的计算样式。

即使你没有提供自定义的css样式,浏览器也会有自己默认的样式表。比如h2的字体大小要比h3的大。

在知道dom结构和每个节点的样式后,我们就需要知道每个节点需要放在页面上的哪个位置。也就是节点的坐标以及该节点需要占用多大的区域,这个阶段被成语layout布局,主线程通过遍历dom和计算好的样式来生成layout tree,layout tree上的每个节点都记录了x、y坐标和边框尺寸。

注意dom tree和layout tree并不是一一对应的。

dom tree设置了display:none的节点不会出现在layout tree上,而在layout tree上的before伪类中添加了content值的元素,content里的内容会出现在layout tree上,不会出现在dom树里。这是因为dom是通过html解析获得,并不关心样式,而layout tree是根据dom和计算好的样式来生成的。

layout tree是在最后展示在屏幕上的节点是对应的。

此刻我们已经知道了元素的大小、形状和位置,我们还需要知道以什么样的顺序绘制(paint)这个节点。

例如z-index这个属性会影响节点绘制的层级关系,如果我们按照dom的层级结构来绘制页面,则会导致错误的渲染。

为了保证在屏幕上展示正确的层级, 主线程遍历layout tree创建一个绘制记录表(paint record),该表记录了绘制的顺序,这个阶段被称为绘制。

栅格化(rastering):把这些信息转化成像素点显示在屏幕上

chrome早期只栅格化用户可视区的内容,当用户滚动页面时,再栅格化更多的内容来填充缺失的部分。 这种方式会有很强的延时感。

现在的chrome使用了一种更为复杂的栅格化流程,叫做合成(composting),合成时一种将页面的各个部分分成多个图层,分别对其进行栅格化,并在合成器线程中单独进行合成页面的技术,即把页面所有的元素按照某种规则进行分图层,并把图层都栅格化好了。然后只需要把可视区的内容组合成一帧展示给用户即可。

主线程遍历layout tree生成layer(图层) tree。

当layer tree生成完毕和绘制顺序确定后,

主线程将这些信息传递给合成器线程,

合成器线程将每个图层栅格化,由于一层可能像页面的整个长度一样大,因此合成器线程将他们切分为许多图块儿(tiles),然后将每个图块儿发送给栅格化线程。

栅格线程栅格化每个图块,并将他们存储在GPU内存中。

当图块栅格化完成后,合成器线程将收集称为“draw quads”的图块信息,这些信息记录了图块在内存里的位置和在页面的哪个位置绘制图块的信息,根据这些信息合成器线程生成了一个合成器帧。

这个合成器帧(Frame)通过IPC传送给浏览器进程。

  

接着浏览器进程将合成器帧传送到GPU

然后GPU渲染展示到屏幕上,此时页面就有了画面。

当你滚动页面时,则会生成一个新的合成帧,又重复刚刚的内容。

以上过程简化图:

重排:当我们改变一个元素的尺寸位置属性时会重新进行样式计算,布局,绘制以及后面的所有流程。

重绘:当我们改变某个元素的颜色属性时,不会重新触发布局,但还是会触发样式计算和绘制。

重排和重绘都会占用主线程,js也是运行在主线程的,这样就会出现抢占执行时间的问题,如果你写了一个不断导致重排/重绘的动画,浏览器则需要在每一帧都运行样式计算布局和绘制的操作。

当页面以每秒60帧的刷新率时才不会让用户感到页面卡顿,如果你在运行动画时还有大量的js任务需要执行,因为布局、绘制和js执行都是在主线程运行的,当在一帧的时间内布局和绘制结束后,还有剩余时间,js就会拿到主线程的使用权,如果js执行时间过长就会导致在下一帧开始时js没有及时归还主线程,导致下一帧动画没有按时渲染。就会出现页面动画的卡顿。

优化的办法:

1、通过requestAnimationFrame( )这个API,这个方法会在每一帧被调用,通过API的回调,我们可以把js任务分成一些更小的任务块(分到每一帧)【黄色小块代表js】

在每一帧时间用完前暂停js执行,归还主线程。

react最新的渲染引擎react fiber就是用到了API来做了很多优化。

2、栅格化整个流程不占用主线程,只在合成器线程和栅格线程中运行,css中有个动画属性叫transform,通过这个属性实现的动画不会经过布局和绘制,而是直接运行在合成器线程和栅格化线程。 

我们常常会使用位置变化、宽高变化(旋转、3d)来实现动画效果,这些都是可以使用transform来代替的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库|Binlog故障处理之drainer周期性罢工

目录 一、背景 二、故障现象 三、分析过程 四、解决方案 五、思考 六、总结 一、背景 最近,用户反馈我们的生产环境TiDB集群的drainer频繁发生故障。故障表现为服务崩溃无法启动,或者数据在运行过程中丢失,给我们的业务带来了很大的困扰…

uniapp刻度尺的实现(swiper)滑动打分器

实现图&#xff08;百分制&#xff09;&#xff1a;滑动swiper进行打分&#xff0c;分数加减 <view class"scoring"><view class"toggle"><view class"score"><text>{{0}}</text><view class"scoreId&quo…

GitHub金矿:一套智能制造MES的源代码,可以直接拿来搞钱的好项目

目前国内智能制造如火如荼&#xff0c;工厂信息化是大趋势。如果找到一个工厂&#xff0c;搞定一个老板&#xff0c;搞软件的小虾米就能吃几年。 中国制造业发达&#xff0c;工厂林立&#xff0c;但是普遍效率不高&#xff0c;需要信息化提高效率。但是矛盾的地方在于&#xf…

开源:特殊的垄断

免责声明&#xff1a;本博客旨在分享我对开源策略的理解和体会&#xff0c;不代表任何组织或机构的立场或观点&#xff0c;也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏&#xff0c;也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

4、FFmpeg命令行操作2

三、ffprobe命令 ffprobe命令- ffprobe用来查看多媒体文件的信息 常用命令如下所示: ffprobe -show_packets input.mp4 //获取文件信息并显示文件中每个帧的包信息(包含audio和video包),如下图所示: codec_type : 帧类型&#xff0c;如视频包、音频包等 stream_index : 多媒体的…

2023 ChinaJoy后,Flat Ads成为游戏、社交出海的新选择

今年ChinaJoy 展会&#xff0c;共吸引了来自世界各地的 500 多家企业参展&#xff0c;预计吸引超过33万人次参观。ChinaJoy年年有&#xff0c;那今年对于行业来说有什么新变化呢&#xff1f; 01 出海热潮不减&#xff0c;新增客户明显提升 据不完全统计&#xff0c;展会期间前…

雨云 宿迁 14900KF 高防云服务器性能测评

雨云游戏云上线了用I9 13900KF做CPU的VPS服务器&#xff0c;雨云游戏云VPS的14900KF和13900KF机型是纯大核的&#xff08;屏蔽小核&#xff09;保证你的VPS不会被分配到小核上而导致性能下降&#xff0c;水冷散热&#xff0c;超频至6.3Ghz&#xff0c;超高单核性能。 适合开我…

Django快速入门(一)

Django三板斧 1. 基本使用 三板斧: HttpResponse,render,redirect from django.shortcuts import HttpResponse,render,redirect# 一. 返回字符串类型的数据 return HttpResponse(字符串) # 二. 返回HTML文件 # 1. 动态HTML页面: return render(request,login.html) def ab…

Unity 3D 调整cube的颜色

1.选中Assets后&#xff0c;右键->Create->Material 2.调整Material的颜色&#xff0c;然后将Material拖到对应的cube上

家用工作站方案:ThinkBook 14 2023 版

本篇文章聊聊今年双十一&#xff0c;我新购置的家用工作站设备&#xff1a;ThinkBook 14 2023&#xff0c;一台五千元价位&#xff0c;没有显卡的笔记本。我为什么选择它&#xff0c;它又能做些什么。 写在前面 2021 年年中的时候&#xff0c;我写过一篇《廉价的家用工作站方…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring配置开发实战详解

360全方位渗透和探究Spring配置开发实战详解 Spring对于配置的转折点Xml配置 vs Java配置Xml配置模式的优点Xml配置模式的缺点Java配置模式的优点Java配置模式的缺点 Java编程配置流程配置代码案例 组件注入Bean注解配置自动扫描包路径和规则Filter常用的拦截类型FilterType.AS…

【广州华锐互动】VR安防网络综合布线仿真实训打造沉浸式的教学体验

随着科技的快速发展&#xff0c;综合布线技术在建筑、数据中心、网络基础设施等领域的应用越来越广泛。为了适应这一趋势&#xff0c;传统的教学方法已经无法满足现代教育的需求。因此&#xff0c;采用创新的教学手段&#xff0c;如虚拟现实&#xff08;VR&#xff09;技术&…

自动化测试框架 —— pytest框架入门篇

今天就给大家说一说pytest框架。 今天这篇文章呢&#xff0c;会从以下几个方面来介绍&#xff1a; 1、首先介绍一下pytest框架 2、带大家安装Pytest框架 3、使用pytest框架时需要注意的点 4、pytest的运行方式 5、pytest框架中常用的插件 01、pytest框架介绍 pytest 是 pytho…

办公工具使用技巧汇总

总结下在使用办公工具时的一些技巧 1.word中自动排序 例如在表格中插入序号&#xff0c;如下图。有时候数据量较大时&#xff0c;一个一个的手动输入&#xff0c;效率不高&#xff0c;需要一种快捷的方式进行序号填充。 初级版本&#xff1a; 选择需要填写序号的列-开始工具…

从系统层到应用层,vivo 已在安全生态层

你每隔多久就会使用一次手机&#xff1f;调研结果也许会让你大吃一惊。 权威报告数据显示&#xff0c;2022年&#xff0c;24.9%的受访者每日使用手机时长超过10小时&#xff0c;其中3.8%的受访者“机不离手”&#xff0c;每日使用时长超过15小时。而真正让手机化身为时间吞金兽…

黑豹程序员-架构师学习路线图-百科:Knife4j API接口文档管理

文章目录 由来&#xff1a;接口文档第一代&#xff1a;Swagger第二代&#xff1a;Knife4j界面 由来&#xff1a;接口文档 古老编程是一个语言前后端通吃&#xff0c;ASP、JSP、PHP都是如此。 但随着项目规模变大&#xff0c;项目团队也开始壮大&#xff0c;岗位职责开始细分&a…

使用Redis实现文章阅读量、收藏、点赞数量记录功能

目录 一、前言二、业务分析三、Redis数据结构选择分析和实现3.1、三个数据缓存都分别使用 字符串 结构计数器存储对应数量值3.2、三个数据缓存使用一个 Hash 结构存储3.3、阅读量使用字符串结构计算器&#xff0c;收藏和点赞分别使用 Set 集合存储 四、总结 一、前言 在博客中会…

HCIA-PPPOE原理与配置

PPPOE原理与配置 实验拓扑图实现步骤家庭网关 AR201PPPOE客户端&#xff08; ISP光猫&#xff09;PPPOE服务器&#xff08;ISP路由器&#xff09; 实验拓扑图 实现步骤 家庭网关 AR201 E0/0/0-7为LAN口&#xff08;二层接口&#xff09;E0/0/8为WAN口&#xff08;三层接口&am…

【每日一题】2258. 逃离火灾-2023.11.9

题目&#xff1a; 2258. 逃离火灾 给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid &#xff0c;它表示一个网格图。每个格子为下面 3 个值之一&#xff1a; 0 表示草地。1 表示着火的格子。2 表示一座墙&#xff0c;你跟火都不能通过这个格子。 一开始你在最左上角…

LeetCode【78. 子集】

78. 子集 中等 2.2K 相关企业 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…