拆包

Netty精粹之TCP粘包拆包问题

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-09 11:58:07
粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生这个问题,因此这篇文章只讨论发生在传输层的TCP粘包拆包问题。 什么是粘包、拆包? 对于什么是粘包、拆包问题,我想先举两个简单的应用场景: 客户端和服务器建立一个连接,客户端发送一条消息,客户端关闭与服务端的连接。 客户端和服务器简历一个连接,客户端连续发送两条消息,客户端关闭与服务端的连接。 对于第一种情况,服务端的处理流程可以是这样的:当客户端与服务端的连接建立成功之后,服务端不断读取客户端发送过来的数据,当客户端与服务端连接断开之后,服务端知道已经读完了一条消息,然后进行解码和后续处理...。对于第二种情况,如果按照上面相同的处理逻辑来处理,那就有问题了,我们来看看第二种情况下客户端发送的两条消息递交到服务端有可能出现的情况: 第一种情况: 服务端一共读到两个数据包,第一个包包含客户端发出的第一条消息的完整信息,第二个包包含客户端发出的第二条消息,那这种情况比较好处理,服务器只需要简单的从网络缓冲区去读就好了,第一次读到第一条消息的完整信息,消费完再从网络缓冲区将第二条完整消息读出来消费。 没有发生粘包、拆包示意图 第二种情况: 服务端一共就读到一个数据包,这个数据包包含客户端发出的两条消息的完整信息