“粘包”这个词汇本身有问题, TCP是流协议, 传输的是流不是报文, 什么是流, 流就是不需要管它的大小, 我一次性倒一桶水进缸里, 喝的时候是一次性全喝光吗? 这个词读起来也怪怪的, 我打lianbao打不出来, 打zhanbao打出来, 莫非真的读zhanbao?
今天面试就被问到这个问题,觉得好奇怪!首先TCP根本就没有包的概念,何来黏包一说!使用TCP协议都要设计应用层的协议,应用层协议就需要处理每个消息的的序列化和反序列化,根本就不存在黏包一说
"如果待发送的数据会清空发送缓存,那么TCP栈就会自动为此包设置PUSH标志。实际上现在的TCP协议栈基本上都可以自行处理这个问题,而不是交给应用层处理。" TCP是基于流的,实际应用中很难界定缓冲区中包与包的界限。现在主流且有效的做法就是加包头,不要考虑这些不实用的方式了。
tcp粘包问题靠push是无法解决的了的 push的作用:对方的包源源不断的发过来,接收方的内核未必收到一个包就通知上层一次,如果包足够频繁,它可以积累一些一块通知上层。push标识就是告诉接收者,这个包尽快上报,最好不要缓存了。接收方看到这个标识,会酌情处理(看协议实现者的心情了)。 因此,所有的包都加了push,也不能保证不会粘包。 总结,写程序时,即便99.999%的情况下不会出现粘包和裂包,也要兼容粘包和裂包的处理,即时刻做着粘包和裂包出现的准备。
18,356
社区成员
64,217
社区内容
加载中
试试用AI创作助手写篇文章吧