UDP属于用户数据报协议,属于传输层协议。提供面向无连接的、不可靠的传输,没有拥塞控制和超时重传机制。相对于TCP面向连接的,提供可靠传输的传输层协议,UDP也有其应用场景。UDP在首部开销小,传输速度快的优点,应用也很广泛比音视频通话,网络直播,游戏中帧同步等等。
不同于TCP这样的流式套接字,对于UDP不用处理粘包问题。UDP是面向报文的,对应用层交付的报文,直接添加协议头就交付给IP层,不会对报文进行合并或者拆分,保留了报文的边界。所以接收端的socket缓冲区采用链式结构保存每一个到达的UDP数据包,这样接收端一次recv只能从缓冲区读出一个数据包,而不用处理粘包问题。
UDP协议作为不可靠的传输,可能会出现丢包,乱序等问题。使用时需要实现数据包确认机制,丢包重传机制,数据包排序机制,另外尽量不发送大于路径MTU的数据包。
单个UDP传输的最大内容是1472字节,由于不同的网络中转设备设置的MTU不同。而Internet上标准MTU值为576,除去IP头和UDP头(576-20-8)等于548,所以我们发送的UDP数据报要控制在548字节之内。如果超了需要在发送端对UDP数据包进行分片发送,在接收端再进行组合。
下面是用UDP与epoll结合使用,实现的回射服务器。
服务器端 udp_epoll.cpp
#include <stdio.h>
#include &l