首页 > 图灵资讯 > java面试题>正文
javaNetty面试题-拆包粘包问题
2024-05-22 13:38:50
拆包TCP 传输协议是面向流的,没有数据包界限。 MTU(Maxitum Transmission Unit) 是链路层一次最大传输数据的大小。
MTU 一般来说大小为 1500 byte。
MSS(Maximum Segement Size) 是指 TCP 最大报文段长度,它是传输层一次发送最大数据的大小。
如上图所示,如果 MSS + TCP 首部 + IP 首部 > MTU,那么数据包将会被拆分为多个发送。这就是拆包现象。
Nagle 算法
Nagle 算法可以理解为批量发送,也是我们平时编程中经常用到的优化思路,它是在数据未得到确认之前先写入缓冲区,等待数据确认或者缓冲区积攒到一定大小再把数据包发送出去。Netty 中为了使数据传输延迟最小化,就默认禁用了 Nagle 算法。
拆包/粘包的解决方案
在客户端和服务端通信的过程中,服务端一次读到的数据大小是不确定的。需要确定边界:
消息长度固定 特定分隔符 消息长度 + 消息内容(Netty)