Netty 核心组件
Channel;
EventLoop 主要负责监听网络事件并调用事件处理器进行相关IO操作处理;
ChannelFuture;
ChannelHandler 和 ChannelPipeline;
EventLoopGroup与EventLoop关系
EventLoopGroup包含多个EventLoop;
NioEventLoopGroup默认的 构造函数 会启用多少 线程
默认线程数量为 CPU核心数*2
Netty线程模型
单线程;
多线程 ;
主从多线程模式;
Netty 零拷贝
在操作系统OS上的Zero-copy 通常指避免在 用户他态(User-space)与内核态(Kernel-space)之间来回拷贝数据。
Netty零拷贝指的是对数据操作的优化,以下几个方面:
使用Netty提供的CompositeByteBuf类,可以将多个ByteBuf合并为一个逻辑上的ByteBuf,避免各个ByteBuf之间的拷贝;
ByteBuf支持slice操作,可以将ByteBuf分解为多个共享同一个存储区域的ByteBuf,避免内存拷贝;
通过FileRegion包装的FileChannel.tranferTo实现文件传输,能直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致内存拷贝问题。
Netty心跳机制
当客户端和服务端之间在一段时间内没数据交互,处于idle状态时,其中一方会发送一个特殊的数据包给对方,当接收方收到数据包后会回应一个特殊的数据 报文 。即PING-PONG交互。以确认对方是否任然在线,这就确保了TCP连接的有效性。核心实现类IdleStateHandler。
TCP粘包/拆包;解决方法
TCP发送数据时,出现了多个 字符串 “粘”在了一起或者一个字符串被“拆开”的问题。
Netty自带解码器:
LineBasedFrameDecoder:他可以解码以换行符分隔的包,判断是否有换行符,然后进行截取;
DelimiterBasedFrameDecoder:可以解码自定义分隔符的解码器;
FixedLengthFrameDecoder:固定长度解码器,能按照指定长度对消息进行拆包;
LengthFieldBasedFrameDecoder:自定义长度解码器;
Netty大小端
网络编程 中,对于字节存在2种序列方式,大端 和 小端。
大端字节序,指高位字节在前,低位字节在后,0x12345678,和我们平时读数一样 如 368;
小端字节序,低位字节在前,高位字节在后,0x87654321, 和我们平时读数相反, 如 863;