Quality of service aims to provide different levels of priority to different applications, users or data flows. It guarantees a certain level of performance for data flows. Techniques to improve quality of service include scheduling, which treats different flows in a fair manner. Other techniques are FIFO queuing, priority queuing, weighted fair queuing, traffic shaping using leaky bucket and token bucket algorithms, resource reservation to reserve bandwidth and buffers beforehand, and admission control to restrict new packet flows.