网络——tcp粘包概念与解决

作者:小 琛
欢迎转载,请标明出处

何为tcp粘包

tcp传输特点:面向连接、可靠传输、面向字节流

tcp传输是一种面向字节流的方式,最大的优点就是使用方便,我们可以直接以字节为单位进行操作,但也带来了一个最大的问题:粘包。

何为tcp传输粘包?
TCP粘包就是指发送方发送的若干个数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。

例如下面的例子:客户端发送了两次1+1,希望得到计算结果,服务端并未在第一次发送后处理,而此时接收缓存区就会将两次发送内容都放到缓冲区,因此变成了1+11+1。
网络——tcp粘包概念与解决

tcp粘包的解决方式

  1. 通信双方规定传输数据长度
    网络——tcp粘包概念与解决
    udp协议中,其头部就包含了数据的大小,因此不存在粘包问题。

  2. 包头+数据+分隔符
    网络——tcp粘包概念与解决

  • 包头的大小应为确定的。
    因此在传输数据的时候,大小应为:包头长度+包头内提示的数据长度。
    例如:recv(sockfd, buff, “sizeof(包头)+包头内提示长度”)
  • 判断是否为包头,依据分隔符。即该内容中有无分隔符,有的话分隔符下一个就是包头

总结

  1. 定长包头+数据(有效数据载荷)+分隔符,是最完美的解决粘包问题的方法。
  2. 定长包头中要可以或许当前传输数据的长度,而分隔符可以找到下一条数据的起始位置,即下一条数据的包头
  3. 分隔符不一定是一个字节的字符,也可以是一个字符串,一般工业使用\r,\n等。
  4. 分隔符实际作用就是定义数据边界