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") in C++. You will learn to make "system calls" to interact with "the system". There will be 5 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.

Instructor Bill Cheng (click to see office hours)
E-mail: <>.  (Please do not send HTML-only e-mails. They will not be read.)
Time TuTh 12:00pm - 1:50pm 
Location ZHS 159 
TA Bowen Song, E-mail: <>
Office Hours: Thu 4:00-5:30pm, Fri 8-9:30am (on Zoom) (you can make an appointment for Fri, but Thu is strictly first-come-first-served)
Rudra Panda, E-mail: <>
(If needed, the grader will hold regrade sessions the week after the announcement of each assignment's grades.)
Midterm Exam during class time, Tue, 10/18/2022 (firm).
Final Exam 11am-1pm, Tue, 12/13/2022 (firm).
Class Resources
Description   :   textbooks, topics covered, grading policies, additional resources, etc.
Lectures   :   information about lectures (and lectures slides in PDF format).
Videos   :   information about D2L lectures and discussion sections videos.
Labs   :   information about discussion sections and labs.
Programming   :   programming assignments (please also see important information about programming assignments at the bottom of this web page.)
Forum   :   Piazza Forum for discussing course materials and assignments. You are required to be a member of this group. (This group is by invitation only.) Please do not send request to join this group until after the first lecture.

(in reversed chronological order)
  • 9/19/2022: Office hour tomorrow (Tue, 9/20/22) has been moved to 8-9pm. Sorry about the inconvenience.

  • 8/29/2022: Office hour this Wednesday (8/31/22) is moved to 3-4pm on Friday, 9/2/2022 Sorry about the inconvenience.

  • 8/22/2022:
    • Watch this area for important announcements.

    • Due to security concerns, we cannot post Zoom meeting IDs in public area of the class website. A summary of Zoom meeting IDs and links are provided here (password protected).

    • To get user ID and password for accessing protected area of this web site, please visit the request access page after semester starts and submit the requested information. (You do not have to be registered for the course to get the password. You just need to have an USC e-mail address.)

    • Please do not send request to join the class Piazza Forum until after you have watch the first lecture video.

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).

This is not an introductory class. We will assume that you know how to program because you are supposed to have satisfied all the prerequisites of this course. If you somehow were able to satisfy all the prerequisites of this course without being reasonably proficient in software development, it's not our job to teach you how to program. If you are not reasonably proficient in programming, may be you should consider taking this course at a later time when you are better at it. Or, you should get ready to spend a lot of time doing the labs and the programming assignments and start doing all your assignments as early as possible and seek help from the instructors and the course producers whenever you are stuck.

All programming assignments (include labs) 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, and no C++ with Microsoft, Mac, or Google extensions.) Since the standard C++ does not support networking, all networking related programming assignments are required to be done by making system calls (with a C interface) and without using any C++ networking libraries. C is a proper subset of standard C++. If you know standard C++, you already know C. Standard C++ is designed to work with system calls and we will learn about networking system calls in this class.

Your program must compile and run with a Makefile on a standard 32-bit Ubuntu 16.04 machine running inside VirtualBox. Grading for programming assignments can ONLY be done on a standard 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. Please install a 32-bit Ubuntu 16.04 into VirtualBox on your laptop/desktop as soon as possible and start using it with the very first programming assignment.

If the only computer you have access to is the new Mac running on a non-Intel/AMD CPU, then it may not be possible to install VirtualBox into your machine. If that's the case, you must do all your labs and programming assignments on the system specified here.

If you are not familiar with Linux/Unix, please read Unix for the Beginning Mage, a tutorial written by Joe Topjian. (Unfortunately, looks like this book has just disappeared from the web.) You can also visit UNIX Tutorial for Beginners or Learn tcsh in Y Minutes. If you already know how to use Unix/Linux before and just need a refresher, please review my summary of some commonly used Unix commands and my tcsh scripting tutorial. It's a good idea to be familiar with the terminal-based Unix/Linux development environment (vi/pico/emacs, gcc/g++, make, etc.).

If a student registered late for this class or could not be present at the beginning of the semester, the student is still required to turn all the assignments on time or the student will receive a score of 0 for these assignments. No exceptions!