Study of TCP/UDP Performance Using NS-2

 

Study of TCP/UDP Performance Using NS-2

 

Aim: To study and compare the performance of TCP and UDP using the NS-2 simulation tool. (Packet transmission, Packet loss, Throughput and Packet Delivery Ratio (PDR))

 

Simulation setup

Parameter

TCP

UDP

Number of application packets

1000

1000

Packet size

1000 bytes

1000 bytes

Total application data

1 MB

1 MB

Bottleneck bandwidth

1 Mbps

1 Mbps

 

Steps to execute

1.    Install NS-2 in Google Colab

a.   Open Google Colab and create a new notebook

b.   Check the Linux environment

o   !uname -a

c.   Update the package list

o   !apt-get update -qq

d.   Install NS-2

o   !apt-get install -y ns2

e.   Check the NS-2 installation and verify

o   !which ns

2.   TCP UDP Performance analysis.

a.   Create the TCL file

b.   Run the TCL program

c.   Check the generated files

d.   Analyse the tracefile and plot the result

 


 

TCP UDP Performance analysis

 

Create the tcl file

%%writefile tcp_udp.tcl

 

# Create simulator

set ns [new Simulator]

 

# Create trace file

set tracefile [open tcp_udp.tr w]

$ns trace-all $tracefile

 

# Create nodes

set n0 [$ns node]       ;# TCP source

set n1 [$ns node]       ;# UDP source

set n2 [$ns node]       ;# Router

set n3 [$ns node]       ;# Router

set n4 [$ns node]       ;# Destination

 

# Create links

$ns duplex-link $n0 $n2 10Mb 10ms DropTail

$ns duplex-link $n1 $n2 10Mb 10ms DropTail

 

# Bottleneck link

$ns duplex-link $n2 $n3 1Mb 20ms DropTail

$ns duplex-link $n3 $n4 10Mb 10ms DropTail

 

# Queue limit

$ns queue-limit $n2 $n3 10

 

# TCP CONNECTION

# TCP Reno agent

set tcp [new Agent/TCP/Reno]

$tcp set packetSize_ 1000

 

# Attach TCP to n0

$ns attach-agent $n0 $tcp

 

# TCP receiver

set tcpsink [new Agent/TCPSink]

$ns attach-agent $n4 $tcpsink

$ns connect $tcp $tcpsink

 

# TCP traffic

set tcp_app [new Application/Traffic/CBR]

$tcp_app set packetSize_ 1000

$tcp_app set interval_ 0.01

$tcp_app set random_ false

 

$tcp_app attach-agent $tcp

 

# UDP CONNECTION

# UDP agent

set udp [new Agent/UDP]

$udp set packetSize_ 1000

$ns attach-agent $n1 $udp

 

# UDP receiver

set null [new Agent/Null]

$ns attach-agent $n4 $null

$ns connect $udp $null

 

# UDP traffic

set udp_app [new Application/Traffic/CBR]

$udp_app set packetSize_ 1000

$udp_app set interval_ 0.01

$udp_app set random_ false

 

$udp_app attach-agent $udp

 

# START TRANSMISSION

$ns at 0.5 "$tcp_app start"

$ns at 0.5 "$udp_app start"

 

# STOP TRANSMISSION

$ns at 10.5 "$tcp_app stop"

$ns at 10.5 "$udp_app stop"

 

# END SIMULATION

$ns at 11.0 "finish"

 

# Finish procedure

proc finish {} {

 

    global ns tracefile

 

    $ns flush-trace

 

    close $tracefile

 

    exit 0

}

 

# Run simulation

 

$ns run

 

Run the TCL program

!ns tcp_udp.tcl

 

Check the generated files

!ls -lh tcp_udp*

 

Analyze the trace file and plot the result

# TCP vs UDP Performance Analysis

 

TCP_GENERATED = 1000

UDP_GENERATED = 1000

 

tcp_received = 0

udp_received = 0

 

tcp_bytes = 0

udp_bytes = 0

 

tcp_dropped = 0

udp_dropped = 0

 

with open("tcp_udp.tr", "r") as f:

 

    for line in f:

 

        fields = line.split()

 

        if len(fields) < 6:

            continue

 

        event = fields[0]

        from_node = fields[2]

        to_node = fields[3]

        packet_type = fields[4]

 

        try:

            packet_size = int(fields[5])

        except:

            continue

 

        # TCP received at destination n4

        if (event == "r" and

            to_node == "4" and

            packet_type == "tcp"):

 

            tcp_received += 1

            tcp_bytes += packet_size

 

        # UDP received at destination n4

        if (event == "r" and

            to_node == "4" and

            packet_type == "cbr"):

 

            udp_received += 1

            udp_bytes += packet_size

 

        # Dropped packets

        if event == "d":

 

            if packet_type == "tcp":

                tcp_dropped += 1

 

            elif packet_type == "cbr":

                udp_dropped += 1

 

