zoukankan      html  css  js  c++  java
  • 粘包

    只有TCP有占包问题,UDP不会出现

    123-粘包问题-socket收发消息.png

    111、应用程序看到的数据是一个整体(流),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,容易出现粘包的问题。TCP协议层会把构成整条消息的数据段排序完成后呈现在内核缓冲区

    222、UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须是以消息为单位提取数据,不能因此提取任意字节的数据,这一点和TCP很不同。

    所谓的粘包问题主要是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据造成的

    111、UDP 的recvfrom 是阻塞的,一个recvfrom(x)必须是对唯一一个sendinto(y),收完了x个字节的数据就算完成,若y>x,数据就会丢失,UDP根本不会出现粘包,但是会丢失数据,不可靠

    222、TCP的协议数据不会丢失,没有收完包,下次再接收,会继续上次继续接收,己端总是在收到ack时才会清除缓冲区的内容,数据是可靠的,但是回粘包

    TCP发送数据的四种情况

    123-粘包问题-粘包可能.png

    • D1和D2间隔时间长,且两者数据量小,不会发生粘包问题
    • D1和D2间隔时间非常短,数据量小,会发生粘包问题,tcp协议本身规定的
    • D2比较大,D1比较小,间隔时间也短,服务端一次性读取D1和D2的一部分,出现了粘包问题
    • D1大,D2比较小,获取了D1的一部分,然后获取了D1的剩余部分和D2,出现了粘包问题

    粘包的两种情况

    1、发送端需要等缓冲区满了才出去,造成粘包(发送数据时间间隔非常短,数据量小,会合在一起,产生粘包

    2、接收方不及时接收缓冲区的包,造成了多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

    解决方法

    • 1、两者间隔时间变长
    • 2、发送之前告诉客户端数据的大小

    发送前告诉大小,这个大小也会占位置

    大小的位置必须得固定

    4:4,4:4,4:4,100:4,200:4

  • 相关阅读:
    第五章
    第四章
    第三章
    第二章
    第一章
    configparser-xml-subprocess-shutil
    sys,os,模块-正则表达式
    %----format 格式化字符串---- 生成器---- 迭代器
    python 内置函数
    python 内置函数!
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11098420.html
Copyright © 2011-2022 走看看