stickup

Netty网编程实战:四种解决粘包方式切换、两种生产级双向监听模式并行、高效编解码、多处理器协同作战

荒凉一梦 提交于 2020-08-16 12:05:08
前言 在前面的课题把Netty网络编程的各种理论和主要组件、核心部件、重要机制都摊开说清楚后,今天给大家分享一下Netty在网络编程中的一些典型应用场景和一些重要问题的解决方案。比如由于TCP网络传输底层的原因,而产生不可预期的粘包和半包问题,致使收到对端的报文明显缺斤少两或前后报文之间相互粘连在一起;又如在生产环境中,网络通信的任意一端由于外界网络或自身bug的原因,导致网络长时间阻塞或直接断开等行为,对端无法明显感知真正原因;不能第一时间通知到对端或相关技术人员处理,最终导致更大的业务受损。 网络粘包半包 假设客户端分别发送了两个数据包 D1 和 D2 给服务端,由于服务端一次读取到的字节 数是不确定的,故可能存在以下 4 种情况。 (1)服务端分两次读取到了两个独立的数据包,分别是 D1 和 D2,没有粘包和拆包; (2)服务端一次接收到了两个数据包,D1 和 D2 粘合在一起,被称为 TCP 粘包; (3)服务端分两次读取到了两个数据包,第一次读取到了完整的 D1 包和 D2 包的部分 内容,第二次读取到了 D2 包的剩余内容,这被称为 TCP 拆包; (4)服务端分两次读取到了两个数据包,第一次读取到了 D1 包的部分内容 D1_1,第 二次读取到了 D1 包的剩余内容 D1_2 和 D2 包的整包。 如果此时服务端 TCP 接收滑窗非常小,而数据包 D1 和 D2