欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

UDP 协议的那点事儿

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

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


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

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

udp 报文段结构

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

UDP 协议的那点事儿

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

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 协议的那点事儿

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