IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 极客HTTP协议学习笔记探索篇(34-38) -> 正文阅读

[网络协议]极客HTTP协议学习笔记探索篇(34-38)

34、Nginx:高性能的Web服务器

  • Nginx作为一个Web服务器,功能非常完善,完美支持HTTP/1,HTTPS,HTTP/2,主线版本已经发展到1.17,正在进行HTTP/3的研发。
    进程池
  • Nginx是一个轻量级的Web服务器,轻量是相对于重量而言的,“重量级”就是指服务器进程很重,占用很多资源,当处理HTTP请求时会消耗大量CPU和内存,受到资源的限制很难提高性能
    在这里插入图片描述
  • 在Nginx之前,Web服务器的工作模式大多是每一个请求使用单独进程或线程处理,这样就会有进程或线程创建成本,以及进程线程上下文切换的开销,而Nginx则是使用了“进程池+单线程”的工作模式
    I/O 多路复用
  • Nginx利用了Linux内核里的I/O多路复用接口,epoll,Web服务器从根本上来说是“I/O”密集型,处理能力关键在于网络收发,而网络I/O会因为各式各样的原因不得不等待,比如数据未到达,对端无响应,缓存区满发布出去等。
  • Nginx把多个HTTP请求处理打散成碎片,都“复用”到一个单线程里,不按先来后到顺序处理,而只当连接上真正可读,可写的时候才处理,如果可能阻塞就立刻切换出去处理其他请求,这样就能消除I/O阻塞,高效率利用CPU,又因为网络收发并不会消耗太多CPU计算能力,也不需要切换进程,所以整体CPU负载是相当低的。
    在这里插入图片描述
    多阶段处理
  • Nginx在内部把整个Web服务器分解成了多个“功能模块”,可以在配置文件任意拼接,从而实现高度的灵活和扩展性。
  • 四大模块:
  1. handler:直接处理HTTP请求
  2. filter:不直接处理请求,加工过滤响应报文
  3. upstream:实现反向代理,转发请求到其它服务器
  4. balance:实现反向代理的负载均衡算法

35、OpenResty:更灵活的Web服务器

  • Nginx缺点:配置文件是磁盘中的静态文件,每次修改后必须重启才生效,对于有台服务器的网站来说,运维成本高且不灵活。
  • OpenResty的由来,2009年就职于某宝的程序员张亦春发布了该Web服务器,OpenResty并不是一个新的服务器,而是基于Nginx,利用Nginx模块化,可扩展的特性,开发了一系列的增强模块,并把它打包整合形成一个“一站式”的Web开发平台。其中ngx_lua模块把Lua语言嵌入了Nginx,可以用脚本语言的方式操作Nginx内部进行,多路复用,阶段式处理等各种构件。
  • 脚本语言优点:不需要编译,随写随用
  • Lua:设计目标是迁入到其它应用程序里运行,为其它编程语言带来“脚本化”能力,Lua拥有“代码热加载”特性,不需要重启进程,就能从磁盘,Redis或其它地方加载数据,随时替换内存里的代码片段,这就带来了“动态配置”,可以永不停机。另外Lua
  • LuaJIT:高效的Lua虚拟机,支持JIT(Just In Time)技术,可以把Lua代码即时翻译成“本地机器码”
  • OpenResty阶段式处理:Nginx流水线是一个个C模块组成,只能在静态文件里配置,而OpenResty则是由一个个Lua脚本组成,可以从磁盘,Redis,MySQL加载,且编写调试过程非常方便快捷。

