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

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

    其实,讲到 UDP,就少不了 TCP。这俩货简直就是个“连体兄弟”,只要出现一个,另一个肯定就在不远处等着你。

    博主相信,绝大多数的服务端开发都碰到过“TCP 与 UDP 的区别”这样的面试题,而在实际业务开发中,也会对比 TCP 与 UDP,选择合适的协议进行开发。

    所以,咱们还是老生常谈,先来看看这俩兄弟的区别。

TCP 与 UDP 的区别

    相信很多人都知道,TCP 是面向连接的,UDP 是面向无连接的。

    那么,什么是面向连接,什么是面向无连接呢?

    在互通之前,面向连接的协议会先建立连接,再进行通信。就像 TCP 会进行三次握手,而 UDP 不会。

    那为什么会建立连接呢?TCP 进行三次握手,UDP 就不能发三个数据包玩玩,有什么区别呢?

    其实这里所谓的建立连接,就是通过建立一定的数据结构来维护客户端和服务端交互的状态,用这样的数据结构来保证所谓的面向连接的特性。

    上面这段话中,有一个很重要的词-状态。也就是说,TCP 实质上是一个有状态的服务。这个状态,可以说是它和 UDP 的本质区别。

    通俗点讲,有状态的 TCP 就是有脑子的,它会记住数据是否已经精确发送了,发到哪里了,应该接收哪个数据,不能容忍一点错误。

    与之对应的,UDP 就是没脑子的,天真无邪,发出去的数据就发出去,不会考虑网络世界的“恶意”。

TCP 既然有脑子,那肯定能做到很多 UDP 做不到的事情,例如:

提供可靠交付。通过 TCP 连接传输的数据,无差错、不丢失、不重复,且按序到达。而 UDP 则是不保证不丢失,不保证按序到达

面向字节流。TCP 发送的时候是一个流,没有头尾。而 UDP 是基于数据报,一个个发,一个个收

可进行拥塞控制。TCP 意识到包丢弃或者网络环境不好的时候,会调整自己的行为,决定要发快点,还是发慢点。而 UDP 则是应用让我发,我就发,管它洪水滔天。。

UDP 包头

    发送的 UDP 包到达目标机器后,发现 MAC 地址匹配,于是取下来,然后再交给 IP 层处理,发现 IP 匹配,接下来呢?数据包给谁呢?

    发送的时候,接收机器怎么知道数据包是 UDP 的包呢?所以在 IP 头里面有个 8 位协议,这里会存放,数据包究竟是 TCP 还是 UDP。

    处理完传输层的事情,内核的事情基本上就干完了,里面的数据应该交给应用程序自己去处理。可是,一台机器上跑着那么多的应用程序,应该给谁呢?

    无论应用程序写的是使用 TCP 传呼机,还是 UDP 传数据,都要监听一个端口。正式这个端口,用来区分应用程序。

    这样,UDP 头里面的内容就都出来了,如下图:

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

    当我们看到 UDP 包头的时候,发现的确有端口号,有源端口号和目标端口号。但是它除了端口号,就再没有其他的,和 TCP 头比起来,简单的一塌糊涂。

UDP 三大特点

上面提过,UDP 像个小孩子一样,比较简单,有以下特点:

沟通简单。没有花花肠子(大量的数据结构、处理逻辑、包头字段),秉承“性善论”,相信网络通路很容易到达,不容易被丢弃;

轻信他人。不会建立连接,只认端口号,谁都可以给他传数据,他也可以传给任何人数据,甚至可以同时传给多人数据;

愣头青,做事不懂权变。不会根据网络的请求进行拥塞控制,不管网络再差,它该怎么发还怎么发。

UDP 使用场景

    正所谓“祸兮福所倚”,虽然 UDP 有着很多问题,但也可以在特定场景中发挥更好的作用。

    第一,需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。这很好理解,就像你是领导,你会让你们组刚毕业的小伙伴去做一些没有那么难,或者是失败了也能忍受的实验性项目。

我们之前认识的 DHCP 就是基于 UDP 协议的。一般的获取 IP 地址都是内网请求,而且一次获取不到 IP 也没关系,过一会还可以请求获取。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpfgd.html