Java 面试题 —— TCP 粘包、拆包问题

1、粘包、拆包问题概况

正常情况:

​  服务端一共接收到客户端的两个数据包,两个数据包各自包含完整的消息。

粘包问题:

​  服务端一共接收到客户端的一个数据包,这个数据包共包含两条消息。

拆包问题:

​  服务端一共接收到客户端的两个数据包,第一个数据包只包含第一条消息的部分,第二个数据包共包含第一条消息的剩余部分和第二条消息。

2、产生原因

  • 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包问题;
  • 应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包问题;
  • 进行 MSS(最大报文长度)大小的 TCP 分段,当 TCP 报文长度 - TCP 头部长度 > MSS 的时候,将发生拆包问题;
  • 接收方法不及时读取套接字缓冲区中的数据,这将发生粘包问题。

补充:

  • 滑动窗口 限制
  • MTU/MSS 限制
  • Nagle 算法

3、解决方案

  • 使用带消息头的协议

    ​  消息头存储消息开始标识及消息长度信息,接收端获取消息头的时候解析出消息长度,然后向后读取该长度的内容,位数不够补0。

  • 设置定长消息

    ​  接收端每次读取既定长度的内容作为一条完整消息,不足的空位补全。

  • 设置消息边界

    ​  可在报文末尾增加换行符表明一条完整的消息,这样接收端可以根据这个换行符来判断消息是否完整。

4、Netty 框架对 TCP 粘包拆包问题的解决工具

  • LineBasedFrameDecoder(基于换行符)
  • DelimiterBasedFrameDecoder(基于分隔符)
  • FixedLengthFrameDecoder(基于定长)

Java 面试题 —— TCP 粘包、拆包问题相关推荐

  1. java tcp怎么拆包_Java网络编程基础之TCP粘包拆包

    TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...

  2. java获取一个tcp包大小_Java网络编程之TCP粘包拆包

    TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...

  3. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...

  4. Netty详解(五):Netty TCP粘包 拆包

    1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...

  5. Netty(二)——TCP粘包/拆包

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...

  6. TCP粘包/拆包问题

    目录 TCP粘包/拆包 TCP粘包/拆包问题说明 TCP粘包/拆包发生的原因 粘包问题的解决策略 未考虑TCP粘包导致功能异常案例  TimeServer的改造 TimeClient的改造 利用Lin ...

  7. TCP粘包|拆包和解决方案

    1 产生原因 TCP是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化算法(Nagle ...

  8. Netty解决TCP粘包/拆包导致的半包读写问题

    一.TCP粘包/拆包问题说明 TCP是个"流"协议,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包拆分,所以在业务上认为,一 ...

  9. 一起学Netty(六)之 TCP粘包拆包场景

    TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况: 1)如 ...

最新文章

  1. 散列基础知识总结(思维导图)
  2. 从零学React Native之12 组件的生命周期
  3. Spring @Bean and @Configuration
  4. Linux 查看CPU,内存,硬盘
  5. python traceback对象_Python traceback【转】
  6. 怎样用MATLAB画二次函数曲线,MATLAB 二次函数的画图.doc
  7. RISC-V评估系列
  8. hdu 5273 Dylans loves sequence 逆序数 区间dp
  9. js模版引擎handlebars.js实用教程——结束语
  10. python实现etl_为什么选择R而不是Python做ETL
  11. linux运行powershell,linux – 是否可以编写一个在bash / shell和PowerShell中运行的脚本?...
  12. linuxpython安装_Linux安装python3.6
  13. STM32使用DMA发送串口数据
  14. 面向对象(Python):学习笔记之类属性和类方法
  15. shared pool 和buffer pool 详解(之二, Cache Buffers LRU Chain、Cache Buffers LRU Chain闩锁竞争与解决)
  16. 英特尔服务器主板型号参数对照表,intel主板_目前市场上intel主板芯片组型号对应cpu针脚数量?...
  17. 网络神采关键词过滤NET插件
  18. 【Unity】打包报错 com.android.buil.gradle.internal.tasks.workers$ActionFacade
  19. 台式电脑脑计算机没法启动怎么办,台式机主机电源灯不亮,开不了机怎么办? 台式电脑无法开机什么原因...
  20. 无人值守安装linux7,PXE下无人值守配置阵列及安装CentOS7

热门文章

  1. i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0
  2. 华为mate7 android 5.1 root权限,Mate7 Emui3.1+5.1.1root方法
  3. 科易动力携手企企通,打造数字化采购与供应链管理平台
  4. Java生成word通报(使用echart、poi-tl、PhantomJS)
  5. mimo-ofdm信道matlab代码,MIMO-OFDM无线通信及MATLAB实现代码
  6. Android:权限配置
  7. U8与MES对接,字段对接案例分享
  8. matlab绘图(其他形式的二维曲线)
  9. IDEA的Maven插件报红(Mac版)
  10. 详解 | 史上最强Java学习路线