查漏补缺: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粘包问题和常用解决方案(上)的主要内容,如果未能解决你的问题,请参考以下文章

查漏补缺:OSI七层模型和TCP/IP模型

day8---多线程socket 编程,tcp粘包处理

day08 多线程socket 编程,tcp粘包处理

什么是TCP粘包?

TCP粘包问题分析和解决(全)

python/socket编程之粘包