文档章节

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

天冰
 天冰
发布于 2014/06/19 10:49
字数 461
阅读 16416
收藏 12

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中的使用

//decoder
//1-读半包的解码器
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4)); 
//2-进行消息解码
ch.pipeline().addLast(new ProtobufDecoder(BoxAuthReqProto.AuthRequest.getDefaultInstance()));
//encoder					
ch.pipeline().addLast(new LengthFieldPrepender(4));
ch.pipeline().addLast(new ProtobufEncoder());



© 著作权归作者所有

共有 人打赏支持
天冰
粉丝 6
博文 24
码字总数 17657
作品 0
程序员
Netty 粘包/拆包应用案例及解决方案分析

熟悉TCP变成的可以知道,无论是客户端还是服务端,但我们读取或者发送消息的时候,都需要考虑TCP底层粘包/拆包机制,下面我们先看一下TCP 粘包/拆包和基础知识,然后模拟一个没有考虑TCP粘包...

Java/Python
08/21
0
0
Netty构建游戏服务器(四)--JAVA与unity通过protobuf通信

一,概要 1,服务器端采用Netty,前面的教程已经讲述了netty的基本用法和原理。使用的是java自带的编码解码方式,现在为了和unity通信,选用google备受关注的protobuf来编码解码。protobuf优...

安世博
2016/09/20
828
0
【Netty】Netty实例开源项目

版权声明:本文为谙忆原创文章,转载请附上本文链接,谢谢。 https://blog.csdn.net/qq_26525215/article/details/81989644 Netty netty-not-sticky-pack-demo 项目地址 Netty 本篇博客讲解:...

谙忆
08/23
0
0
Netty5入门学习笔记001

Netty官网:http://netty.io/ 本例程使用最新的netty5.x版本编写 服务器端: TimeServer 时间服务器 服务端接收客户端的连接请求和查询当前时间的指令,判断指令正确后响应返回当前服务器的校...

山东-小木
2014/12/17
0
10
Netty精粹之TCP粘包拆包问题

粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生这个问题,因此这篇文章只...

Float_Luuu
2016/02/27
8.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

怎样使用主流缓存更新策略来减少性能消耗?

在互联网项目开发中,缓存的应用是非常普遍了,缓存可以帮助页面提高加载速度,减少服务器或数据源的负载。 一、为什么需要缓存? 一般在项目中,最消耗性能的地方就是后端服务的数据库了。而...

Java干货分享
17分钟前
1
0
杭州云栖大会阿里云放大招,8K远程医疗会诊引关注

大家每天都会照镜子,镜子里的一切都清清楚楚,足可乱真,可是你想过有一天看视频直播就像照镜子么? 这不,在云栖大会的C馆里,8K超高清直播体验馆前异常火爆,在这里,很多参会者都围着有1...

阿里云云栖社区
19分钟前
16
0
C++获取系统盘符极简方法

盘符获取 std::shared_ptr<std::list<wchar_t>> disks(void) {wchar_t data[255];return [&](int length)->std::shared_ptr<std::list<wchar_t>> {auto result = std::make_shared< s......

CHONGCHEN
19分钟前
1
0
Python 操作samba文件服务器

# /usr/bin/env python# -*- coding:utf-8 -*-from smb.SMBConnection import SMBConnectionconn = SMBConnection('root', '123456', 'any', '', use_ntlm_v2 = True)assert conn.......

China丶小可
26分钟前
1
0
vue引入echart.js打包时特别大

link : https://www.cnblogs.com/strinkbug/p/5786222.html 一、i在html中添加script标签如下: <script src="//cdn.bootcss.com/echarts/3.2.2/echarts.simple.min.js"></script> 二、在web......

Js_Mei
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部