TCP的粘包和拆包问题
1、TCP是面向字节流的,而且具有套接字缓冲区,当要发送的内容不够多时会放到发送缓冲区内,等到数据足够多时才发送,这时会发生粘包问题,这个也叫negal算法。当数据量过大时,也会发生拆包问题。
TCP有MSS这个字段标识,是最大报文段长度,当大于这个长度时,要进行拆包,
处理拆包问题:
1、通过包头+包长+包体的协议发送,当接收到指定的包长时,才说明处理结束,
2、指定包的结束标识,当获取到指定标识时,说明获取完整
处理粘包问题:
1、发送方要想解决粘包问题,可以关闭negal算法
2、接收方无法解决粘包问题,应用层可以解决,,有两个办法
1、应用层是循环接收数据的,可以格式化数据,格式为开始符+结束符,
2、发送每条数据的时候,将数据的长度一并发送
        1、TCP是面向字节流的,而且具有套接字缓冲区,当要发送的内容不够多时会放到发送缓冲区内,等到数据足够多时才发送,这时会发生粘包问题,这个也叫negal算法。当数据量过大时,也会发生拆包问题。
TCP有MSS这个字段标识,是最大报文段长度,当大于这个长度时,要进行拆包,
处理拆包问题:
1、通过包头+包长+包体的协议发送,当接收到指定的包长时,才说明处理结束,
2、指定包的结束标识,当获取到指定标识时,说明获取完整
处理粘包问题:
1、发送方要想解决粘包问题,可以关闭negal算法
2、接收方无法解决粘包问题,应用层可以解决,,有两个办法
1、应用层是循环接收数据的,可以格式化数据,格式为开始符+结束符,
2、发送每条数据的时候,将数据的长度一并发送
全部评论 
 从原理上来说没有“粘包”这个概念吧?tcp本身就是面向无状态的字节流,也不关心字节流是什么,发送就发送了。最多指定开始和结束的标识符,或者抛给应用层去进行处理
昨天面试遇到的原题,可惜今天才看到😭
关闭了negal算了也不一定能够解决,就一个简单的道理,tcp上层协议附带一个长度字段就够了,mysql协议就是这么实现的http也是这么实现的,negal在高版本内核应该是默认关闭的
negal 关了发送方就解决粘包了?我记得 negal 只是累计小包,然后一起发吧,是为了解决糊涂窗口综合征,但 tcp 面向字节流,应该还是有粘包问题吧
学习到了,感谢分享
相关推荐
