黏包:顾名思义就是好几次的请求消息粘在了一起
半包:顾名思义就是一个消息分成了好几半发送出去
首先讲解这两种现象出现的原因:
1.大家都知道tcp是一个可靠的网络协议,每发送一段消息,就要进行一次,确认应答(ack处理),但如果这么做,包的往返时间越长,性能越差
2.由以上问题,tcp引入了一个窗口概念来解决,窗口大小即决定了无需等待应答而可以发送的数据最大值
由于滑动窗口的原因,假如客户端比较繁忙,同时发送了很多消息到服务端,但此时服务端已经只接收了一半,就满了,就发生了半包,那如果比较空闲,同时发送很多过来,就发生了黏包,因为消息之间是没有界限的
下边就讲解了通讯协议层面和网络层面出现这两种现象的原因
调整netty的bytebuf大小的方式,默认netty是1024字节
下边来讲几种解决方案
- 短链接,就是每次连接发送完消息后,立刻关闭连接,但是这种方案,实际还是有问题的,假如服务端bytebuf比较短,还是会发生这种问题
- 定长解决,就是客户端和服务端约定一个固定长度,比如10个字节,那么,如果客户端长度不够的话,就不会发出去,可通过一些特殊符号拼凑够这个长度,服务端会通过长度去读取,来避免这个问题
- 分隔符界定消息边界,和上边的方法一样,但是都比较消耗性能,都需要一个字节一个字节去判断是否是分隔符
- LTC解决,相对以上几种方式比较搞笑和可靠