Linux UDP相关

1、什么是UDP?

答:UDP提供尽量少的传输层服务,除了复用和解复用外,还提供了轻量级的错误检查。UDP将进程消息加上源端口号和目的端口号(用来复用和解复用),再加上两个域,直接将段传送给网络层。在发送段之前两个传输层实体之间没有握手,因此成为无连接的。 

2、有许多应用适合UDP的原因是什么?

答:

(1)很好的应用层控制(发送什么数据和什么时候发送) 
UDP可以直接将封装好的段传给网络层进行传输,而TCP有拥塞控制和握手,不管这些机制耗时多少

(2)不需要建立连接 
TCP在发送信息之前需要三次握手建立连接,而UDP直接发送信息,没有延迟。这也就是DNS使用UDP的原因,而http使用TCP是因为对于web网页,可靠性很重要。

(3)不需要连接状态 
TCP需要在端系统中保存连接状态,包括接收端和发送端的缓冲信息,拥塞控制参数,序号和确认号,而UDP不需要保存这些信息,因此一个使用UDP的服务器可以支持更多的客户端

(4)更小的头部载荷 
TCP段有20字节头部,UDP只有8字节头部

3、UDP的段结构什么样子的?

答:UDP段包括4个域:源端口号、目的端口号、段长度(头部+数据)、校验和(用来检查段中头部是否有错误),每个域占两个字节。

4、UDP校验和是什么?

答:将除了校验和的三个域的二进制按位相加,得到的和进行取反,填入校验和域。在接收端将这四个域的二进制数按位相加,如果不全为1,则传输中发送错误。 
尽管UDP提供错误检验,但是却没有提供错误校正的机制

5、tcp并发与udp并发的区别

答:Libev适用于网络高并发,主要由于它支持epoll、select等多路复用机制,加之与多线程配合,性能较好。但是无论是epoll还是select,在观察有无数据就绪时,都是针对多个文件描述符。如果只有一个文件描述符,那么进程只要观察那一个文件描述符即可。在网络编程中,一个Socket对应一个文件描述符。Tcp协议的server在监听端口前初始化一个socket,每有一个新的连接,就新建一个socket。因此当tcp服务器面对高并发请求时,实际上有多个socket,也就是有多个文件描述符。Libev适用于这种模式。Udp协议的Server没有真正意义上的“连接”的概念,在监听端口和响应请求时都只有一个socket,也就只有一个文件描述符。因此,对于udp服务器,Libev实际上意义不大。虽然Libev支持网络IO事件,也就支持udp协议,但是在udpsocket中直接使用epoll效果不佳,测试发现由于存在额外开销,将小幅度降低性能。

 

6、udp并发的常规思路是什么?

答:大部分udp服务器是顺序迭代的,服务器等待客户端请求,然后读取请求,处理请求,发回响应。但是,当处理客户端请求需要很长时间,就需要考虑某种形式的并发。一个“长处理”可以理解为处理请求的时间明显大于发送请求的时间。并发的常见思路是使用多线程。服务器在读取一个新请求之后,可以交由一个线程处理,该线程在处理之后直接将响应内容发给客户端。另一方面,udp服务器和多个客户端交互,但是却没有多个socket。典型的解决方案是,服务器为每个客户端创建一个新的socket,并绑定一个新的端口。客户端以后就通过这个新的socket与服务器通信,获得响应。总结来说,udp并发服务器,针对多个客户端,可以创建多个socket;针对多个请求,可以使用多线程(线程池)进行处理。

 7、影响UDP高效的因素

答:

(1) 无法智能利用空闲带宽导致资源利用率低

一个简单的事实是UDP并不会受到MTU的影响,MTU只会影响下层的IP分片,对此UDP一无所知。在极端情况下,UDP每次都是发小包,包是MTU的几百分之一,这样就造成UDP包的有效数据占比较小(UDP头的封装成本);或者,UDP每次都是发巨大的UDP包,包大小MTU的几百倍,这样会造成下层IP层的大量分片,大量分片的情况下,其中某个分片丢失了,就会导致整个UDP包的无效。

由于网络情况是动态变化的,UDP无法根据变化进行调整,发包过大或过小,从而导致带宽利用率低下,有效吞吐量较低。而TCP有一套智能算法,当发现数据必须积攒的时候,就说明此时不积攒也不行,TCP的复杂算法会在延迟和吞吐量之间达到一个很好的平衡。

(2) 无法动态调整发包

由于UDP没有确认机制,没有流量控制和拥塞控制,这样在网络出现拥塞或通信两端处理能力不匹配的时候,UDP并不会进行调整发送速率,从而导致大量丢包。在丢包的时候,不合理的简单重传策略会导致重传风暴,进一步加剧网络的拥塞,从而导致丢包率雪上加霜。更加严重的是,UDP的无秩序性和自私性,一个疯狂的UDP程序可能会导致这个网络的拥塞,挤压其他程序的流量带宽,导致所有业务质量都下降。

(3) 改进UDP的成本较高

可能有同学想到针对UDP的一些缺点,在用户态做些调整改进,添加上简单的重传和动态发包大小优化。然而,这样的改进并比简单的,UDP编程可是比TCP要难不少的,考虑到改造成本,为什么不直接用TCP呢?当然可以拿开源的一些实现来抄一下(例如:libjingle),或者拥抱一下Google的QUIC协议,然而,这些都需要不少成本的。

上面说了这么多,难道真的不该用UDP了吗?其实也不是的,在某些场景下,我们还是必须UDP才行的。那么UDP的较为合适的使用场景是哪些呢?

 

8、大家喜欢用udp的原因是什么?

(1)节省创业成本。udp比tcp开销少,意味着一台服务器能服务的用户更多,并且用udp更容易普遍使用p2p,不用服务器中转,更是大大节省中央服务器的开销。

(2)灵活。形象的说,tcp就是在udp基础上实现的一套用起来更简单更傻瓜的协议。用更底层的方式可以构建更高效灵活并符合自己需求的协议,当然是更优的,但提高了开发成本,最基本的,离开局域网后udp丢包概率大,收到包时候的次序可能都是乱的,包括对方还有没有网络,这些全都需要自己去维护,而tcp的数据准确性那都是tcp协议就帮程序员维护好的,对方断线你就知道收到通知了。

(3)udp打洞能更容易在不同品牌型号的路由情况下实现p2p,无论聊天文本、语音视频、文件收发都可以实现,对upnp等的支持,很多年了路由器都没有统一,但udp打洞来实现p2p基本上都没问题。

9、在外网通信链路不稳定的情况下,有什么办法可以降低UDP的丢包率呢?

答:一个简单的办法来采用冗余传输的方式。一般采用较多的是延时双发,双发指的是将原本单发的前后连续的两个包合并成一个大包发送,这样发送的数据量是原来的两倍。这种方式提高丢包率的原理比较简单,例如本例的冗余发包方式,在偶数包全丢的情况下,依然能够还原出完整的数据,也就是在这种情况下,50%的丢包率,依然能够达到100%的数据接收。

10、UDP的通信有界性是什么?

答:在阻塞模式下,UDP的通信是以数据包作为界限的,即使server端的缓冲区再大也要按照client发包的次数来多次接收数据包,server只能一次一次的接收,client发送多少次,server就需接收多少次,即客户端分几次发送过来,服务端就必须按几次接收。

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值