传输层协议 --- UDP

序言

 在之前的文章 Socket 编程 中,我们只是简单的知道了怎么利用 UDP协议 或者是 TCP协议 来发送我们的数据,并且我们还知道 UDP 是不可靠的,TCP 是可靠的。但这是为什么呢?底层的构造和策略决定他们的属性!这篇文章中,我们就来先认识 UDP 吧。


UDP 协议端格式

 每一层都有相应的协议,所谓协议,我们也可以简单认为就是在正文之前加上若干结构体字段(报头),确保数据的正确传输、识别、处理以及可能的校验和错误恢复。UDP 的报头如下:
在这里插入图片描述
在正文之前一共包含 64 位长度(8字节)的字段,每个字段的功能如下:

  • 源端口号(Source Port):占用 2 个字节,表示发送方端口号
  • 目标端口号(Destination Port):占用 2 个字节,表示接收方端口号
  • 长度(Length):占用 2 个字节,表示 UDP 数据报文的长度,包括头部和数据部分
  • 检验和(Checksum):占用 2 个字节,用于检测 UDP 数据报在传输过程中是否有错误。如果检验和出错,就会直接将报文丢弃
    - 数据(Data):占用 0 个或多个字节,实际传输的数据部分

在这里我们着重介绍一下 长度 字段,占 2 个字节,构成于 报头 + 报文。我们可以简单计算一下,2 个字节表示的最大数字是 — 2^16 - 1 = 65535,这就代表一个 UDP 数据报的最大长度为 65535 字节,再减去报头的长度 8 字节,那么能传输的最大的报文的长度为 65527 字节。当然这只是理论情况下,实际情况下看到受到其他的限制。


UDP 协议的特点

1. 无连接

UDP 在发送数据之前 不需要建立连接,数据包可以直接发送到目标主机。这种无连接性减少了建立连接和断开连接的开销,并提高了传输效率。
 这个是我们直观感受过的,当时我们的服务端并未启动,但是客户端依然可以将数据传送到服务端!这说明两者之间通信是不需要建立连接状态的。

2. 不可靠(尽最大努力交付)

UDP 不保证可靠交付,即不保证数据包能够到达目标主机或按发送顺序到达。如果数据包在传输过程中丢失或损坏,UDP不会进行重传或错误恢复。
 结构决定特性!UDP 协议端的格式很简单,只是负责将数据发出,并不会去维护发送了哪些信息!

3. 面向报文

UDP 对应用程序交下来的报文不再划分为若干个分组来发送,也不把收到的若干个报文合并后再交付给应用程序。UDP 保留了报文的边界,使得接收方能够准确地识别出每个报文的内容。

 通过了解 UDP,大家不觉得其实它的特征就很像很早之前信件传输吗?一封信发出去,谁也不知道它是否能到达收信人手中,就算收到了也不知道。


UDP 的缓冲区

UDP 是全双工的,可以接受的同时发送,但是他还和 TCP 有点不一样,两者都是全双工,但是 TCP 是包含发送缓冲区和接收缓冲区的,但是 UDP 没有发送缓冲区:
在这里插入图片描述

 这是因为 UDP 对发送数据添加报头后立马就会发送,不会进行其他的操作,而 TCP 为了达到一个可靠通信,在发送数据时会进行相应的处理(在后面介绍 TCP 时会介绍)。并且 UDP 这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致,如果缓冲区满了,再到达的 UDP 数据就会被丢弃(果然是不靠谱的协议)。


UDP 的使用注意事项

 刚才我们谈到,一次 UDP 传输的数据最大为 65527 字节,然而该大小在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过该数字,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。


总结

 在这篇文章中我们了解了 UDP,感觉内容不是很多,也比较好理解。但是在之后学习 TCP 可是截然不同了,毕竟后者为了 可靠 可是下了不少功夫,希望大家这篇文章有所收获!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值