文档章节

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

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

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
2018/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 本篇博客讲解:...

谙忆
2018/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

没有更多内容

加载失败,请刷新页面

加载更多

Pages Manager——可本地管理Pages服务内容,一键生成漂亮的文档界面。

Pages Manager Git地址 可本地管理Pages服务内容,一键生成漂亮的文档界面。在线预览 简单、轻便,无需安装数据库。 框架:spring-boot 数据库:sqlite 原理 本地维护一组markdown文档 将mar...

tanghc
17分钟前
1
0
基础目标检测算法介绍:CNN、RCNN、Fast RCNN和Faster RCNN

每次丢了东西,我们都希望有一种方法能快速定位出失物。现在,目标检测算法或许能做到。目标检测的用途遍布多个行业,从安防监控,到智慧城市中的实时交通监测。简单来说,这些技术背后都是强...

AI女神
18分钟前
1
0
哪有什么互联网寒冬?只是你穿的少而已!

声明:本文由终端研发部原创发布,未经允许,不得转载 前言 最近一段时间,大家都在说一些大公司纷纷裁员, 优化公司内部的组织架构。面对如此的寒冬变化,很多人在迷茫,在焦虑,在担忧自己...

终端研发部
23分钟前
2
0
nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)

Nginx 启动时报错:nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory) 原因:系统重启 /var/run/ 目录下文件会清空。 方法一: # sudo nginx -c /etc/ngi......

驛路梨花醉美
25分钟前
2
0
TiDB 源码阅读系列文章(二十四)TiDB Binlog 源码解析

作者:姚维 TiDB Binlog Overview 这篇文章不是讲 TiDB Binlog 组件的源码,而是讲 TiDB 在执行 DML/DDL 语句过程中,如何将 Binlog 数据 发送给 TiDB Binlog 集群的 Pump 组件。目前 TiDB 在...

TiDB
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部