Socket/TCP粘包、多包和少包, 断包

C#Socket通信,解决粘包和分包问题 源码下载,学习的时候做的,现在可以做到一个服务端对应多个客户端同时接受消息,也解决了分包和粘包的问题,欢迎下载 (16条消息) 网络通信编程学习.7z-C#文档类资源-优快云文库https://download.youkuaiyun.com/download/Trinity_Force/44900216 什么是粘包分包 TCP是面向连接的协议 TCP是点到点的通信 TCP提供可靠的传输服务 TCP协议提供全双工的通信 TCP协议面向字节流进行传输的,可以对用户的数据进行拆分或合并 TCP... 阅读详情

转自: http://blog.youkuaiyun.com/delez/article/details/7342341


为什么TCP 会粘包 

  前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整。为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? 带者问题,我们先分析一下问题。
  提到通信, 我们面临都通信协议,数据协议的选择。 通信协议我们可选择TCP/UDP:

  • TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的。
  • UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的。

由于TCP无消息保护边界, 需要在消息接收端处理消息边界问题。也就是为什么我们以前使用UDP没有此问题。 反而使用TCP后,出现少包的现象。

粘包的分析

上面说了原理,但可能有人使用TCP通信会出现多包/少包,而一些人不会。那么我们具体分析一下,少包,多包的情况。
  • 正常情况,发送及时每消息发送,接收也不繁忙,及时处理掉消息。像UDP一样.
  • 发送粘包,多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包. 这种情况和客户端处理繁忙,接收缓存区积压,用户一次从接收缓存区多个数据包的接收端处理一样。
  • 发送粘包或接收缓存区积压,但用户缓冲区大于接收缓存区数据包总大小。此时需要考虑处理一次处理多数据包的情况,但每个数据包都是完整的。
  • 发送粘包或接收缓存区积压, 用户缓存区是数据包大小的整数倍。 此时需要考虑处理一次处理多数据包的情况,但每个数据包都是完整的。
  • 发送粘包或接收缓存区积压, 用户缓存区不是数据包大小的整数倍。 此时需要考虑处理一次处理多数据包的情况,同时也需要考虑数据包不完整。
  我们的情况就属于最后一种,发生了数据包不完整的情况。
啰嗦了这么多,总结 一下, 就两种情况下会发生粘包。
  1. 发送端需要等缓冲区满才发送出去,造成粘包
  2. 接收方不及时接收缓冲区的包,造成多个包接收

如何应对

先卖个关子, 不是所有的粘包都需要处理。 我们先列举一下,免得在编码过程中,因为知道了粘包的情况下,都处理粘包。
  1. 连续的数据流不需要处理。如一个在线视频,它是一个连续不断的流, 不需要考虑分包。
  2. 每发一个消息,建一次连接的情况。
  3. 发送端使用了TCP强制数据立即传送的操作指令push。
  4. UDP, 前面已说明白了。在这在强调一下,UDP不需要处理,免的忘记了。
  • 如果用socket编写编程的话, 我就不多说我, 可参考下面的资料:
  • Grizzly: http://grizzly.java.net/nonav/docs/docbkx2.0/html/coreframework-samples.html User Guide 第二章的样例:解析收到的消息。
  • xSocket:http://xsocket.sourceforge.net/core/tutorial/V2/TutorialCore.htm 第 18 节。
  • Netty: http://netty.io/docs/3.2.6.Final/api/org/jboss/netty/handler/codec/frame/FrameDecoder.html FrameDecoder 的 API 文档。Netty 抽象了一个“消息桢解码器”的类来处理这些。
  • Mina 2:http://mina.apache.org/chapter-11-codec-filter.html
  • Mina 2:如果En文不好的话, 可参考http://freemart.iteye.com/blog/836654。  它在判断包是否完整时,有个小缺陷,它没使用IOBuffer的prefixedDataAvailable。但注释写的比较好。
把官网上的代码,也在这展示一下。

public class ImageResponseDecoder extends CumulativeProtocolDecoder {

   /** 
     * 返回值的解释: 
     * 1、false, 继续接收下一批数据,有两种情形,如缓冲区数据刚刚就是一个完整消息,或不够一条消息时。如果不够一条消息,那么会将下一批数据和剩余消息进行合并
     * 2、true, 当缓冲区的消息多于一条消息时,剩余消息会再会推送至doDecode
   */

    protected  boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)throws Exception {
       //发送数据时,头四个字节记录了消息的长度。 此方法会读四个字节,并和实现流长度对比。返回前,将流reset.
    if (in.prefixedDataAvailable(4)) {
       int length = in.getInt();
       byte [] bytes = newbyte[length];
       in.get(bytes);
       ByteArrayInputStream bais =new ByteArrayInputStream(bytes);
       BufferedImage image = ImageIO.read(bais);
       out.write(image);
        return true;//如果读取内容后还粘了包,系统会自动处理。
   }else{
       returnfalse;//继续接收数据,以待数据完整
    }  
  }
}

<p><span style="color: rgb(153, 255, 153);">    </span></p>
  • 再总结一下处理流程: 就发送数据时,包开始写入消息长度n, 当接收到的缓存区数据m,各处理流程如下:
  •   1)若n<m,则表明数据流包含多包数据,从其头部截取n个字节存入临时缓冲区,剩余部分数据依此继续循环处理,直至结束。或n>m
  •   2)若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。
  •   3)若n >m,则表明数据流内容尚不够构成一完整结构数据,需留待与下一包数据合并后再行处理。

