大学生对udp的认识 这样回答offer拿到手软

UDP协议,作为一个面试互联网公司几乎必问的题目,你真的有回答好吗?

请你讲一下什么是UDP

请你说一下TCPUDP区别

请你说下UDP在哪些场景用到。

请你说下UDP特性

请你......

(求求你不要再问了,呜呜呜)

面试的时候,UDP回答好了,并且能答到一些让面试官觉得眼前一亮的点,会给你面试加不少分,并且作为一个基础问题,更能看出候选人的基础到底牢不牢固,这个问题没有回答好,基本就与offer失之交臂。所以让我们一起来快乐的学习下UDP吧~

推荐视频:

腾讯一面题: UDP如何实现可靠性传输?

网络原理tcp/udp,网络编程epoll/reactor,面试中正经“八股文”

直播学习地址:C/C Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

UDP它是一种用户数据报协议,即User Datagram Protocol。UDP和TCP都属于运输层协议中的一种

大学生对udp的认识 这样回答offer拿到手软(1)

UDP的主要特点有:

1.UDP是无连接的,所以在发送数据前和发送数据后,都不需要建立连接和断开连接,减少了开销

2.UDP使用尽最大努力交付,即UDP它不保证可靠交付,这个我稍后会举一个例子,说明什么是尽最大努力交付。

3.UDP是面向报文的,发送方的UDP只在应用程序交下来的报文添加了首部后就交付给IP层。UDP对应用层交下来的报文,既不合并,也不拆分,也就是说应用层交给UDP多长的报文,UDP就照样的发送,UDP一次交付一个完整的报文。为了提高效率,应用程序必须选择合适大小的报文,如果报文过长,那么UDP把它交给IP层,IP层可能需要进行分片;如果报文太短,会使得IP数据报的首部相对长度较大,两种情况都会使得IP层的效率降低。

4.UDP没有拥塞控制,所以当网络出现拥塞的时候不会使得源主机的发送速率降低,这非常适用于对实时性要求高的应用,比如实时视频会议等等,它要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞的时候丢失部分数据,对时延要求较高(当很多源主机都同时向网络发送高速率的实时视频流时,网络就有可能发送拥塞,所以不适用拥塞控制功能的UDP是有可能会引起网络产生严重拥塞的问题)。

5.UDP支持一对一,一对多,多对一和多对多的交互通信

6.UDP的首部开销小,只有8个字节,相对于TCP的20字节,要短很多。

大学生对udp的认识 这样回答offer拿到手软(2)

用户数据报UDP包含有两个字段,一个是首部字段,另外一个是数据字段。首部字段有8个字节,分别由四种信息组成,每个信息长度都是为2个字节的。

1.源端口:源主机的发送该信息的端口号,如果不需要对方回信,则可以置为0。

2.目的端口:目的地的端口号,在终点交付报文的时候需要用到。

3.长度:UDP用户数据报的长度。

4.检验和:检测UDP用户数据报在传输中是否有错。

大学生对udp的认识 这样回答offer拿到手软(3)

接下来我们来讨论下它是如何尽最大努力交付

【文章福利】需要C/C Linux服务器架构师学习资料加群812855908(资料包括C/C ,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)

大学生对udp的认识 这样回答offer拿到手软(4)

首先在发送方,在发送前,会先生成一个伪首部,这个伪首部既不向下传递也不向上递交,只是为了做检验和临时生成的,在发送方填完检验和字段到UDP首部后,就会去除伪首部。

伪首部是12字节大小,包括有分别都是4字节的源IP地址,目的IP地址,1个字节的全0,和存储1个字节大小的17(UDP在IP报文的协议号是17),最后2字节存储UDP用户数据报的长度

