Description of Course Goals and Curriculum
This course teaches you the basic concepts of computer networks (from the ground up) and the services built on top of them. In particular, we first study the backbone of the internet - what each layer of the internet is, what it is responsible for, and the services at each of these layers. Building upon this knowledge, we then consider potential vulnerabilities of these protocols and techniques to make the internet more secure. Next, concepts and ideas on improving the speed of the internet for the end user are explored. Finally, we consider problems at the intersection of the internet and privacy, censorship, and regulation. More specifically, the topics covered by this course include:
- Protocols & Infrastructure
- Packet Switching
- End-to-End Principle
- Link Layer & Ethernet
- IP Addressing
- DNS & Interdomain Routing
- Software Defined Networking
- Management & Security
- TCP and UDP
- Network Traffic - Bufferbloat and Congestion Collapse
- Traffic Engineering - Token/Leaky Bucket
- Security - BGPSEC, DNSSEC, Botnets
- Modern Web Design - SPDY, Pipelining, Persistent Connections
- Content Distribution Networks
- Streaming Video - DASH
- Censorship & Firewalls
- Privacy & Tor
- FCC Guest Speaker
Learning From Classroom Instruction
There are two 50-minute lectures (on Mondays and Wednesdays) and one 50-minute precept (on Fridays) every week. There are many ways to learn the material in this course. Professor Feamster prefers to teach on the blackboard, but he also posts matching slides online before each lecture. Other than the last week or so, most of the concepts are also covered in greater depth in the course textbook. If these are still not enough, Professor Feamster has also posted an entire playlist of 2-5 minute videos on YouTube that cover each of the topics in this course one by one. Precepts usually review material discussed in lecture and provide background knowledge and tips on upcoming assignments.
Learning For and From Assignments
Each homework assignment is 15% of a student’s grade. (In total, the programming assignments account for 60% of a student’s total grade.) The 0th assignment (which is not graded but necessary) is about setting up your local development environment using Vagrant and Virtualbox. The first assignment is entirely in Go, and involves building a simple web server and an HTTP proxy. The second assignment is written in Python and uses Spark to explore phenomena such as Bufferbloat and TCP sawtooth behavior in network traffic. The third assignment is also in Python using the Mininet API and involves building protection against portscan attacks. The final assignment involves writing Go and Python code to build and measure the effect of prefetching on page loading time. The precepts generally do a good job of providing the necessary background material, including (but definitely not limited to) an introduction to Python, Go, iPython notebooks, Spark, and Mininet. Students are encouraged to work in pairs on all assignments. As pretty much every COS class, office hours and Piazza are available to help you on these assignments.
The midterm and final mainly focus on the material covered in lecture. To prepare for exams, I would recommend (re)-reading the lecture slides and (re)-watching the course YouTube videos. If there are any topics that are confusing, try reading about it in the textbook or going to office hours. Professor Feamster also released last year’s exams and solutions to us, which are helpful in gauging your readiness for the real exam. Finally, Professor Feamster also holds review sessions during the weeks leading up to an exam. If you have any topics that need more explanation or are looking for more practice problems, these are a great resource.
Overall, the class offers plenty of resources to learn the material and work on the assignments. I would highly recommend watching the appropriate YouTube videos before each lecture to get an overview of each topic. They are incredibly helpful and so short you can finish two or three while walking to lecture. As mentioned previously, the assigned chapter readings generally follow the lectures pretty closely, and are also a great resource. Precepts do a good job of introducing you to new languages and libraries, but if you are searching for additional material, I would recommend skimming Brian Kernighan’s book (http://www.gopl.io/) for learning Go, this article (https://github.com/mininet/mininet/wiki/Introduction-to-Mininet) for an overview of Mininet, and the offical Spark documentation (https://spark.apache.org/docs/0.9.1/python-programming-guide.html) for help with the Spark Python API. For students interested in learning even more about computer networks, there is an entire Coursera course on Software Defined Networking (https://www.coursera.org/learn/sdn) by Professor Feamster as well. Finally, it is good to remember that a lot of additional supplementary material can be found by a quick Google search.
What Students Should Know About This Course For Purposes Of Course Selection
This course can be used to fulfill one Systems requirement for concentrators within COS. COS 217 is listed as a prerequisite for this course and it is recommended that students take either COS 318 (Operating Systems) or COS 333 (Advanced Programming Techniques) before taking this course. If this class will be your first systems class, I would advise that you not let this recommendation deter you from taking this course. The course does a good job of giving you the necessary amount of background knowledge. One can argue that the only real advantage someone who took COS 333 might have is some experience with Python. However, Python is generally perceived as one of easiest languages to pick up, and assuming one already took 226 and 217, this should not be a problem at all. Furthermore, in my experience, most students come into the course with limited to no experience with Vagrant, Go, Mininet, or Spark.
As all COS systems classes do, this course takes more time than your average COS class. On the other hand though, it does not demand the “all-in” commitment as COS 318 does. Overall, I would highly recommend students to consider taking COS 461. It provides a great survey of some of the most important topics in computer networks, and offers a lot of resources for students to learn the material. Knowledge about and problem-solving abilities in computer networks are important for students interested in computer systems and security, and useful later on for courses such as COS 418 (Distributed Systems) and COS 561 (Advanced Computer Networks).