1、TCP和UDP
Socket为TCP长连接,TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。会存在粘包拆包问题。
UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包拆包问题。
2、粘包拆包
TCP是个流协议,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为一个完整的包可能会被TCP拆分为多个包进行发送,这就是拆包;也有可能把多个小的包封装成一个大的数据包发送,这就是粘包。
3、粘包和拆包的几种情况
1.第一种情况,Data1和Data2都分开发送到了Server端,没有产生粘包和拆包的情况。
2.第二种情况,Data1和Data2数据粘在了一起,打成了一个大的包发送到Server端,这个情况就是粘包。
3.第三种情况,Data2被分离成Data2_1和Data2_2, 并且Data2_1在Data1之前到达了服务端,这种情况就产生了拆包。
由于网络的复杂性,可能数据会被分离成N多个复杂的拆包/粘包的情况,所以在做TCP服务器的时候就需要首先解决拆包/粘包的问题。