



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基础篇1、TCP、UDP的区别?TCP与UDP区别总结:1. TCP面向连接(如打 要先拨号建立连接);UDP是无连接的,即 数据之前不需要建立连接。2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到 达;UDP尽最大努力交付,即不保证可靠交付3. TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的 UDP没有拥塞 ,因此网络出现拥塞 使源主机的 速率降低(对实时应用很有用,如IP ,实时视频会议等)4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信5. TCP首部开销20字节;
2、UDP的首部开销小,只有8个字节6. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道2、TCP协议如何保证可靠传输?校验和,确认 和序列号序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。确认 :TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认 。也就是 ACK报文。这个ACK报文当中带有对应的确认序列号,告诉 方,接收到了哪些数据,下一次的数据从哪里发。序列号的作用不仅仅是 的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一。超时重传:当TCP发出一个 ,它启动一个定时器,等待目的端确认收到
3、这个报文段。如果不 收到一个确认,将重发这个报文段。流量 :TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只 端 接收端缓冲区能接纳的数据。当接收方来不及处理 方的数据,能提示 方降低 的速率,防止包丢失。TCP使用的流量 协议是可变大小的滑动窗口协议。接收方有即时窗口(滑动窗口),随ACK报文发送拥塞 :如果网络出现拥塞,分组将会丢失,此时 方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当这一点和流量 很像,但是出发点不同。流量 是 接收方能来得及接收,而拥塞 是为了降低整个网络的拥塞程度。TCP 主要通过四个算法来进行拥塞 :慢开始、拥塞避免、快重传、快恢复。3、T
4、CP的握手、挥 制?TCP的握 制:TCP的挥 制:详情参考:4、TCP的粘包/拆包 及其解决方法是什么?为什么会发生TCP粘包、拆包? 发生TCP粘包、拆包主要是由于下面一些 :1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。2. 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据 到网络上,这将会发生粘包。3. 进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度MSS的时候将发生拆 包。4. 接收方法不及时 套接字缓冲区数据,这将发生粘包。粘包、拆包解决办法:TCP本身是面向流的,作为网络服务器,如何从这源源不断涌来的数据流中拆分出或者合
5、并出有意义的信息呢?通常会有以下一些常用的方法:1. 端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过 包首部的长度字段,便知道每一个数据包的实际长度了。2. 端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中 固定长度的数据就自然而然的把每个数据包拆 来。3. 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆 。5、Netty的粘包/拆包是怎么处理的,有哪些实现?对于粘包和拆包问题,常见的解决方案有四种:1. 客户端在 数据包的时候,每个包都固定长度,比如1024个字节大小,如果
6、客户端 的数据长度不足1024个字节,则通过补充空格的方式补全到指定长度;Netty提供的FixedLengthFrameDecoder2. 客户端在每个包的末尾使用固定的分隔符,例如rn,如果一个包被拆分了,则等待下一个包过来之后找到其中的rn,然后对其拆分后的头部部分与前一个包的剩余部分进行合并,这样就得到了一个完整的包;Netty提供LineBasedFrameDecoder与DelimiterBasedFrameDecoder3. 将消息分为头部和消息体,在头部中保存有当前整个消息的长度,只有在 到足够长度的消息之后才算是读到了一个完整的消息;Netyy提供了LengthFieldBa
7、sedFrameDecoder与LengthFieldPrepender4. 通过自定义协议进行粘包和拆包的处理。Netty提供了通过实现MessageToByteEncoder和ByteToMessageDecoder来实现6、同步与异步、阻塞与非阻塞的区别?简单点理解就是:1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我 返回。4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过select通知调用者同步I
8、O和异步IO的区别就在于:数据拷贝的时候进程是否阻塞 阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回7、说说网络IO模型?8、BIO、NIO、AIO分别是什么?BIO:同步并阻塞 ,服务器实现模式为 接一个线程,即客户端有连接请求时服务器端就需要启动 一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改 善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器 要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。NIO:同步非阻塞 ,服务器实现模式为一个请求一个线程,即客户端 的连接请求都会 到多路复用器上
9、,多路复用器轮询到连接有I/O请求 启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。AIO:异步非阻塞 ,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相 册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。9、select、poll、epoll的机制及其区别?单个进程打开的文件描述符(fd文件句柄)不一致select :有最大连接数限制数为1024,单个进
10、程所能打开的最大连接数由FD_ZETSIZE宏定义。poll:poll本质上与select没有区别,但是它没有最大连接数的限制, 是它是基于链表来的。epoll:虽然连接有上限,但是很大,1G内存的 可以打开10万左右的连接,以此类推。Socket的方式不一致select :轮询的方式,一个一个的socket检查过去,发现有socket活跃 进行处理,当线性socket增多时,轮询的速度将会变得很慢,造成线性造 能下降问题。poll:对select稍微进行了优化,只是修改了文件描述符,但是 socket的方式还是轮询。expoll:epoll内核中实现是根据每个fd上的callback函数来实
11、现的,只有活跃的socket才会主动 调用callback,通知expoll来处理这个socket。(会将连接的socket 到epoll中, 相当于socket 的花名册, 如果有一个socket活跃了, 会回调一个函数, 通知epoll,赶紧过来处理)内存空间拷贝方式(消息传递方式)不一致 select:内核想将消息传递到用户态,需要将数据从内核态拷贝到用户态,这个过程非常的耗时poll:同上epoll:epoll的内核和用户空间共享一块内存,因此内存态数据和用户态数据是共享的select、poll、epoll时间复杂度分别是:O(n)、O(n)、O(1)10、Netty跟Java NIO
12、有什么不同,为什么不直接使用JDK NIO类库?NIO有什么缺点:NIO的类库和API还是有点复杂,比如Buffer的使用 Selector编写复杂,如果对某个 后,业务代码过于耦合 需要了解很多多线程的知识,熟悉网络编程 面对断 连、保丢失、粘包等,处理复杂NIO存在BUG,根据网上 说是selector空轮训导致CPU飙升,具体有 的 JDK的官网Netty主要的优点有:框架设计优雅,底层模型随意切换适应不同的网络协议要求提供很多标准的协议、安全、编码 的支持解决了很多NIO不易用的问题在很多开源框架中使用,如Dubbo、RocketMQ、Spark等底层 有:Zero-Copy-Capa
13、ble Buffer,非常易用的灵拷贝Buffer(这个内容很有意思,稍后专门来说);统一的API; 扩展的时间模型传输方面的支持有:管道通信(具体不知道干啥的,还请老司机指教);Http隧道;TCP与UDP协议方面的支持有:基于原始文本和二进制的协议;解压缩;大文件传输;流 传输;protobuf编 ;安全认证;http和websocket总之提供了很多现成的功能可以直接供开发者使用。12、Netty组件有哪些,分别有什么关联?ChannelSocketEventLoop流,多线程处理,并发;ChannelHandler和ChannelPipeline Bootstrap 和 ServerB
14、ootstrap13、说说Netty的执行流程?1. 创建ServerBootStrap实例2. 设置并绑定Reactor线程池:EventLoopGroup,EventLoop就是处理所有 到本线程的Selector上面的Channel3. 设置并绑定服务端的channel4. 创建处理网络 的ChannelPipeline和handler,网络时间以流的形式在其中流转,handler完成 多数的功能定制:比如编 SSl安全认证5. 绑定并启动 端口6. 当轮训到准备就绪的channel后,由Reactor线程:NioEventLoop执行pipline中的方法,最终调度 并执行channe
15、lHandler高级篇14、Netty高性能体现在哪些方面?.15、Netty的线程模型是怎么样的?Reactor线程模型Reactor单线程模型 一个NIO线程+一个accept线程:Reactor多线程模型Reactor主从模型 主从Reactor多线程:多个acceptor的NIO线程池用于接受客户端的连接Netty可以基于如上三种模型进行灵活的配置。总结Netty是建立在NIO基础之上,Netty在NIO之上又提供了更 次的抽象。在Netty里面,Accept连接可以使用单独的线程 处理,读写操作又是另外的线程 处理。Accept连接和读写操作也可以使用同一个线程 进行处理。而请求处理
16、逻辑既可以使用单独的线程 处理,也可以跟放在读写线程一块处理。线程 的每一个线程都是NIO线程。用户可以根据实际情况进行组装,构造出满足系统需求的高性能并发模型。16、Netty的零拷贝提体现在哪里,与操 上的有什么区别?传统意义的拷贝是在 数据的时候, 传统的实现方式是:1. File.read(bytes)2. Socket.send(bytes)这种方式需要四次数据拷贝和四次上下文切换:1. 数据从磁盘 到内核的read buffer2. 数据从内核缓冲区拷贝到用户缓冲区3. 数据从用户缓冲区拷贝到内核的socket buffer4. 数据从内核的socket buffer拷贝到网卡接口
17、(硬件)的缓冲区零拷贝的概念明显上面的第二 第三步是没有必要的,通过java的FileChannel.transferTo方法,可以避免上面两次多余的拷贝(当然这需要底层操 支持)1. 调用transferTo,数据从文件由DMA引擎拷贝到内核read buffer2. 接着DMA从内核read buffer将数据拷贝到网卡接口buffer上面的两次操作都不需要CPU参与,所以就达到了零拷贝。Netty中的零拷贝主要体现在三个方面:1、bytebufferNetty 和接收消息主要使用bytebuffer,bytebuffer使用对外内存(DirectMemory)直接进行Socket读写。
18、:如果使用传统的堆内存进行Socket读写,JVM会将堆内存buffer拷贝一份到直接内存中然后再写入socket,多了一次缓冲区的内存拷贝。DirectMemory中可以直接通过DMA 到网卡接口2、Composite Buffers传统的ByteBuffer,如果需要将两个ByteBuffer中的数据组合到一起,我们需要首先创建一个size=size1+size2大小的新的数组,然后将两个数组中的数据拷贝到新的数组中。但是使用Netty提供的组合ByteBuf,就可以避免这样的操作,因为CompositeByteBuf并没有真正将多个 Buffer组合起来,而是保存了它们的 ,从而避免了数
19、据的拷贝,实现了零拷贝。3、对于FileChannel.transferTo的使用Netty中使用了FileChannel的transferTo方法,该方法依赖于操实现零拷贝。17、Netty的内存 怎么实现的?netty内存池实现原理netty内存池可以分配堆内存和 内存(Direct内存),内存分配的 算法是类似的,从堆内存分配代码入手来学习整个内存池的原理。netty框架处理IO 时,使用ByteBuf承载数据。ByteBuf的内存分配由PooledByteBufAllocator来执行,最终的内存分配工作会被委托给PoolArena,堆内存分配的PoolArena实现是HeapAren
20、ty通常被用于高并发系统,多线程竞争加锁会影响内存分配的效率,为了缓解高并发时的线程竞争,netty 使用者创建多个分配器(PoolArena)来分离线程竞争,提高内存分配效率。可通过PooledByteBufAllocator构造子中的nHeapArena参数来设置PoolArena的数量,或者直接取框架中的 默认值,通过以下代码决定默认值,默认值根据CPU 数、JVM最大可用内存以及默认内存块(PoolChunk)大小等参数来计算这个默认值,计算逻辑是:1)获取系统变量ty.allocator.numHeapArenas,通过System.setProperty(ty.alloc
21、ator.numHeapArenas, )或者增加JVM启动参数- Dty.allocator.numHeapArenas= 设置,如果设置了值,把这个值当做Arena的个数。2)如果没有设置ty.allocator.numHeapArenas系统变量,计算CPU 数*2和JVM最大可用内存/默认内存块大小/2/3,取其中一个较少的值当做PoolArena的个数。确定PoolArena个数之后框架会创建一个PoolArena数组,数组中所有的PoolArena都会用来执行内存 分配。线程申请内存分配时,线程会在这个PoolArena数组中挑选一个当前被占用次数最少的Arena执行内存分配。此外
22、,netty使用扩展的线程对象FastThreadLocalThread来优化ThreadLocal性能,具体的优化思路 是:默认的ThreadLocal使用ThreadLocalMap 线程局部变量,它的实现方式类似于HashMap,需 要计算hashCode 到线程局部变量所在Entry的索引,而FastThreadLocalThread使用FastThreadLocal代替ThreadLocal,FastThreadLocalThread用一个数组来维护线程变量,每个FastThreadLocal维护一个index,该index就是线程局部变量在数组中的位置,线程变量直接通过index无需计算hashCode,FastThreadLocal的优势是减少了hashCode的计算过程,虽然性能只会有轻微的提升,但在高并发系统中,即使只是轻微的提升也会成倍放大。请阅读文章:?.18、Netty的对象 怎么实现的?Netty 并没有使用第 库实现对象池,而是 实现了一个相对轻量的对象池。通过使用threadLocal,避免了多线程下取数据时可能出现的线程安全问题,同时,为了实现多线程回收同一个 实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东育婴师试题及答案
- 企业管理规定试题及答案
- 2024年纺织设计师行业调查试题及答案
- 广告设计师考试色彩心理研究试题及答案
- 广告设计与内容营销试题及答案
- 2024年与设计相关的行业动态国际商业美术设计师考试试题及答案
- 买豆浆的孩子试题及答案
- 2024年广告设计师的复习新方法试题及答案
- 广告设计中的转化率提升策略试题及答案
- 科学编制考试试题及答案
- 无人机配送技术发展-全面剖析
- 广东省江门市2025届高三下学期一模化学试题(原卷版+解析版)
- 2025年上半年广州市海珠区海幢街道招考康园工疗站工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年春季学期形势与政策第二讲-中国经济行稳致远讲稿
- 人教PEP版英语五年级下册Recycle 1单元教学设计(2课时教案)
- 中国产教融合行业市场发展现状及前景趋势与投资分析研究报告(2024-2030版)
- 2025年山西焦煤集团有限责任公司招聘笔试参考题库含答案解析
- 踝关节骨折的护理查房课件
- 第六届“四川工匠杯”职业技能大赛(健康照护赛项)理论参考试题库(含答案)
- 2024-2030年中国生姜及深加工市场发展动态及前景规划研究报告
- 消防中控室操作人员培训
评论
0/150
提交评论