UDP 协议的那点事儿

最近在回顾计算机网络的知识,之前上课没有认真学,只记得几个高大上的术语,因此趁着此次回顾,把学到的知识用博客的形式记录下来,一来加深本身的印象,二来但愿让你对这些基础知识有一个更深刻的了解。固然,我会尽可能把 UDP 协议讲清楚,讲明白,让你“不枉此行”。服务器


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

那你可能会疑惑了,为何放着可靠的 TCP 协议不用,而选择 UDP 协议?计算机网络

UDP 报文段结构

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

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

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

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 协议,就比较烧脑了,作好准备吧!

若是本文对你有帮助,欢迎关注个人公众号 tobe的呓语 ,带你深刻计算机的世界~ 公众号后台回复关键词【计算机】有惊喜哦~

相关文章
相关标签/搜索