什么是消息保护边界?
UDP协议发送数据,每一个包都是被分开的,每一个包都有它自己的边界,不会在接收方与其他的包混杂成为一个包
所以粘包和拆包是针对于TCP包
什么是粘包和拆包?
客户端给服务端发送2个TCP数据包有以下几种情况:
(1) 正常,两个包分开发送
(2) 两个包一同发送
(3) 接收到不完整的或多出一部分的数据包。
有3个原因:
- 应用程序一次发送的数据大于套接字缓冲区,导致发生拆包,
- 应用程序一次发送数据小于套接字缓冲区大小,网卡将多次发送的数据一次发送到服务端
- 应用程序不及时读取套接字缓存区的数据
- tcp报文长度大于分段长度(MMS)。
注:上图第二种情况是粘包,第三种情况和第四种情况是粘包和拆包
如何解决拆包和粘包?
-
> 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度(数据长度和内容一起发送)
-
> 发送端将每个数据包封装为固定长度(不够的可以通过补0填充)
- > 可以在数据包之间设置边界,如添加特殊符号
具体实现
to do ......................