全栈工程师眼中的HTTP( 三 )


近年来Nginx越来越受到市场的青睐 。在高连接并发的情况下,Nginx是Apache服务器不错的替代品或者补充:一方面是Nginx更加轻量级,占用更少的资源和内存;另一方面是Nginx 处理请求是异步非阻塞的,而Apache 则是阻塞型的,在高并发下Nginx 能保持低资源、低消耗和高性能 。
由于Apache和Nginx各有所长,所以经常的搭配是Nginx处理前端并发,Apache处理后台请求 。
值得一提的是,新秀Node.js也是采用基于事件的异步非阻塞方式处理请求,所以在处理高并发请求上有天然的优势 。
DDoS攻击DDoS是Distributed Denial of Service的缩写,DDoS攻击翻译成中文就是“分布式拒绝服务”攻击 。
简单来说,就是黑客入侵并控制了大量用户的计算机(俗称“肉鸡”),然后在这些计算机上安装了DDoS攻击软件 。我们知道浏览器作为一种“善意”的客户端,限制了HTTP并发连接数 。但是DDoS就没有这样的道德准则,每一个DDoS攻击客户端都可以自由设置TCP/IP并发连接数,并且连接上服务器之后,它不会马上断开连接,而是保持这个连接一段时间,直到同时连接的数量大于最大连接数,才断开之前的连接 。
就这样,攻击者通过海量的请求,让目标服务器瘫痪,无法响应正常的用户请求,以此达到攻击的效果 。
对于这样的攻击,几乎没有什么特别好的防护方法 。除了增加带宽和提高服务器能同时接纳的客户数,另一种方法就是让首页静态化 。DDoS攻击者喜欢攻击的页面一般是会对数据库进行写操作的页面,这样的页面无法静态化,服务器更容易宕机 。DDoS攻击者一般不会攻击静态化的页面或者图片,因为静态资源对服务器压力小,而且能够部署在CDN上 。
这里介绍的只是最简单的TCP/IP攻击,而DDoS是一个概称,具体来说,有各种攻击方式,比如CC攻击、SYN攻击、NTP攻击、TCP攻击和DNS攻击等 。
BigPipe前端跟后端在HTTP上也能有交集,BigPipe就是一个例子 。
现有的HTTP数据请求流程是:客户端建立连接,服务器同意连接,客户端发起请求,服务器返回数据,客户端接受并处理数据 。这个处理流程有两个问题 。

全栈工程师眼中的HTTP

文章插图
 
现有的阻塞模型,黄色代表服务器生成页面,白色代表网络传输,紫色代表浏览器渲染页面 。
第一,HTTP协议的底层是TCP/IP,而TCP/IP规定3次握手才建立一次连接 。每一个新增的请求都要重新建立TCP/IP连接,从而消耗服务器的资源,并且浪费连接时间 。对于几种不同的服务器程序(Apache、Nginx和Node.js等),所消耗的内存和CPU资源也不太一样,但是新的连接无法避免,没有从本质上解决问题 。
第二个问题是,在现有的阻塞模型中,服务器计算生成页面需要时间 。等服务器完全生成好整个页面,才开始网络传输,网络传输也需要时间 。整个页面都完全传输到浏览器中之后,在浏览器中最后渲染还是需要时间 。三者是阻塞式的,每一个环节都在等上一个环节100%完成才开始 。页面作为一个整体,需要完整地经历3个阶段才能出现在浏览器中,效率很低 。
BigPipe是Facebook公司科学家Changhao Jiang发明的一种非阻塞式模型,这种模型能完美解决上面的两个问题 。
通俗来解释,BigPipe首先把HTML页面分为很多部分,然后在服务器和浏览器之间建立一条管道(BigPipe就是“大管道”的意思),HTML的不同部分可以源源不断地从服务器传输到浏览器 。BigPipe首先输送的内容是框架性HTML结构,这个框架结构可能会定义每个Pagelet模块的位置和宽高,但是这些pagelet都是空的,就像只有钢筋混泥土骨架的毛坯房 。
全栈工程师眼中的HTTP

文章插图
 
BigPipe页面的渲染流程 。
服务器传输完框架性HTML结构之后,对浏览器说:“我这个请求还没结束,我们保持这个连接不要断开,不过您可以先用我给您的这部分来渲染 。”
所以浏览器就开始渲染这个“不完整的HTML”,毛坯房页面很快出现在用户眼前,具体的页面模块都显示“正在加载” 。
接下来管道里源源不断地传输过来很多模块,这时候最开始加载在服务器中的JS代码开始工作,它会负责把每一个模块依次渲染到页面上 。
在用户的感知上,页面非常快地出现在眼前,但是所有的模块都显示正在加载中,然后主要的区域(比如重要的用户动态)优先出现,接下来是logo、边栏和各种挂件等 。


推荐阅读