zoukankan      html  css  js  c++  java
  • TCP的粘包问题

    什么是粘包

      粘包指的是数据与数据之间没有明确的分界线,导致不能正确读取

      应用程序无法直接操作硬件,应用程序想要发送数据则必须将数据交给操作系统,而操作系统需要同时为所有应用程序提供数据传输服务,也就意味着,操作系统不可能立马就能将应用程序的数据发送出去,就需要为应用程序提供一个缓冲区,用于临时存放数据,具体流程如下

      发送方

        当应用程序调用send函数时,应用程序会将数据从应用程序拷贝到操作系统缓存,再由操作系统从缓冲区读取数据并发送出去。

      接收方

        对方计算机收到数据也是操作系统先收到,至于应用程序何时处理这些数据,操作系统并不清楚,所以同样需要将数据先存储到操作系统的缓冲区中,当应用程序调用recv时,实际上是从操作系统缓冲区中将数据拷贝到应用程序的过程。

      上述过程对于TCP与UDP都是相同的不同之处在于;

        UDP在收发数据时是基于数据包的,即一个包一个包的发送,包与包之间有着明确的分界,到达对方操作系统缓冲区后也是一个一个独立的数据包,接收方从操作系统缓冲区将数据拷贝到应用程序

    如何解决粘包问题  

      解决粘包的核心思路就是 先通知接收方 要发送数据的长度

      再发送真实数据

      问题在于 数据长度也是不确定的

      对方也不清楚 长度信息到底是几个字节  

      解决方案是 把长度信息转换为一个固定的字节的二进制数据(要用到struct模块)

  • 相关阅读:
    centos7系统中忘记了root管理员账号密码的解决方式
    【python之路48】生成器表达式、推导式
    小米集团信息化中台战略
    分时函数
    函数节流
    JS浮点计算问题
    要转型做前端开发了
    优秀的开发人员和测试人员应有的态度
    C#数组的笔记
    LINQ不包含列表
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10458711.html
Copyright © 2011-2022 走看看