TCP 粘包/拆包的原因及解决方法?
TCP是以流的方式来处理数据,一个完整的数据包可能会被TCP拆分成多个包进行发送,也可能把多个小的包封装成一个大的数据包。由于TCP数据包之间没有边界保护,所以当发生粘包或拆包时,接收端难以从数据流中准确获取数据。
TCP粘包/分包的原因:
应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象,而应用程序写入数据小于套接字缓冲区大小,网卡将应用程序多次写入的数据封装成一个数据包发送到网络上,这将会发生粘包现象。
解决方法:
netty提供了3种类型的解码器对TCP 粘包/拆包问题进行处理:
定长消息解码器:FixedLengthFrameDecoder。发送方和接收方规定一个固定的消息长度,不够用空格等字符补全,这样接收方每次从接受到的字节流中读取固定长度的字节即可,长度不够就保留本次接受的数据,再在下一个字节流中获取剩下数量的字节数据。
分隔符解码器:LineBasedFrameDecoder或DelimiterBasedFrameDecoder。LineBasedFrameDecoder是行分隔符解码器,分隔符为\n或\r\n;DelimiterBasedFrameDecoder是自定义分隔符解码器,可以定义一个或多个分隔符。接收端在收到的字节流中查找分隔符,然后返回分隔符之前的数据,没找到就继续从下一个字节流中查找。
数据长度解码器:LengthFieldBasedFrameDecoder。将发送的消息分为header和body,header存储消息的长度(字节数),body是发送的消息的内容。同时发送方和接收方要协商好这个header的字节数,因为int能表示长度,long也能表示长度。接收方首先从字节流中读取前n(header的字节数)个字节(header),然后根据长度读取等量的字节,不够就从下一个数据流中查找。
最新文章
- 如何搭建开源code review gerrit服务器
- uart启示2_异步操作的bug
- JS转换HTML转义符
- robot framework 安装配置
- NGUI Camera's raycast hit through the UI Layer issue
- 爬虫技术 -- 进阶学习(九)使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)
- centos7开机/etc/rc.local不执行的问题
- Hot OS'15 summary
- Lambda前世今生
- python邮件发送接收
- docker 创建本地镜像服务器
- httpcomponents-client-4.3.x DOC
- cocos2d-x物业现场
- POJ 2234 Matches Game 尼姆博弈
- sqlserver 简单的创建数据库
- dp-棋盘形dp
- VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——VoiceRecorder控件的使用方式.Net移动开发
- 使用opencv进行简单的手势检测[by Python]
- kettle并行运行时出现「Unknown error in KarafBlueprintWatcher」
- Oracle 查询字段不包含多个字符串方法