查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)
Posted 落雷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)相关的知识,希望对你有一定的参考价值。
1、TCP粘包问题的产生(发送端)
由于TCP协议是基于字节流并且无边界的传输协议,因此很容易产生粘包问题。TCP的粘包可能发生在发送端,也可能发生在接收端。发送端的粘包是TCP协议本身引起的,TCP为了提高传输效率,发送方经常要收集到足够多的数据后才发送一个TCP段;若连续多次需要send()的数据都很少,此时TCP会根据优化算法将这些数据整合成一个TCP段后在发送,但接收方并不知道要一次接收多少字节的数据,此时就产生发送端的TCP粘包,具体图示如下:
2、粘包问题产生的原因
(1)套接字本身有缓冲区大小的限制(发送缓冲区、接收缓冲区)
(2)TCP传送的端MSS大小有限制
(3)链路层也有MTU大小限制,如果数据包大小>MTU,在IP层进行分片,导致数据分割
(4)TCP的流量控制和拥塞控制,也可导致粘包
(5)TCP延迟确认机制
3、解决方案
(1)定长包
(2)包尾加\\r\\n
(3)报文长度+报文内容,自定义包结构
(4)复杂的应用层协议
以上是关于查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)的主要内容,如果未能解决你的问题,请参考以下文章