tcp粘包现象

粘包现象

  • 为什么TCP会粘包UDP不会

    • UDP传输会有网络最大宽带限制,一般情况不用于传输大文件(除非对限制进行设置)消息之间有边界
    • TCP传输是通过拆包进行网络传输的,可以传输大文件,但是也导致多条消息之间没有边界发生粘包
  • 为什么会出现粘包现象

    • 粘包现象只发生在TCP协议中,TCP协议多条消息之间没有边界,并且还有一大堆优化的算法
    • 发送端:两条消失都很短,发送的间隔时间短
    • 接受端:多条消息由于没有及时接受,而在缓存端推在一起导致粘包
  • struct模块:可以将2G的数字转换成四个字节,在转换回来

    • struct.pack 转换成四个字节
    • struct.unpack 转换回原来数字
  • 粘包现象怎么解决

    • 发送方:计算将要发送数据的长度,发送方通过struct.pack模块把长度转换成固定的4个字节,发送四个字节的长度。

    • 接收方:接受四个字节在使用struct.unpack把4个字节转换成数字,这个数字就是我们要接受数据的长度,接受完长度后再根据长度接受数据

    • 服务端

      # 服务端
      import socket
      import struct
      sk=socket.socket()
      sk.bind(('127.0.0.1',1321))
      sk.listen()
      conn,addr=sk.accept()
      mag1=input('>>>')
      mag2=input('>>>')
      conn.send(struct.pack('i',len(mag1)))
      conn.send(struct.pack('i',len(mag2)))
      conn.send(mag1.encode('utf-8'))
      conn.send(mag2.encode('utf-8'))
      conn.close()
      sk.close()
      
    • 客户端

      #客户段
      import socket
      import time
      import struct
      sk=socket.socket()
      sk.connect(('127.0.0.1',1321))
      time.sleep(0.1)
      m1=struct.unpack('i',sk.recv(4))[0]
      m2=struct.unpack('i',sk.recv(4))[0]
      mag1=sk.recv(m1).decode('utf-8')
      mag2=sk.recv(m2).decode('utf-8')
      print(m1)
      print(m2)
      print(mag1)
      print(mag2)
      
      sk.close()
      
posted @ 2021-06-08 11:15  刘家小仙女  阅读(117)  评论(0编辑  收藏  举报