Internet上传输的数据非常庞大,有时候会传输很多报文,这个报文数量是传输时断开或丢失的报文,这就是UDP丢包机制。
Linux 内核允许UDP进行流量控制,可以有效防止在路由器上造成的网络拥塞。UDP 使用IP报头上的标志位tos的differentiated services (1)字段来控制报文的流量类型。可以使用下面的代码设置UDP的流量类型控制:
“`c
#include
int setsockopt(int socket, int level, int optname,
const void *optval, socklen_t optlen);
int tos = 0x04;
setsockopt(sockfd, SOL_IP, IP_TOS, &tos, sizeof(tos));
UDP报文比确认/重传报文机制(ACK/RST)更乐观 - 就是说它不要求双方都确认报文是否传输成功。这就意味着,UDP包可能会丢失不一定能够被立刻检测出来。所以在 UDP 协议中,我们需要采用更加检测丢失包合理机制,比如不断重传的办法来确保数据的安全传输,让报文得到及时的响应。
另外,Linux 内核有个UDP分片系统,可以将一个大UDP报文分散,以便于在底层网络中传输,此时如果网络中单个分片包丢失,那么就会使它们都丢失,因此有时候我们也会尝试将一些数据块结合在一起以便于更好的传输,即 datagram coalescing。
最后,Linux内核支持UDP通道的测量,使用netlink socket结合时的/proc/net/udp文件,可以支持UDP丢包率的监控,允许开发者在项目中更好的使用UDP来进行数据传输。
了解Linux UDP丢包机制可以帮助开发者更有效的实现所需的网络功能。合理的利用Linux内核提供的三大UDP丢包机制(报文流量控制、报文分片、记录丢包率),将有助于实现稳定、可靠、高效的网络传输。