网站工作原理,你搞懂了吗?

2023-11-07

网站工作原理

Web十分简单,至少用起来是这样!其实构成万维网的系统相当复杂,大多数情况下我们可以简单的说web就是相互链接的文档的集合。在学习web的工程中,我们经常会提到web服务器、动态和静态内容、HTML、JSON与其他内容,你是否对它们如何进行协调工作有一定的好奇,这篇文章带你了解一下Web 的工作方式及原理。

大家所看到的Web网站通常由大量的系统构成,这些系统协通过工作,营造出单个系统的假象。如果某个系统出现问题的话,会直接导致Web彻底崩溃。

输入网站地址,按下回车会发生啥?

1. DNS解析

计算机需要找到IP地址,通常我们在访问的时候输入的是域名,需要将域名转为ip地址。通常使用的是DNS域名解析服务[它作为将域名IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网]。

  • 所有连接在互联网上的计算机至少配置了一个DNS服务器,在浏览器准备连接到网站之前,必须等待联系ISP的DNS服务器,以获取正确的IP地址。一般域名托管在不错的云服务提供商,速度都挺快的。

  • DNS 优化

    • DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。
    • 在你的chrome浏览器中输入:chrome://dns/,你可以看到chrome浏览器的DNS缓存。
    • 系统缓存:主要存在/etc/hosts(Linux系统)中:
  • DNS负载均衡

    • DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。
    • CDN(Content Delivery Network)就是利用DNS的重定向技术,DNS服务器会返回一个跟用户最接近的点的IP地址给用户,CDN节点的服务器负责响应用户的请求,提供所需的内容。
      在这里插入图片描述

就以上图为例,上图是ping www.baidu.com 得到的ip地址,首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到baidu的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: com -> baidu.com ->www.google.com。

那么大家都会问根域名服务器呢?其实真正的域名服务器是www.baidu.com. ,从上图就可以看出来,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,所有网址真正的解析过程为: . -> .com -> baidu.com. -> www.baidu.com.。

2. TCP连接

TCP网络协议是当今互联网所用的两个关键协议之一,另一个是UDP。简单来说,TCP是可靠的,UDP不是。

2.1 TCP介绍

TCP 使用IP来传送数据包及对其进行路由,但也保证了传送过程和数据包的顺序。从开发者的角度来说一旦建立 了TCP连接,从一端发送的数据包就保证能到达另一端。为了实现这一点,TCP采用了基于传送数据量的序列码(sequence number)的概念。这部分信息会被路由器忽略,只有连接两端的计算机才会用到。这样,我们就能保持状态,只需在两个传送端点上而非所有的路由器上都保持。采用了序列码,系统就能判定是否数据丢失。

3. 发送HTTP请求

3.1 HTTPS协议

我不知道把HTTPS放在这个部分是否合适。HTTPS报文包裹在TCP报文中发送的,服务器端收到TCP报文时会解包提取出HTTP报文。但是这个过程中有一定的风险,HTTP报文是明文,如果中间被截取的话就存在一些信息泄露的风险。那么在进入TCP报文之前做一次加密就可以解决这个问题。HTTPS协议的本质就是HTTP+SSL(或TLS)。在HTTP报文进入TCP报文之前,先使用SSL对HTTP报文进行加密。从网络的层级结构看它位于HTTP协议与TCP协议之间。

在这里插入图片描述

3.2 HTTPS过程

HTTPS在运输数据之前需要客户端与服务器进行一个握手(TLS/SSL握手),在握手过程中将确立加密传输数据的密码信息。TLS/SSL使用了非对称加密,对称加密以及hash等。具体过程。具体过程参考【http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html】,HTTPS相对于HTTP,虽然提供了安全保证,但是会带来一些时间上的损耗,比如握手和加密等过程,是否需要使用HTTPS需要根据在安全与性能方面做出权衡。

3.3 HTTP请求

主要发生在客户端。发送HTTP请求的过程就是构建HTTP请求的报文并通过TCP协议发送到服务器指定端口(HTTP协议80/8080,HTTPS协议443)。HTTP请求报文就是由:请求行,请求报头,请求正文组成。

