Tcp粘包和拆包的原因

转载 2018年04月16日 18:36:17

最近研究Netty网络编程,以前项目中也遇到过数据接收过程中数据质量太差问题,很可能是TCP传输过程中问题,特此记录。

问题产生
一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题。

下面可以看一张图,是客户端向服务端发送包:
这里写图片描述

上图中第三中情况有误,TCP为有序传输,顺序应该是Data2_2 Data2_1 Data1

  1. 第一种情况,Data1和Data2都分开发送到了Server端,没有产生粘包和拆包的情况。

  2. 第二种情况,Data1和Data2数据粘在了一起,打成了一个大的包发送到Server端,这个情况就是粘包。

  3. 第三种情况,Data2被分离成Data2_1和Data2_2,并且Data2_1在Data1之前到达了服务端,这种情况就产生了拆包。

由于网络的复杂性,可能数据会被分离成N多个复杂的拆包/粘包的情况,所以在做TCP服务器的时候就需要首先解决拆包/粘包的问题。

TCP粘包和拆包产生的原因
1. 应用程序写入数据的字节大小大于套接字发送缓冲区的大小

  1. 进行MSS大小的TCP分段。MSS是最大报文段长度的缩写。MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是TCP报文段的最大长度,而是:MSS=TCP报文段长度-TCP首部长度

  2. 以太网的payload大于MTU进行IP分片。MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成若干片,让每一片都不超过MTU。注意,IP分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

TCP粘包和拆包的解决策略
1. 消息定长。例如100字节。

  1. 在包尾部增加回车或者空格符等特殊字符进行分割,典型的如FTP协议

  2. 将消息分为消息头和消息尾。

  3. 其它复杂的协议,如RTMP协议等。

TCP粘包和拆包原因

TCP 粘包 拆包
  • huaishu
  • huaishu
  • 2015-11-25 19:12:39
  • 4542

转载和积累系列 - TCP粘包和拆包问题

问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题。 下面可以看一张图,是客户端向服务端发送包: 1...
  • initphp
  • initphp
  • 2014-12-15 20:59:38
  • 10022

TCP粘包,拆包及解决方法

转自:http://blog.insanecoder.top/tcp-packet-splice-and-split-issue/ 在进行Java NIO学习时,发现,如果客户端连续不断的向服...
  • Scythe666
  • Scythe666
  • 2016-07-22 16:35:36
  • 14613

一起学Netty(七)之 TCP粘包拆包基本解决方案

可以看到被分了20次读取,我们可以这样理解,客户端发送了2次req字节,每个req中有10个“$$__”,这样就是第11次切割的时候其实发送了粘包,第一个req中末尾部分和第二次的头部粘在了一起,作为...
  • linuu
  • linuu
  • 2016-05-07 17:17:07
  • 13030

TCP粘包,拆包及解决方法、丢包的原因及解决办法

参考此博客https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/ 粘包、拆包发生原因 发生TCP粘包或拆包有很多原因,现列出...
  • ldw662523
  • ldw662523
  • 2018-03-15 11:42:36
  • 61

TCP 粘包 和 拆包

本文来源:《Netty权威指南》 TCP 粘包/拆包 TCP 是一个“流”协议,没有分界线。 TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分。 粘包/拆包现...
  • hbtj_1216
  • hbtj_1216
  • 2016-12-08 16:29:12
  • 918

tcp粘包、 拆包 与解决方法

**我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个...
  • yushuifirst
  • yushuifirst
  • 2015-08-02 10:21:45
  • 1032

Tcp编程常见问题及解决方法总结(粘包,拆包)

文章来源:http://www.cnblogs.com/wenjingu/p/3809778.html 问题1、粘包问题 解决方法一:TCP提供了强制数据立即传送的操作指令push,TCP软件收到...
  • libaineu2004
  • libaineu2004
  • 2017-05-26 16:00:06
  • 489

Socket TCP粘包拆包

TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发...
  • robinjwong
  • robinjwong
  • 2015-12-03 01:26:12
  • 2781

【Netty4.x】Netty TCP粘包/拆包问题的解决办法(二)

上一篇:【Netty4.X】Unity客户端与Netty服务器的网络通信(一)一、什么是TCP粘包/拆包  如图所示,假如客户端分别发送两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确...
  • liulongling
  • liulongling
  • 2016-07-07 20:25:21
  • 13976
收藏助手
不良信息举报
您举报文章:Tcp粘包和拆包的原因
举报原因:
原因补充:

(最多只允许输入30个字)