Java 面试题 —— TCP 粘包、拆包问题
Java 面试题 —— TCP 粘包、拆包问题
1、粘包、拆包问题概况
正常情况:
服务端一共接收到客户端的两个数据包,两个数据包各自包含完整的消息。
粘包问题:
服务端一共接收到客户端的一个数据包,这个数据包共包含两条消息。
拆包问题:
服务端一共接收到客户端的两个数据包,第一个数据包只包含第一条消息的部分,第二个数据包共包含第一条消息的剩余部分和第二条消息。
2、产生原因
- 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包问题;
- 应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包问题;
- 进行 MSS(最大报文长度)大小的 TCP 分段,当 TCP 报文长度 - TCP 头部长度 > MSS 的时候,将发生拆包问题;
- 接收方法不及时读取套接字缓冲区中的数据,这将发生粘包问题。
补充:
- 滑动窗口 限制
- MTU/MSS 限制
- Nagle 算法
3、解决方案
使用带消息头的协议
消息头存储消息开始标识及消息长度信息,接收端获取消息头的时候解析出消息长度,然后向后读取该长度的内容,位数不够补0。
设置定长消息
接收端每次读取既定长度的内容作为一条完整消息,不足的空位补全。
设置消息边界
可在报文末尾增加换行符表明一条完整的消息,这样接收端可以根据这个换行符来判断消息是否完整。
4、Netty 框架对 TCP 粘包拆包问题的解决工具
- LineBasedFrameDecoder(基于换行符)
- DelimiterBasedFrameDecoder(基于分隔符)
- FixedLengthFrameDecoder(基于定长)
Java 面试题 —— TCP 粘包、拆包问题相关推荐
- java tcp怎么拆包_Java网络编程基础之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- java获取一个tcp包大小_Java网络编程之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)
一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...
- Netty详解(五):Netty TCP粘包 拆包
1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...
- Netty(二)——TCP粘包/拆包
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...
- TCP粘包/拆包问题
目录 TCP粘包/拆包 TCP粘包/拆包问题说明 TCP粘包/拆包发生的原因 粘包问题的解决策略 未考虑TCP粘包导致功能异常案例 TimeServer的改造 TimeClient的改造 利用Lin ...
- TCP粘包|拆包和解决方案
1 产生原因 TCP是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化算法(Nagle ...
- Netty解决TCP粘包/拆包导致的半包读写问题
一.TCP粘包/拆包问题说明 TCP是个"流"协议,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包拆分,所以在业务上认为,一 ...
- 一起学Netty(六)之 TCP粘包拆包场景
TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况: 1)如 ...
最新文章
- 散列基础知识总结(思维导图)
- 从零学React Native之12 组件的生命周期
- Spring @Bean and @Configuration
- Linux 查看CPU,内存,硬盘
- python traceback对象_Python traceback【转】
- 怎样用MATLAB画二次函数曲线,MATLAB 二次函数的画图.doc
- RISC-V评估系列
- hdu 5273 Dylans loves sequence 逆序数 区间dp
- js模版引擎handlebars.js实用教程——结束语
- python实现etl_为什么选择R而不是Python做ETL
- linux运行powershell,linux – 是否可以编写一个在bash / shell和PowerShell中运行的脚本?...
- linuxpython安装_Linux安装python3.6
- STM32使用DMA发送串口数据
- 面向对象(Python):学习笔记之类属性和类方法
- shared pool 和buffer pool 详解(之二, Cache Buffers LRU Chain、Cache Buffers LRU Chain闩锁竞争与解决)
- 英特尔服务器主板型号参数对照表,intel主板_目前市场上intel主板芯片组型号对应cpu针脚数量?...
- 网络神采关键词过滤NET插件
- 【Unity】打包报错 com.android.buil.gradle.internal.tasks.workers$ActionFacade
- 台式电脑脑计算机没法启动怎么办,台式机主机电源灯不亮,开不了机怎么办? 台式电脑无法开机什么原因...
- 无人值守安装linux7,PXE下无人值守配置阵列及安装CentOS7
热门文章
- i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0
- 华为mate7 android 5.1 root权限,Mate7 Emui3.1+5.1.1root方法
- 科易动力携手企企通,打造数字化采购与供应链管理平台
- Java生成word通报(使用echart、poi-tl、PhantomJS)
- mimo-ofdm信道matlab代码,MIMO-OFDM无线通信及MATLAB实现代码
- Android:权限配置
- U8与MES对接,字段对接案例分享
- matlab绘图(其他形式的二维曲线)
- IDEA的Maven插件报红(Mac版)
- 详解 | 史上最强Java学习路线