面试问到UDP,这样回答offer拿到手软

沙海 2021年6月23日01:51:05Java评论78字数 3325阅读11分5秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/34695.html

今天想给大家讲一下计算机网络里的UDP协议,作为一个面试互联网公司几乎必问的题目,你真的有回答好吗?UDP是无连接的,所以在发送数据前和发送数据后,都不需要建立连接和断开连接,减少了开销。接收端在接收UDP后,如果发现收到的报文中的目的端口号不正确,就会丢弃这个报文,并且通过网际控制报文协议ICMP发送"端口不可达"差错报文给发送方。如果正确,则会把UDP用户数据报通过相应的端口,上交到对应端口号的应用进程。文章源自JAVA秀-https://www.javaxiu.com/34695.html

原文约 2500 | 图片 5 | 建议阅读 5 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/34695.html

面试问到UDP,这样回答offer拿到手软

原创洪爵 KNIGHT洪爵 文章源自JAVA秀-https://www.javaxiu.com/34695.html

大家好鸭~我是洪爵。文章源自JAVA秀-https://www.javaxiu.com/34695.html

今天想给大家讲一下计算机网络里的UDP协议,作为一个面试互联网公司几乎必问的题目,你真的有回答好吗?文章源自JAVA秀-https://www.javaxiu.com/34695.html

请你讲一下什么是UDP文章源自JAVA秀-https://www.javaxiu.com/34695.html

请你说一下TCPUDP区别文章源自JAVA秀-https://www.javaxiu.com/34695.html

请你说下UDP在哪些场景用到。文章源自JAVA秀-https://www.javaxiu.com/34695.html

请你说下UDP特性文章源自JAVA秀-https://www.javaxiu.com/34695.html

请你......文章源自JAVA秀-https://www.javaxiu.com/34695.html

(求求你不要再问了,呜呜呜)文章源自JAVA秀-https://www.javaxiu.com/34695.html

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

UDP它是一种用户数据报协议,即User Datagram Protocol。UDP和TCP都属于运输层协议中的一种文章源自JAVA秀-https://www.javaxiu.com/34695.html

面试问到UDP,这样回答offer拿到手软文章源自JAVA秀-https://www.javaxiu.com/34695.html

UDP的主要特点有:文章源自JAVA秀-https://www.javaxiu.com/34695.html

1.UDP是无连接的,所以在发送数据前和发送数据后,都不需要建立连接和断开连接,减少了开销文章源自JAVA秀-https://www.javaxiu.com/34695.html

2.UDP使用尽最大努力交付,即UDP它不保证可靠交付,这个我稍后会举一个例子,说明什么是尽最大努力交付。文章源自JAVA秀-https://www.javaxiu.com/34695.html

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

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

5.UDP支持一对一,一对多,多对一和多对多的交互通信文章源自JAVA秀-https://www.javaxiu.com/34695.html

6.UDP的首部开销小,只有8个字节,相对于TCP的20字节,要短很多。文章源自JAVA秀-https://www.javaxiu.com/34695.html

面试问到UDP,这样回答offer拿到手软文章源自JAVA秀-https://www.javaxiu.com/34695.html

用户数据报UDP包含有两个字段,一个是首部字段,另外一个是数据字段。首部字段有8个字节,分别由四种信息组成,每个信息长度都是为2个字节的。文章源自JAVA秀-https://www.javaxiu.com/34695.html

1.源端口:源主机的发送该信息的端口号,如果不需要对方回信,则可以置为0。文章源自JAVA秀-https://www.javaxiu.com/34695.html

2.目的端口:目的地的端口号,在终点交付报文的时候需要用到。文章源自JAVA秀-https://www.javaxiu.com/34695.html

3.长度:UDP用户数据报的长度。文章源自JAVA秀-https://www.javaxiu.com/34695.html

4.检验和:检测UDP用户数据报在传输中是否有错。文章源自JAVA秀-https://www.javaxiu.com/34695.html

面试问到UDP,这样回答offer拿到手软文章源自JAVA秀-https://www.javaxiu.com/34695.html

接下来我们来讨论下它是如何尽最大努力交付文章源自JAVA秀-https://www.javaxiu.com/34695.html

首先在发送方,在发送前,会先生成一个伪首部,这个伪首部既不向下传递也不向上递交,只是为了做检验和临时生成的,在发送方填完检验和字段到UDP首部后,就会去除伪首部。文章源自JAVA秀-https://www.javaxiu.com/34695.html

伪首部是12字节大小,包括有分别都是4字节的源IP地址,目的IP地址,1个字节的全0,和存储1个字节大小的17(UDP在IP报文的协议号是17),最后2字节存储UDP用户数据报的长度文章源自JAVA秀-https://www.javaxiu.com/34695.html

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

例子:文章源自JAVA秀-https://www.javaxiu.com/34695.html

  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用户数据报文章源自JAVA秀-https://www.javaxiu.com/34695.html

但是这也仅仅只能解决数据缺失的问题,如果这里面16bit数据做了位置交换,那么UDP是检测不出来的。但是也有许多技术是使用到的UDP协议,包括有:TFTP,SNMP,NFS,DNS,BOOTP等。文章源自JAVA秀-https://www.javaxiu.com/34695.html

这里和大家在科普一个知识点,QQ发送消息使用的就是UDP协议,大家也许会惊讶说,这怎么可能?UDP有乱序和丢包问题,使用QQ发送消息从来没见过乱序的情况呀,洪爵你是不是在吹牛。文章源自JAVA秀-https://www.javaxiu.com/34695.html

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

好的,咱们继续聊UDP,大家知道UDP数据报能发送的最大长度吗?文章源自JAVA秀-https://www.javaxiu.com/34695.html

之前有说到,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。文章源自JAVA秀-https://www.javaxiu.com/34695.html

面试问到UDP,这样回答offer拿到手软文章源自JAVA秀-https://www.javaxiu.com/34695.html

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

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

面试问到UDP,这样回答offer拿到手软文章源自JAVA秀-https://www.javaxiu.com/34695.html

UDP,应该说UDP所在的运输层还有一个很重要的功能:复用分用文章源自JAVA秀-https://www.javaxiu.com/34695.html

同一时间可能有多个应用程序与外界进程进行交互,这个时候大家都可以通过运输层传送到IP层(网络层)。文章源自JAVA秀-https://www.javaxiu.com/34695.html

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

好啦,UDP就讲到这里了,相信大家啃完这篇文章,面试再回答UDP就能完虐面试官,让HR给你开出高薪,跪求你来他们公司搬砖。文章源自JAVA秀-https://www.javaxiu.com/34695.html

愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。文章源自JAVA秀-https://www.javaxiu.com/34695.html

道阻且长,往事作序,来日为章。文章源自JAVA秀-https://www.javaxiu.com/34695.html

期待我们下一次相遇!文章源自JAVA秀-https://www.javaxiu.com/34695.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定