`

じ☆ve弦-AS网游中Socket数据的沾包分析与对策

阅读更多

摘抄:

 

ActionScript3+Java(包括任何后台服务器语言)网游戏数据同步问题一直是众多开发人员在开发中常遇到的一个头痛问题,现贴些经验供大家参考参考。
    关于TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。           
    出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据(图1所示)。           
    粘包情况有两种,一种是粘在一起的包都是完整的数据包(图1、图2所示),另一种情况是粘在一起的包有不完整的包(图3所示),此处假设用户接收缓冲区长度为m个字节。           
    不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。           
    在处理定长结构数据的粘包问题时,分包算法比较简单;在处理不定长结构数据的粘包问题时,分包算法就比较复杂。特别是如图3所示的粘包情况,由于一包数据内容被分在了两个连续的接收包中,处理起来难度较大。实际工程应用中应尽量避免出现粘包现象。           
    为了避免粘包现象,可采取以下几种措施。一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。           
    以上提到的三种措施,都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。           
    一种比较周全的对策是:接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开。对这种方法我们进行了实验,证明是高效可行的。

分享到:
评论
3 楼 leopard0825 2010-04-15  
ActionScript 3 中的对象序列化
http://lixinye0123.iteye.com/blog/318188
2 楼 leopard0825 2010-04-15  
http://blog.csdn.net/zhangcq2108/archive/2010/04/12/5474217.aspx
1 楼 leopard0825 2010-04-15  
这个问题是比较经典的.消息包定界问题
我们将每一个包的数据结构定成 消息号ID+消息长度+消息内容
那么消息号和长度假设是2字节表示,那么整个包就是长度+4字节
于是在传送过程中不断检查上述内容,如果粘包就只读固定字节的内容,
如果分包,就把包截断. 就可以解决这个问题.

相关推荐

    じ☆ve Hebe支持库1.0版(じ☆ve Hebe.fne)-易语言

    而【じ☆ve Hebe支持库1.0版】就是为了让易语言的功能更加丰富和强大,尤其是在与操作系统交互方面提供了便利。 在Windows操作系统环境下,许多底层功能的实现都需要调用API(Application Programming Interface)...

    Proxmox VE 8.2-2 ISO 官方镜像(分包1)

    Proxmox VE 8.2-2 ISO 官方镜像(分包1) Proxmox VE是一个既可以运行虚拟机也可以运行容器的虚拟化平台。Proxmox VE基于Debian Linux开发,并且完全开源。出于灵活性的考虑,Proxmox VE同时支持两种虚拟化技术:KVM...

    Proxmox VE 8.2-2 ISO 官方镜像

    Proxmox VE 8.2-2 ISO 官方镜像(一定要下载另外一个分包1) Proxmox VE是一个既可以运行虚拟机也可以运行容器的虚拟化平台。Proxmox VE基于Debian Linux开发,并且完全开源。出于灵活性的考虑,Proxmox VE同时支持...

    Ve--zon-2020年数据泄露调查报告(英文)-2020.8-119页精品报告2020.pdf

    《Ve--zon-2020年数据泄露调查报告》详细介绍了2020年全球数据泄露事件的统计、分析和趋势。该报告通过严谨的数据分析,从不同维度对数据泄露事件进行分类和总结,并提供了一系列针对数据泄露的预防措施和建议。 ...

    じ☆ve Hebe支持库1.0#0版(第三方)

    ★ 不能载入支持库“じ☆ve Hebe支持库1.0版”,其文件名为“じ☆ve Hebe.fne”,数字签名为“{EEEEEEEE-3B3B-0051-3C8E-9CF37CE396F5}”,请确认易语言中是否安装了此支持库。资源作者:。易语言官方论坛。资源界面...

    java 可视化插件 ve(4)VE-examples-1.2.3_jem.zip

    由于上传限制,可是化插件压缩成了6个包: VE(1):emf-sdo-runtime-2.2.0.zip VE(2): GEF-runtime-3.2.zip VE(3): VE-Automated-Tests-1.2.3_jem.zip VE(4): VE-examples-1.2.3_jem.zip VE(5):VE-...

    NLpack1-VE-runtime-1.2.1

    NLpack1-VE-runtime-1.2.1是Eclipse集成开发环境的一个扩展包,主要用于增强Eclipse的中文语言支持。这个版本号1.2.1代表了该插件的迭代改进,通常会包含错误修复、性能提升以及可能的新功能。 Eclipse是一个广泛...

    じ☆veHebe支持库

    【じ☆ve Hebe支持库】是一个专门为开发者设计的软件组件,它提供了丰富的功能和接口,以便于在项目中实现特定的技术需求。这个库可能是针对某一编程语言或平台的,如Java、Python、Android或是iOS等,其核心目标是...

    Proxmox VE 7.2-1官方镜像

    Proxmox VE 7.2-1官方镜像

    D--R&Ve--zon-2020ve--zon数据泄露调查报告(英文)-2020.8-67页精品报告2020.pdf

    2020年Verizon数据泄露调查报告(DBIR)是Verizon公司发布的一份关于数据泄露事件的年度分析报告。该报告收集和分析了大量安全事件数据,对当年的数据泄露趋势、攻击手法、行业特定风险、区域差异以及各类资产和行动...

    Proxmox VE 8.2-1 ISO 官方镜像(分包1)

    Proxmox VE 8.2-1 ISO 官方镜像 Proxmox VE是一个既可以运行虚拟机也可以运行容器的虚拟化平台。Proxmox VE基于Debian Linux开发,并且完全开源。出于灵活性的考虑,Proxmox VE同时支持两种虚拟化技术:KVM虚拟机和...

    Proxmox VE 8.2-1 ISO 官方镜像

    Proxmox VE 8.2-1 ISO 官方镜像(一定要下载另外一个分包1) Proxmox VE是一个既可以运行虚拟机也可以运行容器的虚拟化平台。Proxmox VE基于Debian Linux开发,并且完全开源。出于灵活性的考虑,Proxmox VE同时支持...

    VE-runtime-1.2.3_jem.zip

    eclipse 3.3的可视化编程利器——VE,需要的几个插件之一,全部需要的插件列表:emf-sdo-runtime-2.2.0,GEF-runtime-3.2,VE-runtime-1.2.3_jem,VE-SDK-1.2,注意版本!

    VE-SDK-1.2

    eclipse可视化插件安装必备插件之一:VE-SDK-1.2。eclipse全部可视化插件正确配置是eclipse-SDK-3.2-win32,emf-sdo-runtime-2.2.0,GEF-runtime-3.2,VE-runtime-1.2,VE-SDK-1.2

    VE-Update-1.4.0.zip/

    Java JDK/JRE要高于version 1.4.2。 然后安装Eclipse,然后安装EMF(Eclipse Modeling Framework)和GEF(Graphical Editor Framework)。 之后才能安装Visual Editor相关的东西,包括runtime、SDK、examples和Junit...

    VE-Update eclipes 可视化插件

    **VE-Update Eclipse 可视化插件详解** 在软件开发的世界中,Eclipse 是一款广泛应用的集成开发环境(IDE),以其强大的可扩展性和丰富的插件库而闻名。"VE-Update Eclipse 可视化插件"是针对Eclipse平台设计的一款...

    yiren-p8Yii-ve2467575-x64.apk

    yiren-p8Yii-ve2467575-x64.apk

    VE插件-图形编程

    "VE插件-图形编程"主要指的是Visual Editor(VE)插件,这是一个为Eclipse集成开发环境(IDE)设计的图形化编程工具。Eclipse是一个开源的、跨平台的软件开发平台,它提供了丰富的插件支持,使得开发者可以扩展其...

    VE-Update1.4

    "VE-Update1.4" 是一个针对 Eclipse 的可视化编程插件更新,旨在提升开发者在 Eclipse 环境中的代码编写体验。Eclipse 是一款广泛使用的开源集成开发环境(IDE),支持多种编程语言,而 VE 插件则为其带来了图形化的...

Global site tag (gtag.js) - Google Analytics