黏包

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]

 

posted @ 2018-09-17 16:28  俏如來  阅读(115)  评论(0编辑  收藏  举报