网络——tcp粘包概念与解决
作者:小 琛
欢迎转载,请标明出处
何为tcp粘包
tcp传输特点:面向连接、可靠传输、面向字节流
tcp传输是一种面向字节流的方式,最大的优点就是使用方便,我们可以直接以字节为单位进行操作,但也带来了一个最大的问题:粘包。
何为tcp传输粘包?
TCP粘包就是指发送方发送的若干个数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。
例如下面的例子:客户端发送了两次1+1,希望得到计算结果,服务端并未在第一次发送后处理,而此时接收缓存区就会将两次发送内容都放到缓冲区,因此变成了1+11+1。
tcp粘包的解决方式
-
通信双方规定传输数据长度
udp协议中,其头部就包含了数据的大小,因此不存在粘包问题。 -
包头+数据+分隔符
- 包头的大小应为确定的。
因此在传输数据的时候,大小应为:包头长度+包头内提示的数据长度。
例如:recv(sockfd, buff, “sizeof(包头)+包头内提示长度”) - 判断是否为包头,依据分隔符。即该内容中有无分隔符,有的话分隔符下一个就是包头
总结
- 定长包头+数据(有效数据载荷)+分隔符,是最完美的解决粘包问题的方法。
- 定长包头中要可以或许当前传输数据的长度,而分隔符可以找到下一条数据的起始位置,即下一条数据的包头。
- 分隔符不一定是一个字节的字符,也可以是一个字符串,一般工业使用\r,\n等。
- 分隔符实际作用就是定义数据边界。