tcp粘包

1.粘包

在长连接下,有发送端A与接收端B,A先发送了一段数据“first data”,然后发送了第二段数据“second data”,而B只接收到一段数据“first datasecond data”。

2.缓冲区

在tcp传输过程中,为了保证数据的可靠传输,会进行重发,所以会有内核缓存区对接收方未应答的数据进行缓存。接收方也有一个内核缓存区,用于接收数据。在socket编程中,发送发的send操作是将用户层中的数据copy到内核缓存中,交给tcp发送,而不去等待ack,当内核缓冲区还有剩余空间,直接返回,当内核缓冲区满了后,send会被阻塞。而接收方通过recive去将内核接收缓冲区中数据取回到用户缓存区,如果一直不去接收数据,而发送方一直在发送数据,那么接收方的缓存会满,那么tcp的流量控制,发送方会将自己的接收窗口变为0,发送方此时也不能再发了。

3.粘包产生原因

1.发送方发送了数据,并且收到了ack,而接收方并没有及时recive,导致好多次数据一起存入了接收方内核缓冲区中

2.发送方发送a数据,而未收到ack,可能接收方未收到,此时又send了b数据,那么虽然接收方收到了b数据,但只能并不能回复b数据的ack,因为tcp采用的累积ack,

只有当a数据收到了,会回复b的ack,此时已经收到了2条数据。

3.由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法.简单的说,当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间,看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去

4.解决粘包

1.接收方及时接收数据

2.数据采用定义的分隔符进行分割或者标准格式,方便接收到粘包后进行拆包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值