netty进阶——粘包与半包(现象分析)

小志的博客 小志的博客     2022-12-15     110

关键词:

目录

一、粘包

1.1、粘包现象

  • 发送 abc def,接收 abcdef

1.2、粘包原因

  • 应用层:接收方 ByteBuf 设置太大(Netty 默认 1024)。
  • 滑动窗口:假设发送方 256 bytes 表示一个完整报文,但由于接收方处理不及时且窗口大小足够大,这 256 bytes 字节就会缓冲在接收方的滑动窗口中,当滑动窗口中缓冲了多个报文就会粘包。
  • Nagle 算法:会造成粘包。

二、半包

2.1、半包现象

加粗样式 - 发送 abcdef,接收 abc def

2.2、半包原因

  • 应用层:接收方 ByteBuf 小于实际发送数据量。
  • 滑动窗口:假设接收方的窗口只剩了 128 bytes,发送方的报文大小是 256 bytes,这时放不下了,只能先发送前 128 bytes,等待 ack 后才能发送剩余部分,这就造成了半包。
  • MSS 限制:当发送的数据超过 MSS 限制后,会将数据切分发送,就会造成半包。

三、粘包与半包现象的本质原因

  • 本质是因为 TCP 是流式协议,消息无边界。

四、MSS 限制的了解

  • 链路层对一次能够发送的最大数据有限制,这个限制称之为 MTU(maximum transmission unit),不同的链路设备的 MTU 值也有所不同,例如:以太网的 MTU 是 1500、FDDI(光纤分布式数据接口)的 MTU 是 4352。
  • MSS 是最大段长度(maximum segment size),它是 MTU 刨去 tcp 头和 ip 头后剩余能够作为数据传输的字节数

五、Nagle 算法的了解

  • 即使发送一个字节,也需要加入 tcp 头和 ip 头,也就是总字节数会使用 41 bytes,非常不经济。因此为了提高网络利用率,tcp 希望尽可能发送足够大的数据,这就是 Nagle 算法产生的缘由。
  • 该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送。

netty进阶——粘包与半包(代码示例)(代码片段)

目录一、消息粘包和消息半包的概述1.1、消息粘包1.2、消息半包二、粘包现象代码示例2.1、粘包现象服务端示例代码2.2、粘包现象客户端示例代码2.3、分别启动服务端,客户端,查看服务端结果输出三、半包现象代码示... 查看详情

netty进阶——粘包与半包(滑动窗口)

TCP以一个段(segment)为单位,每发送一个段就需要进行一次确认应答(ack)处理,但如果这么做,缺点是包的往返时间越长性能就越差。为了解决此问题,引入了窗口概念,窗口大小即决定了... 查看详情

netty进阶——粘包与半包(滑动窗口)

TCP以一个段(segment)为单位,每发送一个段就需要进行一次确认应答(ack)处理,但如果这么做,缺点是包的往返时间越长性能就越差。为了解决此问题,引入了窗口概念,窗口大小即决定了... 查看详情

netty进阶——粘包与半包(短链接方式解决粘包问题)(代码片段)

目录一、短链接方式解决粘包问题(代码示例)1.1、短链接方式解决粘包问题的服务端代码示例1.2、短链接方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、短链接方式... 查看详情

netty进阶——粘包与半包(短链接方式解决粘包问题)(代码片段)

目录一、短链接方式解决粘包问题(代码示例)1.1、短链接方式解决粘包问题的服务端代码示例1.2、短链接方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、短链接方式... 查看详情

netty进阶——粘包与半包(固定长度方式解决粘包问题)(代码片段)

目录一、固定长度方式解决粘包问题(代码示例)1.1、固定长度方式解决粘包问题的服务端代码示例1.2、固定长度方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、固定... 查看详情

netty进阶——粘包与半包(固定长度方式解决粘包问题)(代码片段)

目录一、固定长度方式解决粘包问题(代码示例)1.1、固定长度方式解决粘包问题的服务端代码示例1.2、固定长度方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、固定... 查看详情

netty进阶——粘包与半包(预设长度方式解决粘包问题)(代码片段)

目录一、预设长度方式解决粘包问题(代码示例)1.1、预设长度方式解决粘包问题的服务端代码示例1.2、预设长度方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、预设... 查看详情

netty进阶——粘包与半包(预设长度方式解决粘包问题)(代码片段)

目录一、预设长度方式解决粘包问题(代码示例)1.1、预设长度方式解决粘包问题的服务端代码示例1.2、预设长度方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、预设... 查看详情

透过现象看本质,我找到了netty粘包与半包的这几种解决方案。(代码片段)

1、粘包与半包啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车我上来就是一段代码猛如虎1.1服务器代码publicclassStudyServerstaticfinalLoggerlog=LoggerFactory.getLogger(StudyServer.class);voidstart()NioEventLoopGrou... 查看详情

netty进阶——粘包与半包(固定分隔符方式解决粘包问题)(代码片段)

目录一、固定分隔符方式解决粘包问题(代码示例)1.1、固定分隔符解决粘包问题的服务端代码示例1.2、固定分隔符方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、固... 查看详情

netty进阶——粘包与半包(固定分隔符方式解决粘包问题)(代码片段)

目录一、固定分隔符方式解决粘包问题(代码示例)1.1、固定分隔符解决粘包问题的服务端代码示例1.2、固定分隔符方式解决粘包问题的客户端代码示例1.3、分别启动服务端,客户端,查看服务端结果输出一、固... 查看详情

netty03-进阶(代码片段)

三.Netty进阶1.粘包与半包1.1粘包现象服务端代码publicclassHelloWorldServerstaticfinalLoggerlog=LoggerFactory.getLogger(HelloWorldServer.class);voidstart()NioEventLoopGroupboss=newNioEventLoopGroup(1);NioEventLoopGroupworker=newNioEventLoopGroup();tryServerBootstrapserverBo... 查看详情

tcp粘包与半包的核心

  进行Socket编程时经常会碰到 TCP的粘包与半包问题,很多时候我们选用netty等框架而不直接采用原生的Socket编程也是因为netty帮我们将该类传输过程中可能出现的问题屏蔽掉了,使我们可以抽出更多精力来关注功能的实现... 查看详情

tcp的组包半包粘包与分包

...个包分配的足够大,导致接受方并不能一次接受完。3)粘包与分包。     粘包,指发送方发送的若干包数据到接收方接收时粘成一 查看详情

详解啥是tcp粘包和拆包现象并演示netty是如何解决的

参考技术A本文介绍什么是TCP粘包和拆包现象,并通过Netty编写详细的案例来重现TCP粘包问题,最后再通过一个Netty的demo来解决这个问题。具体内容如下TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传... 查看详情

netty——bytebuffer消息粘包半包示例(代码片段)

目录一、ByteBuffer消息粘包、消息半包的概述二、示例需求三、示例代码一、ByteBuffer消息粘包、消息半包的概述NIO是面向缓冲区进行通信的,不是面向流的。既然是缓冲区,那它一定存在一个固定大小。这样一来通常会遇... 查看详情

netty——bytebuffer消息粘包半包示例(代码片段)

目录一、ByteBuffer消息粘包、消息半包的概述二、示例需求三、示例代码一、ByteBuffer消息粘包、消息半包的概述NIO是面向缓冲区进行通信的,不是面向流的。既然是缓冲区,那它一定存在一个固定大小。这样一来通常会遇... 查看详情