ECE 50863: Computer Network Systems

Class Overview

This graduate class focused on understanding, designing, and testing computer networks and network protocols. It consisted of discussion of current network architectures and protocols as well as three labs were I designed parts of networks myself. Given the simulated nature of these labs, and the goal being mostly conceptual, they where all implemented in Python. I also read several research papers on the topics we were covering.

Course Content

  • Network Stack and Routing
  • SSL/TLS
  • TCP
  • UDP
  • IPv4
  • Ethernet
  • Hubs, Switches, and Routers
  • Spanning Tree Algorithm
  • Distance-Vector Routing
  • Link-State Routing
  • Inter Domain Routing
  • BGP
  • Transport Layer
  • Accumulative Acknowledgment
  • Selective Acknowledgment
  • Negative Acknowledgment
  • Flow Control
  • RTT Approximation
  • TCP Tahoe and Reno
  • Cubic TCP
  • TCP BBR
  • Explicit Congestion Notification
  • Weighted Fair Queueing
  • Video Streaming
  • Adaptive Bitrate Algorithms
  • Buffer-Based ABR Algorithms
  • Model Predictive Control ABR Algorithms
  • Variable Bitrate Encoding
  • Software Defined Networks
  • Management, Control, and Forwarding Planes
  • OpenFlow
  • Programmable Switches
  • Software-Driven Wide Area Network

Papers

Labs

Lab 1: Software Defined Network

In the first lab, I built a simple control layer for a software defined network. This lab was meant to help students transition from undergraduate to graduate labs, so it was more simplistic than future labs. The controller simply used Dijkstra's algorithm on latencies to find the quickest path between switches. Each switch would send keep alive packets to both the controller and its neighbors. These packets would also inform the controller what neighbors it could reach. Upon a timeout, the network would assume a topology change, and the controller would update the paths accordingly. If a switch came back online, the controller would again update the paths accordingly.

Lab 2: Transport Layer Protocol

This lab had me build a transport layer protocol and optimize its performance for "goodput" (throughput minus any overhead) and overhead. It was tested over a simulated network which randomly (uniform) dropped or swapped packets. The rate of dropping could be controlled for different tests. We initially build a stop and go protocol (send packet, wait for ACK, then send next packet), then optimized from there.

Features I Implemented

Sensitivity Table

Bandwidth = 200,000 bytes/s, One Way Propagation = 0.100s, mean[standard deviation]

5% loss and 5% reordering 2% loss and 2% reordering No loss and no reordering
Goodput (bytes/s) 107,087[10,101] 142,528[8,616] 156,707[764]
Overhead (% of bytes sent) 13.5[1.15] 11.4[0.895] 10.1[0.0000]

Ablation Table

Bandwidth = 200,000 bytes/s, One Way Propagation = 0.100s, Loss and Reordering = 2%, mean[standard deviation]

Design Alternative Goodput (bytes/s) Overhead (bytes)
Default 142,528[8,616] 11.4[0.895]
Disable parity 113,037[6,802] 36,587[8,925]
Parity for every 40 packets 116,104[10,505] 50,697[8,873]
Parity for every 20 packets 132,257[18,356] 59,903[10,307]
Disable Selective ACK 131,872[10,695] 125,427[36,979]
Disable Selective ACK window growth 138,645[9,146] 71,880[3,899]
Allow Selective ACK window growth up to 1.3x. 133,117[10,295] 80,566[8,812]
Enable variable window size (RTT) 126,750[5,722] 78,604[9,394]
Disable variable timeout (RTT) 150,269[6,208] 65,556[822]

Results Discussion

Discussion of RTT and Timeout in this Simulation

My initial implementation of timeouts and RTT estimation had a major flaw. When sending more than one packet in a row, it would not consider the time it takes to send the previous packets. This was particularly disruptive on the first window, when all packets are sent at once. Because of this, the RTT of each packet would increase linearly until the end of the first window. For further windows, usually only a few packets would be sent at a time, making this less of an issue. This made the RTT estimator for the timeout improve the goodput by avoiding unnecessary timeouts. This would also imply that on a network were the RTT changed or is not known, the RTT estimator may still be useful. My final implementation mostly fixes this flaw, which helps to improve the goodput. Because of the way the emulator is set up, it would likely be impossible for me to fully fix this flaw. This flaw came originally from the assumption that the Monitor.send method would block until the simulated transmission of the packet was complete. In the real world, this type of issue may also be seen if a fast link is then bottlenecked by a slow link. It may be prudent to consider its effects and better solutions to it outside the confines of this simulation.

Lab 3: Adaptive Bitrate (ABR) Algorithms for Video Streaming

In this lab, I tested several different adaptive bitrate algorithms for video streaming as well as making our own. The general goal was to maximize a "quality of experience" (QoE) metric. We implemented the BBA-2 algorithm from "A Buffer-Based Approach to Rate Adaptation" and the RobustMPC algorithm from "A Control-Theoretic Approach for Dynamic Adaptive Video Streaming over HTTP". Finally I implemented my own algorithm.

My Algorithm

My algorithm would receive the throughput off the last chunk downloaded (Previous Throughput), the bitrates of upcoming chunks (Upcoming Bitrates) (video has variable bitrate), and the buffer level form the simulator.

Results