课程内容
- 通过一个示例建立对计算机网络的整体认识
- 建立对网络协议分层的认知
- 分析HTTP1、2、3的关系
- 介绍CDN运行的基本原理
- 了解网络安全的最基本原则
网络基础知识
网络组成部分
主机:客户端和服务器
路由器:进行分组转发和路由计算
网络协议:进行网络中的数据交换而建立的规则、标准或约定
网络结构
网络的网络 ---- 一个大的网络可以划分多个子网,网络之间可以互连
计算机网络的分类
数据交换方式
电路交换:终端间建立专用物理连接,在连接期间保持交换数据流的通道(举例:电话通信)
分组交换:通过“分组”作为数据传输单元,使用存储转发技术进行通信的方式
网络分层
理论上为七层结构,实际应用为四层结构,但是用于学习的为五层结构
网络协议进行网络中的数据交换而建立的规则、标准或约定
协议三要素
- 语法:数据与控制信息的结构或格式 。
- 语义:需要发出何种控制信息,完成何种动作以及做出何种响应。
- 同步:事件实现顺序的详细说明。
标头和载荷
一个数据单元通常分为两部分:标头(Header)和载荷(Payload),通过分层协议进行传输,进行“封装”和“解封装”标头:数据单元头部部分,包含控制信息。载荷:数据单元数据部分,包含实际要传输的数据。
Web中的网络
HTTP:是浏览器和服务器的通信语言
HTTP/0.9
- 背景:主要用于学术交流
- 需求:传输HTML文件
- 实现:基于请求响应模式
- 特点:
- 客户端只有请求行,无请求头和请求体
- 服务器不返回头信息,只返回数据
- 返回的文件内容是以ASCII字节码来传输
HTTP/1.0
- 背景:出现拨号上网和网景推出一款浏览器,通信的文件比较小,而且每个页面的引用也不多
- 需求:传输HTML文件、JavaScript、CSS、图片、音频、视频等不同类型的文件
- 实现: 引入了请求头和响应头,以Key-Value形式保存,通过 请求头 / 响应头 来告诉 服务器 / 浏览器 该怎么处理文件
- 请求头:含有 期待返回的文件类型,压缩形式,文件语言,文件具体编码
accept: text/html //期待服务器返回html类型的文件
accept-encoding: gzip, deflate, br //期待服务器采取gzip,deflate或者br压缩方式
accept-Charset: ISO-8859-1,utf-8 //期待服务器返回的文件编码是UTF-8或者ISO-8859-1
accept-language: zh-CN,zh //期待页面的优先语言是中文
- 响应头:含有服务器最终处理好的文件的信息
content-encoding: br //服务器采用了br的压缩方法
content-type: text/html; charset=UTF-8 //服务器返回的是html文件,并且该文件的编码类型是UTF-8
- 特点:
- 支持多种类型的文件下载,支持多种类型编码的文件格式
- 支持服务器将处理情况告知浏览器 --- 状态码,通过响应行的方式
- 提供 Cache 机制,缓存下载过的数据,减轻服务器压力
- 请求头中加入了用户代理字段,用于服务器统计客户端的基础信息,比如Windows和macOS的用戶数量分别是多少
- 每进行一次 HTTP 请求,都需要经历建立TCP连接、传输HTTP数据和断开TCP连接三个阶段
HTTP/1.1
- 背景:
- 浏览器普及,单个页面中的图片文件越来越多,一个页面可能包含了几百个外部引用的资源文件,对文件传输的速度要求越来越高
- 在HTTP/1.0时需要在响应头中设置完整的数据大小,如Content-Length: 901,浏览器就知道该接受多少数据。随着服务器端技术的发展,很多页面的内容是动态生成的,服务器事先也无法知道该传输多少数据,所以导致浏览不知道该接受多少数据才结束。
(提供对动态内容的支持的背景) - 在HTTP/1.0中,每个域名绑定了一个唯一的IP地址,因此一个服务器只能支持一个域名。随着虚拟主机技术的发展,需要实现在一台物理主机上绑定多个虚拟主机,每个虚拟主机都有自己的单独的域名,这些单独的域名都公用同一个IP地址
(提供对虚拟主机支持的背景)
- 需求:
- 减少 HTTP/1.0 中频繁建立 TCP 连接的过程,减少服务器额外的负担,提升整体 HTTP 的请求时间,
- 解决队头阻塞
- 提供对动态内容的支持
- 提供虚拟主机的支持
- 实现:
采用持久连接的方法【默认开启】--- 在一个 TCP 连接上可以传输多个 HTTP 请求,只要没有明确断开连接,那么 TCP 连接会一直保持- 关闭持久连接方法:在请求头中加上 Connection: close
- 目前浏览器对同一个域名,默认允许同时建立 6个TCP持久连接
- 需要等待前面的请求返回之后,才能进行下一次请求,会发生队头阻塞问题
不成熟的管线化技术:解决队头阻塞,将多个HTTP请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。(FireFox、Chrome都做过管线化的试验,但是由于各种原因,它们最终都放弃了管线化技术)Chunk transfer机制:提供对动态内容的支持,服务器将数据分割成若干个任意大小的数据块,在每个数据块发送时附上上个数据块的长度,最后用一个零长度的块作为发送数据完成的标志请求头增加了Host字段:提供虚拟主机的支持,用来表示当前的域名地址,这样服务器就可以根据不同的Host值做不同的处理添加 Cookie
- 带来的主要问题:对带宽的利用率不理想,很难将带宽用满
原因一:发送数据时 TCP 的慢启动。在TCP连接建立好后,请求常用的关键资源,如HTML文件、 CSS文件和JavaScript文件,由于慢启动,导致耗费时间比正常时间要多很多,推迟了宝贵的首次渲染页面的时间。原因二:同时开启了多条 TCP 连接,竞争固定的带宽。多条TCP连接之间不能协商让哪些关键资源优先下载,这样就有可能影响那些关键资源的下载速度了原因三:HTTP/1.1队头阻塞的问题。由于阻塞,浏览器无法提前收到数据,对数据做预处理操作,队头阻塞会使得数据不能并行请求。
队头阻塞 如果TCP通道中的某个请求因为某些原因没有及时返回,那么就会阻塞后面的所有请求
带宽指每秒最大能发送或者接收的字节数。我们把每秒能发送的最大字节数称为上行带宽,每秒能够接收的最大字节数称为下行带宽。
TCP 的慢启动减少网络拥堵的一种策略,类似于汽车从0到稳定速度的提速过程。
HTTP2
- 需求
- 规避TCP的慢启动和TCP连接之间的竞争问题
- 实现多路复用机制
【最核心的功能】,实现资源的并行请求,解决HTTP/1.1中的队头阻塞问题
- 实现
- 一个域名只使用一个TCP长连接来传输数据:整个页面资源的下载过程只 需要一次慢启动,同时也避免了多个TCP连接竞争带宽所带来的问题
- 多路复用机制:添加二进制分帧层,将请求分成一帧一帧的数据去传输,通过ID来进行标记,这样可以在服务器实现优先级处理,两端都可以随意发送数据
- 请求和接收的过程
- 浏览器准备好请求数据
- 经过二进制分帧层处理,转换为带有请求ID编号的帧,通过协议栈发送给服务器
- 服务器收到所有帧后,将所有相同ID的帧合并为一条完整的请求信息
- 服务器处理该条请求,将处理的响应数据送至二进制分帧层
- 经过二进制分帧层处理,转换为带有请求ID编号的帧,通过协议栈发送给浏览器
- 浏览器收到响应帧后,根据ID编号将帧的数据提交给对应的请求。
- 存在问题
- TCP协议中存在的数据包级别的队头阻塞问题
- TCP建立连接时的握手延迟
- TCP协议僵化
注: HTTP/2 只是传输方式改变,语义没有变化
资源的并行请求指任何时候都可以将请求发送给服务器,而并不需要等待其他请求的完成,然后服务器也可以随时返回处理好的请求资源给浏览器
二进制分帧层数据会被转换为一个个带有请求ID编号的帧
主要功能:主要用于实现多路复用技术附带功能:
- 设置请求的优先级。可以优先处理重要的请求。
- 服务器推送。将数据提前推送到浏览器,浏览器可以直接拿到需要的文件数据,加快页面加载速度。
- 头部压缩。对请求头和响应头进行压缩,浏览器发送请求时基本都是发送HTTP请求头,对头部进行压缩,有效提升传输效率。
TCP的队头阻塞由于单个数据包的丢失而造成的阻塞
理解:将TCP连接看成一个按照顺序传输数据的管道,管道中的任意一个数据丢失了,那之后的数据都需要等待该数据的重新传输。
在HTTP/2中,多路请求跑在一个TCP管道中,如果任意一路数据流中出现了丢包的情况,那么就会阻塞该TCP连接中的所有请求
而在HTTP/1.1中,浏览器为每个域名开启了6个TCP连接,如果其中的1个TCP连接发生了队头阻塞,那么其他的5个连接依然可以继续传输数据。
因此随着丢包率的增加,HTTP/2的传输效率也会越来越差。
有测试数据表明,当系统达到了2%的丢包率 时,HTTP/1.1的传输效率反而比HTTP/2表现得更好。
网络延迟又称RTT(Round Trip Time),是指从浏览器发送一个数据包到服务器,再从服务器返回数据包到浏览器的整个往返时间,是反映网络性能的一个重要指标。
握手延迟
- 建立TCP连接,进行三次握手,消耗1.5个RTT
- 进行TLS连接,根据版本不同,所花时间不同,大致需要1~2个RTT
TCP协议僵化
- 中间设备僵化:中间设备依赖一些很少升级的软件,这些软件使用了大量的TCP特性,功能被设置之后就很少更新了。如果我们在客户端升级了TCP协议,这些中间设备可能因为不能理解包的内容而丢弃新协议的数据包。
- 操作系统:TCP协议都是通过操作系统内核来实现,应用程序只能使用不能修改。操作系统的更新滞后于软件的更新,因此想自由更新内核中的TCP协议是很困难的。
由于TCP协议僵化,无法通过修改TCP协议来修复其带来的缺陷,一个解决思路是发明一个TCP和UDP之外的新的传输协议,但是也同样面临和修改TCP一样的挑战。
HTTP3
- 需求:
- 考虑 TCP 协议僵化,解决 HTTP/2 中存在的TCP缺陷
- 实现:
- QUIC协议:(Quick UDP Internet Connections,快速UDP互联网连接)基于UDP协议实现了类似于 TCP的多路数据流、传输可靠性等功能。可以看成是集成了“TCP+HTTP/2的多路复用+TLS等功能”的一套协议
- 实现了类似TCP的流量控制,传输可靠性的功能。
- 集成了TLS加密功能。减少了握手所花费的RTT个数
- 实现了HTTP/2中的多路复用功能。QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流(如下图)。实现了数据流的单独传输,就解决了TCP中队头阻塞的问题。
- 实现了快速握手功能。基于UDP,可以实现使用0-RTT或者1-RTT来建立连接,大大提升首次打开页面的速度
- QUIC协议:(Quick UDP Internet Connections,快速UDP互联网连接)基于UDP协议实现了类似于 TCP的多路数据流、传输可靠性等功能。可以看成是集成了“TCP+HTTP/2的多路复用+TLS等功能”的一套协议
- HTTP/2 和 HTTP/3 协议栈比较
- 存在的挑战
- 目前服务器和浏览器端都没有对HTTP/3提供比较完整的支持。
- 部署HTTP/3也存在非常大的问题。系统内核对UDP的优化远远没有达到TCP的优化程度。
- 中间设备僵化问题。设备对UDP的优化程度远远低于TCP。
CDN
CDN:Content Delivery Network,内容分发网络,帮服务器近距离给用户分发网页内容。
- 网页内容:静态内容、动态内容
- 一开始是没有网站的源内容的
- 另一个名字,加速器,将文件进行最小化或者压缩文档。
出现的原因:客户端离服务器的距离越远,要经过的节点也就也多,而节点间会发生阻塞或者丢包等状况。为了提供稳定快速的服务,需要在接近用户的地方搭建服务器,CDN就是为了满足这种需求出现的网络。
CDN的组成
中心节点:CDN网管中心+全局负载均衡DNS重定向解析系统,负责整个CDN网络的分发及管理。
边缘节点:异地分发节点,由负载均衡设备、高速缓存服务器两部分组成。(边缘服务器:接近用户的服务器)
CDN分发内容流程
请求静态内容
如果源服务器将静态内容提前备份给CDN
- push:源服务器将静态内容提前备份给CDN
- request:用户请求网页内容
- response:就近的CDN服务器将静态内容提供给用户
如果源服务器没有将静态内容提前备份给CDN
- request:用户请求网页内容
- pull:CDN去问源服务器索取静态内容,源服务器可以让CDN进行备份
- response:CDN将内容提供给用户
请求动态内容
请求时间:运行CDN上的接口,而不是运行源服务器的代码,用户可以直接从CDN上获取时间
CDM的布局相当于给源服务器增加了一道墙,源服务器不用担心DDos攻击,但CDN需要考虑DDos攻击,于是就布局了多台CDN服务器在各个地方,监控CDN服务器的负载情况,若某台服务器超载,则转移到没有超载的服务器上,实现平均分配网络的流量,即负载均衡。采用TSL/SSL证书对网站进行保护
实现负载均衡:采用任播技术。服务器对外拥有同一个IP地址,收到用户请求,请求会由距离用户最近的服务器来响应,若该服务器超载,则利用任播技术把流量转移到没超载的服务器上。
WebSocket
WebSocket 是一种网络通信协议,他可以让服务器将数据主动推送给客户端
- 有状态的持久连接
- 服务器端可以主动推动消息
- 用WebSocket发送消息延迟比HTTP低
- 从HTTP协议升级而来
用途:即时通讯
代码示例:
- 客户端代码
- 服务端代码
网络安全
网络安全三要素
- 机密性:攻击者无法获知通信内容
- 完整性:攻击者对内容进行篡改时能被发现
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信
对称加密和非对称加密
- 对称加密:加密、解密用同样的密钥
- 非对称加密:加密、解密使用不同的密钥(公钥和私钥),而且
公钥加密只能用私钥解密、私钥加密只能用公钥解密
密码散列函数(哈希函数)
- 输入:任意长度的内容
- 输出:固定长度的哈希值
- 性质:
找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的
机密性
- 加密需要加密算法和密钥等信息(
统称为秘密信息) - 网络是明文的,不安全
完整性和身份验证
HTTPS
把 HTTP 的明文换成密文,再验证身份,即 HTTPS
HTTPS = HTTP + TLS
TLS = 身份验证 十 加解密
身份验证靠 PKI
服务端身份验证靠 PKI,客户端身份验证靠 HTTP 协议
参考文档
http发展史:http发展史
CDN:漫话:如何给女朋友解释什么是CDN?,什么是CDN?CDN能为我们做什么?我们为什么要了解他?
WebSocket:带你揭开WebSocket的神秘面纱!
课上有一些没有听懂就去搜罗了一些资料来看,还有一些得今后再去深入学习了。