转载和积累系列 - TCP粘包和拆包问题
2014-12-15 20:59
225 查看
问题产生
一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题。下面可以看一张图,是客户端向服务端发送包:
1. 第一种情况,Data1和Data2都分开发送到了Server端,没有产生粘包和拆包的情况。
2. 第二种情况,Data1和Data2数据粘在了一起,打成了一个大的包发送到Server端,这个情况就是粘包。
3. 第三种情况,Data2被分离成Data2_1和Data2_2,并且Data2_1在Data1之前到达了服务端,这种情况就产生了拆包。
由于网络的复杂性,可能数据会被分离成N多个复杂的拆包/粘包的情况,所以在做TCP服务器的时候就需要首先解决拆包/粘包的问题。
TCP粘包和拆包产生的原因
1. 应用程序写入数据的字节大小大于套接字发送缓冲区的大小2. 进行MSS大小的TCP分段。MSS是最大报文段长度的缩写。MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是TCP报文段的最大长度,而是:MSS=TCP报文段长度-TCP首部长度
3. 以太网的payload大于MTU进行IP分片。MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成托干片,让每一片都不超过MTU。注意,IP分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
TCP粘包和拆包的解决策略
1. 消息定长。例如100字节。2. 在包尾部增加回车或者空格符等特殊字符进行分割,典型的如FTP协议
3. 将消息分为消息头和消息尾。
4. 其它复杂的协议,如RTMP协议等。
参考:《Netty权威指南》
相关文章推荐
- [转载]解决TCP网络传输“粘包”问题
- 转载和积累系列 - 百度 搜索引擎中的粒度问题
- 转载和积累系列 - 内存碎片化问题
- 【转载】TCP粘包问题分析和解决(全)
- Netty系列-TCP粘包拆包问题
- TCP粘包问题分析和解决(全)转载文章记录下资源
- 转载和积累系列 - TCP协议疑难杂症全景解析
- 转载和积累系列 - 一个比较困扰的SVN问题
- 解决TCP网络传输“粘包”问题
- [转载]数学之美 系列十八 - 矩阵运算和文本处理中的分类问题
- 解决TCP网络传输“粘包”问题
- TcpClient.Connect函数连接超时的问题(转载)
- Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决-转载
- 转:解决TCP网络传输“粘包”问题
- 解决TCP网络传输“粘包”问题
- 解决TCP网络传输“粘包”问题
- TCP网络传输"粘包"问题
- 解决TCP网络传输“粘包”问题
- 解决TCP网络传输“粘包”问题
- 解决TCP网络传输“粘包”问题