TCP底层会根据TCP缓冲区的实际情况对网络传输的数据流进行包的划分,而不会根据上层业务数据的具体含义来划分,所以,一个在业务逻辑上完整的包在实际传输中可能会被拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP拆包/粘包问题。
由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,一般的解决方案有:
- 消息定长:例如每个报文的大小为固定长度200字节,如果不够则空位补缺
- 在包尾添加回车换行符来进行分割
- 将消息分为消息头和消息体,消息头中包含消息总长度
每日学习笔记,写于2020-05-21 星期四