【浏览器工作原理与实践三】:浏览器中的网络

文章目录

  • 【浏览器工作原理与实践三】:浏览器中的网络
    • 一、HTTP1:HTTP性能优化
      • 超文本传输协议 HTTP/0.9
      • 被浏览器推动的 HTTP/1.0
      • 那么该如何实现多种类型文件的下载呢?
      • 缝缝补补的 HTTP/1.1
        • 1. 改进持久连接
        • 2. 不成熟的 HTTP 管线化
        • 3. 提供虚拟主机的支持
        • 4. 对动态生成的内容提供了完美支持
        • 5. 客户端 Cookie、安全机制
      • 总结
    • 二、HTTP2:如何提升网络速度
      • HTTP/1.1 的主要问题
        • 第一个原因,TCP 的慢启动。
        • 第二个原因,同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽。
        • 第三个原因,HTTP/1.1 队头阻塞的问题。
      • HTTP/2 的多路复用
        • 多路复用的实现
      • HTTP/2 其他特性
        • 1. 可以设置请求的优先级
        • 2. 服务器推送
        • 3. 头部压缩
      • 总结
    • 三、HTTP3:甩掉TCP、TCL包袱 构建高效网络
      • TCP 的队头阻塞
      • TCP 建立连接的延时
      • TCP 协议僵化
      • QUIC 协议
      • HTTP/3 的挑战
    • 四、同源策略:为什么XMLHttpRequst不能跨域请求资源
      • 什么是同源策略
      • 安全和便利性的权衡
        • 1. 页面中可以嵌入第三方资源
        • 2. 跨域资源共享和跨文档消息机制
      • 总结
    • 五、跨站脚本攻击XSS:为什么cookie中有httpOnly属性
      • 什么是 XSS 攻击
      • 恶意脚本是怎么注入的
        • 1. 存储型 XSS 攻击
        • 2. 反射型 XSS 攻击
        • 3. 基于 DOM 的 XSS 攻击
      • 如何阻止 XSS 攻击
        • 1. 服务器对输入脚本进行过滤或转码
        • 2. 充分利用 CSP
      • 3. 使用 HttpOnly 属性
      • 总结
    • 六、CSRF攻击:陌生链接不要随便点
      • 什么是 CSRF 攻击
        • 1. 自动发起 Get 请求
        • 2. 自动发起 POST 请求
        • 3. 引诱用户点击链接
      • 如何防止 CSRF 攻击
        • 1. 充分利用好 Cookie 的 SameSite 属性
        • 2. 验证请求的来源站点
        • 3. CSRF Token
      • 总结
    • 七、沙盒:页面和系统之间的隔离墙
      • 安全视角下的多进程架构
      • 安全沙箱
      • 安全沙箱如何影响各个模块功能
        • 1. 持久存储
        • 2. 网络访问
        • 3. 用户交互
      • 站点隔离(Site Isolation)
    • 七、HTTPS:让数据传输更安全
      • 在 HTTP 协议栈中引入安全层
        • 第一版:使用对称加密
        • 第二版:使用非对称加密
        • 第三版:对称加密和非对称加密搭配使用
        • 第四版:添加数字证书
      • 数字证书的申请和验证
      • 浏览器如何验证数字证书

一、HTTP1:HTTP性能优化

超文本传输协议 HTTP/0.9

HTTP/0.9 是于 1991 年提出的,主要用于学术交流,需求很简单——用来在网络之间传递 HTML 超文本的内容,所以被称为超文本传输协议。整体来看,它的实现也很简单,采用了基于请求响应的模式,从客户端发出请求,服务器返回数据

下面我们就来看看 HTTP/0.9 的一个完整的请求流程(可参考下图)。

  • 因为 HTTP 都是基于 TCP 协议的,所以客户端先要根据 IP 地址、端口和服务器建立 TCP 连接,而建立连接的过程就是 TCP 协议三次握手的过程。
  • 建立好连接之后,会发送一个 GET 请求行的信息,如GET /index.html用来获取 index.html。
  • 服务器接收请求信息之后,读取对应的 HTML 文件,并将数据以 ASCII 字符流返回给客户端。
  • HTML 文档传输完成后,断开连接。

总的来说,当时的需求很简单,就是用来传输体积很小的 HTML 文件,所以 HTTP/0.9 的实现有以下三个特点。

  • 第一个是只有一个请求行,并没有HTTP 请求头和请求体,因为只需要一个请求行就可以完整表达客户端的需求了。
  • 第二个是服务器也没有返回头信息,这是因为服务器端并不需要告诉客户端太多信息,只需要返回数据就可以了。
  • 第三个是返回的文件内容是以 ASCII 字符流来传输的,因为都是 HTML 格式的文件,所以使用 ASCII 字节码来传输是最合适的。

