TCP 粘包拆包
一、什么是粘包拆包?
粘包拆包是TCP协议传输中一种现象概念。TCP是传输层协议,他传输的是“流”式数据,TCP并不知道传输是哪种业务数据,或者说,并不关心。它只是根据缓冲区状况将数据进行包划分,然后进行传输。

在这个前提下,就有可能发生发生同一个业务数据被分割程多个数据包,或者多个业务数据被打包到同一个数据包进行发送。但是对于业务数据接收方,则必须拥有能够重新拆解或者组装完整业务数据的能力。这个现象,我们称之为TCP粘包拆包。

如上图,三个业务数据A、B、C被打包成一个数据包进行传输;D被分割为连个数据包进行传输。
所以综上,影响粘包拆包发生的原因:

1、业务数据的大小<>TCP 套接字缓冲区大小
如果需要写入的应用数据大于当前设置的TCP套接字缓冲区,则需要对应用数据进行分次写入。
SO_SNDBUF:发送缓冲区大小。
SO_RCVBUF:接收缓冲区大小。
应用首先将数据写入TCP套接字缓冲区,然后等待发送。默认情况下,多数操作系统支持动态调节SO_SNDBUF大小以进行自适应,但是如果有主动设置,则自动调节会失效。
2、MSS大小传输线制
标识TCP传往另一段的最大数据长度,建立连接时,双发通告自己允许的MSS(只能出现在SYN报文中)。
3、MTU大小限制
网路中主机之间的MTU不是一个常数,取决于所选择的路由,而且路径不一定对称(A到B的选路,B到A的选路).

因为每一次发送报文都会包含IP及TCP首部,所以,发送的报文段越大,效率越高,但是以不发生报文分段及双方都接受为基础。否则以较小的MTU发送。
关于MTU MSS相关知识可以参照:MTU(Maximum transmission unit) 最大传输单元
二、怎么处理粘包拆包?
传输层是业务无感知的,因此粘包拆包只能由业务层处理。通过指定收发两端共同的约定规约,发送方按照特定的规则组装数据,接收方按照同样的规则拆解数据。
这个共同的约定规约,我们通常称之为应用层协议;发送方组装数据的过程称之为编码;接收方拆解数据的过程称之为解码。
常见的协议处理有如下:
1、固定长度消息
在预知最大报文不超特定长度的情况下,可以规定报文大小固定,业务数据不足则以特定的空间占位。

2、特定分隔符分割消息
每条消息尾部加特定分割符进行消息分割。

3、消息头+消息体
每一条消息包含一个消息头和一个消息体,消息头使用固定长度占位,内部写入当前消息消息体的数据长度。接收方首先读取消息头数据,然后根据指明的消息长度进行消息体的读取。

应用协议没有统一的规则限制,如上,我们只是简要说明可能使用的应用协议形式,实际应用中,也会根据特定的场景需求进行定向的优化。
TCP 粘包拆包的更多相关文章
- Netty(三)TCP粘包拆包处理
tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. 粘包.拆包问题说明 假设客户端分别发送数据包D1和D ...
- TCP粘包/拆包问题
无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河 ...
- TCP 粘包/拆包问题
简介 TCP 是一个’流’协议,所谓流,就是没有界限的一串数据. 大家可以想想河里的流水,是连成一片的.期间并没有分界线, TCP 底层并不了解上层业务数据的具体含义 ,它会根据 TCP 缓冲区 ...
- TCP粘包/拆包问题的解决
TCP粘包拆包问题 一个完整的包可能被TCP拆分成多个包,或多个小包封装成一个大的数据包发送. 解决策略 消息定长,如果不够,空位补空格 在包尾增加回车换行符进行分割,例如FTP协议 将消息分为消息头 ...
- Netty(二)——TCP粘包/拆包
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...
- 第四章 TCP粘包/拆包问题的解决之道---4.1---
4.1 TCP粘包/拆包 TCP是一个“流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可 ...
- Java网络编程基础之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- TCP粘包/拆包 ByteBuf和channel 如果没有Netty? 传统的多线程服务器,这个也是Apache处理请求的模式
通俗地讲,Netty 能做什么? - 知乎 https://www.zhihu.com/question/24322387 谢邀.netty是一套在java NIO的基础上封装的便于用户开发网络应用程 ...
- netty之==TCP粘包/拆包问题解决之道(一)
一.TCP粘包/拆包是什么 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在 ...
- Netty使用LineBasedFrameDecoder解决TCP粘包/拆包
TCP粘包/拆包 TCP是个”流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TC ...
随机推荐
- [ES6系列-07]Generator Function: 生成器函数
[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs Generator function 生成器函数是E ...
- Java——super的使用
总是忘了,还是记下来吧~~ With super(), the superclass no-argument constructor is called. With super(parameter l ...
- akka-typed(2) - typed-actor交流方式和交流协议
akka系统是一个分布式的消息驱动系统.akka应用由一群负责不同运算工作的actor组成,每个actor都是被动等待外界的某种消息来驱动自己的作业.所以,通俗点描述:akka应用就是一群actor相 ...
- 使用 git add -p 整理 patch
背景 当我们修改了代码准备提交时,本地的改动可能包含了不能提交的调试语句,还可能需要拆分成多个细粒度的 pactch. 本文将介绍如何使用 git add -p 来交互式选择代码片段,辅助整理出所需的 ...
- Hystrix微服务容错处理及回调方法源码分析
前言 在 SpringCloud 微服务项目中,我们有了 Eureka 做服务的注册中心,进行服务的注册于发现和服务治理.使得我们可以摒弃硬编码式的 ip:端口 + 映射路径 来发送请求.我们有了 F ...
- Chisel3 - bind - PortBinding
https://mp.weixin.qq.com/s/NaInHsJgOwG03BLNF-wlxQ 介绍Module输入输出端口如何进行绑定. 1. IO() 在定义一个模块 ...
- Java实现 蓝桥杯VIP 算法提高 师座操作系统
算法提高 师座操作系统 时间限制:1.0s 内存限制:256.0MB 问题描述 师座这天在程序设计课上学了指针和结构体以后,觉得自己可以轻松的写出操作系统,为了打败大微软帝国,他给这个系统起了个响亮的 ...
- Java中IO软件包的详细介绍
一.Java Io流 Java Io流的概念 java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作.在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为" ...
- Java实现第十届蓝桥杯不同子串
试题 C: 不同子串 本题总分:10 分 [问题描述] 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串.例如,字符串aaab 有非空子串a, b, aa, ab, aaa, ...
- 一篇文章快速搞懂 Atomic(原子整数/CAS/ABA/原子引用/原子数组/LongAdder)
前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized,还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入 ...