Java学习笔记(十五)-Netty

**

Netty的Recator模型

单线程:一个NIO线程+一个accept线程
在这里插入图片描述
多线程:
在这里插入图片描述
主从Reactor多线程:多个acceptor的NIO线程池用于接受客户端的连接
在这里插入图片描述
转自https://segmentfault.com/a/1190000017128263?utm_source=tag-newest
**
**

TCP沾包/拆包

虽然应用层面使用了Netty,但是对于操作系统来说数据交互按TCP协议来,尽管我们的应用层是按照 ByteBuf 为 单位来发送数据,server按照Bytebuf读取,但是到了底层操作系统仍然是将数据拆成字节流发送,因此,数据到了服务端,也是按照字节流的方式读入,然后到了 Netty 应用层面,重新拼装成 ByteBuf,而这里的 ByteBuf 与客户端按顺序发送的 ByteBuf 可能是不对等的。
沾包:客户端根据自定义协议来组装我们应用层的数据包如将3个数据包组装成2个TCP包
拆包;服务端根据我们的应用层的协议来组装数据包将客户端发来的2个TCP包拆成3个数据包

**
**

时间轮算法 HashedWheelTimer

时间轮其实就是一种环形的数据结构,可以想象成时钟,分成很多格子,一个格子代码一段时间(这个时间越短,Timer的精度越高)。并用一个链表报在该格子上的到期任务,同时一个指针随着时间一格一格转动,并执行相应格子中的到期任务。任务通过取摸决定放入那个格子。

**
**

心跳

因为网络的不可靠性, 有可能在 TCP 保持长连接的过程中, 由于某些突发情况, 例如网线被拔出, 突然掉电等, 会造成服务器和客户端的连接中断. 在这些突发情况下, 如果恰好服务器和客户端之间没有交互的话, 那么它们是不能在短时间内发现对方已经掉线的. 为了解决这个问题, 我们就需要引入 心跳 机制. 心跳机制的工作原理是: 在服务器和客户端之间一定时间内没有数据交互时, 即处于 idle 状态时, 客户端或服务器会发送一个特殊的数据包给对方, 当接收方收到这个数据报文后, 也立即发送一个特殊的数据报文, 回应发送方, 此即一个 PING-PONG 交互. 自然地, 当某一端收到心跳消息后, 就知道了对方仍然在线, 这就确保 TCP 连接的有效性.

**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章