现在接着《HTTP权威指南》学习总结(上)继续介绍HTTP相关的知识
连接管理
TCP连接
之前一直在介绍HTTP的报文结构。但是在通信的过程中,只有建立了连接才能互相传送信息。因此,如何建立连接、维护连接、终止连接同样非常重要。如果连接出现了问题,那就有可能出现报文丢失从而破坏了信息的完整性。同样,如果连接出现了问题,那么报文的有序性也无法保证。HTTP通信其实是由 TCP/IP 来承载的。TCP/IP 是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。
因为这两篇文章主要是介绍HTTP协议,所以不会深究 TCP/IP 协议集。笔者以后会另开博客介绍TCP/IP,这里只提及其在用户使用HTTP协议时起到的作用。
注:文章中出现的部分示例图来自《HTTP权威指南》PDF版本的截图
TCP是可靠的数据传输管道
HTTP连接实际上就是TCP连接以及一些使用连接的规则。TCP为HTTP提供了一条可靠的比特传输管道。从TCP连接一端输入的字节信息能够从另一端以原有的顺序、正确地传送出来,也就是我们通常所说的可以报文的完整性和有序性。
那么TCP是如何帮助客户端和服务器端建立连接的呢?
换句话说,客户端如何根据一个URL就能和服务端建立连接并获取所需的资源?
其实TCP流是分段的,由IP分组进行传送。在TCP/IP模型中,HTTP位于应用层,TCP位于传输层,IP位于网络层。HTTPS其实就是在应用层和传输层之间加了一个安全层(通常是TLS和SSL)。
一条TCP连接由<源地址,源端口号,目标地址,目标端口号>4个值组成。两条不同的TCP连接不允许拥有4个相同的地址组件。
TCP的性能
HTTP事务的时延
我们在前面提到过,一个HTTP事务是由一条完整的请求报文和一条完整的响应报文组成。看起来十分简单,但是这个过程中存在很多可能会增加时延的地方。
- 客户端根据URL地址确定服务器的IP地址和服务端口号可能会耗费比较多的时间(主要用于DNS域名解析等)
- 获取到服务器IP地址等信息之后TCP向服务器发送建立连接的请求,并等待服务器回送同意建立连接的应答并建立连接。这里如果有较多的HTTP事务的话,耗费的时间将大大增加
- 连接建立起来之后,客户端通过建立的TCP管道向服务器发送请求报文,并等到服务器回送响应报文,可能会耗费些许时间
TCP可能会导致哪些时延
- TCP的三次握手
- TCP慢启动拥塞机制
- TCP延迟确认算法
- 端口耗尽和TIME_WATE时延
如何减少时延
- 并行连接:通过多条TCP连接发起并发的HTTP请求
- 持久连接:重用TCP连接以消除连接和关闭时延
- 管道化连接:多条HTTP请求共享TCP管道
- 复用的连接:交替传送请求和响应报文(与持久连接有所区别)
代理
什么是代理
Web代理服务器是网络的中间实体。代理位于客户端和服务器之间,扮演的角色有点类似于"中间人",在各个端点之间传送HTTP报文。如果没有Web代理,那么HTTP客户端就要和HTTP服务器直接进行对话。有了Web代理,客户端和服务器之间的通信就要经过代理了。其实对于客户端和服务器来说,信息发送方是透明的。因为它们在接收报文的时候,分不清到底是直接从客户端发过来的还是经过了代理。
所以Web代理服务器既是客户端,也是服务器端。
公共代理和私有代理
其实大部分代理都是公共代理,比如说高速缓存代理服务器,会利用用户间共同的请求。这样的话,汇入同一个代理服务器的请求越多,就越有用。还有一部分是私有代理。搭建私有代理的费用比较昂贵,常见的有某些用户用于翻墙的梯子,有可能是自行搭建的代理服务。
代理的使用途径
- 资源访问控制器:只允许授权用户请求某些资源
- Web防火墙:限制非授权用户进入军事区
- Web缓存代理:代理缓存维护了常用的文档的本地副本,当用户请求对应资源时直接从代理返回而不用请求远程服务器,避免了宽带资源的浪费
- 反向代理(在后面介绍Nginx的时候会着重讲讲反向代理)
- 正向代理:主要用于为局域网用户访问Internet提供便利
其实代理和网关的作用有些类似。只要记住一点:代理和通信双方使用的都是同一种协议,例如在帮助客户端同服务器进行通信时,它和客户端以及服务器之间都是使用HTTP协议。而网关不一样,网关可以进行协议的转换。比如说客户端打算通过FTP协议访问远端服务器,网关可能在和服务器进行通信时是用的是HTTP协议,完成了协议的转换。
缓存
缓存这部分的知识比较多,但是都比较简单、易于理解。
主要的作用代理缓存服务器就是将常用并且不经常的资源缓存下来,在用户向远端服务器请求该资源时将本地缓存的资源提供出去。在此同时,缓存服务器会不定时对本地资源向远程服务器进行新鲜度验证等操作。远程服务器还可以通过某些HTTP首部,例如no-store、no-cache、Expires(使用的实际过期日期,可能由于时间不一致导致某些错误)或者是max-age(服务器告诉缓存资源缓存最大秒数,为零就是不缓存)等告诉缓存某些资源的过期时间或者是给用户提供该资源之前应该进行什么操作---比如新鲜度验证、过期时间预警等。缓存有效地减少了冗余数据的传输、缓解了网络瓶颈的问题、降低了距离时延,同时也降低了对原始服务器的要求。对于缓存来说,命中率是一个比较重要的评价缓存性能的指标。
cookie机制与客户端识别
cookie主要用于客户端向服务器端提供身份说明。例如,客户端和服务器端说:“Hi ! My name is EakonZhao, please give me my shopping list。”那么服务器就会给用户EakonZhao提供其购物清单。cookie可分为会话cookie以及持久cookie。会话cookie在用户退出浏览器的时候就会被清除,而持久cookie则会存在硬盘之中。由于cookie属于比较私密的信息,我们一定要保管好cookie,若是被别人窃取了,可能会对我们的财产或者是信息安全造成威胁。
认证
认证的作用就是确认通信双方身份的真实性。比如说服务器会在客户端请求访问某些访问控制资源的时候要求其提供合法的口令。但是认证机制也存在一些缺陷,例如基本认证简单便捷,但并不安全。因为基本认证机制会通过网络发送用户名和密码,虽然用户名和密码经过了某种编码(例如Base-64编码),但实际上很容易就可以解码。
HTTPS 安全的HTTP
HTTPS和HTTP并不是两种完全分离的协议。HTTPS就是在HTTP外层加了一个保护壳(通常是TLS/SSL),使得外界看不到HTTP传输的信息。其中会涉及到许多加密技术。例如对称加密、非对称加密、公开密钥技术、数字签名或者是数字证书等等。其中各种加密技术主要用于防止信息传输过程中第三方窃取的行为,而数字签名和数字证书等技术用于对通信双方身份的认证,防止和伪造的客户端或者是服务器进行通信。SSL和TLS协议其实十分类似,TLS协议是前者改进之后的版本。TLS也会涉及握手的过程,其中的行为主要是用于约定加密方法、协商各种安全参数,并且对客户端和服务器端进行证书的交换以验明身份等等。总之,HTTPS可以安全地传输信息,不用担心被窃听。(HTTPS涉及了大量的加密算法、密码学以及网络安全相关的知识,这里只做非常简要的介绍)