粘包问题

本文详细探讨了TCP粘包现象的产生原因及解决方案。由于TCP是基于字节流的无边界传输特性,可能会导致粘包问题。文章分析了多种可能的原因,包括套接字缓冲区、MSS和MTU限制等,并提出了在应用层通过添加消息边界来解决粘包问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流协议与粘包

TCP是个流协议

  • TCP是基于字节流传输的,只能维护发出去多少,确认多少,没有维护消息与消息之间的边界,因此可能导致粘包问题。
  • 粘包问题解决方法是在应用层维护消息边界。

这里写图片描述
如图反应了包在网络中的传输情况。我们无法预知TCP接收缓冲区中收到的数据原本的边界是什么。

产生原因

这里写图片描述

TCP是一个字节流、无边界的。对于客户端和服务端来说,一次读操作,不保证能读完数据。接收的数据包个数也是不确定的。

产生粘包问题的原因分析:
1、SQ_SNDBUF 套接字本身有缓冲区 (发送缓冲区、接受缓冲区)
2、tcp传送的端 mss大小限制
3、链路层也有MTU大小限制,如果数据包大于>MTU要在IP层进行分片,导致消息分割。
4、tcp的流量控制和拥塞控制,也可能导致粘包
5、tcp延迟发送机制 等等
结论:tcp/ip协议,在传输层没有处理粘包问题。

解决方案

本质:上是要在应用层维护消息与消息的边界

两种方式
  • 包尾加\n
    • \n作为协议的边界
    • recv()使用MSG_PEEK标志
  • 包头加上包体长度
    • 发报文时,前四个字节长度(转成网络字节序)+包体
    • 收报文时,先读前四个字节,求出长度;根据长度读数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值