http协议
http 1.1默认开启了keep-alive。建立的TCP连接可以在多次请求中复用。
http请求的构成
请求行
1、url——输入的网址
2、版本——http版本
3、方法
- GET——从服务器获取资源。返回什么,由服务器决定。
- POST——他需要主动告知服务器一些信息,而不是获取。告知服务器的信息一般会放在正文里。正文可以有各种形式,常见的是JSON。
- PUT——向指定资源位置上传最新内容。与POST的区别之处在于,POST常用语创建资源,PU通常用于修改资源。
- DELETE——删除资源。
首部字段
请求行下面就是首部字段。首部是key value,通过冒号分隔。这里往往用于保存一些重要的字段。
Accept-Charset——客户端可接受的字符集——防止传过来其他的字符集导致乱码。
Content-type——正文格式
Cach-control——用来控制缓存。当客户端发送的请求中包含max-age指令时,如果判定缓存层中,资源的缓存时间数之比指定时间的数值小,那么客户端可以接受缓存资源。当指定max-age值为0,那么缓存层通常需要将请求转发给应用集群。
if-Modified-Since也是关于缓存的。如果服务器资源在某个时间更新了,那么客户端应该更新资源;如果没有更改,则会返回304 Not Modified的相应,那么客户端就不用下载了,也会节省带宽。
http请求的发送
Retry-After——告知客户端多长时间之后再次尝试一下。
503——服务暂时不再和这个值配合使用
http 2.0——通过头压缩、分帧、二进制编码、多路复用提升性能
http 1.1——在应用层以纯文本的形式进行通信。每次通信都有带完整的http头。
http2.0对http头进行了压缩,将原来每次都携带的大量key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。对相同的头,只发送索引表中的索引
http 2.0将一个TCP连接中,切分成多个流,每个流都有自己的ID,而且流可以是客户端发送给服务端的,也可以是服务端发送给客户端的。
http 2.0还将所有的传输信息分割为更小的信息和帧,并对他采用二进制格式编码。常见的帧有header帧,用于传输header内容,而且会开启一个新的流。还有Data帧,用于传输正文实体。多个Data帧属于同一个流。
假设我们有三个http请求。在http 1.1中是串行的,但是http 2.0,可以同时回复多个请求,而且不用按照顺序一对一应。
http 2.0其实将三个请求变成三个流,将数据分成帧,乱序发送到TCP连接中:
http 2.0成功解决了http 1.1的队首阻塞问题。同时也不需要通过http 1.x的pipline机制用多条TCP连接实现并行请求和响应。
减少了TCP连接对数对服务器性能的影响,同时将页面中的多个数据通过一个数据链进行传输,加快页面组件的传输速度。
https协议
对称加密和非对称加密
- 对称加密——加密和解密的密钥相同
- 非对称加密——加密和解密的密钥不同。公钥加密的信息,只有私钥才能解密;私钥加密的信息,只有公钥才能解密。
对称加密
被密钥加密的信息在网上传递也不怕被黑客拦截,但是如何约定密钥,这成了关键。如果密钥在传输的过程中被拦截,那么加密就毫无用处了。
非对称加密
非对称加密的私钥不会在网上传输,但是公钥会在互联网上传播。
数字证书
非对称加密不能保证获取的公钥是正确的,如果收到了黑客发来的公钥,那么接下来消息的互通是看不出来问题的。
证书里面有什么?
- 公钥
- 发布机构
- 有效期
https的工作模式
https的总体思路——数据使用对称加密传输,公钥通过非对称加密进行传输。
客户端验证服务器的过程(单向验证,为了安全,也可以启用双向验证)
- 建立https时,客户端向服务器明文发送TLS版本信息、加密套件候选列表、压缩算法候选列表等信息。还会有一个随机数,在协商对称密钥的时候用。
- 服务端返回一个消息,通知客户端服务端使用的协议版本、加密套件、压缩算法,以及一个随机数,该随机数用于后续加密协商。
- 之后服务端还会返回给客户端一个证书,说明沟通完成了。此时客户端可以拿着这个证书去CA中,拿着CA证书里面的公钥去解密服务端的证书。如果解密成功,说明服务端可信
- 验证完毕之后,客户端随机产生一个Pre-Master随机数,用证书中的公钥加密,发给服务器,服务器通过私钥将该随机数解密。
- 此时,客户端和服务端分别都有三个随机数,分别是:自己产生的随机数、对方产生的随机送、刚刚生成的Pre-Master随机数。通过这三个随机数,可以在客户端和服务端产生相同的对称密钥.
- 有了对称密钥之后,客户端和服务端就可以通过对称加密的方式进行通信了。
流媒体协议
视频是一连串连续的图片,每张图片为一帧。如果每秒30帧,则帧率(FPS)为30.假设图片尺寸是1024*768像素,每个像素点由RGB组成,每个8位,共24位。则一秒钟的视频大小为:
因此一分钟是4G。
数据量太大了,人们相处的解决办法是——编码——尽量用少的bit数保存视频。编码是一个压缩的过程。
视频和图片进行压缩,因为视频图片有这样一些特点:
1、空间冗余:图像的相邻像素之间有较强的相关性,一张图片相邻像素往往是渐变的,不是突变的,没必要每个像素都完整地保存,可以隔几个保存一个,中间的用算法计算出来。
2、时间冗余:视频序列的相邻图像之间内容相似。一个视频中连续出现的图片也不是突变的,可以根据已有的图片进行预测和推断。
3、视频冗余:人的视觉系统对某些细节不敏感,因此不会每一个细节都注意到,可以允许丢失一些数据。
4、编码冗余:不同像素值出现的的概率不同,概率高的用的字节少,概率低的用的字节多,类似霍夫曼编码(huffman coding)的思路。
FTP——文件传输协议
FTP采用两种TCP链接传输一个文件
控制链接——服务器以被动的方式打开FTP的端口21,客户端主动发起链接。该连接将命令从客户方传给服务器,并传回服务器的应答。常用的命令:
list——获取文件目录
reter——取一个文件
store——存一个文件
数据连接——每当一个文件在客户端与服务器之间传输时,就创建一个数据连接。
FTP的两种工作模式
每传输一个文件就建立一个新的数据连接。FTP有两种工作模式,主动模式和被动模式:
主动模式
- 客户端随即打开一个大于1024的端口N,向服务器的21端口发起连接
- 开放N+1端口进行监听,并向服务器发送“port N+1"命令
- 由服务器从自己的数据端口20,主动连接到客户端指定的数据端口 N+1.
被动模式
- 当开启一个 FTP 连接时,客户端打开两个任意的本地端口 N 和 N+1。
- N端口与服务器的21端口进行连接,连接之后获取服务器返回的一个端口X,
- 客户端的N+1端口向服务器的端口X发起连接
- 服务器被动连接到客户端的端口N+1
DNS协议
DNS的两项功能
- 根据域名查询IP地址
- 针对多IP地址多负载均衡,可以实现使你访问在多地址中选择距离最近的IP进行访问
DNS服务器一定要设置成高可用、高并发、分布式的。
DNS解析过程
1、电脑客户端发出DNS请求,查询www.baidu.com的IP地址是什么,并发给本地域名服务器(本地DNS)。(本地域名服务器即本地DNS,是网络服务商自动分配的,该服务区通常在网络服务商的某个机房)。
2、本地DNS收到客户端请求之后,将请求的域名在本地缓存中进行查找,如果找到对应的IP地址,则返回给客户端;如果没有,则向根域名服务器发送请求,获取该域名的IP地址。根域名服务器是最高层次的,全球一共13套,他不直接用于域名解析,但是可以指路。
3、根DNS收到来自本地DNS的请求之后,先查看域名的末尾,发现是 .com ,因此会返回给本地DNS域名为 .com 的顶级域名服务器地址
4、本地DNS转向顶级域名服务器,顶级域名服务器获取到域名之后,发现是baidu.com,于是将管理www.baidu.com的权威DNS服务器的地址返回给本地DNS。
5、本地DNS转向权威DNS服务器,权威DNS服务器是域名解析结果的原出处。权威DNS服务器查询之后会将域名对应的IP地址返回给本地DNS。
6、本地DNS将IP地址返回给客户端,客户端与目标建立连接
DNS可以做内部负载均衡
例如一个应用要访问一个数据库,就应该记录数据库的域名,因为如果该数据库移动到别的机器上,IP地址会变化。如果记录的是IP地址,那么修改的工作量就很大了;使应用记录域名,在修改数据库的位置之后,只需要在DNS服务器中将域名映射为新的IP地址即可,大大简化的运维。
更进一步,一个应用要访问另一个应用,如果配置另外一个应用的IP地址,那么这个访问就是一对一的。但是如果我们如果部署了多个被访问应用,如何实现负载均衡?只要配置一个域名即可。在域名解析时,配置策略,控制每次访问的IP地址即可实现负载均衡。
DNS实现全局负载均衡
- 将失效的应用的IP地址在DNS服务器中删除
- 控制访问与客户端相近的服务器,可以加快访问速度。
DNS访问数据中心对象存储上的静态资源
对于简单的应用来讲,权威DNS服务器可以直接将域名对应的IP地址进行返回。客户端可以通过多个IP地址,进行简单的轮询,实现简单的负载均衡。
但是对于复杂应用,尤其是跨地域的大型应用,则需要更加复杂的全局负载均衡机制,因而需要专门的设备或者服务来做这件事,这就是全局负载均衡器(GSLB)。下图是全局负载均衡器的使用示例:
httpdns协议
传统DNS的局限性
1、域名缓存问题——因为时效性
1、DNS会进行本地缓存,缓存可能会因为时效性问题而反馈给客户端错误的IP地址。
2、DNS服务器还会对一些静态页面进行缓存,如此减少访问的距离,加快访问速度。在域名解析的时候,返回的IP地址就是这些用于缓存的服务器,而不是提供服务的服务器。这就会带来时效性问题——如果页面已经更新,用户访问的依然是老页面。
3、本地缓存往往使得全局负载均衡失效,因为上次进行缓存的时候,缓存中的地址不一定是这次访问距离客户最近的地方,如果依然把缓存中的地址返回给客户端,就会造成绕路。
2、域名转发问题
进行域名解析时会访问域名解析服务器,有的域名解析服务器会将任务委托给别的域名解析服务,这就会带来问题。
比如解析服务器A访问自己的DNS服务器,权威DNS服务器会返回给A一个地址,该地址对于A来说访问会比较快。但是如果A偷懒,将解析请求委托给B去做,返回的IP地址不一定对于A来说是最好的。
3、出口NAT问题
出口的时候,分舵机房都会配置NAT,即网络地址转换,使得从这个网关出去的包,都换成新的IP地址。当队前卫DNS进行请求的时候,权威DNS就无法通过IP地址来辨别发送请求的客户端来着哪一个运营商,因为极有可能导致跨运营商访问
httpsDNS的工作模式(简略版)
由于默认的域名解析都是走DNS的,想绕过DNS,就需要使用HTTPDNS客户端。一般是手机通过嵌入HTTPDNS客户端的SDK实现利用HTTPDNS进行域名解析。