HTTP协议

HTTP,是Web工程师每天打交道最多的一个基本协议。很多工作流程、性能优化都围绕着HTTP协议进行。

http协议

 http协议

(HyperText Transfer Protocol, HTTP)超文本传输协议是互联网上应用最为广泛的一种网络协议。设计HTTP的最初目的是提供一种发布和接收HTML页面的方法。OSI模型定义了整个世界计算机相互连接的标准,总共分为7层,其中最上层(第7层)也就是应用层,HTTPHTTPSFTPTELNETSSHSMTPPOP3都属于应用层,这也是软件工程师最关心的一层。

HTTP已经演化出了很多版本,它们中的大部分都是向下兼容的。客户端在请求的开始告诉服务器它采用的协议版本号,服务器则在响应中采用相同或者更早的协议版本。当前应用最广泛的版本为1999年发布的HTTP/1.1,比起HTTP/1.0增加了几个重要特性,如缓存处理、持续链接以及其他一些性能优化。20152HTTP/2正式发布,新的版本有了一种重大更新,除了一如既往向下兼容外,还有一些优化,比如减小网络传输延迟,并简化服务器向浏览器传输内容的过程。

通过查看站点的HTTP请求信息,可以得到很多优化信息,前端最基本的优化方法是:尽量减少同一域下的请求数以及尽量减少每一个资源的体积。浏览器常常限定了对同一域名发起的并发连接数的上限。IE6/7firefox2设计规则是同时只能对一个域名发起两个并发连接。新版本的各种浏览器普遍把这一上限设定为4-8个。如果浏览器需要对某个域进行更多的连接,则需要在用完了当前连接之后,重复使用或者重新建立tcp连接。QQ空间的CSS贴图由程序自动生成,保证最佳的图片质量、最合理的图片摆放和最小的体积。由于浏览器针对资源的域名限制并发连接数,而不是针对浏览器地址栏中的页面域名,所以很多静态资源可以放在其他域名下(不同的子域名也被认为是不同的域名)。如果只有一台服务器,可以把这些不同的域名同时指向一个ip,也就提高了对这台服务器的并发连接数限制。

把静态资源放在非主域名下,这种做法除了可以增加浏览器并发,还有一个好处是,减少HTTP请求中携带的不必要的cookie数据(静态资源不需要cookie,头信息中带上了cookie明显对带宽和连接速度都造成了影响)。除此之外,合并同一域名下的资源,比如把多个css合并为一个,多张图组合。还有其他一些优化:如内嵌小型css、js、设置缓存、减少重定向,这些做法虽然各不相同,但是了解HTTP请求过程,这些优化的方法的最终目的都是最大化利用有限的请求数。我们不光要限制请求数,还要尽量减少每一个资源的体积。资源体积越大,在传输中消耗的流量就越多,等待时间也越久(比如选择合适的图片格式就能用更小的体积达到更好的显示效果),对于较大的文本资源,必须开启gzip(对于含有重复“单词”的文本文件压缩率非常高,更能有效提高传输过程)。

后端对于HTTP的关注在于让服务器尽快相应请求,以及减少请求对服务器的开销。浏览器限定对某个域的并发连接数很大程度是浏览器对服务器的一种保护。而一些”恶意“的客户端,比如下载软件,它作为一个HTTP协议客户端,不考虑服务器的压力,而发起大量的并发请求(虽然用户感觉到下载速度很快)。为什么服务器对并发请求数敏感?虽然服务器的多个进程看上去是在同时运行,但对于单核cpu架构来说,实际上是计算机系统同一段时间内,以进程的形式,将多个程序加载到存储器中,并借由时间共享,以在一个处理器上表现出同时运行的感觉。由于在操作系统中,生成进程、销毁进程、进程间切换都很消耗cpu和内存,因此当负载高时,性能会明显降低。在早期系统中(如linux2.4以前)进程是基本运作单位,在支持线程的系统(linux2.6)中,线程才是基本的运作单位,而进程只是线程的容器。线程的开销明显小于进程,而且部分资源还可以共享,因此效率较高。Apache是市场份额最大的web服务器,apache通过模块化的设计来适应各种环境,其中一个模块叫做多处理模块(MPM),unix上默认的MPM是prefork,为了优化可以改成worker。prefork和worker最大区别是,prefork的一个进程维持一个连接,而worker的一个线程维持一个连接。所以prefork更稳定但内存消耗也更大,worker没那么稳定,因为很多连接的线程共享一个进程,当一个线程崩溃的时候,整个进程和所有线程一起死掉。但是worker内存使用要比prefork低的多,所以很适合用在高HTTP请求的服务器上。另外apache处理请求是阻塞的,nginx是异步非阻塞的。BigPipe首先把html页面分成很多部分,然后在服务器和浏览器之间建立一条管道,HTML不同部分可以源源不断从服务器传输到浏览器。HTTP1.1引入分块传输编码,允许服务器为动态生成的内容维持HTTP持久连接,如果一个HTTP消息的Transfer-Encoding消息头的值为chunked,那么消息体数量由不确定的块组成,也就是说想发送多少块都可以,并以最后一个大小为0的块结束,BigPipe首先输送的内容是框架性HTML结构。

评论

目前评论:0   

点击加载更多评