tcp的粘包和拆包问题
粘包问题即主要的解决方法:
粘包问题的主要原因是,操作系统在发送数据前会先将数据存放在发送缓冲区当中,
发送数据过多或者过少都会造成当前发送的数据当中包含的是多个请求的内容,就造成
了粘包的问题。
1 发送端使用固定长度的包进行发送,若当前的包的长度不足指定的长度,使用空格
将剩余的长度补齐。收端按照固定长度读取,则不会发生粘包的问题了。
2 在每个包后面加上\r\n的记号,对端在tcp报文段当中直到读取到了\n\r才认定当前
是一个完整的数据包。
3 将消息分为请求头和请求体,头部当中存储的为数据包的长度,只有在读取到头部
指定长度的数据之后认为读到了一个完整的数据包。
发生粘包和拆包的几种情况:
1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
2.应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
3.进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。
4.接收方法不及时读取套接字缓冲区数据,这将发生粘包。