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 5 programming assignments and the last two 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 lectures and try to avoid starting a lab or programming assignment only when the deadline approaches.

Please note that this class does not use Blackboard. Everything about this class can be found on the CSCI 353, Spring 2023 class website (if you see this page again, it means that the class website is under construction).

My actual CS 353 class website for Spring 2023 is not ready yet. Since many students are registering now, I felt that I should post some important information about CS 353 (especially about rules) so students can know what to expect and register accordingly. I tend to be a stickler to rules, so there will be no exceptions. The rules are not just for students. I'm bound by my own written rules and I have to stick to them.

Some students don't understand why I am so strict with rules. Some think that it's just a power trip for me. It's actually just the opposite! The reason for sticking to rules is that I have the responsibility of treating all students fairly! If I apply one rule to one student and don't apply the same rule to another student, I think that's totally unfair. I think fairness is very important. Without fairness, grades have no meaning. The only way I know how to be fair is to have rules that are written down clearly and stick to all the written rules. When you ask me to bend a written rule for you, please understand that you are asking me to be unfair to all other students; and therefore, I will not bend the rule for you. You see, this actually takes power away from me because I am bound by my own rules and you can demand that I stick to my own rules!

Late Registration

  • Even though you might be considering other classes at the beginning of the semester, if you have any intention to take this class, you are expected to watch every lecture video on time and submit all labs and programming assignments on time (i.e., same deadlines as students who are already registered). So, even if you get in on Friday of the 3rd week of classes, you will not be getting an extension for PA1 (which is due at the end of Friday of the 3rd week of classes) or the lab submission deadlines you have missed (there is one lab due every week).



  • In the past few semesters, we have been using a flipped classroom model where lectures were pre-recorded and students were expected to have watched the pre-recorded lecture videos before coming to a "live and in-person" class during the scheduled lecture time. Well, we will not be doing that this semester and will be switching back to the traditional classroom teaching model where lecture material are given during the scheduled lecture time.

Time Conflicts

  • If you have another class that has a time conflict with our lecture time, I will not approve such a time conflict.
  • If you have another class that has a partial time conflict with our discussion section time, I would consider approving such a time conflict. But you should contact me via e-mail first and give me all the details before filing a petition.


  • All recorded videos will be made available on D2L (although you may not be able to download any of these videos). Every registered student will be given a D2L account.

