Click here to see a PREVIEW of important rules that was posted before the semester started. This is an undergraduate level course covering the fundamental concepts of networking as embodied in the Internet. Topics covered in this are: design principles, layering, protocol design/analysis of the global Internet; networked applications; the structure/architecture of the Internet; protocols for network transport and congestion control; network layer and routing; link layer/MAC; and network security.
You will also learn to write multi-threaded programs to create a network of communicating servers using "socket programming" (which some would consider as "system programming"). You will learn to make "system calls" to interact with "the system". There will be 6 to 7 programming assignments and some of them can be quite time-consuming and challenging to implement and debug. Therefore, the workload of this class can be quite high and it's important to keep up with the pace of the class and try to avoid starting a lab or programming assignment only when the deadline approaches.
(in reversed chronological order)
The prerequisite for this course is CSCI 201 (Principles of Software Development). Please see the CS Course Catalog for information about CSCI 201.
According to the CS Course Catalog, the prerequisite for CSCI 201 is CSCI 104L, and the prerequisite for CSCI 104L is CSCI 103L. Therefore, you will be expected to have had at least two semesters of experience programming in C++ from these courses.
In addition, a corequisite of CSCI 104L is CSCI 170, and graphs and basic graph algorithms are covered in CSCI 170. Therefore, you will be expected to be familiar with graph representations (e.g., nodes and edges for abstract representation, adjacency list data structure, etc.) and basic graph algorithms such as breadth-first-search (BFS).
All programming assignments are to be done in standard C++ (i.e., c++11, c++14, etc.). No other programming languages will be accepted. (Sorry, no Java, no Python.) All networking related programming are to be done in C (i.e., without C++ socket libraries). C is a proper subset of standard C++. If you know standard C++, you already know C.
Your program must compile and run with a Makefile either on nunki.usc.edu or on a 32-bit Ubuntu 16.04 machine running inside VirtualBox. Grading for programming assignments can ONLY be done on nunki.usc.edu (which runs a Unix operating system) or on a 32-bit Ubuntu 16.04 machine running inside VirtualBox. Even if you can demonstrate that your code runs perfectly on some other system, it cannot be considered for grading and you won't get any partial credit for it. If you are not familiar with Unix, please read Unix for the Beginning Mage, a tutorial written by Joe Topjian. You can also visit UNIX Tutorial for Beginners or Learn tcsh in Y Minutes. If you knew how to use Unix/Linux before and just need a refresher, please review a summary of some commonly used Unix commands. It's a good idea to be familiar with the Unix/Linux development environment (vi/pico/emacs, gcc/g++, make, etc.) One good way to start is to install Ubuntu Linux into a Virtual Machine on your laptop/desktop and start using it with the very first programming assignment. If you are comfortable with commandline interface to Linux/Unix systems (i.e., without a desktop), you can also try VagrantBox and use it for your programming assignments.
If a student registered late for this class or could not be present at the beginning of the semester, he/she is still required to turn all the assignments on time or he/she will receive a score of 0 for these assignments. No exceptions!