计算机网络学习笔记(4)—— 应用层协议

Posted by 皮皮潘 on 02-18,2022

HTTP

HTTP是基于TCP协议的,因此需要事先建立TCP连接,目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样建立的 TCP 连接,就可以在多次请求中复用。

HTTP请求的格式如下图所示:
1656_0.png

HTTP 的报文大概分为三大部分。第一部分是请求行,第二部分是请求的首部,第三部分才是请求的正文实体

HTTP响应的格式如下图所示,大致和HTTP的请求差不多,这里就不再说了:
1658_0.png

另外由于TCP是基于二进制流进行传输的,因此TCP是无法保证上层的应用的报文是否到齐或者完整的,因此需要上层应用自行解决拆包和粘包的问题

HTTPS

众所周知,https就是在http的基础上加入了密钥加密,从而防止了信息的明文传输,同时也通过证书的方式证明了服务端的身份而不至于被假冒

由于https使用到了加密技术,因此这里先简单地说一下密码学算法、摘要、签名、证书、CA等前置知识

密码学算法的主要用途:1. 摘要 2. 加密 3. 签名,其中摘要是不可逆的,加密是可逆的,签名是可信的

摘要的意义是在源信息不泄漏的前提下辨别其真伪,易变性保证了可以从公开的特征上甄别出信息是否来自于源信息,不可逆性保证了不会从公开的特征暴露出源信息

加密与摘要的本质区别在于加密是可逆的,逆过程就是解密,而后者是不可逆的。根据加密和解密是否采用同一个密钥,对应算法分为对称加密和非对称加密,非对称加密不能直接用于大量数据的加密,因此目前的加密一般结合对称与非对称加密

证书是权威CA中心对特定公钥信息的一种公证载体,其中包含了服务端的公钥,也可以理解为权威CA对特定公钥未被篡改的签名背书,由于客户的机器上已经预置了权威CA本身的证书(CA证书或者根证书),因此有了安全真正的起源,在服务端通过持有权威CA签名的证书证明自身的公钥的有效性,为什么要通过CA中心达成认证是因为达成信任的基本途径不外乎基于共同私密信息的信任和基于权威公证人的信任两种,但是在网络世界,客户端和服务端往往没有共同私密信息,因此能采用的只有基于权威公证人的信任——公开密钥基础设施(Public Key Infrastructure PKI)

https生成证书的大致步骤如下:确定加密算法,生成密钥,公钥分发给CA,CA认证核验公钥,CA签名生成证书

在完成了证书的生成之后,服务端就可以启用https协议了,https工作模式如下:
1654_1.jpg

其核心在于:1. 通过CA加证书验证双方都没有被假冒 2. 前期基于公钥和私钥的非对称加密进行通信来确定加密算法和对称密钥 3. 后期基于前期协商的对称密钥进行加密通信

其中客户端需要证书的TLS通信则称为双向TLS,这是云原生基础设施的主要认证方法,它不仅保证了向客户端保证了服务端的身份没有篡改也向服务端保证了客户端的身份没有篡改

流媒体协议

视频和图片都有着类似的特定,因此可以进行压缩:

  1. 空间冗余:图像的相邻像素之间有较强的相关性,一张图片相邻像素往往是渐变的,不是突变的,没必要每个像素都完整地保存,可以隔几个保存一个,中间的用算法计算出来。
  2. 时间冗余:视频序列的相邻图像之间内容相似。一个视频中连续出现的图片也不是突变的,可以根据已有的图片进行预测和推断。
  3. 视觉冗余:人的视觉系统对某些细节不敏感,因此不会每一个细节都注意到,可以允许丢失一些数据。
  4. 编码冗余:不同像素值出现的概率不同,概率高的用的字节少,概率低的用的字节多,类似霍夫曼编码(Huffman Coding)的思路。

压缩好的数据,为了传输组成一系列 NALU,按照帧和片依次排列;排列好的 NALU,在网络传输的时候,要按照 RTMP 包的格式进行包装,RTMP 的包会拆分成 Chunk 进行传输;推送到流媒体集群的视频流经过转码和分发,可以被客户端通过 RTMP 协议拉取,然后组合为 NALU,解码成视频格式进行播放。

P2P协议

