本文旨在解释了为什么说UDP是不可靠,到底什么是UDP的消息边界,以及UDP是否会出现粘包和半包的问题
概念
UDP协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送,至于对方是否可以接收到这些数据内容,UDP协议无法控制,因此说,UDP协议是一种不可靠的协议。无连接的好处就是快,省内存空间和流量,因为维护连接需要创建大量的数据结构。
UDP会尽最大努力交付数据,但不保证可靠交付,没有TCP的确认机制、重传机制(上一篇文章介绍过 TCP详解(二)滑动窗口/流量控制-CSDN博客),如果因为网络原因没有传送到对端,UDP也不会给应用层返回错误信息。
报文格式
可以看到UDP的报文非常简单,不像TCP那也有序号、确认号、选项啥的,UDP的头部只有如下4个
- 源端口:发送方主机的应用程序的端口号
- 目的端口:目的主机的应用程序的端口号
- 长度字段,是以字节为单位的UDP头部和UDP数据的总长度,因为UDP头部长度为8,且空数据的UDP数据报是允许的,这意味着该长度字段值最小为8。UDP长度值是冗余的,因为可以通过IP数据报的总长度减去IP首部的长度推导出来。
- 校验和,覆盖了UDP首部、UDP数据和一个伪首部,由初始发送方计算,由最终目的方校验,用于判断数据报在网络传输过程中是否出错,比如某一位从1变成了0或者少了几个字节。
消息边界
所谓数据边界就是UDP接收缓冲区就界定了消息之前的分隔,两个消息不会放到一起,应用层每次都取,都能取到一个完整的包。
UDP发送缓冲区
UDP协议是面向数据报文的信息传送服务。UDP在发送端没有缓冲区,对于应用层交付下来的报文在添加了首部之后就直接交付于ip层,不会进行合并,也不会进行拆分,而是一次交付一个完整的报文。
对于发送端,UDP 包头中,用 两个字节&#