98-UDP协议:因性善而简单,难免碰到“城会玩”

10、UDP协议:因性善而简单,难免碰到“城会玩”

开篇词

讲完了 IP 层以后,接下来我们开始讲传输层

传输层里比较重要的两个协议,一个是 TCP,一个是 UDP。

对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议。

10.1、TCP 和 UDP 有哪些区别?

一般面试的时候我问这两个协议的区别,大部分人会回答,TCP 是面向连接的,UDP 是面向无连接的。

什么叫面向连接,什么叫无连接呢?

在互通之前,面向连接的协议会先建立连接。 例如,TCP 会三次握手,而 UDP 不会。

为什么建立连接?

所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。

TCP 提供可靠交付:

  • 通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。
  • 我们都知道 IP 包是没有任何可靠性保证的,一旦发出去,就像西天取经,走丢了、被妖怪吃了,都只能随它去。

而 UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。

TCP 是面向字节流的:

  • 发送的时候发的是一个流,没头没尾。
  • IP 包可不是一个流,而是一个个的 IP 包。之所以变成了流,这也是 TCP 自己的状态维护做的事情。

UDP 继承了 IP 的特性, 基于数据报的,一个一个地发,一个一个地收。

TCP 是可以有拥塞控制的:

  • 它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。
  • UDP 就不会, 应用让我发,我就发,管它洪水滔天。

总结:

  • TCP 其实是一个有状态服务,通俗地讲就是有脑子的,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行。
  • UDP 则是无状态服务。通俗地说是没脑子的,天真无邪的,发出去就发出去了。

比喻:

如果 MAC 层定义了本地局域网的传输行为,IP 层定义了整个网络端到端的传输行为;

这两层基本定义了这样的基因:

  • 网络传输是以包为单位的,二层叫帧,网络层叫包,传输层叫段。我们笼统地称为包。
  • 包单独传输,自行选路,在不同的设备封装解封装,不保证到达。
  • 基于这个基因,生下来的孩子 UDP 完全继承了这些特性,几乎没有自己的思想。

10.2、UDP 包头是什么样的?

当我发送的 UDP 包到达目标机器后,发现 MAC 地址匹配,于是就取下来;

将剩下的包传给处理 IP 层的代码。把 IP 头取下来,发现目标 IP 匹配;

接下来呢?这里面的数据包是给谁呢?

发送的时候,我知道我发的是一个 UDP 的包,收到的那台机器咋知道的呢?

在 IP 头里面有个 8 位协议,这里会存放,数据里面到底是 TCP 还是 UDP,当然这里是 UDP。于是,如果我们知道 UDP 头的格式,就能从数据里面,将它解析出来。

解析出来以后呢?数据给谁处理呢?

处理完传输层的事情,内核的事情基本就干完了;

里面的数据应该交给应用程序自己去处理,可是一台机器上跑着这么多的应用程序,应该给谁呢?

  • 无论应用程序写的使用 TCP 传数据,还是 UDP 传数据,都要监听一个端口
  • 这个端口,用来区分应用程序;
  • 无论是 TCP 还是 UDP 包头里面应该有端口号,根据端口号,将数据交给相应的应用程序。

    UDP 包头:有源端口号和目标端口号。

10.3、UDP 的三大特点

  1. 没有大量的数据结构、处理逻辑、包头字段;
  2. 不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,他也可以传给任何人数据,甚至可以同时传给多个人数据。
  3. 不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发。(没有拥塞控制)

10.4、UDP 的三大使用场景

1、需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。

  • **DHCP 就是基于 UDP 协议的。**一般的获取 IP 地址都是内网请求,而且一次获取不到 IP 又没事,过一会儿还有机会。
  • PXE 可以在启动的时候自动安装操作系统,操作系统镜像的下载使用的 TFTP,这个也是**基于 UDP 协议的。**在还没有操作系统的时候,客户端拥有的资源很少,不适合维护一个复杂的状态机,而且因为是内网,一般也没啥问题。

2、不需要一对一沟通,建立连接,而是可以广播的应用。

  • UDP 的不面向连接的功能,可以使得可以承载广播或者多播的协议。
  • DHCP 就是一种广播的形式,就是基于 UDP 协议的,而广播包的格式前面说过了。

对于多播,我们在讲 IP 地址的时候,讲过一个 D 类地址,也即组播地址,使用这个地址,可以将包组播给一批机器。

当一台机器上的某个进程想监听某个组播地址的时候,需要发送 IGMP 包,所在网络的路由器就能收到这个包,知道有个机器上有个进程在监听这个组播地址。

路由器收到这个组播地址的时候,会将包转发给这台机器,这样就实现了跨路由器的组播。

3、需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。

10.5、UDP举例

直播、游戏。

小结

  • 如果将 TCP 比作成熟的社会人,UDP 则是头脑简单的小朋友。TCP 复杂,UDP 简单;TCP 维护连接,UDP 谁都相信;TCP 会坚持知进退;UDP 愣头青一个,勇往直前;
  • UDP 虽然简单,但它有简单的用法。它可以用在环境简单、需要多播、应用层自己控制传输的地方。例如 DHCP、VXLAN、QUIC 等。

思考题

1、都说 TCP 是面向连接的,在计算机看来,怎么样才算一个连接呢?

有目标的链接信息,四元组,然后目标的心跳正常

2、你知道 TCP 的连接是如何建立,又是如何关闭的吗?

3次握手,4次挥手

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufeng2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值