美文网首页基础知识程序员
Dubbo剖析-粘包与半包问题(一)

Dubbo剖析-粘包与半包问题(一)

作者: 阿里加多 | 来源:发表于2018-05-21 09:20 被阅读238次

一、前言

在客户端与服务端进行通信时候都会约定一个通讯协议,协议一般包含一个header和body,一个header和body组成了一次通讯的内容,一个通讯包。正常情况下客户端通过socket发送一个请求包后,服务端接受后解析请求包,然后进行处理,这看似是一个很简单的问题,但当客户端连续发送多个请求包时就可能会出现半包、粘包现象。

二、什么是粘包与半包问题

在客户端发送数据时,实际是把数据写入到了TCP发送缓存里面的。

如果发送的包的大小比TCP发送缓存的容量大,那么这个数据包就会被分成多个包,通过socket多次发送到服务端,服务端第一次从接受缓存里面获取的数据,实际是整个包的一部分,这时候就产生了半包现象,半包不是说只收到了全包的一半,是说收到了全包的一部分。

如果发送的包的大小比TCP发送缓存容量小,并且TCP缓存可以存放多个包,那么客户端和服务端的一次通信就可能传递了多个包,这时候服务端从接受缓存就可能一下读取了多个包,这时候就出现了粘包现象。

服务端从接受缓存读取数据后一般都是进行解码操作,也就是会把byte流转换了pojo对象,如果出现了粘包或者半包现象,则进行转换时候就会出现异常。

出现粘包和半包的原因是TCP层不知道上层业务的包的概念,它只是简单的传递流,所以需要上层应用层协议来识别读取的数据是不是一个完整的包。

三、如何避免

  • 比较常见方案是应用层设计协议时候协议包分为header和body,header里面记录body长度,当服务端从接受缓冲区读取数据后,如果发现数据大小小于包的长度则说明出现了半包,这时候就回退读取缓存的指针,等待下次读事件到来的时候再次测试。如果发现包长度大于了包长度则看长度是包大小整数倍则说明了出现了粘包,则循环读取多个包,否者就是出现了多个整包+半包。

  • 多个包之间添加分隔符。

  • 包定长,每个包大小固定长度。
    ...

四、总结

本文介绍了网络通讯中粘包和半包的概念,出现原因,以及常用的应对策略。
更多关于分布式系统中服务降级策略的知识可以单击 单击我
想系统学dubbo的单击我
想学并发的童鞋可以 单击我

image.png

相关文章

  • Dubbo剖析-粘包与半包问题(一)

    一、前言 在客户端与服务端进行通信时候都会约定一个通讯协议,协议一般包含一个header和body,一个heade...

  • 即时通讯

    iOS即时通讯,从入门到“放弃”?socket的半包,粘包与分包的问题iOS 处理socket粘包问题iOS___...

  • 2.Netty基本--TCP粘包半包如何解决,协议和序列化到底啥

    [toc] 1.什么是TCP粘包和半包?为什么会出现粘包和半包? 粘包: 粘包半包 混合双打: 首先TCP是可靠有...

  • Netty处理半包粘包的解码思路

    Netty处理半包粘包的解码思路 前言 写netty通讯的都不免遇到半包粘包情况。那么半包粘包是什么意思呢?我们可...

  • Netty 半包,粘包处理

    基于TCP协议处理网络数据经常面对半包和粘包问题,那么什么是半包问题,什么是粘包问题呢?应用层消息在被发送到网络之...

  • Netty粘包/半包问题

    在netty中经常会出现粘包/半包问题? 1.应用程序写入的数据大于套接字缓冲区大小, 这将导致半包现象2.应用程...

  • TCP 半包粘包问题

    什么是粘包现象 TCP 粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着...

  • netty的编解码

    什么是拆包/粘包 TCP 粘包/拆包 半包:读取的数据不是一个数据包粘包:读取的数据超过一个数据包 粘包问题的解决...

  • 粘包、半包

    1.什么是粘包? 粘包通常出现在TCP的协议里面,对于UDP来说是不会出现粘包状况的。通俗的讲,就是在发包的时候会...

  • 文章收藏

    iOS native 加载 H5 图片(沙盒加载html图片) socket的半包,粘包与分包的问题 Scoket...

网友评论

  • 水欣:dubbo源码看的好吃力呀
    阿里加多:@水欣 看多了就好了的,贵在坚持,:smiley:

本文标题:Dubbo剖析-粘包与半包问题(一)

本文链接:https://www.haomeiwen.com/subject/fqtwdftx.html