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解决半包(TCP粘包/拆包导致)读写问题

摘要 使用Netty进行异步IO编程,同事问我粘包/拆包问题如何处理,所以抽空分析一下TCP粘包/拆包问题的产生;Netty提供了多种编解码器用于处理半包问题,熟练掌握了类库的应用,TCP粘包问题变得...
  • LANGZI7758521
  • LANGZI7758521
  • 2016年07月23日 15:50
  • 3545

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

概述在李林锋的Netty系列之Netty编解码框架分析中介绍了各种解码器,也推荐组合LengthFieldBasedFrameDecoder ByteToMessageDecoder这两个解码器来处理...
  • linsongbin1
  • linsongbin1
  • 2017年09月10日 10:29
  • 3719

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

TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限没有分割的一串数据。TCP会根据缓冲区的实际情况进行包划分,一个完整的包可能会拆分成多个包进行发送,也用可能把多个小包封装成一个大的数...
  • weiqubo
  • weiqubo
  • 2015年05月12日 09:55
  • 2932

Netty4实战 - TCP粘包&拆包解决方案(这个文章解决了自己想解决的问题)

目录(?)[-] TCP黏包拆包粘包问题的解决策略Netty粘包和拆包解决方案 LineBasedFrameDecoder解码器 Netty依赖1 Server端2 Client ...
  • a925907195
  • a925907195
  • 2017年07月11日 11:08
  • 1726

Netty学习10-粘包和拆包

1 粘包拆包基本概念 TPC是一个面向流的协议。所谓流就是没有边界的一串数据,如同河水般连成一片,其中并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的具体情况进行包的划分...
  • woshixuye
  • woshixuye
  • 2017年01月04日 09:24
  • 1643

netty中拆包粘包问题

基础知识 1.首先图解拆包/粘包问题出现的原因 假设现在客户端向服务器端发送数据,在某一时间段上客户端分别发送了D1和D2二个数据包给服务器,由于服务器一次读取到的字节数是不确定的,故存在以...
  • yang920106
  • yang920106
  • 2017年04月16日 13:58
  • 108

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

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

Netty4 自定义Decoder,Encoder进行对象传递(粘包处理)

首先我们必须知道Tcp粘包和拆包的,TCP是个“流”协议,所谓流,就是没有界限的一串数据,TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际数据进行包的划分,一个完整的包可能会被拆分...
  • AlbertFly
  • AlbertFly
  • 2016年05月29日 21:23
  • 4265

一起学Netty(七)之 TCP粘包拆包基本解决方案

可以看到被分了20次读取,我们可以这样理解,客户端发送了2次req字节,每个req中有10个“$$__”,这样就是第11次切割的时候其实发送了粘包,第一个req中末尾部分和第二次的头部粘在了一起,作为...
  • linuu
  • linuu
  • 2016年05月07日 17:17
  • 10883

Netty精粹之TCP粘包拆包问题

粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生这个问题,因此这篇文章只讨论发生在传输层的T...
  • huaweitman
  • huaweitman
  • 2016年03月19日 15:53
  • 1709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Netty解决半包(TCP粘包/拆包导致)读写问题
举报原因:
原因补充:

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