为什么会出现粘包/拆包?
1.应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
2.应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入数据发送到网络,这将会发生粘包。
3.进行MSS(最大报文长度)大小TCP分段,当报文长度-TCP头部长度>MSSd的时候将会发生拆包。
4.接收方法不及时读取套接字缓冲区数据,也会发生粘包
粘包只在TCP这一层发生的,我们本身是在 TCP上层应用层里面,应用层是在socket交互的,也就是说跟一个buffer的缓冲区交互,那么buffer缓冲区拿到的全是字节。字节关心的重点是这个数据每次应用程序发送的边界的问题,而不是说TCP让粘包或拆包的一个逻辑。
如果获取完整的应用程序报文?
1.使用带消息头的协议,头部写入包长度,然后再读取包内容。
2.设置定长消息,每次读取定长内容,长度不够时定位补固定字符。
3.设置消息边界,服务端从网络流中按照消息边界分离出消息内容,一般使用"\n"
4.更为复杂的协议,比如:json/protobuf。