36、WAF:保护我们的网络服务

  • HTTPS仅仅保证了“通信链路安全”,让第三方无法得知通信内容,但在通信链路的两端,也就是客户端和服务器,它是无法提供保护的。
  • Dos(Denial of Service):拒绝服务,目的是使计算机或者网络无法提供服务
  • DDos(Distributed denial-of-service attack): 分布式阻断服务,指攻击者控制多台主机同时向一台主机或网络发起Dos攻击。
  • SQL注入:利用服务器字符串拼接成SQL语句漏洞,构造非正常SQL,获取数据库内部敏感数据。
  • XSS:跨站脚本,通过js代码注入,利用js脚本获取未设防的Cookie。
  • WAF(Web Application Firewall):网络应用防火墙,是一种HTTP入侵检测和防御系统
  • WAF具有的基本功能:1、IP白名单和IP黑名单 2、URI黑名单和白名单 3、防护DDos攻击,对特定的IP地址限速 4、过滤请求报文,防御“代码注入”攻击 5、过滤响应报文,防御敏感信息外泄 6、审计日志,记录所有检测到的入侵操作
  • WAF工作原理:取到HTTP请求和响应报文,用字符串处理函数看看有没有关键字,敏感词,或者用正则表达式做一下模式匹配,命中了规则就执行对应工作,比如返回404,403。
  • 全面的WAF方案:ModSecurity,它是一个开源,生产级的WAF工具包,3.0版本可以集成进Apache或者Nginx
  • ModSecurity核心组件:规则引擎,它实现了自定义的SecRule,有自己特定的语法,主要基于正则表达式,不够灵活,后面也引入Lua,实现了脚本化配置;规则集,源码提供了一个基本的规则配置文件 modsecurity.conf-recommended,配置完成后删除后缀-recommended即可
  • ModSecurity额外提供了一个更完善的规则集,为网站提供全面可靠的保护,OWASP ModSecurity 核心规则集,简称“核心规则集”或者“CRS”

37、CDN:加速我们的网络服务

  • CDN :Content Distribution Network,内容分发网络,专门为解决长距离上网络访问速度慢而诞生的一种网络应用服务。核心原则:就近访问
    在这里插入图片描述
  • 内容:指HTTP协议里的资源,比如超文本,图片,视频,应用程序包等。资源按照是否可缓存又分为“静态资源”和“动态资源”。静态资源指数据内容任何时候访问都是一样的,如图片,音频等,动态资源只数据内容是动态变化的,由后台服务器计算生成,每次访问都不一样,只有静态资源才能被缓存加速,就近访问,动态资源只能由源站实时生成,被Cache-Control指定的动态资源除外
    CDN的负载均衡
  • 全局负载均衡(Global Server Load Balance):主要职责是当用户接入网络时在CDN专网中挑选出一个“最佳”节点提供服务。
    CDN的缓存代理
  • CDN关键概念:命中:指用户访问资源恰好在缓存里,可以直接返回给用户;回源:缓存里没有,必须使用代理的方式回源站取。

