TCP协议下的粘包问题

TCP协议下的粘包问题

  • 粘包问题出现在TCP协议下,在UDP协议下不会出现粘包的问题。
  • 粘包问题出现的原因:

    应用层被成为应用元,操作系统被被称为系统元

    • 合包机制:在TCP协议下有一个合包机制,当应用层传输过来数据后,如果数据较小,并且连续多次传输,此时nagle算法会对把多个数据进行
      打包,统一发送给接收方,
      • 好处是:减少了网络资源的消耗,接收方只需要给发送方回传一份回执即可,如果不进行合包操作,每发送一条数据,接收方就需要回一份回执,会大量消耗网络资源。
      • 弊端是:由于TCP协议下字节流没有明确的边界,很可能出现多条数据打包后到接收方接收的是一条数据,并没有拆分,这是粘包的一种情况。
      
      '''client.py'''
      import socket
      sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      sk.connect(('172.16.12.164', 8085))
      msg1 = sk.recv(1024)
      msg2 = sk.recv(1024)
      print(msg1)
      print(msg2)
      
      '''server.py'''
      import socket
      sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      sk.bind(('172.16.12.164', 8085))
      # 申请网络资源
      sk.listen()
      conn, addr = sk.accept()
      conn.send(b'hello')
      conn.send(b'world')
      
      '''输出结果'''
      b'helloworld'
      b''
      # 出现了粘包现象,两次输入的结果放在了一次输出,第二次输出为空
    • 拆包机制:在TCP协议中除了合包机制外,还有拆包机制。当传输的数据过大,已经超过网卡的MTU限制的时候,TCP协议会自动的把大的文件拆分成多个小于MTU的包分别进行发送。
      • 好处是:这样的话像视频、歌曲等大的文件就可以在TCP协议下进行阐述,不会对数据的大小有进行限制。
      • 弊端是:当传输两个被拆分成多个的大的数据时,前一个数据的最后一块可能和后一个数据的第一块产生粘包问题。例如:第一个文件5000byte,后一个文件2500byte,正常情况下MTU的值为1500。那么第一个数据会被拆分为1500、1500、1500、500,第一个数据的最后一部分不够1500,操作系统的缓存机制起作用了,第二个大的数据传过来的时候先拆分出1000,加上第一个数据的500,组成1500,剩下的再进行拆分,传输过去的时候就发生了前一个数据的最后部分和后一个数据的开始部分发生了粘包的现象。

猜你喜欢

转载自www.cnblogs.com/ddzc/p/12381030.html