1 | netty:粘包与拆包的处理
TCP是个流协议,流是一串没有界限的数据。TCP会根据TCP缓冲区的实际情况对包进行划分。因此造成一个完整的业务包,会被TCP分成多个包、把多个包封装成一个大的包进行发送。 粘包与拆包现象 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包; 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包; 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包; 服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。 产生原因 应用程序write写入的字节大小/大于套接口发送缓冲区大小; 进行MSS大小的TCP分段; 以太网帧的payload大于MTU进行IP分片。 对于Linux,发送缓冲区的默认值为:16384。可使用下面命令查看: # 接收 cat /proc/sys/net/ipv4/tcp_rmem # min default max # 4096 87380 6291456