UDP踩坑——为啥老阻塞?

码林潮汐
• 阅读 8922

众所周知,UDP是尽力而为的服务,也就是传输是不可靠的,丢包不会给你重传,只会做一些简单的查错。最最最重要的是UDP没有TCP的三次握手机制!如果大家想要通过UDP传输一些文件之类的话,就需要模拟TCP三次握手,让UDP能够“活”起来,不然就会造成丢包,或者造成因为丢包而产生的阻塞。

  1. 踩坑①:


    UDP踩坑——为啥老阻塞?
    图中左侧的流程中,Client端按照文件大小除以packet大小来确定while循环的次数,这是比较致命的,因为在UDP中极有可能出现丢包的情况,那么循环的次数就不是正确的次数了,从而造成阻塞。而丢包在以太网中还是比较少见的,但是还是发生了丢包,这是为什么呢?八成就是在在Socket建立之前就丢了!所以进而造成循环次数不对,Client苦苦等待,Server端已经发完运行之后的程序了。

    那么我们应该如何解决这样的问题呢?

    • 不用循环次数来退出while循环!而用自定的一种说明,比如Server端传完数据之后再额外发一个终止信息,Client接收到终止信息之后退出while循环,那么这样依旧可能造成终止信号丢失,Client又阻塞了...这时一个办法是采用可靠传输的TCP传送终止信号,或者通过setSoTimeout来设置超时时间,一旦超过这个时间就退出。
    • 让Server端等待Client建立Socket,建立完之后再给爷传!也是采用可靠的数据传输TCP,告知Server我已经建立连接了,您可以传输了。也就是图中右侧部分的流程。
    • 图中还有第三种解决方法就是直接让Server端sleep,但是因为时间不太好确定,所以不太推荐。
  2. 踩坑②:

    在server端,我们创建固定大小(如512B)的byte[] b封装我们的dataPacket,但是文件往往不是能被完整划分的,所以最后一个文件的实际信息大小可能会小于512B。此时在Client,我们将传输之后的文件写进本地的文件中,dp是dataPacket,里面存储着传输过来的信息byte[] b =dp.getData(),在将b写入文件时,我们应该取0-b的实际有效信息的长度,不然会产生实际有效信息长度小于512B时,b会被自动填充前面一个dp的信息以使得b的大小达到512,这就产生了冗余

    具体结果如下:

    正确接收文件:

    UDP踩坑——为啥老阻塞?
    产生冗余之后的:

    UDP踩坑——为啥老阻塞?
    可以明显看到重复的文字,所以我猜测dataPacket是排队连起来的,若信息长度不够时,会拿前面一个数据包信息填充。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
tcp粘包与udp丢包的原因
tcp粘包与udp丢包的原因一,什么是tcp粘包与udp丢包TCP是面向流的, 流要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送
Easter79 Easter79
3年前
tcp、netstat、dns
传输层协议与应用掌握TCP的封装和工作原理掌握UDP的封装和工作原理了解常用的TCP和UDP端口号对TCP和UDP首部能够进行分析!(https://oscimg.oschina.net/oscnet/7614088914017ad2c404c2a31fd3a0b3c92.png)传输层的作用IP层提供点到点的连接传输层提
Easter79 Easter79
3年前
tcp编程、socket编程、redis
tcp编程(需要建立连接,三次握手,四次挥手,然后发送信息流,数据包是有序的)udp编程(知道IP、端口直接发送数据,数据包可能是无序的)1、客户端和服务器客!(http
Wesley13 Wesley13
3年前
UDP协议报文格式
今天让我们来认识一下UDP协议的报文格式UDP协议和TCP协议同位于传输层,介于网络层(IP)和应用层之间:UDP数据部分为应用层报文,而UDP报文在IP中承载。如下图:!(https://oscimg.oschina.net/oscnet/74e201602c3a16bf23339e6347610af1f67.png)UDP报文格式
Wesley13 Wesley13
3年前
IM总结
发送消息UDP打洞,登录的时候HTTP。登录成功后,会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式登录的时候,端口是8000。如果采用UDP协议,通过服务器中转方式。UDP协议是不可靠协议,它只管发送,不管对方是否收到的。如果client使用UDP协议发送消息后,服务器收到该包,需要使用UDP协议发回一个
Easter79 Easter79
3年前
TCP&UDP&Socket讲解(上)
这两天我将整理TCP&UDP&Socket,大约花大家1015分钟之间,希望本篇文章让大家对TCP使用的理解提高一个层次。 建议大家拿出纸和笔,画一下!!!一、TCP1\.TCP位于传输层,英语全称为TransmissionControlProtocol,又名传输控制协议;UDP英语全称为UserDatagramProtoc
Wesley13 Wesley13
3年前
TCP UDP有什么区别
前言计算机分层中的传输层,主要是负责计算机之间的数据传输,TCP和UDP都属于传输层协议。在实际开发过程中,需要根据实际需求的来选择适当的传输协议。在这里我们简单总结下TCP、UDP的特点和区别以及实际开发中如何选择。TCP和UDP的定义TCP是面向有连接,可靠的流协议。保证两端通讯主机之间
Stella981 Stella981
3年前
PHP Swoole与TCP三次握手
握手常见问题1、连接拒绝2、Operationnowinprogress多是因为丢包、错误ip、backlog满了&阻塞&tcp_abort_on_overflow03、min(maxconn,backlog)sslt连接拒绝在TCP三次握手的时候,客户端发送
Wesley13 Wesley13
3年前
Java网络编程——12.UDP
前面几章讨论了在TCP传输层协议之上运行的网络应用程序,TCP是为数据的可靠传输而设计的。用户数据报协议(UserDatagramProtocal,UDP)是在IP之上发送数据的另一种传输层协议,速度很快,但不可靠。当发送UDP数据时,无法知道数据是否会到达,也不知道数据的各个部分是否会以发送时的顺序到达。1、UDP协议类似F
API 小达人 API 小达人
1年前
如何在 Eolink Apikit 中发起 TCP/UDP 文档测试
TCP/UDP是两种常用的网络传输协议。TCP协议提供可靠的连接,而UDP协议提供不可靠的连接。
ELB UDP健康检查常见故障分析
UDP是面向非连接的一种协议,在发送数据前不会通过进行三次握手建立连接,UDP健康检查的实现过程如下:
码林潮汐
码林潮汐
Lv1
烽火连三月,家书抵万金。
文章
3
粉丝
0
获赞
0