当前位置: 代码迷 >> 综合 >> 【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 八)
  详细解决方案

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 八)

热度:5   发布时间:2024-02-05 21:54:41.0

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 八)

【1】WAF

【1.1】Web 服务遇到的威胁
1. “DDoS”攻击(distributed denial-of-service attack),即“洪水攻击”,黑客会控制许多“僵尸”计算机,向目标服务器发起大量无效请求,因为服务器无法区分正常用户和黑客,只能“照单全收”,这样就挤占了正常用户所应有的资源;如果黑客的攻击强度很大,就会像“洪水”一样对网站的服务能力造成冲击,耗尽带宽、CPU 和内存,导致网站完全无法提供正常服务;
2. ”代码注入“,网站后台的 Web 服务经常会提取出 HTTP 报文里的各种信息,应用于业务,有时会缺乏严格的检查,因为 HTTP 报文在语义结构上非常松散、灵活,URI 里的 query 字符串、头字段、body 数据都可以任意设置,这就带来了安全隐患,给了黑客“代码注入”的可能性;黑客可以精心编制 HTTP 请求报文,发送给服务器,服务程序如果没有做防备,就会“上当受骗”,执行黑客设定的代码;
1) “SQL 注入”(SQL injection)利用了服务器字符串拼接形成 SQL 语句的漏洞,构造出非正常的 SQL 语句,获取数据库内部的敏感信息;
2) “HTTP 头注入”在“Host”“User-Agent”“X-Forwarded-For”等字段里加入了恶意数据或代码,服务端程序如果解析不当,就会执行预设的恶意代码;
3) “跨站脚本”(XSS)攻击,属于“JS 代码注入”,利用 JavaScript 脚本获取未设防的 Cookie;

【1.2】网络应用防火墙(WAF)
WAF 是一种“防火墙”,工作在七层,看到的不仅是 IP 地址和端口号,还能看到整个 HTTP 报文,能够对报文内容做更深入细致的审核,使用更复杂的条件、规则来过滤数据,即 WAF 就是一种“HTTP 入侵检测和防御系统”;

【1.3】WAF 功能
1. IP 黑名单和白名单,拒绝黑名单上地址的访问,或者只允许白名单上的用户访问;
2. URI 黑名单和白名单,与 IP 黑白名单类似,允许或禁止对某些 URI 的访问;
3. 防护 DDoS 攻击,对特定的 IP 地址限连限速;
4. 过滤请求报文,防御“代码注入”攻击;
5. 过滤响应报文,防御敏感信息外泄;
6. 审计日志,记录所有检测到的入侵操作;

【2】CDN

CDN(Content Delivery Network 或 Content Distribution Network),即“内容分发网络”
【2.1】CDN 的负载均衡

两个关键组成部分,全局负载均衡和缓存系统,对应的是 DNS 和缓存代理技术;

1. 全局负载均衡(Global Sever Load Balance)简称为 GSLB,是 CDN 的“大脑”,主要的职责是当用户接入网络的时候在 CDN 专网中挑选出一个“最佳”节点提供服务,解决的是用户如何找到“最近的”边缘节点,对整个 CDN 网络进行“负载均衡”;
GSLB 最常见的实现方式是“DNS 负载均衡”,没有 CDN 的时候,权威 DNS 返回的是网站自己服务器的实际 IP 地址,浏览器收到 DNS 解析结果后直连网站;加入 CDN 后权威 DNS 返回的不是 IP 地址,而是一个 CNAME(Canonical Name) 别名记录,指向的就是 CDN 的 GSLB,由于没拿到 IP 地址,于是本地 DNS 就会向 GSLB 再发起请求,这样就进入了 CDN 的全局负载均衡系统,开始“智能调度”,
主要的依据有:
1). 由用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点;
2). 由用户所在的运营商网络,找相同网络的边缘节点;
3). 检查边缘节点的负载情况,找负载较轻的节点;
4). 根据如节点的“健康状况”、服务能力、带宽、响应时间等;
GSLB 把这些因素综合起来,用一个复杂的算法,最后找出一台“最合适”的边缘节点,把这个节点的 IP 地址返回给用户,用户就可以“就近”访问 CDN 的缓存代理了;

2. CDN 的缓存代理
“命中”就是指用户访问的资源恰好在缓存系统里,可以直接返回给用户;
“回源”指缓存里没有,必须用代理的方式回源站取;
命中率就是命中次数与所有访问次数之比,回源率是回源次数与所有访问次数之比;