被浏览器推动的 HTTP/1.0

HTTP/0.9 虽然简单,但是已经可以满足当时的需求了。不过变化是这个世界永恒不变的主旋律,1994 年底出现了拨号上网服务,同年网景又推出一款浏览器,从此万维网就不局限于学术交流了,而是进入了高速的发展阶段。随之而来的是万维网联盟(W3C)和 HTTP 工作组(HTTP-WG)的创建,它们致力于 HTML 的发展和 HTTP 的改进。

万维网的高速发展带来了很多新的需求,而 HTTP/0.9 已经不能适用新兴网络的发展,所以这时就需要一个新的协议来支撑新兴网络,这就是 HTTP/1.0 诞生的原因。不过在详细分析 HTTP/1.0 之前,我们先来分析下新兴网络都带来了哪些新需求。

首先在浏览器中展示的不单是 HTML 文件了,还包括了 JavaScript、CSS、图片、音频、视频等不同类型的文件。因此支持多种类型的文件下载是 HTTP/1.0 的一个核心诉求,而且文件格式不仅仅局限于 ASCII 编码,还有很多其他类型编码的文件

那么该如何实现多种类型文件的下载呢?

HTTP 是浏览器和服务器之间的通信语言,不过 HTTP/0.9 在建立好连接之后,只会发送类似GET /index.html的简单请求命令,并没有其他途径告诉服务器更多的信息,如文件编码、文件类型等。同样,服务器是直接返回数据给浏览器的,也没有其他途径告诉浏览器更多的关于服务器返回的文件信息。

这种简单的交流型形式无疑不能满足传输多种类型文件的需求,那为了让客户端和服务器能更深入地交流,HTTP/1.0 引入了请求头和响应头,它们都是以为 Key-Value 形式保存的,在 HTTP 发送请求时,会带上请求头信息,服务器返回数据时,会先返回响应头信息。至于 HTTP/1.0 具体的请求流程,你可以参考下图。

有了请求头和响应头,浏览器和服务器就能进行更加深入的交流了。

那 HTTP/1.0 是怎么通过请求头和响应头来支持多种不同类型的数据呢?

要支持多种类型的文件,我们就需要解决以下几个问题

  • 首先,浏览器需要知道服务器返回的数据是什么类型的,然后浏览器才能根据不同的数据类型做针对性的处理。
  • 其次,由于万维网所支持的应用变得越来越广,所以单个文件的数据量也变得越来越大。为了减轻传输性能,服务器会对数据进行压缩后再传输,所以浏览器需要知道服务器压缩的方法。
  • 再次,由于万维网是支持全球范围的,所以需要提供国际化的支持,服务器需要对不同的地区提供不同的语言版本,这就需要浏览器告诉服务器它想要什么语言版本的页面。
  • 最后,由于增加了各种不同类型的文件,而每种文件的编码形式又可能不一样,为了能够准确地读取文件,浏览器需要知道文件的编码类型

基于以上问题,HTTP/1.0 的方案是通过请求头和响应头来进行协商,在发起请求时候会通过 HTTP 请求头告诉服务器它期待服务器返回什么类型的文件、采取什么形式的压缩、提供什么语言的文件以及文件的具体编码。最终发送出来的请求头内容如下:

accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh

其中第一行表示期望服务器返回 html 类型的文件,第二行表示期望服务器可以采用 gzip、deflate 或者 br 其中的一种压缩方式,第三行表示期望返回的文件编码是 UTF-8 或者 ISO-8859-1,第四行是表示期望页面的优先语言是中文。

服务器接收到浏览器发送过来的请求头信息之后,会根据请求头的信息来准备响应数据。不过有时候会有一些意外情况发生,比如浏览器请求的压缩类型是 gzip,但是服务器不支持 gzip,只支持 br 压缩,那么它会通过响应头中的 content-encoding 字段告诉浏览器最终的压缩类型,也就是说最终浏览器需要根据响应头的信息来处理数据。下面是一段响应头的数据信息:

content-encoding: br
content-type: text/html; charset=UTF-8

其中第一行表示服务器采用了 br 的压缩方法,第二行表示服务器返回的是 html 文件,并且该文件的编码类型是 UTF-8。

有了响应头的信息,浏览器就会使用 br 方法来解压文件,再按照 UTF-8 的编码格式来处理原始文件,最后按照 HTML 的方式来解析该文件。这就是 HTTP/1.0 支持多文件的一个基本的处理流程。

