- 应用程序写入字节的大小大于socket发送缓冲区大小,此时会发送拆包
- 应用程序发送数据大小大于MSS(最大数据报文段),此时会进行MSS大小的TCP分段
- 以太网帧playload大于MTU(通信协议某一层最大允许通过的数据包大小)进行IP分片。如果IP层有数据要传,而且数据长度比链路层的MTU大,那么IP层就会进行数据分片,每个数据片的大小不超过链路层的MTU
- 由于TCP无法理解上一层的业务数据特点,所以TCP是无法保证发送的数据包不发生粘包和拆包,这个问题只能通过上层的协议栈设计来解决,解决思路有一下几种:
- 消息定长。每个发送的数据包大小固定,比如100字节,不足100字节的用空格补充,接受方取数据的时候根据这个长度来读取数据
- 消息末尾增加换行符来表示一条完整的消息。接收方读取的时候根据换行符来判断是否是一条完整的消息。如果消息的内容也包含换行符,那么这种方式就不合适了。
- 将消息分为消息头和消息尾两部分,消息头指定数据长度,根据消息长度来读取完整的消息。例如UDP协议是这么设计的,用两个字节来表示消息长度,所以UDP不存在粘包和拆包问题。