提高命中率、降低回源率的方法
1). 在存储系统上下功夫,硬件用高速 CPU、大内存、万兆网卡,再搭配 TB 级别的硬盘和快速的 SSD,软件方面则不断“求新求变”,各种新的存储软件都会拿来尝试,比如 Memcache、Redis、Ceph,尽可能地高效利用存储,存下更多的内容;
2). 缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点;一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户;回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,这样最终“扇入度”就缩小了,可以有效地减少真正的回源;
3). 使用高性能的缓存服务,最常用的是专门的缓存代理软件 Squid、Varnish,还有新兴的 ATS(Apache Traffic Server),而 Nginx 和 OpenResty 作为 Web 服务器领域的“多面手”,凭借着强大的反向代理能力和模块化、易于扩展的优点,也在 CDN 里占据了不少的份额;

【3】WebSocket

“WebSocket”是一种基于 TCP 的轻量级网络通信协议,在地位上是与 HTTP“平级”的,注意“WebSocket”不是一个“调用接口的集合”,而是一个通信协议;
WebSocket 是针对HTTP“请求 - 应答”通信模式的优化,“请求 - 应答”是一种“半双工”的通信模式,虽然可以双向收发数据,但同一时刻只能一个方向上有动作,传输效率低,并且它是一种“被动”通信模式,服务器只能“被动”响应客户端的请求,无法主动向客户端发送数据;

【3.1】WebSocket 的特点
WebSocket 是一个真正“全双工”的通信协议,在服务发现方面,WebSocket 没有使用 TCP 的“IP 地址 + 端口号”的形式,而是延用了 HTTP 的 URI 格式,开头的协议名为“ws”和“wss”,分别表示明文和加密的 WebSocket 协议;
WebSocket 的默认端口为 80 和 443,因为现在互联网上的防火墙屏蔽了绝大多数的端口,只对 HTTP 的 80、443 端口“放行”,所以 WebSocket 就可以“伪装”成 HTTP 协议,比较容易地“穿透”防火墙,与服务器建立连接;

【3.2】WebSocket 的帧结构

开头的两个字节是必须的,也是最关键的;
“FIN”是消息结束的标志位,相当于 HTTP/2 里的“END_STREAM”,表示数据发送完毕,一个消息可以拆成多个帧,接收方看到“FIN”后,就可以把前面的帧拼起来,组成完整的消息;
“FIN”后面的三个位是保留位,目前没有任何意义,但必须是 0;
“Opcode”即操作码,表示帧类型,1 表示帧内容是纯文本,2 表示帧内容是二进制数据,8 是关闭连接,9 和 10 分别是连接保活的 PING 和 PONG;
“MASK”即掩码标志位,表示帧内容是否使用异或操作(xor)做简单的加密,目前的 WebSocket 标准规定,客户端发送数据必须使用掩码,而服务器发送则必须不使用掩码;
“Payload len”,表示帧内容的长度,是另一种变长编码,最少 7 位,最多是 7+64 位,即额外增加 8 个字节,所以一个 WebSocket 帧最大是 2^64;
“Masking-key”即掩码密钥,由标志位“MASK”决定,如果使用掩码就是 4 个字节的随机数,否则就不存在;

【3.3】WebSocket 的握手

【3.3.1】必要的字段
WebSocket 的握手是一个标准的 HTTP GET 请求,但要带上两个协议升级的专用头字段
“Connection: Upgrade”,表示要求协议“升级”;
“Upgrade: websocket”,表示要“升级”成 WebSocket 协议;
为了防止普通的 HTTP 消息被“意外”识别成 WebSocket,添加如下两个字段
Sec-WebSocket-Key,一个 Base64 编码的 16 字节随机数,作为简单的认证密钥;
Sec-WebSocket-Version,协议的版本号,当前必须是 13;

【3.3.2】服务器端处理
服务器收到 HTTP 请求报文,看到上面的四个字段,可知该 GET 请求是 WebSocket 的升级请求,于是构造一个特殊的“101 Switching Protocols”响应报文,通知客户端,接下来就不用 HTTP 了,全改用 WebSocket 协议通信;
为了防止误链接,WebSocket 的握手响应报文使用字段“Sec-WebSocket-Accept”验证客户端请求报文,具体的做法是把请求头里“Sec-WebSocket-Key”的值,加上一个专用的 UUID “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,再计算 SHA-1 摘要;

【3.3.3】客户端处理
客户端收到响应报文,就可以用同样的算法,比对值是否相等,如果相等,就说明返回的报文确实是刚才握手时连接的服务器,认证成功;

参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】透视HTTP协议

  相关解决方案