Computer Network | Leaky bucket algorithm

20 Jun, 2022
In the network layer, before the network can make Quality of service guarantees, it must know what traffic is being guaranteed. One of the main causes of congestion is that traffic is often bursty. To understand this concept first we have to know little about traffic shaping. Traffic Shaping is a mechanism to control the amount and the rate of the traffic sent to the network. Approach of congestion management is called Traffic shaping. Traffic shaping helps to regulate rate of data transmission and reduces congestion.There are 2 types of traffic shaping algorithms: 
Leaky BucketToken Bucket
Leaky Bucket
Token Bucket
Suppose we have a bucket in which we are pouring water in a random order but we have to get water in a fixed rate, for this we will make a hole at the bottom of the bucket. It will ensure that water coming out is in a some fixed rate, and also if bucket will full we will stop pouring in it.The input rate can vary, but the output rate remains constant. Similarly, in networking, a technique called leaky bucket can smooth out bursty traffic. Bursty chunks are stored in the bucket and sent out at an average rate. 
In the figure, we assume that the network has committed a bandwidth of 3 Mbps for a host. The use of the leaky bucket shapes the input traffic to make it conform to this commitment. In Figure the host sends a burst of data at a rate of 12 Mbps for 2 s, for a total of 24 Mbits of data. The host is silent for 5 s and then sends data at a rate of 2 Mbps for 3 s, for a total of 6 Mbits of data. In all, the host has sent 30 Mbits of data in 10 s. The leaky bucket smooths the traffic by sending out data at a rate of 3 Mbps during the same 10 s. Without the leaky bucket, the beginning burst may have hurt the network by consuming more bandwidth than is set aside for this host. We can also see that the leaky bucket may prevent congestion.A simple leaky bucket algorithm can be implemented using FIFO queue. A FIFO queue holds the packets. If the traffic consists of fixed-size packets (e.g., cells in ATM networks), the process removes a fixed number of packets from the queue at each tick of the clock. If the traffic consists of variable-length packets, the fixed output rate must be based on the number of bytes or bits.The following is an algorithm for variable-length packets:  
Initialize a counter to n at the tick of the clock.If n is greater than the size of the packet, send the packet and decrement the counter by the packet size. Repeat this step until n is smaller than the packet size.Reset the counter and go to step 1.
Initialize a counter to n at the tick of the clock.
If n is greater than the size of the packet, send the packet and decrement the counter by the packet size. Repeat this step until n is smaller than the packet size.
Reset the counter and go to step 1.
Example – Let n=1000 Packet=
 Since n> front of Queue i.e. n>200 Therefore, n=1000-200=800 Packet size of 200 is sent to the network.  
Now Again n>front of the queue i.e. n > 400 Therefore, n=800-400=400 Packet size of 400 is sent to the network.  
Since n< front of queue Therefore, the procedure is stop. Initialize n=1000 on another tick of clock. This procedure is repeated until all the packets are sent to the network.Below is the implementation of above approach:  
C++
Java
Python3
// cpp program to implement leakybucket#include<bits/stdc++.h>using namespace std;int main(){    int no_of_queries, storage, output_pkt_size;    int input_pkt_size, bucket_size, size_left;       // initial packets in the bucket    storage = 0;      // total no. of times bucket content is checked   no_of_queries = 4;      // total no. of packets that can   // be accommodated in the bucket   bucket_size = 10;             // no. of packets that enters the bucket at a time    input_pkt_size = 4;             // no. of packets that exits the bucket at a time    output_pkt_size = 1;  for(int i = 0; i < no_of_queries; i++) //space left  {  size_left = bucket_size - storage;  if(input_pkt_size <= size_left)  {      // update storage    storage += input_pkt_size;    printf("Buffer size= %d out of bucket size= %d\n", storage, bucket_size);  }  else  {    printf("Packet loss = %d\n", (input_pkt_size-(size_left)));         // full size         storage=bucket_size;    printf("Buffer size= %d out of bucket size= %d\n", storage, bucket_size);                      }  storage -= output_pkt_size; }  return 0;} // This code is contributed by bunny09262002
//Java Implementation of Leaky bucket import java.io.*;import java.util.*; class Leakybucket {    public static void main (String[] args) {        int no_of_queries,storage,output_pkt_size;        int input_pkt_size,bucket_size,size_left;                  //initial packets in the bucket        storage=0;                    //total no. of times bucket content is checked        no_of_queries=4;                 //total no. of packets that can        // be accommodated in the bucket        bucket_size=10;                 //no. of packets that enters the bucket at a time        input_pkt_size=4;                 //no. of packets that exits the bucket at a time        output_pkt_size=1;        for(int i=0;i<no_of_queries;i++)        {            size_left=bucket_size-storage; //space left                         if(input_pkt_size<=(size_left))                    {                storage+=input_pkt_size;                System.out.println("Buffer size= "+storage+                    " out of bucket size= "+bucket_size);            }            else            {                System.out.println("Packet loss = "                            +(input_pkt_size-(size_left)));                                                  //full size                      storage=bucket_size;                                 System.out.println("Buffer size= "+storage+                            " out of bucket size= "+bucket_size);                             }            storage-=output_pkt_size;        }    }}
# initial packets in the bucketstorage = 0; # total no. of times bucket content is checkedno_of_queries = 4; # total no. of packets that can# be accommodated in the bucketbucket_size = 10     # no. of packets that enters the bucket at a timeinput_pkt_size = 4     # no. of packets that exits the bucket at a timeoutput_pkt_size = 1for i in range(0,no_of_queries): #space left     size_left = bucket_size - storage;    if input_pkt_size <= size_left:      # update storage        storage += input_pkt_size        print("Buffer size = {} out of bucket size= {} ".format(storage, bucket_size))    else:        print("Packet loss = ", (input_pkt_size-(size_left)),end=" ");                 # full size             storage=bucket_size;        print("Buffer size= {} out of bucket size = {}".format(storage, bucket_size));                        storage -= output_pkt_size;  # This code is contributed by Arpit Jain
Output  
Buffer size= 4 out of bucket size= 10
Buffer size= 7 out of bucket size= 10
Buffer size= 10 out of bucket size= 10
Packet loss = 3
Buffer size= 10 out of bucket size= 10
Difference between Leaky and Token buckets – 
Some advantage of token Bucket over leaky bucket – 
If bucket is full in token Bucket , tokens are discard not packets. While in leaky bucket, packets are discarded.
Token Bucket can send Large bursts at a faster rate while leaky bucket always sends packets at constant rate.
This article is contributed by Abhishek Kumar and Himanshu Gupta. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
amanakmsd
shahnirmit2503
clintra
bunny09262002
111arpit1
Transport Layer
Computer Networks
GATE CS
Computer Networks
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.