下载一个文件可以使用 HTTP 或 FTP,这两种都是集中下载的方式,而 P2P 则换了一种思路,采取非中心化下载的方式;

在P2P中每个节点并不从服务器去下载文件,而是通过种子文件去获悉哪些其他节点有对应文件的一部分内容,然后去这些节点去下载对应的文件内容,并基于种子文件中的哈希值去校验文件内容的正确性,同时自身也打开监听端口,将自己下载了的部分文件开放出去让别的节点下载,从而可以大幅度降低服务器的压力

DNS

DNS服务器就是实现域名和IP之间映射的,为了降低DNS服务器的负载,DNS服务器设置成树状的层次结构,本地DNS服务器在本地无缓存的情况下会从根DNS服务器开始递归地询问下一级域名对应的DNS服务器所在的位置直到把域名解析完毕

通过DNS在域名和 IP 的映射过程中,给了应用基于域名做负载均衡的机会,可以是简单的负载均衡,也可以通过CNAME然后根据地址(外部DNS服务器通过本地DNS服务器的IP来获取用户的大致区域,然后分配对应的临近的IP地址)和运营商(外部DNS服务器根据运营商分配不同的域名别名,然后访问不同的下级DNS服务器)做全局的负载均衡

由于DNS是全局的,会有缓存更新不及时等问题,因此另外提出了一种HttpDNS,HttpDNS 其实就是,不走传统的 DNS 解析,而是自己搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析的时候,直接通过 HTTP 协议进行请求这个服务器集群,得到就近的地址。

CDN

CDN将一些静态数据缓存在了离用户近的边缘节点之上,从而降低了网络延时,如何转发到对应的CDN则是基于DNS的全局负载均衡实现的

在没有 CDN 的情况下,用户向浏览器输入 www.web.com 这个域名,客户端访问本地 DNS 服务器的时候,如果本地 DNS 服务器有缓存,则返回网站的地址;如果没有,递归查询到网站的权威 DNS 服务器,这个权威 DNS 服务器是负责 web.com 的,它会返回网站的 IP 地址。本地 DNS 服务器缓存下 IP 地址,将 IP 地址返回,然后客户端直接访问这个 IP 地址,就访问到了这个网站。

然而有了 CDN 之后,情况发生了变化。在 web.com 这个权威 DNS 服务器上,会设置一个 CNAME 别名,指向另外一个域名 www.web.cdn.com,返回给本地 DNS 服务器。当本地 DNS 服务器拿到这个新的域名时,需要继续解析这个新的域名。这个时候,再访问的就不是 web.com 的权威 DNS 服务器了,而是 web.cdn.com 的权威 DNS 服务器,这是 CDN 自己的权威 DNS 服务器。在这个服务器上,还是会设置一个 CNAME,指向另外一个域名,也即 CDN 网络的全局负载均衡器。

接下来,本地 DNS 服务器去请求 CDN 的全局负载均衡器解析域名,全局负载均衡器会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:

  • 根据用户 IP 地址,判断哪一台服务器距用户最近;
  • 用户所处的运营商;
  • 根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需的内容;
  • 查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。

防盗链

最常用也最简单的方法就是 HTTP 头的 referer 字段, 当浏览器发送请求的时候,一般会带上 referer,告诉服务器是从哪个页面链接过来的,服务器基于此可以获得一些信息用于处理。如果 refer 信息不是来自本站,就阻止访问或者跳到其它链接。

另外一种常用的机制是时间戳防盗链。管理员在配置界面上,约定一个加密字符串。客户端取出当前的时间戳,要访问的资源及其路径,连同加密字符串进行签名算法得到一个字符串,然后生成一个下载链接,带上这个签名字符串和截止时间戳去访问资源服务器。在服务端,根据取出过期时间,和当前时间进行比较,确认请求是否过期。然后服务端有了资源及路径,时间戳,以及约定的加密字符串,根据相同的签名算法计算签名,如果匹配则一致,访问合法,才会将资源返回给客户

VPN

VPN 通过隧道技术在公众网络上仿真一条点到点的专线,是通过利用一种协议来传输另外一种协议的技术,这里面涉及三种协议:乘客协议、隧道协议和承载协议,以 IPsec 协议为例来说明:
1648_1.png

