Socket通讯中的粘包问题及处理方案
1、TCP提供的是一种面向连接的,可靠的字节流服务,没有消息边界,所以会产生粘包问题。
当出现如下情况时会出现粘包情况:
1、当应用程序发送缓冲区大于套接口发送缓冲区。
2、由TCP传递给IP的报文段大于MSS时。
3、当网络层向网络接口层发送的数据包大小超过MTU
例如:两个主机HostA和HostB,主机A向主机B发送M1和M2两个数据包。则主机B接收数据包时出现的如下情况:
情况一:M1和M2,分别接收完.
情况二:M1和M2一次性接收完.
情况三:先接收M1和M2的一部分M2_1,再接收M2的另一部分M2_2.
情况四:先接收M1的一部分M1_1,再接收M1的另一部分M1_2.和M2
情况。。。。。
2、粘包的解决方案
本质上是要在应用层维护消息与消息的边界
方式一:定长包。有可能增加了网络的负担,例如:如果定义的发送缓冲区是100个字节,而要发送的数据是10个字节,则每次都 得发送100个字节。
方式二:包尾加\r\n(ftp)。如果数据包中含有\r、\n,则需要进行转义等操作。
方式三:非定长的数据包。即包头加上包体长度,这样可以先接收包头(含有数据包长度),再接收包体,有效的降低了网络的负担
方式四:更复杂的应用层协议。