38、WebSocket:沙盒里的TCP

  • WebSocket:HTTP上Socket通信规范

  • Socket:套接字,格式:ip:端口号,网络中不同主机间应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上通信进程的一端,提供了应用层进程利用网络协议交换数据的机制。

  • 为什么要有WebSocket:
    WebSocket 是针对HTTP“请求-应答”通信模式的缺点而诞生的。”请求-应答“是一种“半双工”的通信模式,可以双向收发数据,但同一时刻只能有一个方向有工作,传输效率低,它同时也是一种被动的通信模式,服务器只能被动响应客户端的请求,无法主动向客户端发送数据。所以HTTP难以应用在动态页面,即时消息,网络游戏等要求”实时通信“的领域。WebSocket原来是HTML5的一部分,后来自立门户,形成了一个单独的标准,RFC文档编号是6455。

  • 额外科普一下单工、半双工、全双工
    数据通常是在两个站(点对点)之间进行传输,按照数据流的方向可分成三种传输模式:单工、半双工、全双工

  • 单工:图(a),数据在两点之间只支持数据在一个方向传输,并且这个方向不能改变,举例:电视,广播

  • 半双工:图(b),数据在两点之间同一时间内只支持数据在一个方向传输,这个方向可以改变,举例:对讲机

  • 全双工:最下面那个图,数据在两点之前同一时间内支持数据双向传输,举例:电话通话
    在这里插入图片描述
    注意:前面说“请求-应答”模式是一种“半双工”的传输模式,这里打了引号,只是类比助于理解,“请求-应答”模式在HTTP里,传输的数据是一来一回的,而半双工概念是数据可以来回,同一时间内不允许同时来回,举个例子的话,假设A和B用对讲机说话,半双工:A说完,B听到A说的话,A可以不等B说话接着说,但是对于“请求-应答”模式,则是A说完,B必须要回,A或B才可以再说,且说完必须得到对方回应,所以“请求-应答”模式可以算是半双工范围里的一种特殊情况,二者并不能打等号。
    WebSocket的特点

  • WebSocket是一个“全双工”的通信协议,与TCP一样,客户端和服务器都可以随时向对方发送数据,“实时通信”的效率也就高了。

  • WebSocket采用二进制帧结构,语法语义与HTTP完全不兼容,但因为它的主要运行环境是浏览器,为了便于推广和应用,在使用习惯上尽量向HTTP靠拢,这就是它名字里“Web”的含义。

  • 服务发现方面,WebSocket没有使用TCP的“IP地址+端口号”,而是沿用HTTP的URI格式,开头协议名不是http,而是引入两个新名字:“ws"和"wss”,分别表示明文和加密的WebSocket协议。

  • WebSocket默认端口也选择了80和443,因为现在互联网上的防火墙屏蔽了绝大多数端口,只对80和443端口放行,所以WebSocket就可以“伪装”成HTTP协议,与服务器建立连接。
    WebSocket的帧结构

  • 长度:不固定,最少2个字节,最多14个字节
    在这里插入图片描述
    开头两字节是必须的,

  • 第一字节第1位FIN是消息结束标志位,一个消息可以拆成多个帧,接收方看到“FIN”后,就把前面的帧拼起来,组成完整的消息;第2-4位是保留位,目前没有意义,但必须是0;第一个字节的后四位叫Opcode,表示操作码,其实就是帧类型,1表示帧内容是纯文本,2表示帧内容是二进制数据,8是关闭连接,9和10分别是连接保活的PING和PONG(WebSocket协议里的PING和PONG帧对于保持长连接很重要,可以让链路上总有数据在传输,防止被服务器,路由,网关认为是“无效链接”而意外关闭)

  • 第二个字节第1位是掩码标志位MASK,表示帧内容是否使用异或操作做简单加密,目前WebSocket标准规定,客户端发送数据必须使用掩码,服务器发送则必须不用掩码。第二个字节后7位是Payload len,表示帧内容长度,它是另一种变长编码,最少7位,最多7+64位,也就是额外增加8字节,所以WebSocket帧最大是264,长度字段后面是Masking-key,掩码秘钥,是由MASK决定的,如果使用掩码就是4个字节的随机数,否则就不存在。
    WebSocket帧头 结束标志位+操作码+帧长度+掩码
    WebSocket握手 WebSocket同样也有个握手过程,握手完成之后才能正式收发数据,WebSocket利用了HTTP本身“协议升级”特性,“伪装”成HTTP,这样就能绕过浏览器沙盒,网络防火墙等等限制,WebSocket握手是一个标准的HTTP GET请求,但要带上两个协议升级的专用头字段:
    1、 Connection:Upgrade表示要求协议升级,
    2、Upgrade:websocket,表示要升级成WebSocket协议,
    为防止HTTP错识别成WebSocket,握手消息增加了两个额外的认证用头字段,
    3、Sec-WebSocket-Key:一个Base64编码的16字节随机数,作为简单的认证秘钥,
    4、Sec-WebSocket-Version:协议版本号,当前必须是13,
    当服务器收到HTTP报文,看到上面这四个字段,不是普通GET请求,而是WebSocket的升级请求,而是构造一个特殊的“101 Switching Protocols”响应报文,通知客户端,接下来就不用HTTP了,全改用WebSocket协议通信。WebSocket握手响应报文也是有特殊格式的,要用字段Sec-WebSocket-Accept验证客户端请求报文,格式为:
    encode_base64(
    sha1( Sec-WebSocket-Key + ‘258EAFA5-E914-47DA-95CA-C5AB0DC85B11’ ))
    这个258EAFA5-E914-47DA-95CA-C5AB0DC85B11为专用UUID

  • 浏览器是一个"沙盒"环境,有很多限制,不允许建立TCP连接收发数据,而有了WebSocket,我们就可以在浏览器里与服务器直接建立“TCP连接”,而获得更多的自由。不过由于过于“原始”,用户必须自己管理连接,缓存,状态,开发上比HTTP复杂得多。

练习

38、WebSocket:沙盒里的TCP

1、WebSocket 与 HTTP/2 有很多相似点,比如都可以从 HTTP/1 升级,都采用二进制帧结构,你能比较一下这两个协议吗?
2、试着自己解释一下 WebSocket 里的”Web“和”Socket“的含义。
3、结合自己的实际工作,你觉得 WebSocket 适合用在哪些场景里?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:59:17  更:2021-07-31 16:59:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:56:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码