多路复用

浅析HTTP/2的多路复用

◇◆丶佛笑我妖孽 提交于 2019-11-27 11:59:25
HTTP/2有三大特性:头部压缩、Server Push、多路复用。前两个特性意思比较明确,也好理解,唯有多路复用不太好理解,尤其是和HTTP1.1进行对比的时候,这个问题我想了很长时间,也对比了很长时间,现在把思考的结果分享出来,希望对大家有帮忙。 先来说说Keep-Alive 在没有 Keep-Alive 前,我们与服务器请求数据的流程是这样: 浏览器请求 //static.mtime.cn/a.js -->解析域名-->HTTP连接-->服务器处理文件-->返回数据-->浏览器解析、渲染文件 浏览器请求 //static.mtime.cn/b.js -->解析域名-->HTTP连接-->服务器处理文件-->返回数据-->浏览器解析、渲染文件 ... ... ... 这样循环下去,直至全部文件下载完成。 这个流程最大的问题就是: 每次请求都会建立一次HTTP连接 ,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,而且逻辑上是非必需的,因为不间断的请求数据,第一次建立连接是正常的,以后就占用这个通道,下载其他文件,这样效率多高啊!你猜对了,这就是 Keep-Alive 。 Keep-Alive 解决的问题 Keep-Alive 解决的核心问题:一定时间内,同一域名多次请求数据,只建立一次HTTP请求,其他请求可复用每一次建立的连接通道

粪发涂墙-Redis

北慕城南 提交于 2019-11-27 02:28:56
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 下面重点介绍单线程设计和IO多路复用核心设计快的原因。 为什么Redis是单线程的 1.官方答案 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 2.性能指标 关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 3.详细原因 1)不需要各种锁的性能消耗 Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除 一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。 总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。 2

【11.2】C10K问题和io多路复用(select、poll和epoll)

南笙酒味 提交于 2019-11-26 16:57:15
C10K问题是一个在1999年被提出来的计数挑战:   如何在一颗1GHz CPU,2G内存、1gbps网络环境下,让单台服务器同时为1万个客户端提供FTP服务 Unix下五种I/O模式    1.阻塞式io(阻塞不会消耗cpu)   2.非阻塞式io   3.io复用   4.信号驱动式io   5.异步io epoll并不代表一定比select好:   在并发高,连接活跃度不是很高的情况下,epoll比select好   在并发不高,但是连接活跃度很高的情况下,select比epoll好 来源: https://www.cnblogs.com/zydeboke/p/11327768.html

selectors模块 - 实现多路复用简单介绍

二次信任 提交于 2019-11-26 11:12:16
常见的多路复用有select、epoll、poll方式。但并不是每种操作系统都能使用,比如:windows操作系统不支持使用epoll来实现多路复用。而selectors模块能根据操作系统来判断选择最好的多路复用方式,相当于一个通用的接口。 重点看代码注释 import selectors import socket # windows不能用epoll,selectors能根据操作系统来选择最好的多路复用方式select或epoll sel = selectors.DefaultSelector() # 如果是sock时,就执行accpet操作 def accept(sock, mask): conn, addr = sock.accept() conn.setblocking(False) # 设置非阻塞 sel.register(conn, selectors.EVENT_READ, read) # 注册绑定conn # 如果是conn时,就执行read函数 def read(conn, mask): try: data = conn.recv(1024) if not data: raise Exception conn.send(data) # 接收有数据就发送数据 except Exception as e: # 没有数据就解除绑定,关闭conn sel

NAT的工作过程详解

断了今生、忘了曾经 提交于 2019-11-26 10:59:27
文章目录 什么是NAT NAT的作用 NAT的实现方式 静态转换 Static Nat 动态转换 Dynamic Nat 端口多路复用 OverLoad NAT的过程 什么是NAT NAT(Network Address Translation,网络地址转换)是1994年提出的。网络地址转换的方式。 当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。 装有NAT软件的路由器叫做 NAT路由器 ,它至少有一个有效的外部全球IP地址。这样, 所有使用本地地址(私有地址)的主机在和外界通信时 ,都要 在NAT路由器上将其本地地址转换成全球IP地址(公有地址) ,才能和 因特网连接 。 NAT的作用 NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。 两大应用: 1. 宽带分享 :这是 NAT 主机的最大功能。 2. 安全防护 :NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC 。 NAT的实现方式 静态转换 Static Nat

静态、动态NAT、端口多路复用(案例)

て烟熏妆下的殇ゞ 提交于 2019-11-26 10:57:42
NAT—网络地址转换作用 NAT的优点 1.节省公有合法IP地址 2.处理地址重叠 3.增强灵活性 4.安全性 NAT的缺点 1.延迟增大 2.配置和维护的复杂性 3.不支持某些应用,可以通过静态NAT映射来避免 NAT实现方式 1.静态转换(Static Translation) 2.动态转换(Dynamic Translation 3.端口多路复用(Port Address Translation,PAT) 静态转换 IP地址的对应关系是一对一,而且是不变的,借助静态转换,能实现外部网络对内部网络中某些特设定服务器的访问。 配置: 接口IP地址配置 将192.168.0.10转成201.1.1.2 将192.168.0.20转成201.1.1.3 配置静态 Router(config)# ip nat inside source static 192.168.0.10 201.1.1.2 Router(config)# ip nat inside source static 192.168.0.20 201.1.1.3 ACL的内外端口 Router(config)#in f0/0 Router(config-if)#ip nat outside Router(config)#in f0/1 Router(config-if)#ip nat inside 建立NAT端口映射关系