为什么TCP会产生粘包问题?
目录
概述
粘包 就是指应用层的多条消息被合并为一个TCP包了,这个其实在发送端和接收端都会产生
还有一种现象叫拆包,指的是应用层数据被拆分为多个TCP包了
发送端
正常的情况
每个应用层数据都会被封装为一个TCP包然后发送
两个包粘在一起的情况
如果应用层传递下来的数据太少那么TCP协议会等待更多的数据再发送,这样可以提高传输效率,防止大头儿子的情况
粘包和拆包一起的情况
如果应用层数据太大超过了TCP协议的MSS
大小,则会发生拆包
接收端
接收端如果来不及处理数据,那么多个到达的TCP包都会加入缓存队列,此时也会发生粘包现象
为什么UDP不会产生粘包问题
因为TCP是面相流的,不认为应用层的消息是一条一条的,只是将应用层传递下来的数据看成一个数据流,没头没尾
而UDP则是基于报文的,将应用层的数据看成是一个完整的数据包,所以不会进行拆分和合并,不管应用层传递下来多大多小的数据都只会封装为一个UDP包进行传输,接收端也一样会将接受到的UDP报文完整的交付给应用层