# Packet Loss

tcp_loss = TCP_GENERATED - tcp_received

udp_loss = UDP_GENERATED - udp_received

 

# PDR

tcp_pdr = (tcp_received / TCP_GENERATED) * 100

udp_pdr = (udp_received / UDP_GENERATED) * 100

 

# Throughput

duration = 10.0

 

tcp_throughput = (tcp_bytes * 8/(duration * 1000000))

udp_throughput = (udp_bytes * 8/(duration * 1000000))

 

# Display Results

print("             TCP vs UDP PERFORMANCE")

print(f"{'Metric':<25}{'TCP':<15}{'UDP':<15}")

 

print(f"{'Packets Generated':<25}"

      f"{TCP_GENERATED:<15}"

      f"{UDP_GENERATED:<15}")

 

 

print(f"{'Packets Received':<25}"

      f"{tcp_received:<15}"

      f"{udp_received:<15}")

 

print(f"{'Packet Loss':<25}"

      f"{tcp_loss:<15}"

      f"{udp_loss:<15}")

 

print(f"{'Packets Dropped':<25}"

      f"{tcp_dropped:<15}"

      f"{udp_dropped:<15}")

 

print(f"{'PDR (%)':<25}"

      f"{tcp_pdr:<15.2f}"

      f"{udp_pdr:<15.2f}")

 

print(f"{'Throughput (Mbps)':<25}"

      f"{tcp_throughput:<15.4f}"

      f"{udp_throughput:<15.4f}")

 

 

Packet Loss

import matplotlib.pyplot as plt

 

protocols = ["TCP", "UDP"]

loss = [tcp_loss, udp_loss]

 

plt.figure(figsize=(7,5))

plt.bar(protocols, loss)

 

plt.xlabel("Protocol")

plt.ylabel("Number of Packets")

plt.title("TCP vs UDP Packet Loss")

 

plt.show()

 

Throughput

throughput = [tcp_throughput, udp_throughput]

 

plt.figure(figsize=(7,5))

plt.bar(protocols, throughput)

 

plt.xlabel("Protocol")

plt.ylabel("Throughput (Mbps)")

plt.title("TCP vs UDP Throughput")

 

plt.show()

 

 

Packet Delivery Ratio

pdr = [tcp_pdr, udp_pdr]

 

plt.figure(figsize=(7,5))

plt.bar(protocols, pdr)

 

plt.xlabel("Protocol")

plt.ylabel("Packet Delivery Ratio (%)")

plt.title("TCP vs UDP Packet Delivery Ratio")

 

plt.ylim(0, 100)

plt.show()

 

 

Result: The performance of TCP and UDP was successfully studied using NS-2 simulation. TCP and UDP traffic were generated through a common bottleneck link, and their performance was analyzed using packet delivery, packet loss and throughput measurements.

 

 

Simulation of Congestion Control Algorithms Using NS-2

 

Simulation of Congestion Control Algorithms Using NS-2

 

Aim

To study the Network Simulator (NS-2) and simulate TCP congestion control algorithms, namely TCP Reno and TCP Tahoe, and observe their congestion-window behavior.

 

Steps to execute

1.    Install NS-2 in Google Colab

a.   Open Google Colab and create a new notebook

b.   Check the Linux environment

o   !uname -a

c.   Update the package list

o   !apt-get update -qq

d.   Install NS-2

o   !apt-get install -y ns2

e.   Check the NS-2 installation and verify

o   !which ns

2.    TCP Reno congestion-control algorithm.

a.   Create the Reno TCL file

b.   Run the TCL program

c.   Check the generated files

d.   Plot the TCP Reno congestion window

3.   TCP Tahoe congestion-control algorithm

a.   Create the Tahoe TCL file

b.   Run the TCL program

c.   Check the generated files

d.   Plot the TCP Tahoe congestion window

 

 

TCP Reno congestion-control algorithm.

 

a.   Create the Reno TCL file

%%writefile reno_cwnd.tcl

 

# Create simulator

set ns [new Simulator]

 

# Create trace file

set tracefile [open reno.tr w]

$ns trace-all $tracefile

 

# Create congestion window file

set cwndfile [open reno_cwnd.tr w]

 

# Create nodes

set n0 [$ns node]

set n1 [$ns node]

set n2 [$ns node]

set n3 [$ns node]

 

# Create links

$ns duplex-link $n0 $n2 10Mb 10ms DropTail

$ns duplex-link $n1 $n2 10Mb 10ms DropTail

$ns duplex-link $n2 $n3 1Mb 20ms DropTail

 

