`
lbyzx123
  • 浏览: 475970 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

udp传输到底会不会发生粘包问题

 
阅读更多
看了一些解答说udp都是整包发,整包收,不会发生粘包,但是周围的前辈们说还是有可能的,我们现在服务端收到的数据也就几十个字节的大小,收的频率是每秒10条左右吧,到底会不会发生粘包现象,就是两条数据粘一块,或者其中一条数据不完整另一个完整

从TCP与UDP的区别讲起
网络数据经过路由器,如果数据很小,没有超过路由器的封包大小,就会直接直接经过路由器到达下一个路由器,一层一层最终到达目的地
如果数据很大,这里指一个发送,超过了路由器的封包大小,那么路由器就会把这个数据包进行拆分,比如拆分成A B C三个包,这三个包都没有超过路由器的封包大小,到达下一个路由器的时候,TCP与UDP的区别就来了:
TCP收到A的时候,会resp通知源路由器,A到达,B C包依然如此,如果由于网络的各种原因,目的路由收到了A C,B没有收到,TCP会要求源路由把B包重新发一次,直到ABC包目的路由都接受到了,那么目的路由把ABC包重新组成起始包,继续往下一个路由发送,这就是TCP安全连接的由来,只要发送,我就能保证目的一定能收到(网络断开能检测到)
UDP则不是这样,如果ABC包拆分之后,目的路由只收到AC,经过检测,B没有被收到,那么此包就会被当作不完整,直接被丢弃。由于UDP没有resp的通知过程,所以,UDP的传输效率要高一些,当然安全性也低一些
由上面的这些可以得出结论:UDP是绝对不会被粘包,因为路由器收到的只会是完整数据才会继续下发,什么粘包处理完全没有必要。

一般网络编程时候,也会定义数据包头,包体
TCP接收数据的时候,可以先接收包头进行安全验证,通过继续接受包体,不通过直接断开连接
UDP接受则没有办法这样做,你再大的一个数据,一个RECV,也是直接接受,不能说我先接受多长,这样是不可能的(不过一般大文件数据,都不会用UDP这种不安全传输)。


UDP有明确的结束标志,不会有粘包的,UDP本身有对数据完整性的校验,不完整的包会被丢弃,所以也不会不完整。如果你是指一次会受到2-3个UDP包,那只要根据开头和结束标记分割就行了。TCP的话,只要所需数据块的大小是确定的,然后每次接受的数据根据长度,不足就继续收,超过就把剩余的存下来与下次的接受合并,就可以解决粘包问题。

粘包这个词应该是特指TCP的,是你一次发的数据太少,不值得发一次,系统就把他缓冲下来,和下次的一起发了。这是因为TCP传输本来就是流的概念,程序处理的是流,怎么分包程序都应该能正确处理。多数情况下TCP也不需要处理粘包。
UDP没有粘包,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包。

UDP不是流协议,有消息边界,不存在粘包的问题。要丢就是整个包都丢了。



真正的原因如下:
TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送出去, 这样, 就可以有效提高发送效率. 所以会造成所谓的粘包, 即前一份Send的数据跟后一份Send的数据可能会暂存到缓冲当中, 然后一起发送.

UDP就不同了, 面向报文形式, 系统是不会缓冲的, 也不会做优化的, Send的时候, 就会直接Send到网络上, 对方收不收到也不管, 所以这块数据总是能够能一包一包的形式接收到, 而不会出现前一个包跟后一个包都写到缓冲然后一起Send.

但其实别想得太复杂的, TCP所谓的粘包处理, UDP所谓的丢包处理, 其实都是很简单的.
TCP只要保证自己写入的流是按 长度 + 内容 + 长度 + 内容 这样就可以非常简单的解决粘包问题, 切忌不要采用所谓的 开始标识 + 数据 + 结束标识 来分包, 适用性极低, 错误率极高, 除非数据都是固定有格式, 否则是不能采用这种方式的.
UDP传送当中, 只存在丢包的可能, 收到包的时候, 肯定这个包的内容就是正确的, 很少会有错误的, 因为UDP本身也会用CRC32进行验证, 还有长度验证, 验证不通过, 系统自动就会丢弃, 所以, 只需要去想象一种情况, 把一个苹果切了很多块, 然后要捡起这些块到另外一个容器, 由另外一个人进行重组, 而这捡的过程当中, 有可能切的人捡漏了某些块, 然后重组苹果的人就要求切的人重新把缺失的块捡回来。

 

分享到:
评论

相关推荐

    unity实现Socket通讯(内含tcp粘包/拆包解决)

    TCP协议是基于字节流的,没有消息边界,可能会出现粘包或拆包的问题。为了解决这个问题,我们通常采用以下策略: - 固定长度消息:每个数据包都设定固定长度,便于解析。 - 包头+包体:每个数据包前加上包头,包含...

    mina 断包,粘包问题解决

    Apache Mina作为网络通信库,其设计目标是提供高效、稳定的通信机制,但因为TCP协议本身的特性,不可避免地会遇到断包和粘包的问题。为了解决这些问题,Mina提供了一些内置机制,如缓冲区管理和自定义编码解码器。 ...

    Socket通信,通过异步,解决粘包问题

    在TCP/IP协议栈中,Socket接口提供了应用层与传输层之间的接口,使得应用程序能够利用TCP或UDP等传输层协议进行数据交换。 在Socket通信中,"粘包"问题是一个常见的挑战。所谓“粘包”,是指在网络传输过程中,由于...

    c++服务器 拆包粘包 过程

    然而,由于TCP的特性,可能会导致数据在网络传输过程中出现“粘包”或“拆包”的现象。 首先,我们来解释一下什么是"粘包"和"拆包": 1. **粘包**:当TCP发送端连续发送多个数据包时,接收端可能无法区分这些...

    C#Socket 封装了Tcp/Udp传输字串、文件、对象

    1.封装了Tcp/Udp传输字串、文件、对象的细节,处理了Tcp粘包问题 2.测试代码设计原始Socket、TcpListener、TcpClient、UdpClient的使用 3.测试代码包括一个可以发送文本消息和发送文件的聊天室 4.设计网络通信、多...

    python粘包问题及socket套接字编程详解

    TCP:适合传输数量大 ,需要建立连接,会出现粘包问题,粘包问题可以解决,确定传入的长度,接收同样长度就可以保证一次性传输完 UDP: 适合传输数据量小,没有粘包,不需要连接,一次性传输,下一次就是新的数据,弊端就是数据...

    SuperSocket.ClientEngine.Core socket 客户端处理粘包半包

    由于TCP为了提高传输效率,会将多个小的数据包合并成一个大的数据包进行发送(粘包),或者将一个大数据包分成多个小的数据包发送(半包)。这可能导致接收方无法正确解析数据,尤其是在协议规定了固定长度或分隔符...

    json粘包处理 [Delphi]

    在网络通信中,如果连续发送多个小数据包,为了提高传输效率,网络层可能会将这些小包合并成一个大包发送,接收方在接收到这个大包后,需要将其正确地拆分成原始的小数据包,这就是所谓的“粘包”问题。对于JSON数据...

    socket的粘包处理

    TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagram protocol,用户数据报协议)是无连接的,提供高效率服务。在...

    Unity + Socket + Protobuff+异步+粘包拆包断包_V2

    Protobuff+异步+粘包拆包断包_V2"聚焦于解决在使用Socket进行网络通信时常见的问题,如粘包、拆包、断包以及断线重连等,同时结合了Protocol Buffers(Protobuff)这一高效的数据序列化协议,以提高数据传输的效率和...

    QT socket网络通信 tcp/udp功能开发,带报告 [源码 成品]基tcp/udp开发,实现文字、图片、文件、语音传输

    [源码 成品]基tcp/udp开发,实现文字、图片、文件、语音传输和语音播放、语音对讲(对讲机);自定义协议,可解决tcp粘包等问题;图片、文件、语音传输做了客户端和服务端的交互(类似握手);语音对讲采用多线程。 ...

    ios 录音播放udp数据包传输过来的pcmData流

    我要防止udp的丢包和粘包 于是加上了 协议头 音频标识 音频长度 拼接在最前面 我没处理粘包改怎么做,建议你们自己加,大概思路就是 把两个包合成一个包来处理即可。 写这篇文章的时候还参考了另外一篇文章的思路 ...

    Netty粘包分包服务器端客户端完整例子

    粘包和分包问题通常出现在数据传输过程中。当发送端连续发送多个小包时,接收端可能会一次性接收到这些小包的组合,这称为"粘包";反之,如果一个大包被接收端错误地分割成多个小包处理,就是"分包"。这些问题在基于...

    面试题:聊聊TCP的粘包、拆包以及解决方案.docx

    为什么UDP协议不会有粘包问题呢?这是因为UDP是面向数据报的协议,它有固定的消息边界,每个UDP数据包都是独立的,不会与其他数据包合并或分离。 粘包和拆包的发生场景通常与TCP的缓冲区管理和数据发送策略有关。当...

    python socket网络编程之粘包问题详解

    UDP协议则不会发生粘包,因为它面向消息,每个UDP段都是独立的数据包。 在TCP中,发送方为了提高传输效率,会使用优化算法,如Nagle算法,将小的数据片段合并成一个大的数据块进行发送。这可能导致接收方一次接收的...

    Boostasio异步TCP通讯及tcp粘包解包解决方案.doc

    TCP 粘包解包是指在数据传输过程中,接收方可能会收到多个数据包,并将其合并成一个完整的数据包,这需要在发送方和接收方之间进行协调。本文档将详细介绍 Boostasio 异步 TCP 通讯的实现机制,以及 TCP 粘包解包的...

Global site tag (gtag.js) - Google Analytics