Netty解决半包(TCP粘包/拆包导致)读写问题

转载 2015年07月09日 06:27:19

转载自    oschina  天冰       

摘要 使用Netty进行异步IO编程,同事问我粘包/拆包问题如何处理,所以抽空分析一下TCP粘包/拆包问题的产生;Netty提供了多种编解码器用于处理半包问题,熟练掌握了类库的应用,TCP粘包问题变得很容易。


TCP粘包/拆包

TCP是个"流"协议,所谓流,就是没有界限没有分割的一串数据。TCP会根据缓冲区的实际情况进行包划分,一个完整的包可能会拆分成多个包进行发送,也用可能把多个小包封装成一个大的数据包发送。这就是TCP粘包/拆包。


TCP粘包/拆包问题说明

客户端要给服务端发送数据,假如为两个数据包。

可能的情况如下:


问题产生的原因:

1-应用程序write写入的字节大小 大于 套接字发送缓冲区大小

2-进行MSS大小的TCP分段

3-以太网帧的payload大于MTU进行IP分片


TCP粘包/拆包解决办法

1-定长消息,例如每个报文长度固定,不够补空格

2-使用回车换行符分割,在包尾加上分割符,例如Ftp协议

3-消息分割,头为长度(消息总长度或消息体长度),通常头用一个int32表示

4-复杂的应用层协议


Netty对于读写半包的的处理

提供多种解码器用于处理半包,如 LineBasedFrameDecoder、DelimiterBasedFrameDecoder、FixedLengthFrameDecoder、ProtobufVarint32FrameDecoder、ByteToMessageDecoder以及LengthFileldBasedFrameDecoder等等。

下面的例子为 我在 ProtoBuf中的使用

?
1
2
3
4
5
6
7
8
//decoder
//1-读半包的解码器
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(10240404)); 
//2-进行消息解码
ch.pipeline().addLast(new ProtobufDecoder(BoxAuthReqProto.AuthRequest.getDefaultInstance()));
//encoder                  
ch.pipeline().addLast(new LengthFieldPrepender(4));
ch.pipeline().addLast(new ProtobufEncoder());

相关文章推荐

netty实战-自定义解码器处理半包消息

概述在李林锋的Netty系列之Netty编解码框架分析中介绍了各种解码器,也推荐组合LengthFieldBasedFrameDecoder ByteToMessageDecoder这两个解码器来处理...

【Netty4.x】Netty TCP粘包/拆包问题的解决办法(二)

上一篇:【Netty4.X】Unity客户端与Netty服务器的网络通信(一)一、什么是TCP粘包/拆包  如图所示,假如客户端分别发送两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确...

Netty 粘包、断包解决

Netty和Mina一样是NIO通讯工具框架,有一定区别也有一定相似之处。Netty和Mina在数据包处理、传输时都有可能会出现粘包和断包的情况,下图对粘包、断包进行描述。 以下是网上对粘包的解决...
  • A123638
  • A123638
  • 2017年01月12日 15:23
  • 1056

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Netty之解决TCP粘包拆包(自定义协议)

1、什么是粘包/拆包        一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小...

高性能网络框架Netty的TCP拆包、粘包解决方案

简单地说,网络通信时由于TCP会对传输的数据报进行对用户透明的拆分与重新组装,然后将拆分后的分别发送,而我们接收时要获取发送时的数据报,如何再对其拆分与组装,以便于我们能知道报文的意思,这个提取报文的...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Netty解决半包(TCP粘包/拆包导致)读写问题
举报原因:
原因补充:

(最多只允许输入30个字)