CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
粘包问题简介
15
2019-04-26 14:56:59
概念相关
## TCP粘包是什么 是指使用TCP协议时一次性接收到的“消息数据包”过多,无法有效分隔每个包的数据。 比如,两个文件未经特殊处理,按顺序在同一个TCP连接中传输,接收端从接收缓冲区中读取的数据就很难区分两个文件数据的分界点在哪。 当然,TCP协议本身并不是基于数据包的协议,这是在理论基础上对实际生产环境妥协造成的结果。 ## 粘包产生的原因 众所周知,TCP协议是需要在客户端和服务端经过三次握手建立一个端到端的连接的。也就是说,每次通过TCP协议发送的消息,需要经过如下过程: 1. 建立连接,三次握手 2. 发送数据 3. 断开连接 生产中使用TCP连接有两种方式: - `TCP短连接` 必要时才建立连接,数据发送结束后就断开连接,释放资源 每次发送的数据量很小,那么在建立连接与断开连接的操作上的消耗占比就会过大,导致系统资源、系统响应时间等均收到影响 但是,如果能够确保一包数据发送完成后就断开连接,那么不会出现粘包问题 - `TCP长连接` 建立连接后不断开 只有一次建立连接的消耗,后续可以复用这个连接反复进行数据传输,吞吐量会更高 TCP被设计为可靠的流传输协议,会自适应地重发丢失的数据,理论上TCP发送完完整的消息就应当断开。 但是,为了更高的效率及避免网络拥塞,实际生产环境往往会使用一个长连接收发多段数据。一旦发送方将多个数据通过一个连接发送(比如`Nagle`优化算法,将多个小数据块合并发送),那么接收方就得使用相应的方法区分多个数据,否则就出现了粘包问题。 另外,由于UDP不是基于流的协议,发送的数据单位都是一个有界的整体,不存在连接复用的问题,因此使用UDP协议发送数据不会出现粘包问题。 ## 常用的粘包解决方案 常用的方法主要是以下三种,都各有优缺点,适合不同的使用场景: - **发送固定长度的消息** 优点:定长,解析逻辑简单 缺点:有时不能充分利用到消息的所有空间,数据长度不足时可能需要填充到定长 - **使用特殊标记区分两个消息** 优点:额外的数据量最少 缺点:实际在数据流中检测这个标记相对麻烦 - **将实际数据再包装为消息头和消息体,用定长的消息头并在消息头中包含消息体的长度** 优点:检测逻辑简单效率高 缺点:每个消息需要额外传输一个消息头
发布文章 101
文章被阅读 1606
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。