1、内容总览
2、前言 & 课程介绍
描述一个复杂系统通常有这两种分析方法:自底向上和自顶向下。
- 自底向上方法用来构建对计算机网络的认知,从一个个基础节点开始,不断增加复杂度,直到构建出一个完整的计算机网络。
- 自顶向下方法用来解释(现成/线程 ?)网络应用,协议的特性,工作原理等。从最高层次的实际需求开始,描述如何使用计算机网络构建一个满足实际需求的应用。
3、计算机网络基础
3.1、计算机网络组成部分的一些概念
- 主机:负责提供信息和接收信息,分为客户端和服务端。
- 路由器:负责转发主机之间的信息。
- 网络协议:负责提供统一的格式,方便路由器和主机这些信息进行编码或解码。
3.2、网络结构:网络的网络
以蟹宝王帝国为例,介绍如何从本地网络开始,一步步搭建起一个遍布全国的广域网。
3.3、信息交换方式
- 电路交换
- 分组交换
3.4、网络分层
网络分层的几种方式——OSI七层模型,TCP/IP五层模型和TCP/IP四层模型。
后两种均是从OSI七层模型优化而来。
TCP/IP参考模型是一个从应用中发展成主流的参考模型,先有TCP/IP协议栈再划分成对应的参考模型。
- 网络层:在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。
- 运输层:负责向两台主机进程之间的通信提供通用的数据传输服务。
- 应用层:通过应用进程间的交互来完成特定网络应用。
3.5、协议
就像人与人沟通一样,既然想“聊天”,最起码得有一个基本条件,比如都使用汉语或英语,这算是一个比较宽泛的协议了。而在计算机通信当中,也差不多,就是约定好咱们交互时的数据格式是什么,每个数据项什么意思,然后你收到之后应该怎么处理或怎么回应。
简单来说,互联网协议就是在互联网上传输数据的规则。当然,协议是非常多的,比如TCP、UDP、IP协议、FTP协议等等。而使用这些协议最基本的要求就是发送方和接收方所使用的协议必须一致,否则不就鸡同鸭讲了嘛。
协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接收一条报文或其他事件所采取的动作。
当我们说几层协议时,一般来说:一台设备上的第X层与另一台设备上的第X层进行通信的规则就是第X层协议。
3.6、标头和载荷
网络协议中的基本结构是标头和载荷,每一层都会将上一层的标头和载荷视为这一层的载荷,并添加自己的标头。
如下图,计算机网络中,快递面单相当于标头,包裹里的东西相当于载荷。
3.7、HTTP协议示例
3.8、TCP协议示例
3.9、小结
4、web中的网络
- 介绍了HTTP1,HTTP2,HTTP3的升级历程和规则特性。
- 介绍了如何提升web/浏览器性能,可以从HTTP,CDN两方面入手。
- 介绍了webSocket。
4.1、HTTP协议
4.1.1、HTTP协议基本结构
用一个示例(下图),解释HTTP基本结构。示例中,有两种颜色的消息,其中,红色的是请求,蓝色的是响应。
- 请求:
请求的第一行 GET / HTTP / 1.1,包含3个元素,这3个元素分别表示 请求的方法,资源的路径和HTTP的版本。
跟在后面的是头部,每一行代表一个头部。例如,Host: info.cern.ch ( 头部名称:头部值 )。头部后面的空行将头部和正文分隔开来,示例中是GET请求,没有正文,所以这里看不见。
- 响应:
响应的第一行称为状态行,HTTP / 1.1 200 OK ,包含3个要素,分别代表HTTP版本,状态码,重要信息(可自定义)。跟在后面的是头部,和请求中的头部类似,头部后面的空行将头部和正文分隔开来,此例中正文是一个HTML文档。
4.1.2、HTTP连接模型
几个重要概念:Short-lived connections(短连接),Persistent connections(长连接),队头堵塞。
HTTP协议使用典型的请求响应模型。 在 HTTP/1.x 中,有几种连接模式:
Short-lived connections(短连接),Persistent connections(长连接),HTTP Pipelining(HTTP 流水线)
Short-lived connections
HTTP 最早期的模型,也是 HTTP/1.0 的默认模型,是短连接。每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。
Persistent connections
在 HTTP/1.1 里,默认就是长连接的。 一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭(服务器可以使用 Keep-Alive 协议头来指定一个最小的连接保持时间)。
HTTP pipelining
默认情况下,HTTP请求是按顺序发出的。下一个请求只有在当前请求收到应答过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。 流水线模型允许客户端发送多个请求,服务器按顺序进行响应。这种模型看似很好,但现实中几乎没有浏览器会使用。原因在于这种模型对于解决队头堵塞几乎没有帮助,还可能会导致一些潜在的安全问题。
队头堵塞
“队头阻塞”与短连接和长连接无关,而是由HTTP基本的“请求-响应”模型所导致的。
因为HTTP规定报文必须是“一发一收”,这就形成了一个先进先出的“串行”队列。队列里的请求没有轻重缓急的优先级,只有入队的先后顺序,排在最前面的请求被最优先处理。
如果队首的请求因为处理的太慢耽误了时间,那么队列里后面的所有请求也不得不跟着一起等待,结果就是其他的请求承担了不应有的时间成本。
对于队头堵塞问题,HTTP1.1 中最常用的方案是同时建立多个TCP连接,将请求分散在多个TCP连接上,这种方案确实可以缓解队头堵塞问题,但建立多条TCP连接得成本是巨大的。而且,无法实现“多路复用”。
对于“无法多路复用”的解决方法
对于HTTP1中,“无法多路复用”的问题,HTTP2 将多个HTTP请求拆分到帧里面,每一个帧可以携带来自不同HTTP请求的数据。注意:这里的帧和链路层的帧不一样。
帧的结构
帧带来的额外好处
4.1.3、HTTP3 : QUIC
既然HTTP2已经解决了多路复用问题,为什么还会有HTTP3呢?简单来说,HTTP3的出现就是因为HTTP2还不够快。虽然HTTP2解决了HTTP层面的队头堵塞问题,但在TCP层面仍可能出现队头堵塞。
在TCP和QS层面,要启动一个HTTPS连接,需要经历3个RTT (Round-Trip Time),这3个RTT分别是 TCP建立连接需要1个RTT,QS建立连接需要2个RTT(QS1.2及以下,QS1.3以上可以实现首次连接 1 RTT,后续连接 0 RTT)。因此,在真正进行报文交换前,已经过去3个RTT,效率很低。这个延迟是TCP协议和QS固有的延迟。
既然已有协议无法解决上述问题,必须设计一个新的协议。这个协议就是QUIC。QUIC将QS作为自己的一部分,解决了之前TCP与QS需要握手的问题。又吸取了HTTP中“流”的概念,继而解决了队头堵塞的问题。同时,引入了新的机制,可以实现首次连接1RTT,后续连接0RTT的特性。
4.3、CDN
到HTTP3时,能在HTTP上做的提升基本都实现了。在HTTP之外,仍有很多影响HTTP性能的因素,例如——CDN。
CDN这个技术其实说起来并不复杂,最初的核心理念,就是将内容缓存在终端用户附近。
内容源不是远么?那么,我们就在靠近用户的地方,建一个缓存服务器,把远端的内容,复制一份,放在这里,不就OK了?
因为这项技术是把内容进行了分发,所以,它的名字就叫做CDN——Content Delivery Network,内容分发网络。
具体来说,CDN就是采用更多的缓存服务器(CDN边缘节点),分布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求。(有点像电商的本地仓吧?)
大家可能觉得,这个不就是 “镜像服务器” 嘛?其实不一样。镜像服务器是源内容服务器的完整复制。而CDN,是部分内容的缓存,智能程度更高。
确切地说,CDN=更智能的镜像+缓存+流量导流。
而且还需要注意的是,CDN并不是只能缓存视频内容,它还可以对网站的静态资源(例如各类型图片、html、css、js等)进行分发,对移动应用APP的静态内容(例如安装包apk文件、APP内的图片视频等)进行分发。
4.4、WebSocket
WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。(维基百科)
WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。
为什么需要 WebSocket?
我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
因为 HTTP 协议有一个缺陷:通信只能由客户端发起,不具备服务器推送能力。
举例来说,我们想了解查询今天的实时数据,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
WebSocket 协议相对于HTTP协议有以下3个特点:
4.5、小结
5、网络安全
在上一节中,无论是HTTP、WebSocket、TCP/UDP协议,都是明文的。也就是说,一条消息在从一台电脑到另一台电脑的过程中,中途经过的所有路由器,交换机都可以看到消息的全部内容,不仅能看,甚至还可以篡改、丢弃。明文会导致很多行为无法通过网络进行,比如在线银行转账等涉及到钱的行为。
5.1、网络安全三要素
为了保证通信安全,需要实现以下几个目标:
- 机密性:链路中的攻击者即使获取到了内容,也无法知道其中的含义。
- 完整性:攻击者对内容进行篡改时能被发现/通信内容不能被篡改。
- 身份验证:攻击者无法伪装成通信双方的任意一方与另一方通信。
5.2、对称加密和非对称加密
5.3、密码散列函数(哈希函数)
5.4、网络安全: 机密性
5.5、网络安全: 完整性和身份验证
5.6、网络安全: 如何实现机密性
5.7、网络安全: 如何实现完整性
5.8、网络安全: 如何实现身份验证
下图中的 DigiCert Global Root CA 就是根证书。