• 第四章 TCP粘包/拆包问题的解决之道---4.1---


      4.1 TCP粘包/拆包

        TCP是一个“流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

        

        4.1.1 TCP粘包/拆包问题说明

          4.1.2 TCP粘包/拆包发生的原因

            问题产生的原因有三个,分别如下:

            ⑴ 应用程序write写入的字节大小大于套接口发送缓冲区大小;

            ⑵ 进行MSS大小的TCP分段

            ⑶ 以太网帧的payload大于MTU进行IP分段。

          4.1.3 粘包问题的解决策略

            由于底层的TCP无法理解上层的业务数据,所以底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈来解决,根据业界的主流协议的解决方法,可以归纳如下:

            ⑴ 消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;

            ⑵ 在包尾增加回车换行符进行分割,例如FTP协议;

            ⑶ 将消息分为消息头和消息体,消息头中包含表示信息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示总长度;

            ⑷ 更复杂的应用层协议。

            啦啦啦

    啦啦啦

    啦啦啦

        

  • 相关阅读:
    Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]
    Storm系列(五)架构分析之Nimbus启动过程
    Storm系列(四)Topology提交校验过程
    Storm系列(三)Topology提交过程
    Storm系列(二)系统结构及重要概念
    Esper系列(一)初探
    scala学习笔记(四)样本类与模式匹配
    Storm系列(一)集群的安装配置
    Kafka系列(二)特性和常用命令
    Kafka系列(一)安装和配置说明
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6294233.html
Copyright © 2020-2023  润新知