也许有人就会问了,要这个1字节的全0有什么用呢?因为为了做检验和,UDP把伪首部和UDP用户数据报看做由许多16位的字(即两个字节)组成起来的。那么伪首部有12字节,可以分为6个字,UDP首部有8个字节,共4个字,UDP数据部分如果是奇数个字节,那么就需要填入一个全零的字节(这个字节不会发送),筹齐16位的字。然后把这些数据通过二进制的方式加起来,然后取它们的反码,写入检验和字段中。需要注意的是,因为校验和是16位大小的,即两个字节。我们在计算的过程中可能会发生进位的情况,这个时候需要把高位溢出的数移到最低位相加

例子:

1111 1111 1111 1111 0000 0000 0000 0001 —————————————————————— 0000 0000 0000 0001 取反:1111 1111 1111 1110

这个时候1111 1111 1111 1110就会填入检验和。接收方在接收的时候,会通过获得的UDP用户协议报生成伪首部,然后把数据分成16位的字再次加起来,这次不取反码了,直接和UDP首部中的检验和做加法,如果得到的是全1,那么代表用户数据报在传输的过程没有丢失,如果出现的不是全1,则代表有差错,接收方就应该丢弃这个UDP用户数据报

但是这也仅仅只能解决数据缺失的问题,如果这里面16bit数据做了位置交换,那么UDP是检测不出来的。但是也有许多技术是使用到的UDP协议,包括有:TFTP,SNMP,NFS,DNS,BOOTP等。

这里和大家在科普一个知识点,QQ发送消息使用的就是UDP协议,大家也许会惊讶说,这怎么可能?UDP有乱序和丢包问题,使用QQ发送消息从来没见过乱序的情况呀,洪爵你是不是在吹牛。

这是真的,UDP是运输层协议,它本身不能保数据的顺序性,但是QQ是在其之上的应用层去保证了它的顺序性,如果大家感兴趣,洪爵可以出一期视频给大家演示一下它是如何做到的。什么?我怎么知道大家感不感兴趣?大家可以通过赞赏本篇文章...咳咳,公众号给我发信息呀,告诉洪爵想要看(赞赏的话就更好了)。

好的,咱们继续聊UDP,大家知道UDP数据报能发送的最大长度吗?

之前有说到,UDP首部中有2个字节存储了UDP的用户数据报的长度,那么2个字节即16位,所以UDP用户数据报最大长度不能超过2^16-1 = 65535字节UDP首部占用了8个字节,IP层首部占用了20个字节,那么就只剩下65535-8-20=65507个字节;除此之外,能限制UDP用户数据报长度的还有UDP的缓冲区大小,所以UDP能发送的最大长度 = min(缓冲区大小,65507),然而这就是最终结果吗?当然不是,得出来的只是理想的最长长度,因为还有最后一层能控制UDP传输长度的情况,就是MTU的大小(最大传输单元,Maximum Transmission Unit)。以太网数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被称为链路层的MTU。

大学生对udp的认识 这样回答offer拿到手软(5)

不过鉴于Internet上的标准MTU值为576字节,所以建议在进行Internet的UDP编程时,最好将UDP的数据长度控制在 (576-8-20)548字节以内。并且Internet上许多路由器也是为576,所以为了适配,设置为500 为最理想,腾讯游戏使用的MTU就是500 。

难道说要发送UDP数据报只能发送小于等于MTU大小的吗?其实UDP并不会受到MTU的影响,MTU只会影响下层IP分片,如果你发送数倍于MTU的数据,导致IP层大量分片,这种情况下,如果某个分片丢失了,就会导致整个UDP数据报无效。所以一般不会去发送过大的UDP用户数据报。

大学生对udp的认识 这样回答offer拿到手软(6)

UDP,应该说UDP所在的运输层还有一个很重要的功能:复用分用

同一时间可能有多个应用程序与外界进程进行交互,这个时候大家都可以通过运输层传送到IP层(网络层)。

接收端在接收UDP后,如果发现收到的报文中的目的端口号不正确,就会丢弃这个报文,并且通过网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。如果正确,则会把UDP用户数据报通过相应的端口,上交到对应端口号的应用进程。

好啦,UDP就讲到这里了,相信大家啃完这篇文章,面试再回答UDP就能完虐面试官。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页