4.服务器处理请求并返回Http报文

。后端从在固定的端口接收到TCP报文开始,这一部分对应于编程语言中的socket。它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。这一部分工作一般是由Web服务器去进行,经常使用的Web服务器有Tomcat, Jetty和Netty等等。

HTTP响应报文也是由三部分组成: 状态码, 响应报头响应报文

5.浏览器解析渲染页面

浏览器在收到HTML,CSS,JS文件后,它是如何把页面呈现到屏幕上的?下图对应的就是WebKit渲染的过程。

在这里插入图片描述

浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。这个过程比较复杂,涉及到两个概念: reflow(回流)和repain(重绘)。DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow;当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。页面在首次加载时必然会经历reflow和repain。reflow和repain过程是非常消耗性能的,尤其是在移动设备上,它会破坏用户体验,有时会造成页面卡顿。所以我们应该尽可能少的减少reflow和repain。

在这里插入图片描述

JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。

浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-6过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。

6.连接结束

影响高性能网站的几个因素

  • 浏览器会影响网站加载的过程,包括请求文件的次序、渲染页面的方式
    • 浏览器也会收到操作系统和硬件的影响,如果在访问过程中电脑顿住了,其实性能再高的服务器也无济于事。
  • DNS提供了进行负载均衡和提高网站直观速度的简便途径。
  • Web运行在TCP上,每个浏览器和服务器都使用TCP协议,了解TCP协议如何工作,以及这些它提供的有用的保证所进行的过程,可以最大限度的利用资源,并将开销控制到最小。
  • 服务器自身:大多数Linux发行版上自带的Apache服务器在CPU和内存的使用上,效率不太高。但是它能够工作,并且提供大量的文档和支持。如果你需要为静态文件设计高速的小型服务器,且服务器占用资源少,可以考虑Nginx。
  • 开发网站的编程语言:不同的语言和框架有不同的性能特征。
  • 数据库:敲定了编程语言后,就看数据库了。数据库是到目前为止所有web应用中最慢的部分了,尽管实际中能快速运行。
  • 缓存技术:各个网站多少都会遇到各种形式的缓存,但根据经验来看很少有人去配置缓存。通常,服务器或者应用都会先去缓存中查看,然后再进行开销很大的数据库调用或者内容生成。所以一般缓存能极大的提高性能。
  • 还有一些硬件上的东西:比如服务器的硬件和可用带宽等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网站工作原理,你搞懂了吗? 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour

