服务器多路复用是一种技术,它允许一台服务器同时处理多个网络连接。这可以通过使用不同的模型来实现,例如阻塞模型、非阻塞模型和事件驱动模型。
阻塞模型
在阻塞模型中,当服务器接收到一个连接请求时,它会阻止处理其他连接,直到当前连接完成。这种模型对于简单的应用程序来说是足够好的,但是当服务器需要处理大量的连接时,它就会变得效率低下。
非阻塞模型
在非阻塞模型中,服务器使用一个事件循环来监视多个连接。当一个连接接收到数据时,服务器将该连接放入一个事件队列中。事件循环然后从队列中提取连接并处理它们。这种模型对于处理大量连接来说更有效,因为它允许服务器同时处理多个连接。
事件驱动模型
事件驱动模型是服务器多路复用的一种高级形式。与非阻塞模型类似,事件驱动模型使用一个事件循环来监视多个连接。但是,事件驱动模型还使用一个事件处理器来处理事件。事件处理器是一个独立的线程,负责处理事件循环中放置的事件。这种模型对于处理大量连接来说是最高效的。
不同服务器型号的比较
下表比较了不同服务器多路复用模型的优缺点:
模型 | 优点 | 缺点 |
---|---|---|
阻塞 | 简单易于实现 | 效率低下 |
非阻塞 | 高效 | 比阻塞模型更复杂 |
事件驱动 | 最高效 | 比非阻塞模型更复杂 |
选择正确的服务器多路复用模型
选择正确的服务器多路复用模型取决于服务器的需求。对于处理少量连接的简单应用程序,阻塞模型可能就足够了。但是,对于处理大量连接的应用程序,非阻塞或事件驱动模型将是更好的选择。
结论
服务器多路复用是一种重要的技术,它允许一台服务器同时处理多个网络连接。通过使用不同的模型,服务器可以优化其性能,以满足其特定需求。
计算机网络名词解释知识点简答题整理
基带传输:比特流直接向电缆发送,无需调制到不同频段; 基带信号:信源发出的没有经过调制的原始电信号; URL:统一资源定位符,标识万维网上的各种文档,全网范围唯一; 传输时延:将分组的所有比特推向链路所需要的时间; 协议:协议是通信设备通信前约定好的必须遵守的规则与约定,包括语法、语义、定时等。
网络协议:对等层中对等实体间制定的规则和约定的集合; MODEM:调制解调器; 起始(原始)服务器:对象最初存放并始终保持其拷贝的服务器; 计算机网络:是用通信设备和线路将分散在不同地点的有独立功能的多个计算机系统互相连接起来,并通过网络协议进行数据通信,实现资源共享的计算机集合; 解调:将模拟信号转换成数字信号; 多路复用:在一条传输链路上同时建立多条连接,分别传输数据; 默认路由器:与主机直接相连的一台路由器; LAN:局域网,是一个地理范围小的计算机网络; DNS:域名系统,完成主机名与IP地址的转换; ATM:异步传输模式,是建立在电路交换和分组交换基础上的一种面向连接的快速分组交换技术; Torrent:洪流,参与一个特定文件分发的所有对等方的集合; Cookie:为了辨别用户、用于session跟踪等而储存在用户本地终端的数据; SAP:服务访问点; n PDU:PDU为协议数据单元,指对等层之间的数据传输单位;第n层的协议数据单元; PPP:点对点传输协议; Web caching:网页缓存技术; Web 缓存:代替起始服务器来满足HTTP请求的网络实体。
Proxy server:代理服务器; Go-back-n:回退n流水线协议;允许发送方连续发送分组,无需等待确认,若出错,从出错的分组开始重发;接收方接收数据分组,若正确,发ACK,若出错,丢弃出错分组及其后面的分组,不发任何应答; Packet switching:分组交换技术; CDMA:码分多路复用技术;各站点使用不同的编码,然后可以混合发送,接收方可正确提取所需信息; TDM:时分多路复用,将链路的传输时间划分为若干时隙,每个连接轮流使用不同时隙进行传输; FDM:频分多路复用,将链路传输频段分成多个小的频段,分别用于不同连接信息的传送; OSI:开放系统互连模型,是计算机广域网体系结构的国际标准,把网络分为7层; CRC:循环冗余检测法,事先双方约定好生成多项式,发送节点在发送数据后附上冗余码,使得整个数据可以整除生成多项式,接收节点收到后,若能整除,则认为数据正确,否则,认为数据错误; RIP:路由信息协议; Socket(套接字):同一台主机内应用层和运输层的接口; 转发表:交换设备内,从入端口到出端口建立起来的对应表,主要用来转发数据帧或IP分组; 路由表:路由设备内,从源地址到目的地址建立起来的最佳路径表,主要用来转发IP分组; 存储转发:分组先接收存储后,再转发出去; 虚电路网络:能支持实现虚电路通信的网络; 数据报网络:能支持实现数据报通信的网络; 虚电路:源和目的主机之间建立的一条逻辑连接,创建这条逻辑连接时,将指派一个虚电路标识符,相关设备为它运行中的连接维护状态信息; 毒性逆转技术:DV算法中,解决计数到无穷的技术,即告知从相邻路由器获得最短路径信息的相邻路由器到目的网络的距离为无穷大; 加权公平排队WFQ:排队策略为根据权值大小不同,将超出队列的数据包丢弃; 服务原语:服务的实现形式,在相邻层通过服务原语建立交互关系,完服务与被服务的过程; 透明传输:在无需用户干涉的情况下,可以传输任何数据的技术; 自治系统AS:由一组通常在相同管理者控制下的路由器组成,在相同的AS中,路由器可全部选用同样的选路算法,且拥有相互之间的信息; 分组丢失:分组在传输过程中因为种种原因未能到达接收方的现象; 隧道技术:在链路层或网络层通过对等协议建立起来的逻辑通信信道; 移动接入:也称无线接入,是指那些常常是移动的端系统与网络的连接; 面向连接服务:客户机程序和服务器程序发送实际数据的分组前,要彼此发送控制分组建立连接; 无连接服务:客户机程序和服务器程序发送实际数据的分组前,无需彼此发送控制分组建立连接; MAC地址:网卡或网络设备端口的物理地址; 拥塞控制:当网络发生拥塞时,用响应的算法使网络恢复到正常工作的状态; 流量控制:控制发送方发送数据的速率,使收发双方协调一致; Ad Hoc网络:自主网络,无基站; 往返时延:发送方发送数据分组到收到接收方应答所需要的时间; 电路交换:通信节点之间采用面向连接方式,使用专用电路进行传输; ADSL:异步数字用户专线,采用不对称的上行与下行传输速率,常用于用户宽带接入。
多播:组播,一对多通信; 路由器的组成包括:输入端口、输出端口、交换结构、选路处理器; 网络应用程序体系结构:客户机/服务器结构、对等共享、混合; 集线器是物理层设备,交换机是数据链路层设备,网卡是数据链路层设备,路由器是网络层设备; 双绞线连接设备的两种方法:直连线和交叉线,同种设备相连和计算机与路由器相连都使用交叉线;不同设备相连用直连线; MAC地址6字节,IPv4地址4字节,IPv6地址16字节; 有多种方法对载波波形进行调制,调频,调幅,调相; IEEE802.3以太网采用的多路访问协议是CSMA/CD; 自治系统AS内部的选路协议是RIP、OSPF;自治系统间的选路协议是BGP; 多路访问协议:分三大类:信道划分协议、随机访问协议、轮流协议; 信道划分协议包括:频分FDM、时分TDM、码分CDMA; 随机访问协议包括:ALOHA、CSMA、CSMA/CD(802.3)、CSMA/CA(802.11); 轮流协议包括:轮询协议、令牌传递协议 ISO和OSI分别是什么单词的缩写,中文意思是什么?用自己的理解写出OSI分成哪七层?每层要解决的问题和主要功能是什么? 答:ISO:international standard organization 国际标准化组织;OSI:open system interconnection reference model 开放系统互连模型; OSI分为 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层; 层名称解决的问题主要功能 应用层实现特定应用选择特定协议;针对特定应用规定协议、时序、表示等,进行封装。
在端系统中用软件来实现,如HTTP; 表示层压缩、加密等表示问题;规定数据的格式化表示,数据格式的转换等; 会话层会话关系建立,会话时序控制等问题;规定通信的时序;数据交换的定界、同步、建立检查点等; 传输层源端口到目的端口的传输问题;所有传输遗留问题:复用、流量、可靠; 网络层路由、拥塞控制等网络问题;IP寻址,拥塞控制; 数据链路层相邻节点无差错传输问题;实现检错与纠错,多路访问,寻址; 物理层物理上可达;定义机械特性,电气特性,功能特性等;因特网协议栈分层模型及每层的功能。
分层的优点:使复杂系统简化,易于维护和更新; 分层的缺点:有些功能可能在不同层重复出现; 假设一个用户(邮箱为)使用outlook软件发送邮件到另一个用户(邮箱为),且接收用户使用IMAP协议收取邮件,请给出此邮件的三个传输阶段,并给出每个阶段可能使用的应用层协议。
用户 使用outlook软件发送邮件到 163 邮件服务器 163邮件服务器将邮件发送给用户 的yahoo邮件服务器 用户 使用IMAP协议从yahoo邮件服务器上拉取邮件 第1、2阶段可以使用SMTP协议或者扩展的SMTP协议:MIME协议,第3阶段可以使用IMAP、POP3、HTTP协议三次握手的目的是什么?为什么要三次(二次为什么不行)? 为了实现可靠数据传输,TCP协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。
三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。
如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。
选择性重传(SR)协议中发送方窗口和接收方窗口何时移动?分别如何移动? 发送方:当收到ACK确认分组后,若该分组的序号等于发送基序号时窗口发生移动;向前移动到未确认的最小序号的分组处; 接收方:当收到分组的序号等于接收基序号时窗口移动;窗口按交付的分组数量向前移动;简述可靠传输协议rdt1.0, rdt2.0, rdt2.1, rdt2.2和rdt3.0在功能上的区别。
rdt1.0:经可靠信道上的可靠数据传输,数据传送不出错不丢失,不需要反馈。
rdt2.0(停等协议):比特差错信道上的可靠数据传输,认为信道传输的数据可能有比特差错,但不会丢包。
接收方能进行差错检验,若数据出错,发送方接收到NAK之后进行重传。
rdt2.1:在rdt2.0的基础上增加了处理重复分组的功能,收到重复分组后,再次发送ACK; rdt2.2:实现无NAK的可靠数据传输,接收方回发带确认号的ACK0/1, 收到出错分组时,不发NAK,发送接收到的上一个分组的ACK; rdt3.0:实现了超时重发功能,由发送方检测丢包和恢复;电路交换和虚电路交换的区别?哪些网络使用电路交换、报文交换、虚电路交换和数据报交换?请各举一个例子。
电路交换时整个物理线路由通讯双方独占; 虚电路交换是在电路交换的基础上增加了分组机制,在一条物理线路上虚拟出多条通讯线路。
电路交换:电话通信网 报文交换:公用电报网 虚电路交换:ATM 数据报交换:Internet 电路交换:面向连接,线路由通信双方独占; 虚电路交换:面向连接,分组交换,各分组走统一路径,非独占链路; 数据报交换:无连接,分组交换,各分组走不同路径;交换机逆向扩散式路径学习法的基本原理: 交换表初始为空; 当收到一个帧的目的地址不在交换表中时,将该帧发送到所有其他接口(除接收接口),并在表中记录下发送节点的信息,包括源MAC地址、发送到的接口,当前时间; 如果每个节点都发送了一帧,每个节点的地址都会记录在表中; 收到一个目的地址在表中的帧,将该帧发送到对应的接口; 表自动更新:一段时间后,没有收到以表中某个地址为源地址的帧,从表中删除该地址;非持久HTTP连接和持久HTTP连接的不同: 非持久HTTP连接:每个TCP连接只传输一个web对象,只传送一个请求/响应对,HTTP1.0使用; 持久HTTP连接:每个TCP连接可以传送多个web对象,传送多个请求/响应对,HTTP1.1使用;Web缓存的作用是什么?简述其工作过程: 作用:代理原始服务器满足HTTP请求的网络实体; 工作过程: 浏览器:与web缓存建立一个TCP连接,向缓存发送一个该对象的HTTP请求; Web缓存:检查本地是否有该对象的拷贝; 若有,就用HTTP响应报文向浏览器转发该对象; 若没有,缓存与原始服务器建立TCP连接,向原始服务器发送一个该对象的HTTP请求,原始服务器收到请求后,用HTTP响应报文向web缓存发送该对象,web缓存收到响应,在本地存储一份,并通过HTTP响应报文向浏览器发送该对象;简要说明无线网络为什么要用CSMA/CA而不用CSMA/CD? 无线网络用无线信号实施传输,现在的技术还无法检测冲突,因此无法使用带冲突检测的载波侦听多路访问协议CSMA/CD,而使用冲突避免的载波侦听多路访问协议CSMA/CA;简述各种交换结构优缺点,并解释线头HOL阻塞现象。
内存交换结构:以内存为交换中心;优点:实现简单,成本低;缺点:不能并行,速度慢; 总线交换结构:以共享总线为交换中心;优点:实现相对简单,成本低;缺点:不能并行,速度慢,不过比memory快; 纵横制:以交叉阵列为交换中心;优点:能并行,速度快,比memory和总线都快;缺点:实现复杂,成本高; 线头HOL阻塞:输入队列中后面的分组被位于线头的一个分组阻塞(即使输出端口是空闲的),等待交换结构发送;CSMA/CD协议的中文全称,简述其工作原理。
带冲突检测的载波侦听多路访问协议; 在共享信道网络中,发送节点发送数据之前,先侦听链路是否空闲,若空闲,立即发送,否则随机推迟一段时间再侦听,在传输过程中,边传输边侦听,若发生冲突,以最快速度结束发送,并随机推迟一段时间再侦听;奇偶校验、二维奇偶校验、CRC校验三者比较: 奇偶校验能检测出奇数个差错; 二维奇偶校验能够检测出两个比特的错误,能够纠正一个比特的差错; CRC校验能检测小于等于r位的差错和任何奇数个差错;GBN方法和SR方法的差异: GBN:一个定时器,超时,重发所有已发送未确认接收的分组,发送窗口不超过2的k次方-1,接收窗口大小为1,采用累计确认,接收方返回最后一个正确接受的分组的ACK; SR:多个定时器,超时,只重发超时定时器对应的分组,发送窗口和接收窗口大小都不超过2的k-1次方,非累计确认,接收方收到当前窗口或前一窗口内正确分组时返回对应的ACK;
图解不同版本的HTTP协议
大家好,我们来探讨HTTP协议的不同版本。
通过这篇文章,我们将深入理解各个版本的HTTP协议的优缺点、性能差异,以及当前主流协议版本的使用情况。
HTTP/1.1时代,这一版本在HTTP/1.0基础上做了许多优化,成为当前最常用的协议。
持久连接的引入解决了HTTP/1.0中每次请求都需要重新建立TCP连接的问题。
在HTTP/1.1中,浏览器与服务器之间可以建立一个连接进行多个请求的复用,有效节省了连接建立的开销。
如今,大多数浏览器默认开启持久连接。
管道化(Pipelining)功能允许浏览器同时发送多个请求,虽然每个请求的响应仍按顺序返回,但提高了整体的并发性能。
然而,这一功能在不同浏览器中支持情况不一,因此实用性受限。
在HTTP/1.1时代,我们还可以通过优化静态资源的加载策略,如连接和拼接JS、CSS文件,利用雪碧图技术减少HTTP请求次数。
同时,浏览器的缓存机制也被优化,使得静态资源能够被有效缓存,提高加载速度。
SPDY时代,Google提出了SPDY方案,为HTTP/2.0奠定了基础。
SPDY引入了多路复用(Multiplexing)功能,通过共享一个TCP连接,多个请求可以并行传输,有效解决了HTTP1.x中头部阻塞问题,提高了带宽利用率。
请求优先级机制允许关键请求优先响应,提升用户体验。
SPDY还对头部信息进行了压缩,显著减少了传输数据量。
HTTP/2.0时代,HTTP协议迎来了重大变革。
二进制分帧层的引入,使得协议能够在不改动原有语义的前提下,提高传输性能。
压缩头部技术则利用首部表优化了重复数据的传输。
多路复用功能让同一连接可以承载多个请求,显著提高了并发性能。
在HTTP/2.0中,客户端与服务器之间的数据传输更为高效,减少了服务端连接压力,提升了内存使用效率,同时也改善了网络拥塞状况和丢包恢复速度。
请求的乱序发送与重新组合机制,使得数据流能够在同一连接上并行传输,进一步提高了性能。
此外,HTTP/2.0还支持服务器推送,允许服务器在客户端请求前主动发送资源,提高页面渲染速度。
强制SSL要求则确保了数据传输的安全性。
在实际应用中,需要浏览器和服务器支持HTTP/2.0协议,以实现其性能提升。
HTTP/2.0与HTTP/1.1的性能差异可以通过官方演示进行直观比较。
总结,不同版本的HTTP协议在优化网络通信性能方面各有侧重,HTTP/2.0在多路复用、压缩头部和服务器推送等方面做出了重大改进,成为当前主流协议版本。
netty系列之:性能为王!创建多路复用http2服务器
简介
在之前的文章中,我们提到了在Netty的客户端通过使用Http2FrameCodec和Http2MultiplexHandler可以支持多路复用,也就是说在一个连接的channel基础上创建多个子channel,通过子channel来处理不同的stream,从而达到多路复用的目的。
既然客户端可以做到多路复用,同样的服务器端也可以,今天给大家介绍一下如何在netty的服务器端打造一个支持http2协议的多路复用服务器。
多路复用的基础
netty中对于http2多路复用的基础类是Http2FrameCodec、Http2MultiplexHandler和Http2MultiplexCodec。
Http2FrameCodec是将底层的HTTP/2 frames消息映射成为netty中的Http2Frame对象。
有了Http2Frame对象就可以通过Http2MultiplexHandler对新创建的stream开启不同的channel。
Http2MultiplexCodec是Http2FrameCodec和Http2MultiplexHandler的结合体,但是已经不再被推荐使用了。
因为Http2FrameCodec继承自Http2ConnectionHandler,而Http2MultiplexHandler继承自Http2ChannelDuplexHandler,所以这两个类可以同时在客户端和服务器端使用。
客户端使用()()来获得Http2FrameCodec,而服务器端通过()()来获得Http2FrameCodec。
多路复用在server端的使用配置TLS处理器
对于服务器端,同样需要处理TLS和普通clear text两种情况。对于TLS来说,我们需要自建ProtocolNegotiationHandler继承自ApplicationProtocolNegotiationHandler,然后实现configurePipeline方法,在其中分别处理http2和http1.1的连接:
protectedvoidconfigurePipeline(ChannelHandlerContextctx,Stringprotocol){if(_(protocol)){//添加多路复用支持()(()());()(newHttp2MultiplexHandler(newCustMultiplexHttp2Handler()));return;}if(_1_(protocol)){()(newHttpServerCodec(),newHttpObjectAggregator(MAX_CONTENT_LENGTH),newCustHttp1Handler(ALPNNegotiation));return;}thrownewIllegalStateException(未知协议:+protocol);}
首先添加Http2FrameCodec,然后添加Http2MultiplexHandler。
因为Http2MultiplexHandler已经封装了多路复用的细节,所以自定义的handler只需要实现正常的消息处理逻辑即可。
因为Http2FrameCodec已经对消息进行了转换成为HTTP2Frame对象,所以只需要处理具体的Frame对象:
publicvoidchannelRead(ChannelHandlerContextctx,Objectmsg)throwsException{if(msginstanceofHttp2HeadersFrame){onHeadersRead(ctx,(Http2HeadersFrame)msg);}elseif(msginstanceofHttp2DataFrame){onDataRead(ctx,(Http2DataFrame)msg);}else{(ctx,msg);}}配置clear text upgrade
对于h2c的升级来说,需要向pipline中传入sourceCodec和upgradeHandler两个处理器。
sourceCodec可以直接使用HttpServerCodec。
upgradeHandler可以使用HttpServerUpgradeHandler。
HttpServerUpgradeHandler的构造函数需要传入一个sourceCodec和一个upgradeCodecFactory。
sourceCodec我们已经有了,再构造一个upgradeCodecFactory即可:
privatestaticfinalUpgradeCodecFactoryupgradeCodecFactory=protocol->{if((_UPGRADE_PROTOCOL_NAME,protocol)){returnnewHttp2ServerUpgradeCodec(()(),newHttp2MultiplexHandler(newCustMultiplexHttp2Handler()));}else{returnnull;}};
从代码中可以看出,upgradeCodecFactory内部又调用了Http2FrameCodec和Http2MultiplexHandler。
这和使用TLS的处理器是一致的。
finalChannelPipelinep=();finalHttpServerCodecsourceCodec=newHttpServerCodec();(sourceCodec);(newHttpServerUpgradeHandler(sourceCodec,upgradeCodecFactory));总结
通过上述方式,就可以创建出支持多路复用的http2 netty服务器了。
本文的例子可以参考:learn-netty4
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!