TCP的粘包问题篇----起因与解决方案

为什么会发生粘包问题

  首先明确一下包,包是应用层中的数据包。粘包现象,就是发送方发送若干包数据到接收方时数据粘成一团,不知数据包的头和尾。
  为什么会发生粘包问题,大多数原因是因为Nagle算法。我们知道TCP是默认使用Nagle算法。什么是Nagle算法?Nagle算法主要做两个事情:1.得到上一个分组的确认之后,发送下一个分组。2.收集多个小分组,集合成一个分组发送。

  • 在TCP的协议头中,没有像UDP中有一个“报文长度”的字段,但是存在“序列号”这样的字段;从传输层的角度看TCP是一个报文一个报文传输过来的,按照序号放在缓存区当中。
  • 站在应用层的角度来看,就是一串的字节数据。所以应用层看到这些一连串的数据,就不知道哪个部分开始,到那个部分结束。所以就会产生粘包数据。

如何避免粘包问题

  避免粘包问题,其实就是一句话,明确两个包的界限。

  • 对于定长的包,保证每次都按照固定大小读取
  • 对于变长的包,可以在包头的位置,约定一个包的总长度的字段,就知道了包的结束位置。
  • 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议),但是要保证分割符和正文中的内容不冲突。

UDP会发生粘包问题吗?

  • 对于UDP, 如果还没有上层交付数据, UDP的报文长度仍然在. 同时, UDP是一个一个把数据交付给应用层.就有很明确的数据边界.

  • 站在应用层的站在应用层的角度, 使用UDP的时候, 要么收到完整的UDP报文, 要么不收. 不会出现"半个"的情况。

你可能感兴趣的:(网络基础,网络协议)