一、前言

在客户端与服务端进行通信时候都会约定一个通讯协议,协议一般包含一个header和body,一个header和body组成了一次通讯的内容,一个通讯包。正常情况下客户端通过socket发送一个请求包后,服务端接受后解析请求包,然后进行处理,这看似是一个很简单的问题,但当客户端连续发送多个请求包时就可能会出现半包、粘包现象。

二、什么是粘包与半包问题

在客户端发送数据时,实际是把数据写入到了TCP发送缓存里面的。

如果发送的包的大小比TCP发送缓存的容量大,那么这个数据包就会被分成多个包,通过socket多次发送到服务端,服务端第一次从接受缓存里面获取的数据,实际是整个包的一部分,这时候就产生了半包现象,半包不是说只收到了全包的一半,是说收到了全包的一部分。

如果发送的包的大小比TCP发送缓存容量小,并且TCP缓存可以存放多个包,那么客户端和服务端的一次通信就可能传递了多个包,这时候服务端从接受缓存就可能一下读取了多个包,这时候就出现了粘包现象。

服务端从接受缓存读取数据后一般都是进行解码操作,也就是会把byte流转换了pojo对象,如果出现了粘包或者半包现象,则进行转换时候就会出现异常。

出现粘包和半包的原因是TCP层不知道上层业务的包的概念,它只是简单的传递流,所以需要上层应用层协议来识别读取的数据是不是一个完整的包。

三、如何避免

  • 比较常见方案是应用层设计协议时候协议包分为header和body,header里面记录body长度,当服务端从接受缓冲区读取数据后,如果发现数据大小小于包的长度则说明出现了半包,这时候就回退读取缓存的指针,等待下次读事件到来的时候再次测试。如果发现包长度大于了包长度则看长度是包大小整数倍则说明了出现了粘包,则循环读取多个包,否者就是出现了多个整包+半包。

  • 多个包之间添加分隔符。

  • 包定长,每个包大小固定长度。

四、总结

本文介绍了网络通讯中粘包和半包的概念,出现原因,以及常用的应对策略。最后想学系统学习Java并发的童鞋可以 单击我

Dubbo剖析-粘包与半包问题(一)相关推荐

  1. Dubbo剖析-Netty粘包与半包问题(一)

    一.前言 在客户端与服务端进行通信时候都会约定一个通讯协议,协议一般包含一个header和body,一个header和body组成了一次通讯的内容,一个通讯包.正常情况下客户端通过socket发送一个 ...

  2. Java NIO 框架 Netty 之美:粘包与半包问题

    Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它 ...

  3. netty半包粘包 处理_Java NIO 框架 Netty 之美:粘包与半包问题

    一.前言 Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性 ...

  4. TCP 协议如何解决粘包、半包问题

    TCP 协议是流式协议 很多读者从接触网络知识以来,应该听说过这句话:TCP 协议是流式协议.那么这句话到底是什么意思呢?所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标 ...

  5. TCP 粘包、半包 Netty 全搞定

    什么是粘包和半包? 粘包的主要原因: • 发送方每次写入数据 < 套接字缓冲区大小 • 接收方读取套接字缓冲区数据不够及时 半包的主要原因: • 发送方写入数据 > 套接字缓冲区大小 • ...

  6. socket编程 TCP 粘包和半包 的问题及解决办法

    socket编程 TCP 粘包和半包 的问题及解决办法 参考文章: (1)socket编程 TCP 粘包和半包 的问题及解决办法 (2)https://www.cnblogs.com/panchang ...

  7. Netty——ByteBuffer(ByteBuffer消息粘包、半包示例)

    目录 一. ByteBuffer消息粘包.消息半包的概述 二.示例需求 三.示例代码 一. ByteBuffer消息粘包.消息半包的概述 NIO是面向缓冲区进行通信的,不是面向流的.既然是缓冲区,那它 ...

  8. 面试突击:什么是粘包和半包?怎么解决?

    粘包和半包问题是数据传输中比较常见的问题,所谓的粘包问题是指数据在传输时,在一条消息中读取到了另一条消息的部分数据,这种现象就叫做粘包.比如发送了两条消息,分别为"ABC"和&qu ...

  9. Socket TCP协议解决粘包、半包问题的三种解决方案

    什么是粘包.半包问题:         粘包:例如服务端依次将两条消息发送给客户端,我们暂且简单的将这两条消息举例为"Hello"."Unity",而客户端一次 ...

最新文章

  1. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理
  2. [tensorflow、神经网络] - 使用tf和mnist训练一个识别手写数字模型,并测试
  3. idea main scanner 输入_哇晒,你竟然不知道idea的 Live Templates
  4. CSS Framework 960 Grid System (收)
  5. [导入][导入][c#]Web开发中Tag的开发技巧
  6. Nginx学习之九-负载均衡(客户端请求与Nginx进程间负载均衡)
  7. php smarty 语法,php之Smarty根本语法和三大变量
  8. 在python程序中嵌入浏览器_用Python中的wxPython实现最基本的浏览器功能
  9. 系统辨识与自适应控制matlab仿真下载,系统辨识与自适应控制MATLAB仿真 全部程序...
  10. Xman的东西当然值钱了。每1单位高度的植物,就可以卖2美元,把减掉的植物都卖掉,就可以弥补罚单的损失了。你帮Xman计算一下一共可以卖多少钱。
  11. 运放 采集电压 电流高端采样
  12. 爱乐馆-无损古典之刘汉盛榜单100牒
  13. AI 去掉图片的背景色
  14. 全新Funtool趣工具iApp软件库源码+工具箱源码
  15. android定位附近店铺,高德地图怎么添加店铺位置_高德地图定位怎么设置添加自己家店铺位置_攻略...
  16. kodi+java版_[转] Emby+KODI--完美的NAS多媒体方案
  17. 用户未登录跳转至登录页面
  18. 扔硬币先手获胜概率问题
  19. python蓝牙的使用
  20. 拨开云雾synchronized使用五种方式介绍

热门文章

  1. python中init和属性_python类的属性不在\uyu init中__
  2. 52o1314小符号_特殊名字符号(52o1314特殊上下组合小符号)
  3. Python基础知识 2022-11-14 ★ 小结 43-50 字典_集合
  4. 【python】保存某个文件夹下所有图片名字到一个txt文件里
  5. python爬取斗鱼B总直播弹幕
  6. java继承求5个圆柱体积_编写Javat程序,计算并输出一个半径为10.5,高为20的圆柱体的体积。...
  7. java cda安装_JAVA如何与R完美结合起来
  8. 计算机python教程_Python 如何入门?附Python教程下载
  9. mysql utl_file_Oracle的UTL_FILE包
  10. 山海演武传·黄道·第二卷 大风起兮 第二 ~ 三章 傲娇的赤龙皇女