VPN的核心在于保证在公网上面传输信息的安全,因而采取了一定的机制保证安全性:

  • 机制一:私密性,防止信息泄露给未经授权的个人,通过加密把数据从明文变成无法读懂的密文,从而确保数据的私密性。但是同样,对称加密还是存在加密密钥如何传输的问题,这里需要用到因特网密钥交换(IKE,Internet Key Exchange)协议。
  • 机制二:完整性,数据没有被非法篡改,通过对数据进行 hash 运算,产生类似于指纹的数据摘要,以保证数据的完整性。
  • 机制三:真实性,数据确实是由特定的对端发出,通过身份认证可以保证数据的真实性。

基于以上三个特性,组成了 IPsec VPN 的协议簇:
1652_1.png

IPsecVPN的建立过程主要分为两个阶段:

阶段一:建立 IKE(Internet Key Exchange)自己的SA(Security Associations)

这个 SA 用来维护一个通过身份认证和安全保护的通道,为第二个阶段提供服务。在这个阶段,通过 DH(Diffie-Hellman)算法计算出一个对称密钥 K。其算法大致如下图所示,由于在传输过程中只传输了生成密钥的材料,而对称密钥从来没有在通道上传输过,因此截获的人无法算出对应的密钥:
1650_1.png

阶段二:建立IPsec的SA(Security Associations)

在这个 SA 里面,双方会生成一个随机的对称密钥 M,由 K 加密传给对方,然后使用 M 进行双方接下来通信的数据。对称密钥 M 是有过期时间的,会过一段时间,重新生成一次,从而防止被破解。

IPsec SA中有以下内容:

  • SPI(Security Parameter Index),用于标识不同的连接,通过SPI,;
  • 双方商量好的加密算法、哈希算法和封装模式;
  • 生存周期,超过这个周期,就需要重新生成一个 IPsec SA,重新生成对称密钥。

当IPsec的SA建立好以后就可以打包封装传输了,其核心就是将原IP包加密然后在其外面再套一层IP包,且外层IP包的上层协议是ESP,在ESP的正文里面有双方商讨好的SPI使得客户端和服务端可以在各自的SA中查找到对应的哈希算法与密钥,从而可以将加密了的原IP包进行解密,解密后在正文的最后,指明了里面的协议是什么。如果是 IP,则需要先解析 IP 头,然后再解析原IP包内部的东西,这也是从隧道出来后解封装的过程

IPsec VPN的核心就是:客户端发送的明文的 IP 包,都会加密然后被加上 ESP 头和 IP 头,在公网上传输,由于加密,可以保证不被窃取,到了对端后,去掉 ESP 的头,进行解密

移动网络

无论无线通信如何无线,最终还是要连接到有线的网络里,因而移动网络的核心在与基站,而基站子系统主要分为两部分,一部分对外提供无线通信,叫作基站收发信台(BTS,Base Transceiver Station),另一部分对内连接有线网络,叫作基站控制器(BSC,Base Station Controller)。基站收发信台通过无线收到数据后,转发给基站控制器然后进入核心网。核心网收到数据后,一是判断是否合法,二是判断是不是本地号并决定收费规则,两者都通过后数据真正进入外网。整体架构从2G网络到5G网络差不多都是这样,但是在细节上还是经历了很大的变化的

2G网络

手机本来是用来打电话的,不是用来上网的,所以原来在 2G 时代,上网使用的不是 IP 网络,而是电话网络,走模拟信号,专业名称为公共交换电话网(PSTN),因为PSTN是面向连接的回路交换技术,因此相较于无连接的包交换技术(以太网),PSTN更加稳定但是带宽很低

2.5G网络

后来从 2G 到了 2.5G,也即在原来电路交换的基础上,加入了分组交换业务,支持 Packet 的转发,从而支持 IP 网络。

3G网络

到了 3G 时代,主要是无线通信技术有了改进,大大增加了无线的带宽。

4G网络

4G时代进一步提升了无线通信技术,使得下行速度可以达到百兆级别,同时实现了控制面和数据面的分离,在前面的核心网里面,检查是否合法以及转发数据都是由同一个组件负责,而这样灵活性比较差,因为控制面主要是指令,多是小包,往往需要高的及时性;数据面主要是流量,多是大包,往往需要吞吐量,因此在4G网络的核心网中,将控制面和数据面进行了分离

参考

  1. 《趣谈网络协议》