序言
在之前的文章 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
可是截然不同了,毕竟后者为了 可靠
可是下了不少功夫,希望大家这篇文章有所收获!