colincat
2017-07-06 10:00:05 +08:00
1.什么是 TCP 粘包与拆包
首先 TCP 是一个"流"协议,犹如河中水一样连成一片,没有严格的分界线。当我们在发送数据的时候就会出现多发送与少发送问题,也就是 TCP 粘包与拆包。得不到我们想要的效果。
所谓粘包:当你把 A,B 两个数据从甲发送到乙,本想 A 与 B 单独发送,但是你却把 AB 一起发送了,此时 AB 粘在一起,就是粘包了
所谓拆包: 如果发送数据的时候,你把 A、B 拆成了几份发,就是拆包了。当然数据不是你主动拆的,是 TCP 流自动拆的
2.TCP 粘包与拆包产生原因
1.进行了 MSS 大小的 TCP 分段
2.以太网帧的 plyload 大与 MTU 进行了 IP 分片
3.应用程序 write 写入的字节大小大于套接口发送的缓冲区大小
3.解决方法
1.消息定长,比如把报文消息固定为 500 字节,不够用空格补位
2.在包尾增加回车换行符进行分割,例如 FTP 协议
3.将消息分为消息头和消息体,消息头中包含表示消息总长度的字段
可以使用 varint 不固定包头