Final Exam

  • The date and time for the final exam is deteremined by the university and there is absolutely no way to change it for you. Also, according to university policy, no one is permitted to take the final exam at a time different from their classmates. If you already know that you cannot come to the final exam, do not register for this class because I will not change the date or time of your final exam or have a separate exam for you.


  • If you are officially auditing this course (i.e., register for this course under the no-grade option), you will get the same course material as everyone else. If you want to audit this course unofficially, I will have to say no to you.


  • The workload of this class is quite high. We will have 5 programming assignments in this class and some of the stuff you have to do may be completely new to you. It's imperative that you start your programming assignments early since we have a very strict late submission policy. If you have a habit of starting your programming assignments only 2-3 days before the submission deadline, chances are, you may end up geting a very ver low score. For this class, you will not be given any partial credit for "effort".

    We will also have 14 labs in this class, one due every week (no lab on week 15). The purpose of the labs is to help you get started with your programming assignments. You are expected to finish the labs early so you can finish the corresponding programming assignment on time. For a networking programming assignment, the idea is that by finishing the labs that correspond to a programming assignment, you will not be far from finishing the programming assignment.

    We will not be giving out "solutions" to programming assignments even though it may seem that some programming assignments can use a previous programming assignment as a starting point. You should start every programming assignment from scratch and use your experience from previous assignments to write better code! (Although it would be quite difficult to start PA5 from scratch; therefore, it's important that you finish PA4 on time.) We will not be giving out "solutions" to lab assignments either. If your code is not working, you are expected to come to office hours to seek help, although none of the teaching staff will be permitted to write code for you or find bugs for you in your code. The bottom line is that if you are not proficient at programming and debugging, you need to be prepared to spend a lot of time getting good at programming and debugging!

Piazza Forum

  • We will use a Piazza Forum for class related communications and discussion. The class Piazza Forum is an important tool. Everyone must be a member of the class Piazza Forum. Your USC e-mail address will be used to add you to this forum.


  • The prerequisite for this course is CS 201 (Principles of Software Development). The prerequisite for CS 201 is CS 104L, and one of the prerequisite for CS 104L is CS 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 CS 104L is CS 170, and graphs and basic graph algorithms are covered in CS 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 graph algorithms such as breadth-first-search (BFS) and Dijkstra's algorithm (although we will review these data structures and algorithms at the beginning of the semester).

  • All labs and programming assignments are to be done in standard C++ (i.e., c++11, c++14, or c++17). No other programming languages will be accepted. (Sorry, no Java, no Python, and no C++ with Microsoft, Mac, or Google extensions.) Since standard C++ does not support networking, all networking related labs and 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 32-bit Ubuntu 16.04 machine running inside VirtualBox. Grading for labs and programming assignments can ONLY be done on the grader's 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. It's a good idea to get familiar with the Unix/Linux development environment (vi/pico/emacs, gcc/g++, make, etc.) as early as possible. 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 do not have a personal laptop or desktop that runs Windows 10 or Mac OS X, please contact the instructor as soon as possible. If you are thinking about purchasing a laptop, for the purpose of this class, I would recommend that you buy a Windows 10 or Mac laptop that runs on an Intel/AMD CPU to minimize compatibility issues.

    You should learn how to use the Terminal program to compile, run, and debug programs. It's probably a good idea to also learn how to use a text editor (such as vi, emacs, or pico) to create and edit C++ program source code and not rely on using IDEs.

    If the only machine you have access to is one of those new Macs that runs on an non-Intel/AMD CPU, then you must do all your labs and programming assignments on (which is a Linux server running CentOS 7).


  • There is a lot of programming to be done in this class! The class is designed so that the labs and programming assignments go with the schedule of lectures. If you don't keep up, you may have a very difficult time implementing the labs and programming assignments. You should try to understand lecture material by the end of the day the lecture was given. If there is anything you don't understand about the lecture, please send your question to me. In Lecture 1, I will make a promise to you that I will reply to every private e-mail messages within 24 hours of your e-mail! This is my commitment to you.

  • Ask me questions! I am here to help you with this class. I cannot help you if you don't ask me questions! Send me private e-mails or post your questions to the class Piazza (currently, this link is invalid; it will be active after the start of the semester). If I don't get questions from you, I would have to assume that you understand everything.

Important Dates

             January 2023      
          Su Mo Tu We Th Fr Sa  
           1  2  3  4  5  6  7  
    Wk  1  8  9 10 11 12 13 14  first day of classes: 1/9
    Wk  2 15 16 17 18 19 20 21  MLK day: 1/16
    Wk  3 22 23 24 25 26 27 28  pa1 due 1/27
    Wk  4 29 30 31
             February 2023
          Su Mo Tu We Th Fr Sa
    Wk  4           1  2  3  4
    Wk  5  5  6  7  8  9 10 11
    Wk  6 12 13 14 15 16 17 18  pa2 due 2/17
    Wk  7 19 20 21 22 23 24 25  presidents' day: 2/20
    Wk  8 26 27 28
               March 2023
          Su Mo Tu We Th Fr Sa
    Wk  8           1  2  3  4
    Wk  9  5  6  7  8  9 10 11  midterm: 3/6, pa3 due 3/10
          12 13 14 15 16 17 18  Spring recess
    Wk 10 19 20 21 22 23 24 25
    Wk 11 26 27 28 29 30 31
               April 2023
          Su Mo Tu We Th Fr Sa
    Wk 11                    1
    Wk 12  2  3  4  5  6  7  8  pa4 due 4/7
    Wk 13  9 10 11 12 13 14 15
    Wk 14 16 17 18 19 20 21 22
    Wk 15 23 24 25 26 27 28 29  pa4 due 4/28
                May 2023
          Su Mo Tu We Th Fr Sa
              1  2  3  4  5  6  final exam: 5/5 (11am-1pm)
           7  8  9 10 11 12 13  
If you have questions, please e-mail the instructor at <>.