首页 > 其他分享 >常见面试题-Netty线程模型以及TCP粘包拆包

常见面试题-Netty线程模型以及TCP粘包拆包

时间:2023-11-18 11:33:56浏览次数:34  
标签:Netty 面试题 Reactor 模型 TCP 线程 多线程 客户端

介绍一下 Netty 使用的线程模型?

答:

Netty 主要基于主从 Reactor 多线程模型,其中主从 Reactor 多线程模型将 Reactor 分为两部分:

  • mainReactor:监听 Server Socket,用来处理网络 IO 连接建立操作,将建立的 SocketChannel 指定注册给 subReactor
  • subReactor:和建立起来的 socket 做数据交互和业务处理操作

因为客户端的连接数量相对来说比较少,而数据的读和写会比较多一点,使用 mainReactor 只接受客户端连接,由其他线程 subReactor 负责读和写,将业务处理剥离出,让线程池来处理,降低了 Reactor 的性能开销

扩展:单 Reactor 单线程模型、单 Reactor 多线程模型

  • 单 Reactor 单线程模型
    通过 1 个线程负责客户端连接、网络数据的读写、业务处理
    缓存 Redis 就是单 Reactor 单线程模型
  • 单 Reactor 多线程模型
    通过 1 个线程负责客户端的连接、网络数据的读写,将业务处理剥离出去,通过线程池来进行处理

三种 Reactor 模型的优缺点:

  • 单 Reactor 单线程模型是单线程进行业务处理,当负载过重时,处理速度将会变慢,影响系统性能,因此引出单 Reactor 多线程模型
  • 单 Reactor 多线程模型时多个线程处理业务,业务处理速度上来了,但是单 Reactor 承担了所有时间的监听和响应,可能存在性能问题。当有数百万客户端进行连接或者服务端需要对客户端握手进行安全认证,认证本身非常消耗性能,因此出现了主从 Reactor 多线程模型
  • 主从 Reactor 多线程模型中 1 个主 Reactor 只用来处理网络 IO 的连接建立操作,而对于接入认证、IP 黑白名单过滤、握手等操作由从 Reactor 进行处理,这样进一步提升性能,在主从 Reactor 多线程模型中,从 Reactor 有多个,可以与 CPU 个数相同

TCP 粘包、拆包是什么?如何解决?

答:

TCP本身的机制决定了一定会有粘包、拆包,因为 TCP 传输协议时基于数据流传输的,而流化的数据没有界限,因此 TCP 作为传输层协议并不了解上层业务数据的具体含义,会根据 TCP 缓冲区的实际情况进行数据包的划分,所以业务上认为的一个完整的包,可能被 TCP 拆成多个包或者把多个小的包封装成一个大的包进行发送。

产生原因:

  • 粘包:客户端发送的包的大小比socket的缓存小或者接收方读取socket缓存不及时,因此多个包一起发送了
  • 拆包:客户端发送的包的大小比socket的缓存大或者发送的数据大于协议的MTU(最大传输单元)必须拆包,那么这个包就被拆分成了多个包进行发送

解决方法:

有三种方式:

  • 通过指定分隔符来进行分割
  • 通过指定固定长度来进行分割
  • 上边两种方式灵活性不好,因此常用的是通过指定接收数据的长度来解决,也就是LengthFieldBasedFrameDecoder()这个类

标签:Netty,面试题,Reactor,模型,TCP,线程,多线程,客户端
From: https://blog.51cto.com/u_16186397/8460463

相关文章

  • 常见面试题-HashMap源码
    了解HashMap源码吗?参考文章:https://juejin.cn/post/6844903682664824845https://blog.51cto.com/u_15344989/3655921以下均为jdk1.8的HashMap讲解首先,HashMap的底层结构了解吗?底层结构为:数组+链表+红黑树什么时候链表会转换为红黑树呢?当一个位置上哈希冲突过多时,会导致......
  • nginx keepalive 设置避免 服务器端大量time_wait 增加tcp 连接重用
    #Formoreinformationonconfiguration,see:#*OfficialEnglishDocumentation:http://nginx.org/en/docs/#*OfficialRussianDocumentation:http://nginx.org/ru/docs/usernginx;worker_processesauto;error_log/var/log/nginx/error.log;pid/run/......
  • 1.面向对象基础面试题小结
    面向对象基础1面向对象三大特点封装、继承、多态面向过程是将解决问题的过程拆分为一个个方法执行;面向对象是先抽象出对象,由对象执行方法的方式解决问题。1)封装:将一个对象的属性封装在对象内部,不允许外部对象直接访问对象内部信息。2)继承:不同类型对象,相互之间经常有......
  • Netty-基础篇
    核心组件EventLoopGroup概念:由一个或多个EventLoop组成的组,用于处理所有的Channel的I/O操作,可以将其看作是一个线程池。1.包含多个EventLoop。2.EventLoopGroup将为每个新创建的Channel分配一个EventLoop。在每个Channel的整个生命周期内,所有的操作都将由相同的Thread执行。3......
  • 3、HTTP常见面试题
    HTTP是什么?Http是超文本传输协议,一种在通信双方之间指定的规则。其中超文本是指数据格式可以是文本、图片、视频等等各种类型的数据;HTTP常见的状态码1xx:提示信息,传输协议处理的中间状态2xx:请求成功。客户端发起的请求被服务端正确处理并返回响应数据3xx:资源重定位。客户端请......
  • netty tls单向认证通讯
    需求背景项目主要分为监管侧和企业侧,企业侧实时上传数据到云端,云端汇聚业务数据,上传过程需要保证传输的安全性。技术实现数据上传考虑到用HTTPS或者是TCP+TLS传输。其实使用HTTPS传输协议是比较简单的,但是项目硬件使用的4G无线网卡,而且需要实时检测设备运行状态,所以使用......
  • Netty - 快速开始
    一、为什么使用Netty1.NIO的缺点NIO的类库和API繁杂,学习成本高,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。需要熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能写出高质量的NIO程序。臭名昭著......
  • TCP time_wait close_wait处理方法
    CLOSE_WAIT是服务器未能处理完,导致CLOSE_WAIT一直处于存在,导致服务器资源消耗主要的配置参数:TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNTTIME_WAIT是客户端一直等待服务器过程,迟迟未等待服务器的返回,导致客户端资源消耗主要的配置参数:tcp_tw_reuse  对应LWIP里的SO_REUSE......
  • TCP乱序产生的原因
    网络拥塞:当网络拥塞时,数据包可能会在传输过程中因为网络负载过重而延迟或丢失,导致乱序数据的产生。路由选择:路由选择可以使数据包在传输过程中经过不同路径,这也可能导致乱序数据的产生。分段重组:由于网络链路的限制,数据包可能会被分段发送,接收端需要对这些分......
  • Android并发编程高级面试题汇总(含详细解析 五)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......