socket传输过程中产生的粘包拆包问题

我们在之前一篇博客  https://blog.csdn.net/Jbinbin/article/details/82142878  说的是socket套接字底层数据传输。

这篇博客中就出现了socket传输过程中的粘包拆包问题。就是因为socket发送的是无界线的数据流。所以当多个包的大小不一,并且发送出去的时候,缓冲区的大小不一样,会导致包与包之间和合并和包的拆分问题。

对于上图粘包、拆包问题的场景:

  1. 客户端和服务器建立一个连接,客户端发送一条消息,客户端关闭与服务端的连接。客户端与服务端的连接建立成功之后,服务端不断读取客户端发送过来的数据,当客户端与服务端连接断开之后,服务端知道已经读完了一条消息,然后进行解码和后续处理

  2. 客户端和服务器简历一个连接,客户端连续发送两条消息,客户端关闭与服务端的连接。对于第二种情况,如果按照上面相同的处理逻辑来处理,那么服务端在解析这个数据包的时候就肯定要按照组包时候的规则去解析包,不然肯定会出现解析数据不正确问题。

https://my.oschina.net/bieber/blog/487087  这篇博客解释了dubbo对粘包拆包问题的解释及解决方案,其实这方面也确实体现了协议的重要性,如HTTP协议,我们发送一个或者多个http协议,虽然发生了粘包和拆包问题,其实我们解析的时候直接按照协议的组包过程反向解析就好了。dubbo的话是按照dubbo栈,作为一个包去解决拆包粘包问题,dubbo栈满了就是一个协议包。这样把无界限的数据流解析出来一个个的协议包。然后给服务器去处理。

这里也是Tomcat和netty的不同之处,Tomcat只支持http协议,而netty支持各种协议。

猜你喜欢

转载自blog.csdn.net/Jbinbin/article/details/82621641