随机推荐

  • chatgpt赋能python:Python开发的SEO应用

    Python开发的SEO应用 搜索引擎优化 SEO 已经成为每个网站所有者需要考虑的重要因素之一 随着搜索引擎算法的不断变化和演进 我们需要确保我们的网站能在各种搜索引擎中进行良好的排名 Python作为一门强大的编程语言 已经被广泛用于S
  • linux centos 7 恶搞不停重启以及问题解决

    centos 7 恶搞不停重启以及问题解决 一 基础知识 1 运行级别的介绍 首先 CentOS系统有7个运行级别 runlevel 如下 运行级别0 系统停机状态 系统默认运行级别不能设为0 否则不能正常启动 运行级别1 单用户工作状态
  • ADB 用法大全

    基本用法 命令语法 adb 命令的基本语法如下 adb d e s
  • Java时间操作定义类

    类描述 时间操作定义类 public class DateUtils extends PropertyEditorSupport 各种时间格式 public static final SimpleDateFormat date sdf ne
  • libvirt安装过程

    libvirt安装过程 下载libvirt 0 8 1 tar gz 解压该文件 tar zxvf libvirt 0 8 1 tar gz 解压完成后进入到文件夹 libvirt 0 8 1开始安装 1 configure 2 此时提示缺
  • 笔记本电脑无法连接网络并在网络状态中显示ipv4和ipv6无网络访问权限

    win10电脑连不上网首先先右键无线或者网线那个图标 然后点击打开网络和共享中心 找到并点击连接 进入以太网或者wifi状态 看ipv4连接后面是否显示的是无网络访问权限 如果是 请按以下步骤操作 在桌面按WIN R输入CMD点击确定 打开
  • Docker部署Canal

    Canal Canal是阿里开源的一款基于Mysql数据库binlog的增量订阅和消费组件 通过它可以订阅数据库的binlog日志 然后进行一些数据消费 如数据镜像 数据异构 数据索引 缓存更新等 相对于消息队列 通过这种机制可以实现数据的
  • Windows10+CUDA+Tensorflow-gpu安装。装了一个星期,啥问题都见过了。(eg: ImportError: DLL load failed)

    目录 1 CUDA 卸载 2 中间出现的问题 2 1 问题1 This graphics driver could not find compatible graphics hardware You may continue install
  • 畸形报文单包攻击检测防御原理

    Ping of Death攻击 路由器对包的大小是有限制的 IP报文的长度字段为16位 即IP报文的最大长度为65535 如果遇到大小超过65535的报文 会出现内存分配错误 从而使接收方的计算机系统崩溃 攻击者只需不断的通过Ping命令向
  • 源代码中有什么

    在过去 源代码是核心机密 优秀的软件工程师在在某个公司的黑屋子里写程序 我们只能看到发布的产品 但是在今天 开放源代码成为一种开发方式 高手们在开源社区发布他们的代码 我们也终于有机会一睹大师高手们的源程序了 我们可以很容易地从网上下载到各
  • Kubeflow Pipeline - 构建自定义的 Workflow

    文章目录 1 Overview 2 Steps 2 1 理解 component 和 pipeline 2 2 Python SDK 构建 component 和 pipeline 2 3 上传 pipeline 3 Summary 1 O
  • 亮度、对比度与饱和度

    亮度是指图片的明暗程度 对比度是指图片明暗的差异 饱和度则是图片颜色的饱满程度 图片文件一般是RGB格式 当然也有的是YCBR格式 前者主要用于显示 后者则主要用于印刷 当然世上没有绝对的事情 也有人喜欢在电脑或手机上看YCBR格式的 至于
  • 消息队列-msgget

    msgget 获取系统V消息队列标识符 获取消息队列的id 头文件 include
  • 动态规划——JavaScript

    目录 什么是动态规划 怎么用动态规划 动态规划经典例题 斐波那契数 题目描述 思路 代码 爬楼梯 题目描述 思路 代码 不同路径 题目描述 思路 例题 不同路径 打家劫舍 打家劫舍 买卖股票的最佳时期 买卖股票的最佳时期 使用最小花费爬楼梯
  • 【STM32】keil环境下移植cJSON

    前言 由于工作需要 需要在STM32上使用Json 所以把一个JSON库移植到了STM32 keil MDK 实际上keil已经有了JSON扩展包 Jansson 只需要从keil官网上下载JSON Pack再导入就行 有兴趣的可以看这篇文
  • SQLi Labs Lesson22

    Lesson 22 Cookie Injection base64 encoded Double quotes 用admin账号登陆后 查看cookie 发现cookie为 YWRtaW4 有了上一节的经验 admin的base64编码为
  • 接口型模式之Bridge(桥接)模式

    1 如果你期望将实现与抽象相分离以便二者独立演化 可使用Bridge 桥接 模式 2 举例 抽象平台 public abstract class ImpLog public abstract void execute String msg
  • google v8 编译 运行遇到的问题

    环境 window os window sdk 10 vs2017 方法 官网提供的方法 https github com v8 v8 wiki Building from Source 问题1 cmd中执行命令时 tools dev v8
  • mysql_pycharm连接虚拟机上的mysql

    虚拟机上的系统是ubuntu 16 04 LTS 关于虚拟机安装mysql 5 7 参考以下的连接 Ubuntu安装Mysql 5 7 安装成功之后 执行赋予局域网可以访问虚拟机上的mysql mysql gt GRANT ALL PRIV
  • 网站工作原理,你搞懂了吗?

    网站工作原理 你搞懂了吗 网站工作原理 输入网站地址 按下回车会发生啥 1 DNS解析 2 TCP连接 2 1 TCP介绍 3 发送HTTP请求 3 1 HTTPS协议 3 2 HTTPS过程 3 3 HTTP请求 4 服务器处理请求并返回