当前位置: 首页 > 图灵资讯 > java面试题> TCP粘包原因和解决方法

TCP粘包原因和解决方法

来源:图灵教育
时间:2024-05-31 13:24:37

  TCP粘包是指:发送方发送的若干包数据到接收方接收时粘成一包。

  发送方原因:

  TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量):

  收集多个小分组,在一个确认到来时一起发送、导致发送方可能会出现粘包问题。

  接收方原因:

  TCP将接收到的数据包保存在接收缓存里,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。

  解决粘包问题:

  最本质原因在与接收对等方无法分辨消息与消息之间的边界在哪,通过使用某种方案给出边界,例如:

  ●发送定长包。每个消息的大小都是一样的,接收方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。

  ●包尾加上\r\n标记。FTP协议正是这么做的。但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界。

  ●包头加上包体长度。包头是定长的4个字节,说明了包体的长度。接收对等方先接收包体长度,依据包体长度来接收包体。