扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
服务器流量攻击怎么防御?服务器是为网络提供计算服务的设备,∞在企业网站中起着重要的作用。所以平时一定要注重对服务器安全问题。如何防范服务器被攻击呢?
成都创新互联是网站建设专家,致力于互联网品牌建设与网络营销,专业领域包括成都网站建设、网站建设、电商网站制作开发、微信小程序开发、微信营销、系统平台开发,与其他网站设计及系统开发公司不同,我们的整合解决方案结合了恒基网络品牌建设经验和互联网整合营销的理念,并将策略和执行紧密结合,且不断评估并优化我们的方案,为客户提供全方位的互联网品牌整合方案!
服务器被攻击的常见方式有两种:一种是CC,一种是ddos。如果是CC攻击方式,机房技术会根据攻击的类型及时调整策略,CDN的服务在策略上可以先过一层,有效针对CC攻击。
如果是DDOS,必须要机房有硬防才可以防御,这个必须需要带宽充足才可以解决的,同时CDN进行分流和清洗等。对于服务器被攻击并不是不可防范的,用户在使用服务器之前,锐速云可以通过一些简单的措施来提升服务器的安全。
1、服务器租用一定要把administrator禁用;禁止响应ICMP路由通告报文;禁用服务里的Workstation。
2、主机租用系统升级、打操作系统补丁,尤其是IIS6.0补丁、SQL SP3a补丁,甚至IE6.0补丁也要打,同时及时跟踪最新漏洞补丁。
3、启动系统自带的Internet连接防火墙,在设置服务选项中勾选Web服务器;阻止IUSR用户提升权限;防止SQL注入。
做好服务器的ddos防御措施,以防为主被攻击还是很有必要的。若是黑客或者竞争对手要一直盯着你的服务器或者网站,经常性的进行一些攻击,那也是一件很要命的事情。
酷酷云服务器为您诚意解答,服务器租户的选择,酷酷云值得信赖。
服务器安全一般都是采用软件辅助+手工服务的安全设置,有钱人都是买好几W的硬件来做服务器安全。但是对于我一个小小的站长,哪能承受的了。一年的服务器托管才5000多,建议你找专业做服务器安全的公司或者团队,来给你做服务器安全维护。
安全这问题,很重要,我上次就是为了省钱,在网上搜索了一些服务器安全设置的文章,对着文章,我一个一个的设置起来,费了好几天的时间才设置完,没想到,服务器竟然瘫痪了,网站都打不开了,也最终明白了,免费的东西,也是最贵的,损失真的很大,数据库都给我回档了,我哪个后悔啊。娘个咪的。最后还是让机房把系统重装了,然后找的sine安全公司给做的网站服务器安全维护。跟他们还签了合同,真的是一份价格一份服务,专业的服务 安全非常稳定。也只有网站安全了,才能带来安全稳定的客户源。道理也是经历了才明白。说了这么多经历,希望能帮到更多和我一样的网站站长。
下面是关于安全方面的解决办法!
建站一段时间后总能听得到什么什么网站被挂马,什么网站被黑。好像入侵挂马似乎是件很简单的事情。其实,入侵不简单,简单的是你的网站的必要安全措施并未做好。
有条件建议找专业做网站安全的sine安全来做安全维护。
一:挂马预防措施:
1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。
2、定期对网站进行安全的检测,具体可以利用网上一些工具,如sinesafe网站挂马检测工具!
3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。
4、到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性。
5、要尽量保持程序是最新版本。
6、不要在网页上加注后台管理程序登陆页面的链接。
7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过ftp上传即可。
8、要时常备份数据库等重要文件。
9、日常要多维护,并注意空间中是否有来历不明的asp文件。记住:一分汗水,换一分安全!
10、一旦发现被入侵,除非自己能识别出所有木马文件,否则要删除所有文件。
11、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。这其中包括各种新闻发布、商城及论坛。
二:挂马恢复措施:
1.修改帐号密码
不管是商业或不是,初始密码多半都是admin。因此你接到网站程序第一件事情就是“修改帐号密码”。
帐号密码就不要在使用以前你习惯的,换点特别的。尽量将字母数字及符号一起。此外密码最好超过15位。尚若你使用SQL的话应该使用特别点的帐号密码,不要在使用什么什么admin之类,否则很容易被入侵。
2.创建一个robots.txt
Robots能够有效的防范利用搜索引擎窃取信息的骇客。
3.修改后台文件
第一步:修改后台里的验证文件的名称。
第二步:修改conn.asp,防止非法下载,也可对数据库加密后在修改conn.asp。
第三步:修改ACESS数据库名称,越复杂越好,可以的话将数据所在目录的换一下。
4.限制登陆后台IP
此方法是最有效的,每位虚拟主机用户应该都有个功能。你的IP不固定的话就麻烦点每次改一下咯,安全第一嘛。
5.自定义404页面及自定义传送ASP错误信息
404能够让骇客批量查找你的后台一些重要文件及检查网页是否存在注入漏洞。
ASP错误嘛,可能会向不明来意者传送对方想要的信息。
6.慎重选择网站程序
注意一下网站程序是否本身存在漏洞,好坏你我心里该有把秤。
7.谨慎上传漏洞
据悉,上传漏洞往往是最简单也是最严重的,能够让黑客或骇客们轻松控制你的网站。
可以禁止上传或着限制上传的文件类型。不懂的话可以找专业做网站安全的sinesafe公司。
8. cookie 保护
登陆时尽量不要去访问其他站点,以防止 cookie 泄密。切记退出时要点退出在关闭所有浏览器。
9.目录权限
请管理员设置好一些重要的目录权限,防止非正常的访问。如不要给上传目录执行脚本权限及不要给非上传目录给于写入权。
10.自我测试
如今在网上黑客工具一箩筐,不防找一些来测试下你的网站是否OK。
11.例行维护
a.定期备份数据。最好每日备份一次,下载了备份文件后应该及时删除主机上的备份文件。
b.定期更改数据库的名字及管理员帐密。
c.借WEB或FTP管理,查看所有目录体积,最后修改时间以及文件数,检查是文件是否有异常,以及查看是否有异常的账号。
网站被挂马一般都是网站程序存在漏洞或者服务器安全性能不达标被不法黑客入侵攻击而挂马的。
网站被挂马是普遍存在现象然而也是每一个网站运营者的心腹之患。
您是否因为网站和服务器天天被入侵挂马等问题也曾有过想放弃的想法呢,您否也因为不太了解网站技术的问题而耽误了网站的运营,您是否也因为精心运营的网站反反复复被一些无聊的黑客入侵挂马感到徬彷且很无耐。有条件建议找专业做网站安全的sine安全来做安全维护。
维基百科关于 HTTP/2 的介绍,可以看下定义和发展历史:
Wiki
RFC 7540 定义了 HTTP/2 的协议规范和细节,本文的细节主要来自此文档,建议先看一遍本文,再回过头来照着协议大致过一遍 RFC,如果想深入某些细节再仔细翻看 RFC
RFC7540
1、 TCP 连接数限制
对于同一个域名,浏览器最多只能同时创建 6~8 个 TCP 连接 (不同浏览器不一样)。为了解决数量限制,出现了 域名分片 技术,其实就是资源分域,将资源放在不同域名下 (比如二级子域名下),这样就可以针对不同域名创建连接并请求,以一种讨巧的方式突破限制,但是滥用此技术也会造成很多问题,比如每个 TCP 连接本身需要经过 DNS 查询、三步握手、慢启动等,还占用额外的 CPU 和内存,对于服务器来说过多连接也容易造成网络拥挤、交通阻塞等,对于移动端来说问题更明显,可以参考这篇文章: Why Domain Sharding is Bad News for Mobile Performance and Users
在图中可以看到新建了六个 TCP 连接,每次新建连接 DNS 解析需要时间(几 ms 到几百 ms 不等)、TCP 慢启动也需要时间、TLS 握手又要时间,而且后续请求都要等待队列调度
2、 线头阻塞 (Head Of Line Blocking) 问题
每个 TCP 连接同时只能处理一个请求 - 响应,浏览器按 FIFO 原则处理请求,如果上一个响应没返回,后续请求 - 响应都会受阻。为了解决此问题,出现了 管线化 - pipelining 技术,但是管线化存在诸多问题,比如第一个响应慢还是会阻塞后续响应、服务器为了按序返回相应需要缓存多个响应占用更多资源、浏览器中途断连重试服务器可能得重新处理多个请求、还有必须客户端 - 代理 - 服务器都支持管线化
3、Header 内容多,而且每次请求 Header 不会变化太多,没有相应的压缩传输优化方案
4、为了尽可能减少请求数,需要做合并文件、雪碧图、资源内联等优化工作,但是这无疑造成了单个请求内容变大延迟变高的问题,且内嵌的资源不能有效地使用缓存机制
5、明文传输不安全
帧是数据传输的最小单位,以二进制传输代替原本的明文传输,原本的报文消息被划分为更小的数据帧:
h1 和 h2 的报文对比:
图中 h2 的报文是重组解析过后的,可以发现一些头字段发生了变化,而且所有头字段均小写
关于帧详见: How does it work ?- 帧
在一个 TCP 连接上,我们可以向对方不断发送帧,每帧的 stream identifier 的标明这一帧属于哪个流,然后在对方接收时,根据 stream identifier 拼接每个流的所有帧组成一整块数据。
把 HTTP/1.1 每个请求都当作一个流,那么多个请求变成多个流,请求响应数据分成多个帧,不同流中的帧交错地发送给对方,这就是 HTTP/2 中的多路复用。
流的概念实现了单连接上多请求 - 响应并行,解决了线头阻塞的问题,减少了 TCP 连接数量和 TCP 连接慢启动造成的问题
所以 http2 对于同一域名只需要创建一个连接,而不是像 http/1.1 那样创建 6~8 个连接:
关于流详见: How does it work ?- 流
浏览器发送一个请求,服务器主动向浏览器推送与这个请求相关的资源,这样浏览器就不用发起后续请求。
Server-Push 主要是针对资源内联做出的优化,相较于 http/1.1 资源内联的优势:
关于服务端推送详见: How does it work ?- Server-Push
使用 HPACK 算法来压缩首部内容
关于 HPACK 详见: How does it work ?- HPACK
对于 HTTP/1 来说,是通过设置 tcp segment 里的 reset flag 来通知对端关闭连接的。这种方式会直接断开连接,下次再发请求就必须重新建立连接。HTTP/2 引入 RST_STREAM 类型的 frame,可以在不断开连接的前提下取消某个 request 的 stream,表现更好。
HTTP/2 里的每个 stream 都可以设置依赖 (Dependency) 和权重,可以按依赖树分配优先级,解决了关键请求被阻塞的问题
每个 http2 流都拥有自己的公示的流量窗口,它可以限制另一端发送数据。对于每个流来说,两端都必须告诉对方自己还有足够的空间来处理新的数据,而在该窗口被扩大前,另一端只被允许发送这么多数据。
关于流量控制详见: How does it work ?- 流量控制
合并文件、内联资源、雪碧图、域名分片对于 HTTP/2 来说是不必要的,使用 h2 尽可能将资源细粒化,文件分解地尽可能散,不用担心请求数多
所有帧都是一个固定的 9 字节头部 (payload 之前) 跟一个指定长度的负载 (payload):
共分为十种类型的帧:
DATA 帧有如下标识 (flags):
例子:
HEADERS 帧有以下标识 (flags):
例子:
HTTP/2 里的首部字段也是一个键具有一个或多个值。这些首部字段用于 HTTP 请求和响应消息,也用于服务端推送操作。
首部列表 (Header List) 是零个或多个首部字段 (Header Field) 的集合。当通过连接传送时,首部列表通过压缩算法(即下文 HPACK) 序列化成首部块 (Header Block)。然后,序列化的首部块又被划分成一个或多个叫做首部块片段 (Header Block Fragment) 的字节序列,并通过 HEADERS、PUSH_PROMISE,或者 CONTINUATION 帧进行有效负载传送。
一个完整的首部块有两种可能
必须将首部块作为连续的帧序列传送,不能插入任何其他类型或其他流的帧。尾帧设置 END_HEADERS 标识代表首部块结束,这让首部块在逻辑上等价于一个单独的帧。接收端连接片段重组首部块,然后解压首部块重建首部列表。
一个 SETTINGS 帧的 payload 由零个或多个参数组成,每个参数的形式如下:
在建立连接开始时双方都要发送 SETTINGS 帧以表明自己期许对方应做的配置,对方接收后同意配置参数便返回带有 ACK 标识的空 SETTINGS 帧表示确认,而且连接后任意时刻任意一方也都可能再发送 SETTINGS 帧调整,SETTINGS 帧中的参数会被最新接收到的参数覆盖
SETTINGS 帧作用于整个连接,而不是某个流,而且 SETTINGS 帧的 stream identifier 必须是 0x0,否则接收方会认为错误 (PROTOCOL_ERROR)。
SETTINGS 帧包含以下参数:
SETTINGS 帧有以下标识 (flags):
例子:
实际抓包会发现 HTTP2 请求创建连接发送 SETTINGS 帧初始化前还有一个 Magic 帧 (建立 HTTP/2 请求的前言)。
在 HTTP/2 中,要求两端都要发送一个连接前言,作为对所使用协议的最终确认,并确定 HTTP/2 连接的初始设置,客户端和服务端各自发送不同的连接前言。
客户端的前言内容 (对应上图中编号 23 的帧) 包含一个内容为 PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n 的序列加上一个可以为空的 SETTINGS 帧,在收到 101(Switching Protocols) 响应 (代表 upgrade 成功) 后发送,或者作为 TLS 连接的第一个传输的应用数据。如果在预先知道服务端支持 HTTP/2 的情况下启用 HTTP/2 连接,客户端连接前言在连接建立时发送。
服务端的前言 (对应上图中编号 26 的帧) 包含一个可以为空的 SETTINGS 帧,在建立 HTTP/2 连接后作为第一帧发送。详见 HTTP/2 Connection Preface
发送完前言后双方都得向对方发送带有 ACK 标识的 SETTINGS 帧表示确认,对应上图中编号 29 和 31 的帧。
请求站点的全部帧序列,帧后面的数字代表所属流的 id,最后以 GOAWAY 帧关闭连接:
GOAWAY 帧带有最大的那个流标识符 (比如图中第 29 帧是最大流),对于发送方来说会继续处理完不大于此数字的流,然后再真正关闭连接
流只是一个逻辑上的概念,代表 HTTP/2 连接中在客户端和服务器之间交换的独立双向帧序列,每个帧的 Stream Identifier 字段指明了它属于哪个流。
流有以下特性:
所有流以“空闲”状态开始。在这种状态下,没有任何帧的交换
其状态转换:
此状态下接收到 HEADERS 和 PRIORITY 以外的帧被视为 PROTOCOL_ERROR
状态图中 send PP 和 recv PP 是指连接的双方端点发送或接收了 PUSH_PROMISE,不是指某个空闲流发送或接收了 PUSH_PROMISE,是 PUSH_PROMISE 的出现促使一个预示的流从 idle 状态转为 reserved
PUSH_PROMISE 预示的流由 idle 状态进入此状态,代表准备进行 Server push
其状态转换:
reserved(local) 状态下的流不能发送 HEADERS、RST_STREAM、PRIORITY 以外的帧,接收到 RST_STREAM、PRIORITY、WINDOW_UPDATE 以外的帧被视为 PROTOCOL_ERROR
reserved(remote) 状态下的流不能发送 RST_STREAM、WINDOW_UPDATE、PRIORITY 以外的帧,接收到 HEADERS、RST_STREAM、PRIORITY 以外的帧被视为 PROTOCOL_ERROR
处于 open 状态的流可以被两个对端用来发送任何类型的帧
其状态转换:
流是双向的,半关闭表示这个流单向关闭了,local 代表本端到对端的方向关闭了,remote 代表对端到本端的方向关闭了
此状态下的流不能发送 WINDOW_UPDATE、PRIORITY、RST_STREAM 以外的帧
当此状态下的流收到带有 END_STREAM 标识的帧或者任一方发送 RST_STREAM 帧,会转为 closed 状态
此状态下的流收到的 PRIORITY 帧用以调整流的依赖关系顺序,可以看下文的流优先级
此状态下的流不会被对端用于发送帧,执行流量控制的端点不再有义务维护接收方的流控制窗口。
一个端点在此状态的流上接收到 WINDOW_UPDATE、PRIORITY、RST_STREAM 以外的帧,应该响应一个 STREAM_CLOSED 流错误
此状态下的流可以被端点用于发送任意类型的帧,且此状态下该端点仍会观察流级别的流控制的限制
当此状态下的流发送带有 END_STREAM 标识的帧或者任一方发送 RST_STREAM 帧,会转为 closed 状态
代表流已关闭
此状态下的流不能发送 PRIORITY 以外的帧,发送 PRIORITY 帧是调整那些依赖这个已关闭的流的流优先级,端点都应该处理 PRIORITY 帧,尽管如果该流从依赖关系树中移除了也可以忽略优先级帧
此状态下在收到带有 END_STREAM 标识的 DATA 或 HEADERS 帧后的一小段时间内 (period) 仍可能接收到 WINDOW_UPDATE 或 RST_STREAM 帧,因为在远程对端接收并处理 RST_STREAM 或带有 END_STREAM 标志的帧之前,它可能会发送这些类型的帧。但是端点必须忽略接收到的 WINDOW_UPDATE 或 RST_STREAM
如果一个流发送了 RST_STREAM 帧后转入此状态,而对端接收到 RST_STREAM 帧时可能已经发送了或者处在发送队列中,这些帧是不可撤销的,发送 RST_STREAM 帧的端点必须忽略这些帧。
一个端点可以限制 period 的长短,在 period 内接受的帧会忽略,超出 period 的帧被视为错误。
一个端点发送了 RST_STREAM 帧后接收到流控制帧(比如 DATA),仍会计入流量窗口,即使这些帧会被忽略,因为对端肯定是在接收到 RST_STREAM 帧前发送的流控制帧,对端会认为流控制已生效
一个端点可能会在发送了 RST_STREAM 帧后收到 PUSH_PROMISE 帧,即便预示的流已经被重置 (reset),PUSH_PROMISE 帧也能使预示流变成 reserved 状态。因此,需要 RST_STREAM 来关闭一个不想要的预示流。
下面看两个例子来理解流状态:
(1)、Server 在 Client 发起的一个流上发送 PUSH_PROMISE 帧,其 Promised Stream ID 指定一个预示流用于后续推送,send PP 后这个预示流在服务端从 idle 状态转为 reserve(local) 状态,客户端 recv PP 后这个流从 idle 状态转为 reserve(remote) 状态
(2)(3)、此时预示流处于保留状态,客户端如果选择拒绝接受推送,可以发送 RST 帧关闭这个流;服务端如果此时出问题了也可以发送 RST 帧取消推送。不管哪一方发送或接收到 RST,此状态都转为 closed
(4)、没有出现重置说明推送仍有效,则服务端开始推送,首先发送的肯定是响应的 HEADERS 首部块,此时流状态转为半关闭 half-closed(remote);客户端接收到 HEADERS 后流状态转为半关闭 half-closed(local)
(5)(6)、半关闭状态下的流应该还会继续推送诸如 DATA 帧、CONTINUATION 帧这样的数据帧,如果这个过程碰到任一方发起重置,则流会关闭进入 closed 状态
(7)、如果一切顺利,资源随着数据帧响应完毕,最后一帧会带上 END_STREAM 标识代表这个流结束了,此时流转为 closed 状态
(1)、客户端发起请求,首先发送一个 HEADERS 帧,其 Stream Identifier 创建一个新流,此流从 idle 状态转为 open 状态
(2)(3)、如果客户端取消请求可以发送 RST 帧,服务端出错也可以发送 RST 帧,不管哪一方接收或发送 RST,流关闭进入 closed 状态;
(4)、如果请求结束(END_STREAM),流转为半关闭状态。假如是 GET 请求,一般 HEADERS 帧就是最后一帧,send H 后流会立即进入半关闭状态。假如是 POST 请求,待数据传完,最后一帧带上 END_STREAM 标识,流转为半关闭
(5)(6)、客户端半关闭后服务端开始返回响应,此时任一方接收或发送 RST,流关闭;
(7)、如果一切顺利,等待响应结束(END_STREAM),流关闭
流 ID 是 31 位无符号整数,客户端发起的流必须是奇数,服务端发起的流必须是偶数,0x0 保留为连接控制消息不能用于建立新流。
HTTP/1.1 Upgrade to HTTP/2 时响应的流 ID 是 0x1,在升级完成之后,流 0x1 在客户端会转为 half-closed (local) 状态,因此这种情况下客户端不能用 0x1 初始化一个流
新建立的流的 ID 必须大于所有已使用过的数字,接收到一个错误大小的 ID 应该返回 PROTOCOL_ERROR 响应
使用一个新流时隐式地关闭了对端发起的 ID 小于当前流的且处于 idle 状态的流,比如一个流发送一个 HEADERS 帧打开了 ID 为 7 的流,但还从未向 ID 为 5 的流发送过帧,则流 0x5 会在 0x7 发送完或接收完第一帧后转为 closed 状态
一个连接内的流 ID 不能重用
客户端可以通过 HEADERS 帧的 PRIORITY 信息指定一个新建立流的优先级,其他期间也可以发送 PRIORITY 帧调整流优先级
设置优先级的目的是为了让端点表达它所期望对端在并发的多个流之间如何分配资源的行为。更重要的是,当发送容量有限时,可以使用优先级来选择用于发送帧的流。
流可以被标记为依赖其他流,所依赖的流完成后再处理当前流。每个依赖 (dependency) 后都跟着一个权重 (weight),这一数字是用来确定依赖于相同的流的可分配可用资源的相对比例
每个流都可以显示地依赖另一个流,包含依赖关系表示优先将资源分配给指定的流(上层节点)而不是依赖流
一个不依赖于其他流的流会指定 stream dependency 为 0x0 值,因为不存在的 0x0 流代表依赖树的根
一个依赖于其他流的流叫做 依赖流 ,被依赖的流是当前流的父级。如果被依赖的流不在当前依赖树中(比如状态为 idle 的流),被依赖的流会使用一个默认优先级
当依赖一个流时,该流会添加进父级的依赖关系中,共享相同父级的依赖流不会相对于彼此进行排序,比如 B 和 C 依赖 A,新添加一个依赖流 D,BCD 的顺序是不固定的:
独占标识 (exclusive) 允许插入一个新层级(新的依赖关系),独占标识导致该流成为父级的唯一依赖流,而其他依赖流变为其子级,比如同样插入一个新依赖流 E (带有 exclusive):
在依赖关系树中,只有当一个依赖流所依赖的所有流(父级最高为 0x0 的链)被关闭或者无法继续在上面执行,这个依赖流才应该被分配资源
所有依赖流都会分配一个 1~256 权重值
相同父级的依赖流按权重比例分配资源,比如流 B 依赖于 A 且权重值为 4,流 C 依赖于 A 且权重值为 12,当 A 不再执行时,B 理论上能分配的资源只有 C 的三分之一
使用 PRIORITY 帧可以调整流优先级
PRIORITY 帧内容与 HEADERS 帧的优先级模块相同:
看下面这个例子: 第一个图是初始关系树,现在 A 要调整为依赖 D,根据第二点,现将 D 移至 x 之下,再把 A 调整为 D 的子树(图 3),如果 A 调整时带有独占标识根据第一点 F 也归为 A 子级(图 4)
当一个流从依赖树中移除,它的子级可以调整为依赖被关闭流的父级(应该就是连接上一层节点),新的依赖权重将根据关闭流的权重以及流自身的权重重新计算。
从依赖树中移除流会导致某些优先级信息丢失。资源在具有相同父级的流之间共享,这意味着如果这个集合中的某个流关闭或者阻塞,任何空闲容量将分配给最近的相邻流。然而,如果此集合的共有依赖(即父级节点)从树中移除,这些子流将与更上一层的流共享资源
一个例子: 流 A 和流 B 依赖相同父级节点,而流 C 和流 D 都依赖 A,在移除流 A 之前的一段时间内,A 和 D 都无法执行(可能任务阻塞了),则 C 会分配到 A 的所有资源;
如果 A 被移除出树了,A 的权重按比重新计算分配给 C 和 D,此时 D 仍旧阻塞,C 分配的资源相较之前变少了。对于同等的初始权重,C 获取到的可用资源是三分之一而不是二分之一(为什么是三分之一?文档中没有说明细节,权重如何重新分配也不太清楚,下面是按我的理解解释的)
X 的资源为 1,ABCD 初始权重均为 16,*号代表节点当前不可用,图一中 C 和 B 各占一半资源,而 A 移除后 CD 的权重重新分配变为 8,所以图二中 C 和 B 占比变为 1:2,R(C) 变为 1/3
可能向一个流创建依赖关系的优先级信息还在传输中,那个流就已经关闭了。如果一个依赖流的依赖指向没有相关优先级信息(即父节点无效),则这个依赖流会分配默认优先级,这可能会造成不理想的优先级,因为给流分配了不在预期的优先级。
为了避免上述问题,一个端点应该在流关闭后的一段时间内保留流的优先级调整状态信息,此状态保留时间越长,流被分配错误的或者默认的优先级可能性越低。
类似地,处于“空闲”状态的流可以被分配优先级或成为其他流的父节点。这允许在依赖关系树中创建分组节点,从而实现更灵活的优先级表达式。空闲流以默认优先级开始
流优先级状态信息的保留可能增加终端的负担,因此这种状态可以被限制。终端可能根据负荷来决定保留的额外的状态的数目;在高负荷下,可以丢弃额外的优先级状态来限制资源的任务。在极端情况下,终端甚至可以丢弃激活或者保留状态流的优先级信息。如果使用了固定的限制,终端应当至少保留跟 SETTINGS_MAX_CONCURRENT_STREAMS 设置一样大小的流状态
所有流都是初始为非独占地依赖于流 0x0。
Pushed 流初始依赖于相关的流(见 Server-Push)。
以上两种情况,流的权重都指定为 16。
PUSH_PROMISE 帧有以下标识 (flags):
结合上文关于 Server-Push 的流状态转换
PUSH_PROMISE 帧只能在对端(客户端)发起的且流状态为 open 或者 half-closed (remote) 的流上发送
PUSH_PROMISE 帧准备推送的响应总是和来自于客户端的请求相关联。服务端在该请求所在的流上发送 PUSH_PROMISE 帧。PUSH_PROMISE 帧包含一个 Promised Stream ID,该流标识符是从服务端可用的流标识符里选出来的。
如果服务端收到了一个对文档的请求,该文档包含内嵌的指向多个图片文件的链接,且服务端选择向客户端推送那些额外的图片,那么在发送包含图片链接的 DATA 帧之前发送 PUSH_PROMISE 帧可以确保客户端在发现内嵌的链接之前,能够知道有一个资源将要被推送过来。同样地,如果服务端准备推送被首部块引用的响应 (比如,在 Link 首部字段 里的),在发送首部块之前发送一个 PUSH_PROMISE 帧,可以确保客户端不再请求那些资源
一旦客户端收到了 PUSH_PROMISE 帧,并选择接收被推送的响应,客户端就不应该为准备推送的响应发起任何请求,直到预示的流被关闭以后。
不管出于什么原因,如果客户端决定不再从服务端接收准备推送的响应,或者如果服务端花费了太长时间准备发送被预示的响应,客户端可以发送一个 RST_STREAM 帧,该帧可以使用 CANCEL 或者 REFUSED_STEAM 码,并引用被推送的流标识符。
以 nginx 为例,从版本 1.13.9 开始正式支持 hppt2 serverpush 功能,
在相应 server 或 location 模块中加入 http2_push 字段加上相对路径的文件即可在请求该资源时推送相关资源,比如我的博客设置如下,访问首页时有四个文件会由服务器主动推送过去而不需要客户端请求:
通过浏览器控制台可以查看 Push 响应:
也可以用 nghttp 测试 push 响应 (* 号代表是服务端推送的):
上面 http2_push 的设置适合静态资源,服务端事先知道哪些文件是客户端需要的,然后选择性推送
假如是后台应用动态生成的文件(比如 json 文件),服务器事先不知道要推送什么,可以用 Link 响应头来做自动推送
在 server 模块中添加 http2_push_preload on;
然后设置响应头 (add_header) 或者后台程序生成数据文件返回时带上响应头 Link 标签,比如
nginx 会根据 Link 响应头主动推送这些资源
更多nginx 官方介绍见 Introducing HTTP/2 Server Push with NGINX 1.13.9
看了这篇文章 HTTP/2 中的 Server Push 讨论 ,发现 Server-Push 有个潜在的问题
Server-Push 满足条件时便会发起推送,可是客户端已经有缓存了想发送 RST 拒收,而服务器在收到 RST 之前已经推送资源了,虽然这部分推送无效但是肯定会占用带宽
比如我上面博客关于 http2_push 的配置,我每次打开首页服务器都会推送那四个文件,而实际上浏览器知道自己有缓存使用的也是本地缓存,也就是说本地缓存未失效的期间内,服务器的 Server-Push 只是起到了占用带宽的作用
当然实际上对我的小站点来说影响并不大,但是如果网站需要大量推送的话,需要考虑并测试 Server-Push 是否会影响用户的后续访问
另外服
技术在近年来获得前所未有的增长。云技术如今已被运用到银行、学校、政府以及大量的商业组织。但是云计算也并非万能的,和其他IT部署架构一样存在某些难以弥补的缺陷。例如公有云典型代表:服务器,用户数据存储在云计算基础平台的存储系统中,但敏感的信息和应用程序同样面临着网络攻击和黑客入侵的威胁。以下就是壹基比小喻要讲的服务器面临的九大安全威胁。
哪些因素会对服务器安全有危害?
一、数据漏洞
云环境面临着许多和传统企业网络相同的安全威胁,但由于极大量的数据被储存在服务器上,服务器供应商则很可能成为盗取数据的目标。供应商通常会部署安全控件来保护其环境,但最终还需要企业自己来负责保护云中的数据。公司可能会面临:诉讼、犯罪指控、调查和商业损失。
二、密码和证书
数据漏洞和其他攻击通常来源于不严格的认证、较弱的口令和密钥或者证书管理。企业应当权衡集中身份的便利性和使储存地点变成攻击者首要目标的风险性。使用服务器,建议采用多种形式的认证,例如:一次性密码、手机认证和智能卡保护。
三、界面和API的入侵
IT团队使用界面和API来管理和与服务器互动,包括云的供应、管理、编制和监管。API和界面是系统中最暴露在外的一部分,因为它们通常可以通过开放的互联网进入。服务器供应商,应做好安全方面的编码检查和严格的进入检测。运用API安全成分,例如:认证、进入控制和活动监管。
四、已开发的系统的脆弱性
企业和其他企业之间共享经验、数据库和其他一些资源,形成了新的攻击对象。幸运的是,对系统脆弱性的攻击可以通过使用“基本IT过程”来减轻。尽快添加补丁——进行紧急补丁的变化控制过程保证了补救措施可以被正确记录,并被技术团队复查。容易被攻击的目标:可开发的bug和系统脆弱性。
五、账户劫持
钓鱼网站、诈骗和软件开发仍旧在肆虐,服务器又使威胁上升了新的层次,因为攻击者一旦成功**、操控业务以及篡改数据,将造成严重后果。因此所有云服务器的管理账户,甚至是服务账户,都应该形成严格监管,这样每一笔交易都可以追踪到一个所有者。关键点在于保护账户绑定的安全认证不被窃取。有效的攻击载体:钓鱼网站、诈骗、软件开发。
六、居心叵测的内部人员
内部人员的威胁来自诸多方面:现任或前员工、系统管理者、承包商或者是商业伙伴。恶意的来源十分广泛,包括窃取数据和报复。单一的依靠服务器供应商来保证安全的系统,例如加密,是最为危险的。有效的日志、监管和审查管理者的活动十分重要。企业必须最小化暴露在外的访问:加密过程和密钥、最小化访问。
七、APT病毒
APT通过渗透服务器中的系统来建立立足点,然后在很长的一段时间内悄悄地窃取数据和知识产权。IT部门必须及时了解最新的高级攻击,针对服务器部署相关保护策略(ID:ydotpub)。此外,经常地强化通知程序来警示用户,可以减少被APT的迷惑使之进入。进入的常见方式:鱼叉式网络钓鱼、直接攻击、USB驱动。
八、永久性的数据丢失
关于供应商出错导致的永久性数据丢失的报告已经鲜少出现。但居心叵测的黑客仍会采用永久删除云数据的方式来伤害企业和云数据中心。遵循政策中通常规定了企必须保留多久的审计记录及其他文件。丢失这些数据会导致严重的监管后果。建议云服务器供应商分散数据和应用程序来加强保护:每日备份、线下储存。
九、共享引发潜在危机
共享技术的脆弱性为服务器带来了很大的威胁。服务器供应商共享基础设施、平台以及应用程序,如果脆弱性出现在任何一层内,就会影响所有。如果一个整体的部分被损坏——例如管理程序、共享的平台部分或者应用程序——就会将整个环境暴露在潜在的威胁和漏洞下
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流