1.粘包现象:
tcp是流式传输,是字节流,数据传输之间是没有边界的
流式传输的特点:不限传输长度,可靠传输
tcp协议的特点:慢(因为有回执),和一个conn连接通信,会一直占用通信资源
udp协议: 面向数据包的传输
数据包内容:自己的ip,mac,port 和要发送对象的ip,mac,port 以及要发送的内容:
传输长度有限,不可靠
udp协议特点:传输速度快,可以同时与多个客户端进行通信
2:黏包现象的出现:
由于流式传输的特点,产生了数据连续发送的黏包现象.
在一个conn上建立起来的连接上传输的多天数据是没有边界的
数据的发送和接收不是在执行send/recv的操作时就立刻实现的,
而是要经过操作系统内核Nagle算法:
Nagle 算法,可以将短时间内连续发送的数据整合成一个包,发送到接收端
send(10) send(20) --->recv(1024),如果接收到30个字节就是多收了.
拆包机制:
send(4096) ---> recv(4096),拆成四个包,接收到2048,少收了.
如果是短数据:只需要告诉接收端边界就行了
如果是长数据:不仅要告诉接收端边界,还要保证对方完整的接收
3.解决黏包现象:
struct模块
pack('i',len(msg)) 把数字转成四个字节
num = unpack('i',bytes)[0]