当客户端不停的向服务端发送数据包的时候,会出现两个 数据包连在一起的情况,这就是我们TCP协议中经常遇到的粘包和拆包;
运输层中最重要的两种协议:UDP和TCP,但是TCP 比 UDP复杂的多;UDP是无连接的,TCP是面向连接的;因此只有TCP才会发生粘包和拆包的情况;
TCP粘包和拆包的表现形式:
第一种情况
当发送两个数据包的时候,每次server读取一个,情况正常;
第二种情况
两个数据包连在了一起,发生了粘包现象;
第三种情况
P1太大或者P2太大的时候,一次只接收了P1或者P2的一半,这时候就是发生了拆包的现象;
第四种情况
P1和P2都非常大的时候,并且TCP 的滑动窗口还非常的小,这个时候P1和P2都会发生多次的拆包现象;
发生粘包和拆包的原因:
1、要发送的数据大于TCP发送缓冲区剩余空间的大小,将会发生拆包现象;
2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
5、以太网帧的payload大于MTU进行IP分片。
等等......
粘包拆包的解决方法:
(1)消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
(2)在包尾增加回车换行符进行分割,例如FTP协议;
(3)将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;
(4)环形缓冲区解决粘包问题
(5)更复杂的应用层协议。
相关推荐
主要介绍了使用Netty解决TCP粘包和拆包问题过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本demo模拟了TCP通信中发送端和接收端的行为,并利用序列化和反序列化的思想,自定义协议来解决TCP的粘包和拆包问题。
发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充, 1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。 2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。 3、...
tcp 粘包 拆包解决思路以代码,提供DEMO,采用 包长+内容缓冲区 组织方法,未采用分隔符以及定长包,因为我觉得包长+内容缓冲区比较灵活
主要给大家介绍了Golang TCP粘包拆包问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案.docx
通过socket通讯实现服务器与客户端的连接。首先服务器利用udp广播发送自己的ip地址,客户端在收到广播后通过此ip以tcp连接的方式连接服务器来通讯。
面试题:聊聊TCP的粘包、拆包以及解决方案.docx
Netty编码器和处理程序的调用机制,TCP粘包和拆包及其解决方法,Netty核心代码剖析,最后自己手动10天左右的时间学完,确实需要对Java编程有一定基础要求,自己也是所有人匪浅。非常感谢尚硅谷韩顺平老师!!!!! ...
易语言TCP粘包拆包组包应用之协议长度方式与标志符方式。@流云思水。
什么是粘包拆包,为什么发生拆包粘包问题,如何处理拆包粘包问题
1. 关于TCP粘包和拆包的终极解答 3. 通过 HTTP POST 发送进制数据 4. 在Linux进IO的正确姿势
c++服务器 拆包粘包 过程 千万别问我是基于TCP的还是UDP的...
易语言TCP粘包拆包组包应用之协议长度方式与标志符方式
1)粘包和拆包采用帧头里面加长度信息来做; 2)超时机制:采用一个单独的线程来判断,每次收到数据就更新接收时间。在单独的线程里面判断如果当前时间减去上次接收的时间超过20秒则认为超时,关闭该连接; 3)...
一、TCP粘包产生的原理 1.TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方...
炮打TCP - 关于一而再再而三的粘包拆包问题的大字报
socket通信的拆包和装包源码 NettyTree 搭建一个基于Netty的通信框架 NIO:非阻塞式IO BIO:阻塞式IO 1) TCP粘包、拆包 2)编解码技术 1)Java序列化 2)业界主流的编解码框架 Thrift Protobuf 3) Websocket 5)...
通讯中断分析CP通信丢包原因总结丢包:如果通信中发现缺少数据或者丢包,那么...TCP粘包和拆包问题。假设客户端分别发送数据包D1和D2给服务端,由于服务端一次性读取到的字节数是不确定的,所以可能存在以下4种情况。