• TCP的粘包问题


    什么是粘包

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

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

      发送方

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

      接收方

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

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

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

    如何解决粘包问题  

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

      再发送真实数据

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

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

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

  • 相关阅读:
    mysql__视图
    mysql__索引的设计和使用
    mysql————表类型(存储引擎)的选择
    mysql 常用函数
    mysql中的运算符
    HTML5 API详解(1):fullscreen全屏模式
    深入了解 Flexbox 伸缩盒模型
    BAT及各大互联网公司2014前端笔试面试题--Html,Css篇
    js运动动画
    原创:自定义三叉树
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10458711.html
Copyright © 2020-2023  润新知