目录
前言
在学习Java网络编程的过程中,除了TCP/IP的传输协议外,在TCP的传输过程中会遇到粘包和拆包的问题,而一般我们会使用特定的通信协议去解决粘包与拆包问题,所有在这里就对这两方面的知识进行学习和讲解。
一、粘包和拆包是什么?
由于TPC是面向连接以字节流的形式进行传输的。并且它没有设定保护边界,并且在字节流传输的过程中,操作系统会设置一个缓冲区来进行优化。
那么,当我们发送的数据大小较小,没有达到缓冲区设置的大小的时候,TCP就会将多个请求合并成一个请求进行发送,这就是粘包现象。
而当我们发送的数据大小较大,超过了缓冲区设置的大小,那么就会将这个数据分成多个请求进行发送,这就是拆包现象。
这里借用知乎用户@程序新视界的图片
上面途中分别发生了以下几种情况。
理想状态下,packet1 和packet2的大小恰好满足满足缓冲区的大小,或者packet1和packet2的发送间隔时长满足TCP的等待时长,所有就是正常的两个请求数据包发送。
粘包状态,packet1和packet2由于大小较小,发送间隔时间又短,所以合并成一个包发送
拆包状态下,一个packet1包大小过大,拆分成了三个数据包发送。