首页 > 其他分享 >TCP 粘包/拆包的原因及解决方法?

TCP 粘包/拆包的原因及解决方法?

时间:2022-10-23 15:12:20浏览次数:54  
标签:字节 流中 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),然后根据长度读取等量的字节,不够就从下一个数据流中查找。

标签:字节,流中,TCP,粘包,解码器,拆包,分隔符
From: https://www.cnblogs.com/lppBlogg/p/16818588.html

相关文章

  • 面试官, TCP连接状态中的TIME_WAIT表示什么
    答案其实就藏在下面这张图里,接下来我们就一步一步看这张图,图看完了,答案也就有了。状态名词解释整个图client和server的状态都是从ClOSED开始流转LISTEN:表示server在等......
  • 传输层之UDP与TCP的首部
    从通信信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最底层。传输层位于应用层和数据链路层之间,主要有两个协议,用......
  • TCP协议详解一
    TCP协议的报文格式传输层TCP协议提供了一种面向连接的、可靠的字节流服务,其数据帧格式,大致如下图所示: 图:传输层TCP协议的数据帧格式 一个传输层TCP协议的数据帧,大致......
  • TCP/IP四层网络模型
    1.TCP/IP协议是什么?TCP/IP协议时一种网络体系模型的代名词,指的是多种协议的协议簇,即包含TCP、IP、MAC、UDP、HTTP、FTP等多种协议,它是四层网络模型,包含应用层、传输......
  • 计算机网络原理(TCP/IP附一):IEEE802局域网和城域网标准名称目录表
    名称描述官方参考802.1ak多注册协议(MRP)[802.1AK-2007]802.1AEMAC安全(MACSec)[802.1AE-2006]802.1AX链路聚合(以前的802.3ad)[802.1AX-2008]802.......
  • 一个简单的百万并发的TCP服务器的实现。
    我们紧接着上篇文章,看看我们上节课的代码有什么问题?可以明显的看出来上节课的代码公用了一个同样的缓冲区进行读写,正常的情况下我们需要封装一个结构体,让每个对应的客户端......
  • DOTCPP_1468_蓝桥杯基础练习VIP-报时助手
    1.题目链接题目1468:蓝桥杯基础练习VIP-报时助手2.解题思路2.1题意解析本题的目的是要完成报时功能,即根据输入的小时数h和分钟数m的值,按照报时规则输出对应的英文输......
  • linux ss统计tcp,udp进程数
    目录linuxss统计tcp,udp进程数参数说明实例主机不间断重启问题排查linuxss统计tcp,udp进程数参数说明-s,显示与本机连接的tcp和udp的进程数,可用于分析-h,--help帮助......
  • TCP三次握手过程
    第一次握手:主机A通过向主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B两件事:我想要和你通信;你可以用哪个序列号......
  • AI智能视频融合平台EasyCVR如何通过数据库批量修改tcp/udp播放协议?
    EasyCVR视频融合云平台基于云边端一体化架构,兼容性高、拓展性强,可支持多类型设备、多协议方式接入,包括国标GB/T28181、RTMP、RTSP/Onvif协议,以及厂家的私有协议,如:海康Ehome......