专栏首页Java那些事UDP 协议的那点事儿

UDP 协议的那点事儿

预计阅读时间: 4分钟

最近在回顾计算机网络的知识,以前上课没有认真学,只记住了几个高大上的术语,所以趁着这次回顾,把学到的知识用博客的形式记录下来,一来加深自己的印象,二来希望让你对这些基础知识有一个更深入的了解。当然,我会尽量把 UDP 协议讲清楚,讲明白,让你“不虚此行”。


UDP( User Datagram Protocol )协议,翻译过来就是用户数据报协议 ,跟 TCP 协议一样,都是位于 OSI 模型的传输层。不过比起 TCP 协议,UDP 协议就显得简单多了,因为它没有「流量控制」、「拥塞控制」等复杂的处理机制。它甚至没有重传机制,也就是说,如果你的数据包半路走丢了,那就是真找不回来了,所以说 UDP 协议是不可靠的。当然了,这个重传机制是针对传输层而言的,你完全可以在应用层写一个协议来进行丢包处理,比如说像 TCP 一样,增加 ACK 和序列号机制。

那你可能会疑惑了,为什么放着可靠的 TCP 协议不用,而选择 UDP 协议?

UDP 报文段结构

这当然要根据应用的需求来,不过在说这个话题之前,我们先来详细了解一下 UDP 协议。

说实话,UDP 的报文段结构比 TCP 报文段简洁多了(见下图),毕竟 UDP 协议就没有什么多余的机制。

言归正传,报文段里的「源端口号」和「目的端口号」是为了告诉传输层,我这个报文是从哪儿(哪个进程)来的,要到哪儿(哪个进程)去。但要注意一点:一个 UDP 套接字是由一个二元组标识的,这个二元组指的是目的 IP 地址和目的端口号,也就是说,服务器上对应的进程,不在乎你是从哪个客户端来的,我都放进同一个套接字处理,处理完了再根据源端口号和源 IP 地址,把应答信息发送给客户端。相较而言,TCP 套接字需要一个四元组来标识:源 IP 地址,源端口号,目的 IP 地址和目的端口号。这一点在讲 TCP 协议的时候还会细讲,所以这里就不赘述了。

PS:你可能会问,这报文段里怎么没有 IP 地址啊?这是因为IP 地址保存在网络层的 IP 协议段里,传输层的报文段里当然就没有了。

无连接

每次提到 TCP 协议,我们最先想到的就是三次握手和四次挥手,对 UDP 协议来说,这都是没有的事儿~ 使用 UDP 协议的时候,如果客户端要发送报文段给服务端,不用握手,直接就发出去了,也正因为这样,UDP 协议被称为是无连接的。

很容易想到,不需要握手这一过程的话,就没有因为建立连接而造成的时延,一个字,快!这也是 DNS(域名系统)运行在 UDP 协议之上的很大一部分原因。

但是 UDP 协议不可靠啊,传输过程中丢包了怎么办?最简单的做法就是——忽略它!(否则就得像文章开头说的那样,在应用层实现重传机制)就拿 DNS 来说吧,如果数据包丢失,客户端重发就是了(有超时机制),而且在正常情况下,丢包的概率很低。但如果使用 TCP 协议的话,因为要建立连接,域名查询就会慢很多,除此之外,使用 UDP 协议的网络开销更小——UDP 报文段有 8 个字节的首部开销,而 TCP 协议有 20 字节的开销(看前面的关于报文段的两张图)。网络开销小,意味着 DNS 服务器能接受更多客户端的请求。

还有一个方面,TCP 协议有拥塞控制机制,它会在网络拥塞时遏制 TCP 发送方,以至于延迟报文段的传送,所以对于一些要求传输延迟小,且能够容忍一些数据丢失的实时程序来说,UDP 协议可能是一个更好的选择。路由选择协议(RIP)、 网络管理协议(SNMP) 也都选择了 UDP 来作为底层的传输协议。

最后,这是一张客户端与服务端利用 UDP 协议通信的流程图:

UDP 协议要讲的内容不多,下次要讲的 TCP 协议,就比较烧脑了,做好准备吧!

-------- END ---------

本文分享自微信公众号 - 程序员乔戈里(CXYqiaogeli)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个Java对象到底占用多大内存?

    最近在调研MAT和VisualVM源码实现,遇到一个可疑问题,两者计算出来的对象大小不一致,才有了这样疑惑。

    乔戈里
  • 高频面试题:什么是B树?为啥文件索引要用B树而不用二叉查找树?

    小秋:树形结构例如想 B 树,B+ 树,二叉查找树都是有序的,所以查询效率很高,可以再 O(logn) 的时间复杂度查找到目标数据。

    乔戈里
  • 动画:散列表 | 文本编辑器是如何检查英文单词出错的?

    今天小鹿就早早起床开始正准备更新今日的文章,我熟练的敲打着键盘,突然出现了下面的情况:

    乔戈里
  • Python Web学习笔记之TCP、UDP、ICMP、IGMP的解释和区别

    TCP与UDP解释 TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输...

    Jetpropelledsnake21
  • Java网络编程--网络协议

    为使不同计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。OSI网络七层协议就是在这个基础上制定出来的...

    CodingDiray
  • 网络协议 7 - UDP 协议:性善碰到城会玩

        网络协议五步登天路,我们一路迈过了物理层、链路层,今天终于到了传输层。从这一层开始,很多知识应该都是服务端开发必备的知识了,今天我们就一起来梳理下。

    北国风光
  • kubernetes中启动探针startupProbe

    因为k8s中采用大量的异步机制、以及多种对象关系设计上的解耦,当应用实例数 增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的servic...

    极客运维圈
  • 黑盒模型实际上比逻辑回归更具可解释性

    如何让复杂的模型具备可解释性,SHAP值是一个很好的工具,但是SHAP值不是很好理解,如果能将SHAP值转化为对概率的影响,看起来就很舒服了。先前阿Sam也写过...

    Sam Gor
  • MLK | 如何解决机器学习树集成模型的解释性问题

    前些天在同行交流群里,有个话题一直在群里热烈地讨论,那就是 如何解释机器学习模型 ,因为在风控领域,一个模型如果不能得到很好的解释一般都不会被通过的,在银行里会...

    Sam Gor
  • 互联网产品经理精选工作必读书

    1.《设计心理学》 这本书能够让人对于设计有一个全新的认识,尤其是对传统固化的思维方式有一个颠覆性的认识。你会开始观察你身边的一切,思考你身边的一切,当你不知...

    葆宁

扫码关注云+社区

领取腾讯云代金券