HTTP/1.0 除了对多文件提供良好的支持外,还依据当时实际的需求引入了很多其他的特性,这些特性都是通过请求头和响应头来实现的。下面我们来看看新增的几个典型的特性

  • 有的请求服务器可能无法处理,或者处理出错,这时候就需要告诉浏览器服务器最终处理该请求的情况,这就引入了状态码。状态码是通过响应行的方式来通知浏览器的。
  • 为了减轻服务器的压力,在 HTTP/1.0 中提供了Cache 机制,用来缓存已经下载过的数据。
  • 服务器需要统计客户端的基础信息,比如 Windows 和 macOS 的用户数量分别是多少,所以 HTTP/1.0 的请求头中还加入了用户代理的字段

缝缝补补的 HTTP/1.1

不过随着技术的继续发展,需求也在不断迭代更新,很快 HTTP/1.0 也不能满足需求了,所以 HTTP/1.1 又在 HTTP/1.0 的基础之上做了大量的更新。接下来我们来看看 HTTP/1.0 遇到了哪些主要的问题,以及 HTTP/1.1 又是如何改进的。

1. 改进持久连接

HTTP/1.0 每进行一次 HTTP 通信,都需要经历建立 TCP 连接、传输 HTTP 数据和断开 TCP 连接三个阶段(如下图)。

在当时,由于通信的文件比较小,而且每个页面的引用也不多,所以这种传输形式没什么大问题。但是随着浏览器普及,单个页面中的图片文件越来越多,有时候一个页面可能包含了几百个外部引用的资源文件,如果在下载每个文件的时候,都需要经历建立 TCP 连接、传输数据和断开连接这样的步骤,无疑会增加大量无谓的开销。

为了解决这个问题,HTTP/1.1 中增加了持久连接的方法,它的特点是在一个 TCP 连接上可以传输多个 HTTP 请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。

从上图可以看出,HTTP 的持久连接可以有效减少 TCP 建立连接和断开连接的次数,这样的好处是减少了服务器额外的负担,并提升整体 HTTP 的请求时长。

持久连接在 HTTP/1.1 中是默认开启的,所以你不需要专门为了持久连接去 HTTP 请求头设置信息,如果你不想要采用持久连接,可以在 HTTP 请求头中加上Connection: close。目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。

2. 不成熟的 HTTP 管线化

持久连接虽然能减少 TCP 的建立和断开次数,但是它需要等待前面的请求返回之后,才能进行下一次请求。如果 TCP 通道中的某个请求因为某些原因没有及时返回,那么就会阻塞后面的所有请求,这就是著名的队头阻塞的问题。

HTTP/1.1 中试图通过管线化的技术来解决队头阻塞的问题。HTTP/1.1 中的管线化是指将多个 HTTP 请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。

FireFox、Chrome 都做过管线化的试验,但是由于各种原因,它们最终都放弃了管线化技术。

3. 提供虚拟主机的支持

在 HTTP/1.0 中,每个域名绑定了一个唯一的 IP 地址,因此一个服务器只能支持一个域名。但是随着虚拟主机技术的发展,需要实现在一台物理主机上绑定多个虚拟主机,每个虚拟主机都有自己的单独的域名,这些单独的域名都公用同一个 IP 地址。

因此,HTTP/1.1 的请求头中增加了Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理。

4. 对动态生成的内容提供了完美支持

在设计 HTTP/1.0 时,需要在响应头中设置完整的数据大小,如Content-Length: 901,这样浏览器就可以根据设置的数据大小来接收数据。不过随着服务器端的技术发展,很多页面的内容都是动态生成的,因此在传输数据之前并不知道最终的数据大小,这就导致了浏览器不知道何时会接收完所有的文件数据。

HTTP/1.1 通过引入Chunk transfer 机制来解决这个问题,服务器会将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。这样就提供了对动态内容的支持。

5. 客户端 Cookie、安全机制

除此之外,HTTP/1.1 还引入了客户端 Cookie 机制和安全机制。

笔记在这里

