码迷,mamicode.com
首页 > 其他好文 > 详细

查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)

时间:2017-10-29 20:49:43      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:src   end   多少   log   粘包   产生   缓冲区   sock   因此   

  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粘包问题和常用解决方案(上)

标签:src   end   多少   log   粘包   产生   缓冲区   sock   因此   

原文地址:http://www.cnblogs.com/lianshuiwuyi/p/7751062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!