# Queue size

$ns queue-limit $n2 $n3 10

 

# Create TCP Reno

set tcp [new Agent/TCP/Reno]

 

# Attach TCP to sender

$ns attach-agent $n0 $tcp

 

# Create TCP sink

set sink [new Agent/TCPSink]

 

# Attach sink to receiver

$ns attach-agent $n3 $sink

 

# Connect TCP and sink

$ns connect $tcp $sink

 

# Create FTP application

set ftp [new Application/FTP]

 

# Attach FTP to TCP

$ftp attach-agent $tcp

 

# Procedure to record congestion window

proc record {} {

    global ns tcp cwndfile

 

    set now [$ns now]

    set cwnd [$tcp set cwnd_]

 

    puts $cwndfile "$now $cwnd"

 

    $ns at [expr $now + 0.01] "record"

}

 

# Start recording

$ns at 0.0 "record"

 

# Start FTP

$ns at 0.5 "$ftp start"

 

# Stop FTP

$ns at 9.5 "$ftp stop"

 

# Finish simulation

$ns at 10.0 "finish"

 

proc finish {} {

    global ns tracefile cwndfile

 

    $ns flush-trace

 

    close $tracefile

    close $cwndfile

 

    exit 0

}

 

# Run simulation

$ns run

 

b.   Run the TCL program

!ns reno_cwnd.tcl

 

c.   Check the generated files

!ls -lh reno*

 

d.   Plot the TCP Reno congestion window

 

import matplotlib.pyplot as plt

 

time = []

cwnd = []

 

with open("reno_cwnd.tr", "r") as f:

    for line in f:

        t, c = line.split()

        time.append(float(t))

        cwnd.append(float(c))

 

plt.figure(figsize=(10,5))

plt.plot(time, cwnd)

 

plt.xlabel("Time (seconds)")

plt.ylabel("Congestion Window (packets)")

plt.title("TCP Reno Congestion Window")

plt.grid()

 

plt.show()

 

 


 

TCP Tahoe congestion-control algorithm

 

a.   Create the Tahoe TCL file

%%writefile tahoe_cwnd.tcl

 

# Create simulator

set ns [new Simulator]

 

# Create trace file

set tracefile [open tahoe.tr w]

$ns trace-all $tracefile

 

# Create congestion window file

set cwndfile [open tahoe_cwnd.tr w]

 

# Create nodes

set n0 [$ns node]

set n1 [$ns node]

set n2 [$ns node]

set n3 [$ns node]

 

# Create links

$ns duplex-link $n0 $n2 10Mb 10ms DropTail

$ns duplex-link $n1 $n2 10Mb 10ms DropTail

$ns duplex-link $n2 $n3 1Mb 20ms DropTail

 

# Queue size

$ns queue-limit $n2 $n3 10

 

# Create TCP Tahoe

set tcp [new Agent/TCP]

 

# Attach TCP to sender

$ns attach-agent $n0 $tcp

 

# Create TCP sink

set sink [new Agent/TCPSink]

 

# Attach sink to receiver

$ns attach-agent $n3 $sink

 

# Connect TCP and sink

$ns connect $tcp $sink

 

# Create FTP application

set ftp [new Application/FTP]

 

# Attach FTP to TCP

$ftp attach-agent $tcp

 

# Procedure to record congestion window

proc record {} {

    global ns tcp cwndfile

 

    set now [$ns now]

    set cwnd [$tcp set cwnd_]

 

    puts $cwndfile "$now $cwnd"

 

    $ns at [expr $now + 0.01] "record"

}

 

# Start recording

$ns at 0.0 "record"

 

# Start FTP

$ns at 0.5 "$ftp start"

 

# Stop FTP

$ns at 9.5 "$ftp stop"

 

# Finish simulation

$ns at 10.0 "finish"

 

proc finish {} {

    global ns tracefile cwndfile

 

    $ns flush-trace

 

    close $tracefile

    close $cwndfile

 

    exit 0

}

 

# Run simulation

$ns run

 

b.   Run the TCL program

!ns tahoe_cwnd.tcl

 

c.   Check the generated files

!ls -lh tahoe*

 

d.   Plot the TCP Tahoe congestion window

import matplotlib.pyplot as plt

 

time = []

cwnd = []

 

with open("tahoe_cwnd.tr", "r") as f:

    for line in f:

        t, c = line.split()

        time.append(float(t))

        cwnd.append(float(c))

 

plt.figure(figsize=(10,5))

 

plt.plot(time, cwnd)

 

plt.xlabel("Time (seconds)")

plt.ylabel("Congestion Window (packets)")

plt.title("TCP Tahoe Congestion Window")

 

plt.grid()

 

plt.show()