• 粘包


    只有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

  • 相关阅读:
    【转载】常考算法模板
    NOIP2020微信步数暴力80分
    NOIP2020移球游戏快速排序满分程序
    第一场NOI Online能力测试入门组B跑步
    【转】STL之Set——插入元素、二分查找元素(log级别)
    [转载]图论500题
    差分约束系统简单介绍(入门)
    辗转相除法的证明
    并查集2个优化——按秩合并和路径压缩
    递推算法之平面分割问题总结
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11098420.html
Copyright © 2020-2023  润新知