Skip to content

Latest commit

 

History

History
12 lines (10 loc) · 1.39 KB

TCPPacket.md

File metadata and controls

12 lines (10 loc) · 1.39 KB

什么是 TCP 粘包和拆包?

TCP粘包/拆包发生的原因

  1. 应用程序写入字节的大小大于socket发送缓冲区大小,此时会发送拆包
  2. 应用程序发送数据大小大于MSS(最大数据报文段),此时会进行MSS大小的TCP分段
  3. 以太网帧playload大于MTU(通信协议某一层最大允许通过的数据包大小)进行IP分片。如果IP层有数据要传,而且数据长度比链路层的MTU大,那么IP层就会进行数据分片,每个数据片的大小不超过链路层的MTU

TCP粘包/拆包解决策略

  • 由于TCP无法理解上一层的业务数据特点,所以TCP是无法保证发送的数据包不发生粘包和拆包,这个问题只能通过上层的协议栈设计来解决,解决思路有一下几种:
  1. 消息定长。每个发送的数据包大小固定,比如100字节,不足100字节的用空格补充,接受方取数据的时候根据这个长度来读取数据
  2. 消息末尾增加换行符来表示一条完整的消息。接收方读取的时候根据换行符来判断是否是一条完整的消息。如果消息的内容也包含换行符,那么这种方式就不合适了。
  3. 将消息分为消息头和消息尾两部分,消息头指定数据长度,根据消息长度来读取完整的消息。例如UDP协议是这么设计的,用两个字节来表示消息长度,所以UDP不存在粘包和拆包问题。