参考

TCP 粘包问题浅析及其解决方案 最近一直在做中间件相关的东西,所以接触到的各种协议比较多,总的来说有TCP,UDP,HTTP等各种网络传输协议,因此楼主想先从协议最基本的TCP粘包问题搞起,把计算机网络这部分基础夯实一下。 贴个广告 楼主的博客已全部搬迁至自己的博客,感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 TCP协议的简单介绍 TCP是面向连接的运输层协议 简单来说,在使用TCP协议之前,必须先建... 阅读详情

相关推荐

C#TCP\Socket粘包处理(加长度头)

资料文件用于解决C#编程中发生的粘包问题的处理

C# 优雅的解决TCP Socket粘包、分包问题

文章目录一、概述二、探索问题2.1 源码位置2.2 Demo位置2.3 预热2.4 Config配置详解三、解决思路四、数据处理适配器概述4.1 正常数据处理适配器(`NormalDataHandlingAdapter`)4.2 固定包头数据处理适配器(`FixedHeaderPackageAdapter`)4.3 固定长度数据处理适配器(`FixedSizePackageAdapter`)4.4 终止因子分割数据处理适配器(`TerminatorPackageAdapter`)五、数据处理适配器工作原理六

若汝棋茗 的博客 1万+

C#开发医学影像胶片打印系统(一):万能花式布局的实现思路

本篇文章将介绍开发医学影像胶片打印系统(printscu模式)遇到不规则排版时的一种思路,一般来讲,医院打印胶片时都是整张胶片打印,但有时需要将多个病人或一个病人的多个检查打印在同一张胶片上,这时候就需要不规则排版来满足打印需求,使胶片利用率最大化。

罗万科技的博客 1325

Socket/TCP粘包、多包和少包, 断包

为什么TCP 会粘包    前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整。为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? 带者问题,我们先分析一下问题。   提到通信, 我们面临都通信协议,数据协议的选择。 通信协议我们可选择TCP/UDP: TCP(transport control protocol,传输控制协议)是面向连接的,面向

delez的专栏 1万+

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略

本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。

weixin_29233857的博客 248

facebook协议

支持同时登录多个Facebook账号,按照关键词采集小组地址,群发小组,批量添加推荐人,群发推 荐人消息,采集个人Facebook用户,群发用户私信,群发主页评论。通过客服台管理功能,和粉丝互动聊天,通过话术快捷回复,自动翻译聊天记录。通过FaceBook小组采集小组成员id,或者通过FaceBook个人主页,采集主页上粉丝批量操作已FaceBook账号添加推荐热,可以指定添加某个国家的推荐人,可以设置每个账号添加推荐人个数去重模式:所有的FaceBook账号不添加重复的推荐人。

2503_90751938的博客 956

四、网络编程之TCP黏包问题

网络通信过程中,我们可能遇到遇到一些问题,例如黏包、半包、丢包、包乱序等问题。那么我们应该如何解决这些问题呢?本文首先了解这问题产生的原因,再提出解决方法!

weixin_45004203的博客 1707

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度剖析了telnet连接失败,特别是端口23不可达的常见原因与系统性解决方案。文章从客户端本地配置、服务器端服务与防火墙、中间网络路径三个层面,提供了详细的排查步骤与命令,并强调了Telnet协议的安全风险,建议使用SSH等更安全的替代方案进行远程管理与端口测试。

weixin_29306011的博客 898

Socket/TCP粘包 多包和少包 断包

Socket/TCP粘包 多包和少包 断包

mmqqyyqqyyq的博客 704

08 RK3568 MAC TO MAC直连 RTL8367S mdio

本文:采用rk3568 gamc0 通过rgmii直连 交换芯片的mac口 通信方法为mdio。

qq_39451352的博客 3475

【置顶】ARMv8/ARMv9架构入门到精通-[目录]

周贺贺,baron,代码改变世界,coding_the_world,Arm精选,arm_2023,安全启动,加密启动 optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表,Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、V

baron-周贺贺-代码改变世界ctw 2万+

Socket/TCP粘包、多包和少包, 断包 问题

为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整。为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? 带者问题,我们先分析一下问题。 提到通信, 我们面临都通信协议,数据协议的选择。 通信协议我们可选择TCP/UDP: TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务

brk1985的专栏 1128

最新2026年《网络数据安全风险评估办法》条款解读

大型企业集团IT变革下的零信任安全体系建设方案(55页).pptx。以数据安全为核心的安全立体防御体系解决方案(41页).pptx。让数据安全合规地创造价值(15页 PPT).pptx。大型集团数据安全应急预案(57页).docx。数据安全治理与评估服务业务介绍.pptx。数据安全管理实践(17页).pptx。大数据安全架构设计方案.pptx。大数据安全规划总体方案.pptx。数据库安全综合治理方案.pptx。医疗数据安全建设方案.pptx。数据安全框架规划图.pptx。数据安全治理方案.pptx。

cdfunlove的博客 47
上一篇: TCP/IP、Http、Socket的区别
下一篇: Queue插入的时候报错的处理方法:源数组长度不足。请检查 srcIndex 和长度以及数组的下限
skywshing
博客等级 码龄17年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值