关于TCP粘包的问题简述

由于本人不是搞网络编程的,以下资料来源于网络,本人收集总结得出了以下内容。

TCP粘包:TCP设置了缓冲区且拆包检查机制不够科学,造成粘包

1、TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
2.1、TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小、数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,造成粘包,所以必须提供科学的拆包机制。
2.2、UDP,不会使用块的合并优化算法,由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。所以UDP不会出现粘包问题。


粘包原因:
1、发送端需要等缓冲区满才发送出去,造成粘包
TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
2、接收方不及时接收缓冲区的包,造成多个包接收
接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。


粘包情况:
1、粘在一起的包都是完整的数据包
2、粘在一起的包有不完整的包。


保护消息边界:
指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包(UDP)。


TCP无保护消息边界的解决:
(1)发送固定长度的消息
(2)把消息的尺寸与消息一块发送
(3)使用特殊标记来区分消息间隔


流(TCP基于字节流传输):
指无保护消息保护边界的(TCP),如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包。


小结:

TCP是基于字节流的,也就是对片里进行字节流控制,为什么tcp会出现黏包,因为tcp报头没有长度这个变量,而udp是有长度变量的,所以udp不会黏包,tcp反而会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值