UDP协议概述
用户数据报协议 UDP 是 Internet 传输层协议,提供无连接、不可靠、数据报尽力传输服务。
- 无连接:因此在支持两个进程间通信时,没有握手过程。
- 不可靠:当应用进程将一个报文发送近 UDP 套接字时,UDP 并不能保证将该报文送达到目的的接收进程。
不仅如此,在发送方依次发送的报文段,UDP 即便将这些报文段送达到接收进程,也可能是乱序到达的。UDP 没有拥塞机制,所有 UDP 发送端可以用任何速率向其下层(即网络层)注入数据。当然,实际端到端吞吐量可能小于这种速率,这可能是因为中间链路的带宽受限或因为网络拥塞而造成的。
使用 UDP 的主要原因:
- 应用进程更容易控制发送什么数据以及何时发送。会出现分组的丢失和重复。
- 无须建立连接:TCP 需要三次握手建立,UDP 不需要任何准备即可进行数据传输。
- 无连接状态:TCP 需要再端系统中维护连接状态,包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数等;而 UDP 是无连接的,因此也无需维护连接状态。
- 首部开销小:每个 TCP 报文段都至少有 20 字节的首部开销,而 UDP 仅有 8 字节的开销。
虽然 UDP 提供不可靠传输服务,但使用 UDP 的应用仍然可以实现可靠数据参数。这可以通过在应用程序自身中建立可靠传输机制来完成,如 停-等协议或滑动窗口协议等。也就是说,应用进程可以使用 UPD 的同时进行可靠通信,只是需要在应用层设计可靠传输机制而已。
UDP 数据报结构
- UDP 首部四个字段,每个字段长度都是 2 个字节( 16 bit ),共 8 个字节,。
- 源端口号和目的端口号:用于 UDP 实现复用和分解,范围(0~65535)。
- 长度:指示 UDP 报文段中的字节数 (首部和数据的总和)。
- 校验和:接收方使用来检测报文段是否出现差错。
UPD数据传输过程

int socket()
:创建套接字。int bind()
:绑定套接字的本地端点地址。ssize_t sendto()
:发送数据。ssize_t recvfrom()
:接收数据。int close()
:关闭套接字。