计算机网络概论 | 青训营笔记

200 阅读15分钟

课程内容

  • 通过一个示例建立对计算机网络的整体认识
  • 建立对网络协议分层的认知
  • 分析HTTP1、2、3的关系
  • 介绍CDN运行的基本原理
  • 了解网络安全的最基本原则

网络基础知识

网络组成部分
主机:客户端和服务器
路由器:进行分组转发和路由计算
网络协议:进行网络中的数据交换而建立的规则、标准或约定

网络结构
网络的网络 ---- 一个大的网络可以划分多个子网,网络之间可以互连

计算机网络的分类
image.png
数据交换方式
电路交换:终端间建立专用物理连接,在连接期间保持交换数据流的通道(举例:电话通信)
分组交换:通过“分组”作为数据传输单元,使用存储转发技术进行通信的方式

网络分层
理论上为七层结构,实际应用为四层结构,但是用于学习的为五层结构
image.png

网络协议进行网络中的数据交换而建立的规则、标准或约定

协议三要素

  • 语法:数据与控制信息的结构或格式 。
  • 语义:需要发出何种控制信息,完成何种动作以及做出何种响应。
  • 同步:事件实现顺序的详细说明。

标头和载荷
一个数据单元通常分为两部分:标头(Header)和载荷(Payload),通过分层协议进行传输,进行“封装”和“解封装”
标头:数据单元头部部分,包含控制信息。
载荷:数据单元数据部分,包含实际要传输的数据。

Web中的网络

HTTP:是浏览器和服务器的通信语言

HTTP/0.9

  • 背景:主要用于学术交流
  • 需求:传输HTML文件
  • 实现:基于请求响应模式

image.png

  • 特点
    • 客户端只有请求行,无请求头和请求体
    • 服务器不返回头信息,只返回数据
    • 返回的文件内容是以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

image.png

  • 特点:
    • 支持多种类型的文件下载,支持多种类型编码的文件格式
    • 支持服务器将处理情况告知浏览器 --- 状态码,通过响应行的方式
    • 提供 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编号的帧
主要功能:主要用于实现多路复用技术

附带功能:

  1. 设置请求的优先级。可以优先处理重要的请求。
  2. 服务器推送。将数据提前推送到浏览器,浏览器可以直接拿到需要的文件数据,加快页面加载速度。
  3. 头部压缩。对请求头和响应头进行压缩,浏览器发送请求时基本都是发送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),是指从浏览器发送一个数据包到服务器,再从服务器返回数据包到浏览器的整个往返时间,是反映网络性能的一个重要指标。
握手延迟

  1. 建立TCP连接,进行三次握手,消耗1.5个RTT
  2. 进行TLS连接,根据版本不同,所花时间不同,大致需要1~2个RTT

TCP协议僵化

  1. 中间设备僵化:中间设备依赖一些很少升级的软件,这些软件使用了大量的TCP特性,功能被设置之后就很少更新了。如果我们在客户端升级了TCP协议,这些中间设备可能因为不能理解包的内容而丢弃新协议的数据包。
  2. 操作系统: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来建立连接,大大提升首次打开页面的速度
  • HTTP/2 和 HTTP/3 协议栈比较
  • 存在的挑战
    • 目前服务器和浏览器端都没有对HTTP/3提供比较完整的支持。
    • 部署HTTP/3也存在非常大的问题。系统内核对UDP的优化远远没有达到TCP的优化程度。
    • 中间设备僵化问题。设备对UDP的优化程度远远低于TCP。

CDN

CDN:Content Delivery Network,内容分发网络,帮服务器近距离给用户分发网页内容。

  • 网页内容:静态内容、动态内容
  • 一开始是没有网站的源内容的
  • 另一个名字,加速器,将文件进行最小化或者压缩文档。

出现的原因:客户端离服务器的距离越远,要经过的节点也就也多,而节点间会发生阻塞或者丢包等状况。为了提供稳定快速的服务,需要在接近用户的地方搭建服务器,CDN就是为了满足这种需求出现的网络。
image.png
CDN的组成
中心节点:CDN网管中心+全局负载均衡DNS重定向解析系统,负责整个CDN网络的分发及管理。
边缘节点:异地分发节点,由负载均衡设备、高速缓存服务器两部分组成。(边缘服务器:接近用户的服务器)

CDN分发内容流程

请求静态内容

如果源服务器将静态内容提前备份给CDN

  1. push:源服务器将静态内容提前备份给CDN
  2. request:用户请求网页内容
  3. response:就近的CDN服务器将静态内容提供给用户

image.png
如果源服务器没有将静态内容提前备份给CDN

  1. request:用户请求网页内容
  2. pull:CDN去问源服务器索取静态内容,源服务器可以让CDN进行备份
  3. response:CDN将内容提供给用户

image.png

请求动态内容

请求时间:运行CDN上的接口,而不是运行源服务器的代码,用户可以直接从CDN上获取时间
image.png

CDM的布局相当于给源服务器增加了一道墙,源服务器不用担心DDos攻击,但CDN需要考虑DDos攻击,于是就布局了多台CDN服务器在各个地方,监控CDN服务器的负载情况,若某台服务器超载,则转移到没有超载的服务器上,实现平均分配网络的流量,即负载均衡。采用TSL/SSL证书对网站进行保护

实现负载均衡:采用任播技术。服务器对外拥有同一个IP地址,收到用户请求,请求会由距离用户最近的服务器来响应,若该服务器超载,则利用任播技术把流量转移到没超载的服务器上。

WebSocket

WebSocket 是一种网络通信协议,他可以让服务器将数据主动推送给客户端

  • 有状态的持久连接
  • 服务器端可以主动推动消息
  • 用WebSocket发送消息延迟比HTTP低
  • 从HTTP协议升级而来

用途:即时通讯

代码示例:

  • 客户端代码

image.png

  • 服务端代码

image.png

网络安全

网络安全三要素

  • 机密性:攻击者无法获知通信内容
  • 完整性:攻击者对内容进行篡改时能被发现
  • 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信

对称加密和非对称加密

  • 对称加密:加密、解密用同样的密钥
  • 非对称加密:加密、解密使用不同的密钥(公钥和私钥),而且公钥加密只能用私钥解密、私钥加密只能用公钥解密

密码散列函数(哈希函数)

  • 输入:任意长度的内容
  • 输出:固定长度的哈希值
  • 性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的

机密性

  • 加密需要加密算法和密钥等信息(统称为秘密信息
  • 网络是明文的,不安全

完整性和身份验证

HTTPS
把 HTTP 的明文换成密文,再验证身份,即 HTTPS
HTTPS = HTTP + TLS
TLS = 身份验证 十 加解密
身份验证靠 PKI
服务端身份验证靠 PKI,客户端身份验证靠 HTTP 协议

参考文档

http发展史:http发展史
CDN:漫话:如何给女朋友解释什么是CDN?什么是CDN?CDN能为我们做什么?我们为什么要了解他?
WebSocket:带你揭开WebSocket的神秘面纱!

课上有一些没有听懂就去搜罗了一些资料来看,还有一些得今后再去深入学习了。