Unit 4 Simulation Notes
Unit 4 Simulation Notes
Simulation is the process of learning by doing. Whenever there is something new in the
world, we try to analyze it first by examining it and in the process get to learn a lot of
things. This entire course is called Simulation
Introduction to DNS and UDP in IoT Networks:
The Domain Name System (DNS) is a critical component of the Internet, acting as a
directory service that translates humanreadable domain names into IP addresses. In the
context of Internet of Things (IoT) networks, DNS enables IoT devices to communicate with
servers, cloud services, and other devices using easytoremember domain names. UDP (User
Datagram Protocol) is often used with DNS in IoT networks due to its low overhead and
speed, making it suitable for resourceconstrained devices.
DNS plays a crucial role in IoT networks by providing a mechanism for device identification
and service discovery. It allows IoT devices to resolve domain names to IP addresses,
enabling communication with external servers, cloud platforms, or other IoT devices.
Resource Constraints: IoT devices often have limited processing power, memory, and
energy, making efficient DNS resolution critical.
Security Concerns: DNS is vulnerable to attacks like DNS spoofing, which can be
particularly problematic in IoT environments where security is a major concern.
Network Dynamics: IoT networks can be highly dynamic, with devices frequently joining
and leaving the network, requiring DNS mechanisms to adapt quickly.
1. Introduction to UDP
UDP is a lightweight, connectionless protocol that allows data to be sent without establishing
a connection. This makes it ideal for timesensitive applications like DNS queries, where
speed is prioritized over reliability. UDP does not guarantee message delivery, order, or data
integrity, which can be a concern but is often acceptable for DNS lookups due to their
relatively small size and low frequency of errors.
Advantages:
Low Overhead: UDP's simplicity and lack of connection establishment reduce the
processing and memory requirements on IoT devices.
Speed: The absence of handshaking and connection setup allows for faster communication,
which is critical for realtime applications in IoT.
Disadvantages:
Lack of Reliability: UDP does not ensure that messages are delivered or that they arrive in
the correct order, which can be problematic for certain applications.
Security Issues: The lack of builtin security features makes UDP vulnerable to attacks like
spoofing and amplification.
Socket Creation: In a typical implementation, a UDP socket is created using the `socket()`
function, specifying the `AF_INET` (IPv4) or `AF_INET6` (IPv6) address family and the
`SOCK_DGRAM` type for datagrambased communication.
Binding and Listening: The socket is bound to a specific port number, usually port 53 for
DNS, allowing it to receive incoming DNS queries.
Query Formation: IoT devices construct a DNS query by specifying the domain name and
the type of record requested (e.g., A, AAAA, MX).
Sending the Query: The query is sent through the UDP socket to a DNS server.
Receiving the Response: The device listens for a response from the DNS server, which
includes the resolved IP address or an error message if the domain cannot be resolved.
Caching: To reduce latency and conserve resources, IoT devices can cache DNS responses
for a specified duration (TimeToLive, TTL).
Load Balancing: DNS servers can distribute traffic among multiple IP addresses for a single
domain, balancing the load across resources.
Security Enhancements: DNSSEC (DNS Security Extensions) can be implemented to
protect against spoofing and other attacks, though this adds complexity and overhead.
DNS spoofing involves intercepting and altering DNS responses to redirect traffic to malicious
sites. Cache poisoning is a related attack where incorrect DNS data is cached, leading to
incorrect IP address resolution.
2. Mitigation Strategies
Use of DNSSEC: DNSSEC adds a layer of security by enabling DNS responses to be verified
for authenticity.
Regular Updates and Monitoring: Keeping DNS software and configurations up to date and
monitoring for suspicious activities can help mitigate threats.
4.1.5. Conclusion
DNS, facilitated by UDP sockets, is a fundamental component of IoT networks, enabling
efficient device communication. While UDP provides a lightweight and fast mechanism for
DNS resolution, it comes with challenges related to reliability and security. Proper
implementation, including caching, security measures, and efficient socket management, is crucial
for maintaining robust and secure DNS operations in IoT environments.
b) Gratuitous ARP Gratuitous ARP is an ARP request of the host that helps to identify the
duplicate IP address. It is a broadcast request for the IP address of the router. If an ARP
request is sent by a switch or router to get its IP address and no ARP responses are
received, so all other nodes cannot use the IP address allocated to that switch or router.
Yet if a router or switch sends an ARP request for its IP address and receives an ARP
response, another node uses the IP address allocated to the switch or router.
There are some primary use cases of gratuitous ARP that are given below:
The gratuitous ARP is used to update the ARP table of other devices.
It also checks whether the host is using the original IP address or a duplicate one.
c) Reverse ARP (RARP) It is a networking protocol used by the client system in a local area
network (LAN) to request its IPv4 address from the ARP gateway router table. A table is created
by the network administrator in the gatewayrouter that is used to find out the MAC address to the
corresponding IP address.
When a new system is set up or any machine that has no memory to store the IP address, then the
user has to find the IP address of the device. The device sends a RARP broadcast packet,
including its own MAC address in the address field of both the sender and the receiver hardware.
A host installed inside of the local network called the RARPserver is prepared to respond to such
type of broadcast packet. The RARP server is then trying to locate a mapping table entry in the
IP to MAC address. If any entry matches the item in the table, then the RARP server sends the
response packet along with the IP address to the requesting computer.
RARP is commonly known as a "Reverse Address Resolution Protocol". The RARP protocol is
also a type of network layer protocol. A TCP/IP protocol enables any host to get its true IP
address from the network server. As the name defines, the RARP protocol is an extended version
of the ARP. It is usually the opposite of the ARP protocol.
Advantages and Disadvantages of RARP
There are various advantages and disadvantages of RARP. Some main advantages and
disadvantages of RARP are as follows:
Advantages
It is a network access layer protocol that is utilized to transfer data between two sites in a
network.
It is utilized to convert an Ethernet address to an IP address.
It is accessible for LAN technologies such as FDDI, token ring LANs, and many others.
Disadvantages
It can't handle the subnetting operation since no network masks are transferred. If the
network is categorized into subnets, every subnet must have its own RARP server.
It should be placed on the same physical network as the client.
It does not fully exploit the capability of a network such as Ethernet.
The computer transfers the RARP protocol request through a lowcost network layer. As a
result, a router cannot forward the packet since the computer system makes the RARP
request on a relatively low layer of the network.
In a modern network, setting up a computer system is impossible.
d) Inverse ARP (InARP) Inverse ARP is inverse of the ARP, and it is used to find the IP
addresses of the nodes from the data link layer addresses. These are mainly used for the frame
relays, and ATM networks, where Layer 2 virtual circuit addressing are often acquired from
Layer 2 signaling. When using these virtual circuits, the relevant Layer 3 addresses are available.
Advantages
The primary purpose of this protocol is to enable any computer system on a network to
enhance a mapping between two addresses, including IP and physical.
If you know the IP address of the same system, you may utilize an ARP protocol to
determine the MAC address.
The set of mappings saved on the host is referred to as the ARP cache/table.
End nodes should not be arranged in such a way that they may detect MAC addresses. It
may be found when needed.
Disadvantages
ARP Spoofing is a technique that an attacker mainly utilizes to gain access to an Ethernet
network. It can result in data frame snooping on switched LAN networks, or the attacker
can terminate overall traffic, commonly known as ARP denial of service.
ARP attacks may occur, including ARP spoofing and Denial of Service.
4.2.3. Working of ARP Protocol:
Below is a Working flow diagram of ARP Protocol
All the fields given in ARP message format are being explained in detail below:-
Hardware Type: The size of this field is 2 bytes. This field defines what type of Hardware
is used to transmit the message. The most common Hardware type is Ethernet. The value of
Ethernet is 1.
Protocol Type: This field tells which protocol has been used to transmit the message.
substantially the value of this field is 2048 which indicates IPv4.
Hardware Address Length: It shows the length of the tackle address in bytes. The size of
Ethernet MAC address is 6 bytes.
Protocol Address Length: It shows the size of the IP address in bytes. The size of IP
address is 4 bytes.
OP law: This field tells the type of message. If the value of this field is 1 also it’s a request
message and if the value of this field is 2 also it’s a reply message.
Sender Hardware Address: This field contains the MAC address of the device
transferring the message.
Sender Protocol Address: This field contains the IP address of the device transferring the
message.
Target Hardware Address: This field is empty in the request message. This field contains
the MAC address of the entering device.
Target Protocol Address: This field contains the IP address of the entering device.
Advantages of ARP Protocol
There are many Advantages of ARP protocol but below we have told you about some
important advantages.
By using this protocol we can easily find out the MAC Address of the device.
There is no need to configure the end nodes at all to extract the MAC address through this
protocol.
Through this protocol we can easily translate IP address into MAC Address.
There are four main types of this protocol. Which we can use in different ways, and they
prove to be very helpful.
ALGORITHM:
Client:
PROGRAM:
CLIENT:
import socket
s=socket.socket()
s.bind(('localhost',8000))
s.listen(5)
c,addr=s.accept()
address={"165.165.80.80":"6A:08:AA:C2","165.165.79.1":"8A:BC:E3:FA"};
while True:
ip=c.recv(1024).decode()
try:
c.send(address[ip].encode())
except KeyError:
c.send("Not Found".encode())
SERVER:
import socket
s=socket.socket()
s.connect(('localhost',8000))
while True:
REG NO:
ip=input("Enter logical Address : ")
s.send(ip.encode())
print("MAC Address",s.recv(1024).decode())
OUTPUT:
SERVER:
CLIENT:
There are several congestion control algorithms used in networking to manage traffic and avoid
congestion in networks. These algorithms are designed to optimize the use of network resources,
minimize packet loss, and ensure fairness among multiple flows. Here is a list of some widely
used congestion control algorithms:
These algorithms are implemented in various network devices and software, and each has its
own strengths and weaknesses depending on the specific network environment and application
requirements.
To increase the source send rate when the network is not congested.
To share the network resources with other TCP flows in a “fair” way.
To reduce the source send rate when the network is congested.
4.3.4. TCP congestion control algorithms:
Slow start.
Fast recovery.
Network pricing.
Congestion avoidance.
Fast retransmit.
TCP paging.
Selective acknowledgment.
Random early detection.
4.3.5. Sample code for TCP congestion control:
This is the code for packets handled in tcp congestion control
class PacketData : public AppData {
public:
PacketData(int sz) : AppData(PACKET_DATA) {
datalen_ = sz;
if (datalen_ > 0)
data_ = new unsigned char[datalen_];
else
data_ = NULL;
}
PacketData(PacketData& d) : AppData(d) {
datalen_ = d.datalen_;
if (datalen_ > 0) {
data_ = new unsigned char[datalen_];
memcpy(data_, d.data_, datalen_);
} else
data_ = NULL;
}
virtual ~PacketData() {
if (data_ != NULL)
delete []data_;
}
unsigned char* data() { return data_; }
virtual int size() const { return datalen_; }
virtual AppData* copy() { return new PacketData(*this); }
private:
unsigned char* data_;
int datalen_;
};
To study the performance of TCP and UDP using a simulation tool, you'll need to follow a
structured approach. Here’s a detailed guide:
NS-3: A popular network simulator with extensive support for TCP and UDP protocols.
OMNeT++: A modular and extensible simulation library.
GNS3: A graphical network simulator that allows the combination of virtual and real
devices.
OPNET (Riverbed Modeler): A comprehensive tool for network simulation and
performance analysis.
4. Simulation Setup
Configure Simulation Environment: Set up the network topology and define node
parameters.
Implement Protocols: Enable and configure TCP and UDP protocols in the simulation
tool.
Traffic Generation: Use traffic generation models to simulate data transfer using TCP
and UDP.
Parameters: Define simulation parameters such as simulation time, link bandwidth, and
propagation delay.
5. Run Simulations
6. Collect Data
7. Analyze Results
Throughput Analysis: Compare the throughput of TCP and UDP under different
conditions.
Latency Analysis: Measure and compare the end-to-end delay for TCP and UDP
packets.
Packet Loss Analysis: Evaluate the packet loss rate for both protocols.
Jitter Analysis: Analyze the jitter experienced by UDP packets, which is crucial for real-
time applications.
Goodput Analysis: Compare the goodput for TCP and UDP, focusing on the efficiency
of data transfer.
8. Visualize Data
Graphs and Charts: Use tools like Excel, MATLAB, or built-in visualization tools in
the simulator to plot graphs and charts.
Performance Comparison: Create comparative charts to highlight the differences
between TCP and UDP performance.
Here's an example script to simulate TCP and UDP performance in a simple network topology:
# 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 1Mb 10ms DropTail
$ns duplex-link $n1 $n2 1Mb 10ms DropTail
$ns duplex-link $n2 $n3 1Mb 10ms DropTail
# Schedule events
$ns at 0.5 "$ftp0 start"
$ns at 1.0 "$cbr0 start"
$ns at 4.5 "$ftp0 stop"
$ns at 5.0 "$cbr0 stop"
$ns at 6.0 "finish"
ns tcp_udp_simulation.tcl
Analyze the Output:
Throughput: Calculate throughput by analyzing the amount of data received over time.
Latency: Measure the time difference between packet send and receive events.
Packet Loss: Count the number of packets sent versus packets received.
Jitter: Calculate the variation in inter-arrival times for UDP packets.
Goodput: Measure the amount of useful data received, excluding retransmissions and
control messages.
Visualizing Data
Use Gnuplot, Excel, or Python libraries to plot the extracted metrics for better
visualization and comparison.
This AWK script calculates the throughput for packets sent from node 2 to node 3.
By following these steps, you can effectively study and compare the performance of TCP and
UDP protocols using NS2.
Overview:
Distance Vector Routing is a decentralized routing protocol where each router maintains a routing
table that stores the distance (cost) to reach each destination network and the direction (next hop)
to reach that destination. The routers periodically exchange this information with their directly
connected neighbors.
Distance Vector Routing (DVR) Protocol is a method used by routers to find the best path for data
to travel across a network. Each router keeps a table that shows the shortest distance to every other
router, based on the number of hops (or steps) needed to reach them. Routers share this information
with their neighbors, allowing them to update their tables and find the most efficient routes. This
protocol helps ensure that data moves quickly and smoothly through the network.
The protocol requires that a router inform its neighbors of topology changes periodically.
Bellman-Ford Basics:
Each router maintains a Distance Vector table containing the distance between itself and All
possible destination nodes. Distances, based on a chosen metric, are computed using information
from the neighbors’ distance vectors.
Information kept by DV router:
Each router has an ID
Associated with each link connected to a router,
there is a link cost (static or dynamic).
Intermediate hops
Note:
From time-to-time, each node sends its own distance vector estimate to neighbors.
When a node x receives new DV estimate from any neighbor v, it saves v’s distance vector
and it updates its own DV using B-F equation:
Dx(y) = min { C(x,v) + Dv(y), Dx(y) } for each node y ? N
Example :
Consider 3-routers X, Y and Z as shown in figure. Each router have their routing table.
Every routing table will contain distance to the destination nodes.
Consider router X , X will share it routing table to neighbors and neighbors will share it
routing table to it to X and distance from node X to destination will be calculated using
bellmen- ford equation.
Dx(y) = min { C(x,v) + Dv(y)} for each node y ? N
As we can see that distance will be less going from X to Z when Y is intermediate node(hop) so
it will be update in routing table X.
Key Characteristics:
1. Bellman-Ford Algorithm: The algorithm used for calculating the shortest path.
2. Periodic Updates: Routers send their entire routing table to their neighbors at regular
intervals.
3. Table Maintenance: Each router maintains a table (vector) containing the distance to
each destination and the next hop.
4. Simple Implementation: It's straightforward to implement but has limitations in larger
or more dynamic networks.
Operation:
1. Initialization: Each router starts with a table listing the cost to reach directly connected
networks and sets the cost to reach itself as zero.
2. Exchange: Routers exchange routing tables with their neighbors periodically.
3. Update: Upon receiving the routing information, a router updates its own table if a
shorter path is found.
4. Convergence: This process continues until no more updates are made, and the network is
considered to have converged.
Issues:
1. Count to Infinity Problem: This occurs when there is a loop in the network, leading to
infinite loops in route calculations.
2. Slow Convergence: It can take a long time for the network to converge after a change.
Shortest Path: Distance Vector Routing finds the shortest path for data to travel in a
network.
Usage: It is used in local, metropolitan, and wide-area networks.
Easy Implementation: The method is simple to set up and doesn’t require many
resources.
Quick Convergence: It quickly adjusts to changes in the network, finding the best route
to a destination fast.
Link state routing is a technique in which each router shares the knowledge of its neighborhood
with every other router in the inter network.
Link State Routing is a more complex and efficient routing protocol where each router has a
complete map of the network topology. Routers maintain a database describing the entire
network's structure and use this information to compute the shortest path to each destination.
o Knowledge about the neighborhood: Instead of sending its routing table, a router sends
the information about its neighborhood only. A router broadcast its identities and cost of
the directly attached links to other routers.
o Flooding: Each router sends the information to every other router on the internetwork
except its neighbors. This process is known as Flooding. Every router that receives the
packet sends the copies to all its neighbors. Finally, each and every router receives a copy
of the same information.
o Information sharing: A router sends the information to every other router only when the
change occurs in the information.
Reliable Flooding:
Route Calculation:
Each node uses Dijkstra's algorithm on the graph to calculate the optimal routes to all nodes.
o The Link state routing algorithm is also known as Dijkstra's algorithm which is used to find
the shortest path from one node to every other node in the network.
o The Dijkstra's algorithm is an iterative, and it has the property that after kth iteration of the
algorithm, the least cost paths are well known for k destination nodes.
Algorithm:
Initialization
N = {A} // A is a root node.
for all nodes v
if v adjacent to A
then D(v) = c(A,v)
else D(v) = infinity
loop
find w not in N such that D(w) is a minimum.
Add w to N
Update D(v) for all v adjacent to w and not in N:
D(v) = min(D(v) , D(w) + c(w,v))
Until all nodes in N
In the above algorithm, an initialization step is followed by the loop. The number of times the
loop is executed is equal to the total number of nodes available in the network.
Step 1:
The first step is an initialization step. The currently known least cost path from A to its directly
attached neighbors, B, C, D are 2,5,1 respectively. The cost from A to B is set to 2, from A to D is
set to 1 and from A to C is set to 5. The cost from A to E and F are set to infinity as they are not
directly linked to A.
Step 2:
In the above table, we observe that vertex D contains the least cost path in step 1. Therefore, it is
added in N. Now, we need to determine a least-cost path through D vertex.
v = B, w = D
= min( 2, 1+2)>
= min( 2, 3)
v = C, w = D
D(B) = min( D(C) , D(D) + c(D,C) )
= min( 5, 1+3)
= min( 5, 4)
The minimum value is 4. Therefore, the currently shortest path from A to C is 4.</p>
v = E, w = D
D(B) = min( D(E) , D(D) + c(D,E) )
= min( ∞, 1+1)
= min(∞, 2)
The minimum value is 2. Therefore, the currently shortest path from A to E is 2.
The vertex D has no direct link to vertex E. Therefore, the value of D(F) is infinity.
Step 3:
In the above table, we observe that both E and B have the least cost path in step 2. Let's consider
the E vertex. Now, we determine the least cost path of remaining vertices through E.
v = B, w = E
D(B) = min( D(B) , D(E) + c(E,B) )
= min( 2 , 2+ ∞ )
= min( 2, ∞)
The minimum value is 2. Therefore, the currently shortest path from A to B is 2.
v = C, w = E
D(B) = min( D(C) , D(E) + c(E,C) )
= min( 4 , 2+1 )
= min( 4,3)
The minimum value is 3. Therefore, the currently shortest path from A to C is 3.
v = F, w = E
D(B) = min( D(F) , D(E) + c(E,F) )
= min( ∞ , 2+2 )
= min(∞ ,4)
The minimum value is 4. Therefore, the currently shortest path from A to F is 4.
Step 4:
In the above table, we observe that B vertex has the least cost path in step 3. Therefore, it is added
in N. Now, we determine the least cost path of remaining vertices through B.
v = C, w = B
D(B) = min( D(C) , D(B) + c(B,C) )
= min( 3 , 2+3 )
= min( 3,5)
The minimum value is 3. Therefore, the currently shortest path from A to C is 3.
b) Calculating the shortest path from A to F:
v = F, w = B
D(B) = min( D(F) , D(B) + c(B,F) )
= min( 4, ∞)
= min(4, ∞)
The minimum value is 4. Therefore, the currently shortest path from A to F is 4.
Step 5:
In the above table, we observe that C vertex has the least cost path in step 4. Therefore, it is added
in N. Now, we determine the least cost path of remaining vertices through C.
v = F, w = C
D(B) = min( D(F) , D(C) + c(C,F) )
= min( 4, 3+5)
= min(4,8)
The minimum value is 4. Therefore, the currently shortest path from A to F is 4.
Final table:
Disadvantage:
Heavy traffic is created in Line state routing due to Flooding. Flooding can cause an infinite
looping, this problem can be solved by using Time-to-leave field
Key Characteristics:
1. Dijkstra’s Algorithm: The algorithm used for calculating the shortest path.
2. Link State Advertisements (LSAs): Routers send LSAs to all other routers in the
network, containing information about directly connected links and their state.
3. Topology Database: Each router builds and maintains a database of the entire network
topology.
4. Complexity and Efficiency: More complex to implement but offers better scalability
and faster convergence.
Operation:
1. Link State Information: Each router discovers its neighbors and measures the cost to
each link.
2. Flooding LSAs: Routers create LSAs and flood them to all other routers in the network.
3. Database Synchronization: All routers collect LSAs to build an identical topology
database.
4. SPF Calculation: Each router independently runs the Dijkstra algorithm on the topology
database to compute the shortest path tree.
5. Routing Table Update: The shortest path tree is used to update the routing table.
To implement TCL script to simulate link state routing in ns2, we will go through the various
steps in simulating LS (Link State) routing, each with several lines of code as follows.
The first step is to initialize the network simulator, and we do so by creating a network simulator
object. After that, we initialize rtproto (routing protocol) to Link State (LS).
$ns rtproto LS
We next create a random number of nodes, let’s say 7. We use the node instance to create these
nodes as follows.
In the next step we can label the nodes if we wish to. Here we are labeling them from node 0 to
node 6. We can also customize the labels by assigning different colors to them and thus viewing
the simulation much more clearly. Here we will use red and blue.
The next step is to create duplex links between the nodes forming a ring in the end. This can be
achieved by using the duplex-link instance along with specifying three parameters: data rate
(1.5Mb), delay (10ms) and kind of queue (DropTail).
Now we need to orient the links between the nodes appropriately to obtain proper alignment. The
duplex-link-op instance is used for the same.
The next step is to attach TCP agents (using attach-agent) at two nodes let’s say node 1 and node
4. We can do this creating the source and sink objects and connecting them using connect
instance.
Our next step is to create FTP traffic and attach to TCP source. The traffic then flows across
node 1 and node 4. We can do this by creating an FTP agent and attaching it to tcp2.
The next step is to add a finish procedure to flush all data into trace file and then and then run the
nam file.
proc finish{} {
global ns nf
$ns flush-trace
close $nf
exit 0
The final step is to schedule the FTP traffic at the required time intervals. We can also disable
the link between any pair of nodes at a certain timestamp using rtmodel-at instance and then
enable it after a certain time. This is majorly done for testing purposes. Here we have disabled
the link between nodes 2 and 3. The program ends with the run command.
$ns at 0.5 "traffic_ftp2 start"
$ns run
Output :
As shown in the figure above there is a normal flow of packets from node 1 to node 4. We now
disable the link between nodes 2 and 3 at time 1 and the simulations changes as shown below. The
disabled link is shown in red and the packet flow this time changes direction rather than the original
route to node 4.
Advantages:
These algorithms are fundamental to understanding how routers communicate and determine the
best paths for data to travel across networks.
Evaluating the performance of routing protocols using simulation tools is essential for
understanding their behavior under various network conditions. Here’s a structured approach to
performance evaluation for ARP/RARP, TCP/UDP, and Distance Vector/Link State Routing
algorithms using a simulation tool:
1. NS-3:
o A discrete-event network simulator for internet systems.
o Provides support for various routing protocols, ARP, TCP, and UDP.
2. OMNeT++:
o A modular, component-based C++ simulation library and framework.
o Suitable for simulating communication networks and other distributed systems.
3. GNS3:
o A network software emulator that allows the combination of virtual and real
devices.
o Useful for simulating complex network topologies and protocols.
4. OPNET (now part of Riverbed Modeler):
o A comprehensive network simulation and modeling tool.
o Supports detailed analysis of routing protocols, TCP/UDP, and ARP/RARP
performance.
By following these steps and using appropriate simulation tools, you can effectively evaluate the
performance of various routing protocols and understand their strengths and limitations under
different network conditions.