boy-learning-netty | 08 Netty 是如何处理 TCP 粘包、半包等问题的

相关源码:boy-learning-netty
个人博客:http://bruce.bugmakers.club
内容来自《极客时间 - Netty源码剖析与实战》

Netty 是如何处理 TCP 粘包、半包等问题的

  • 什么是粘包和半包

  • 为什么 TCP 应用中会出现粘包和半包现象

  • 解决粘包和半包问题的集中常用方法

  • Netty 对三种常用封帧方式的支持

  • 解读 Netty 处理粘包、半包的源码

什么是粘包和半包

粘包

客户端多次发送 ABC, 服务端接收到 ABC? 如:ABCA, ABCAB, ABCABC

主要原因:

  • 发送方每次写入数据 < 套接字缓冲区大小
  • 接收方读取套接字缓冲区数据不及时

半包

客户端多次发送 ABC, 服务端接收到 A? B? 如:AB, BC, CA

主要原因:

  • 发送方每次写入数据 > 套接字缓冲区大小
  • 发送的数据大于协议的 MTU(Maximum Transmission Unit, 最大传输单元),必须拆包

换个角度看粘包和半包

  • 收发
    • 一个发送可能被多次接收,多个发送可能被一次接收
  • 传输
    • 一个发送可能占用多个传输包,多个发送可能公用一个传输包

为什么 TCP 应用中会出现粘包和半包现象

根本原因:

TCP 是流式协议,消息无边界。

提醒:UDP 像邮寄的包裹,虽然一次运输多个,但每个包裹都有“界限”,一个一个签收,所以无粘包、半包问题。

解决粘包和半包问题的集中常用方法

根本手段:找出消息的边界。

方式\比较 寻找消息边界的方式 优点 缺点 推荐度
TCP 连接改成短连接,一个请求一个短连接 建立连接到释放连接之间的信息即为传输信息 简单 效率低下 不推荐
封装成帧 Framing - 固定长度 满足固定长度即可 简单 浪费空间 不推荐
封装成帧 Framing - 分隔符 分隔符之间 空间不浪费,也比较简单 内容本身出现分隔符时需要转义,所以需要扫描内容,耗费资源 一般
封装成帧 Framing - 固定长度字段储存内容长度信息 先解析固定长度字段,再读取后续内容 精确定位用户数据,也不用转义 长度理论上有限制,需提前预知可能的最大长度从而定义长度占用字节数 推荐
封装成帧 Framing - 其他方式 每种都不同,如JSON可以看{}是否应已经成对 衡量实际场景 衡量实际场景 很多是对现有协议的支持

Netty 对三种常用封帧方式的支持

方式\支持 解码 编码
封装成帧 Framing - 固定长度 FixedLengthFrameDecoder 简单
封装成帧 Framing - 分隔符 DelimiterBasedFrameDecoder 简单
封装成帧 Framing - 固定长度字段储存内容长度信息 LengthFieldBasedFrameDecoder LengthFieldPrepender

解读 Netty 处理粘包、半包的源码

  • 解码核心工作流程
    ByteToMessageDecoder 入手

  • 解码中两种数据累计器(Cumulator)的区别

    第一种 MERGE_CUMULATOR(默认):内存复制
    第二种 COMPOSITE_CUMULATOR:逻辑视图

  • 三种解码器的常用额外控制参数有哪些

    长度
    分隔符(支持一个或多个)
    固定长度字段等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352