TCP协议的粘包问题(数据的无边界性)

数据的接收和发送是无关的,read()/recv() 函数无论数据发送了多少次,都会尽量多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不一样。web

例如,write()/send() 重复执行三次,每次都发送字符串"abc",那么目标机器上的 read()/recv() 可能分三次接收,每次都接收"abc";也可能分两次接收,第一次接收"abcab",第二次接收"cabc";也可能一次就接收到字符串"abcabcabc"。svg

这就是数据的“粘包”问题,客户端发送的多个数据包被当作一个数据包接收。也称数据的无边界性,read()/recv() 函数不知道数据包的开始或结束标志(实际上也没有任何开始或结束标志),只把它们当作连续的数据流来处理。函数