【浏览器工作原理与实践三】:浏览器中的网络相关推荐

  1. <<浏览器工作原理与实践>>读书笔记

    1. 进程和线程的区别 概念: 进程:操作系统进行资源分配和调度的基本单位:程序的运行实例:(在我们启动一个程序的时候,操作系统会为该程序创建一块内存空间,用来存放代码,运行数据,和执行任务的主线程, ...

  2. 《浏览器工作原理与实践》学习笔记

    浏览器原理 前言 本文是学习李兵老师的<浏览器工作原理与实践>过程中记录笔记,详细链接见文末 进程vs线程 进程:一个应用程序的运行实例就是一个进程,详细来说就是:启动一个应用程序的时候, ...

  3. 【浏览器工作原理与实践笔记一】:宏观视角上的浏览器

    [浏览器工作原理与实践笔记一]:宏观视角上的浏览器 文章目录 [浏览器工作原理与实践笔记一]:宏观视角上的浏览器 一.Chrome架构:仅仅打开了1个页面,为什么有4个进程 二.TCP协议:如何保证页 ...

  4. 服务器向所有浏览器响应数据,浏览器工作原理与实践总结一

    一.常用Chrome架构 Chrome 打开一个页面需要启动多少进程?你可以点击 Chrome 浏览器右上角的"选项"菜单,选择"更多工具"子菜单,点击&quo ...

  5. 浏览器工作原理与实践学习笔记

    浏览器工作原理与实践 参考来源: 极客时间-李兵专栏 李兵简介: 08年,在 Chromium 和 IE 发布了一款双核浏览器:太阳花,国内第一款双核浏览器 ,支持chrome并兼容IE,日活达到了2 ...

  6. 浏览器工作原理探究详解

    浏览器工作原理探究 标签: 浏览器工作原理 / web性能优化 引言 最近对web的性能优化比较感兴趣,而前端代码主要在浏览器工作的.如果对浏览器的工作原理了解清楚,可以为web性能优化提供方向以及理 ...

  7. html图片查看器工作原理,五分钟了解浏览器的工作原理

    Web 浏览器无疑是用户访问互联网最常见的入口.浏览器凭借其免安装和跨平台等优势,逐渐取代了很多传统的富客户端. Web 浏览器通过向 URL 发送网络请求来访问 Web 服务器资源,并以交互性的方式 ...

  8. 《深入理解Android》一2.1 浏览器工作原理概述

    本节书摘来自华章出版社<深入理解Android>一书中的第2章,第2.1节,作者孟德国 王耀龙 周金利 黎欢,更多章节内容可以访问云栖社区"华章计算机"公众号查看 2. ...

  9. 曲鸟全栈UI自动化教学(四):Selenium工作原理及Webdriver对浏览器的配置和操作

    一.前言 上篇文章我们学习了Selenium页面操作原理及如何高效的进行元素定位 那Selenium的工作原理又是什么?是如何驱动浏览器的呢?这篇文章为你讲解Selenium工作原理及Webdrive ...

最新文章

  1. 微博客户端播放器的演进之路
  2. CSS height高度 和 width宽度
  3. markdown 本地链接_Markdown的使用
  4. Docker架构、常用命令和示例
  5. ftok() Linux Linux函数
  6. Android 使用SwipeBackLayout实现滑动返回上一级页面——实战来袭
  7. 通过【Windows10安装程序---MediaCreationTool】来制作并安装Win10正式版
  8. android 反编译 jadx,jadx gui下载 jadx(Android反编译gui工具) v0.6.1 官方版 下载-脚本之家...
  9. react-router嵌套路由页面无法显示
  10. 爬虫取中间文本_【实战No.2】1小时打造你自己的网络爬虫
  11. 卷宗怎么做_卷宗怎么读
  12. 给软件添加鼠标右键快捷方式
  13. 点餐小程序【源码好优多】
  14. 【Mysql】----基础练习
  15. 帝国cms忘记网站后台登录网址怎么找回?
  16. 【JokerのKintex7325】SDK程序从QSPI启动过慢分析。
  17. VC++年月日时间和64位时间的使用及相互转换(附源码)
  18. 时间相减,得出相差的年,天,时,分,秒(moment,new Date())
  19. 中缀表达式To前缀表达式 (python实现)
  20. P30-P32:逻辑类型,保留小数的输出,辗转相除法求最大公约数

热门文章

  1. “特步们”的“近火”与“远忧”
  2. IntelliJ IDEA 无法使用输入法,输入法失效怎么办?
  3. tiktok 点选验证码
  4. 机器人社社长事迹_【青春榜样】佳木斯大学十佳科技创新创新标兵事迹——黄鹏...
  5. python就业班百度云_2017python就业班百度云在线分享
  6. html+css实现视差滚动
  7. (Android) Activity生命周期总结
  8. docker tomcat ,把webapps.dist里面的全部文件 复制到 webapps下面就行。
  9. perfectscrollbar 多个_Microsoft向Office365添加了8000多个免版税图片
  10. pgsql 无法删除表 CASCADE无效