什么是tcp传输的粘包和拆包
这篇文章主要介绍"什么是tcp传输的粘包和拆包",在日常操作中,相信很多人在什么是tcp传输的粘包和拆包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"什么是tcp传输的粘包和拆包"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
以太网数据帧
所谓以太网数据帧,即链路层传输的数据包。以太网数据帧的数据长度被限制在46-1500字节,这1500字节被称为链路层MTU。
这1500字节还包括了ip头(最少20字节)和tcp头(最少20字节),应用层的数据长度则最多为1460,实际为1400字节左右。
MSS最大段报文
TCP层的一个字段,指的是通过TCP,应用层一次所能传输的最大数据包。
如果应用层数据包超过MSS,就会把应用层数据包拆分,分成两个段来发送。
如果应用层数据包比较小,远小于MSS,应用层数据包就会发生粘包,多个数据包作为一个段来发送。
粘包和拆包
所谓粘包和拆包的包,是对应用层数据包而言的。
正常情况下一个TCP包传输一个应用数据包。粘包时,两个或多个应用数据包被粘合在一起通过一个TCP传输。
而拆包情况下,会将一个应用数据包会被拆成两段或者多段分开传输,其他的一段可能会和其他应用数据包粘合。
所谓粘包,又分为发送方粘包和接收方的粘包。
发送方的粘包,应用层一次发送多个数据包,tcp会将多个数据包打包成一个tcp报文发送出去。
接收方的粘包,接受方未能及时将tcp接收缓存中的数据读出。
所谓拆包,即如果应用层一次发送的数据超过了一次tcp报文所能传输的最大值,tcp会将一个数据包拆分成多个最大长度的tcp报文分开传输。
粘包和拆包的解决方案
如果发生了粘包,则需要将粘在一起的包,拆开。
如果发生了拆包,则需要将被拆分的包,合并回来。
通常的做法,就是加一个数据头,数据头中保存实际数据的长度。
如果粘包,按照数据头中保存的长度读取即可。
如果是拆包,则需要等待下个数据包到来继续读取,直到读到完整的数据包为止。
到此,关于"什么是tcp传输的粘包和拆包"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!