为什么TCP会出现粘包/拆包?

 

image.png

 

为什么会出现粘包/拆包?

1.应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。

2.应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入数据发送到网络,这将会发生粘包。

3.进行MSS(最大报文长度)大小TCP分段,当报文长度-TCP头部长度>MSSd的时候将会发生拆包。

4.接收方法不及时读取套接字缓冲区数据,也会发生粘包

 

粘包只在TCP这一层发生的,我们本身是在 TCP上层应用层里面,应用层是在socket交互的,也就是说跟一个buffer的缓冲区交互,那么buffer缓冲区拿到的全是字节。字节关心的重点是这个数据每次应用程序发送的边界的问题,而不是说TCP让粘包或拆包的一个逻辑。

 

如果获取完整的应用程序报文?

1.使用带消息头的协议,头部写入包长度,然后再读取包内容。

2.设置定长消息,每次读取定长内容,长度不够时定位补固定字符。

3.设置消息边界,服务端从网络流中按照消息边界分离出消息内容,一般使用"\n"

4.更为复杂的协议,比如:json/protobuf。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值