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, Fall 2023 class website (if you see this page again, it means that the class website is under construction).

PREVIEW
My actual CS 353 class website for Fall 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).

Syllabus

Lectures

  • All lectures will be live and in-person and will be held in the lecture classroom. I will try my best to record all the live lectures on Zoom and make the videos available.

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

Videos

  • 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 determined 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.

Quizzes

  • We will have one quiz every Friday (except for the last week of the semester and when Friday falls on a university holiday). The quiz will cover lectures and lab assignment of the current week. These will be take-home quizzes. The first quiz is considered a quiz rehearsal and it will not count towards your grade. We will automatically drop the lowest two quiz scores when we calculate your final class grade.

Audit

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

Workload

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

Grade Normalization of Programming Assignments>

  • If there are multiple graders, since it's pretty much impossible to have every grader grade identically, I will track which student is graded by which grader. When I calculate your final class grade at the end of the semester, I will "normalize" each programming assignment grade according to the average for each grader and adjust your grade according to the overall class average. For example, if the average score of your grader is 85 and the overall class average is 86, this means that your grader's average is slightly lower than the class average (maybe because you were graded by a "harsher grader") and everyone graded by your grader will get their grade increased by 1 point (so that your grader's average will be 86). On the other hand, if the average score of your grader is 86.5, this means that your grader's average is slightly above the class average (maybe because you were graded by an "easier grader"), then everyone graded by your grader will get their grade lowered by 0.5 point (so that your grader's average will be 86). This is not a perfect system. But I think it's a big improvement over not normalizing your scores and it's done this way so that the adjustments are typically very small.

    Preparation

    • 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 a 32-bit Ubuntu 16.04 system 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 11 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 11 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 have two choices. You can either do all your labs and programming assignments on viterbi-scf1.usc.edu (which is a Linux server running CentOS 7 and it's not a great choice for this class), or you can set up a Ubuntu 16.04 system in AWS Free Tier (this would be the preferred choice).

    Expectations

    • 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

                  August 2023
              Su Mo Tu We Th Fr Sa
        Wk  1 20 21 22 23 24 25 26  first day of classes: 8/21
        Wk  2 27 28 29 30 31
        
                 September 2023
              Su Mo Tu We Th Fr Sa
        Wk  2                 1  2
        Wk  3  3  4  5  6  7  8  9  labor day: 9/4, pa1 due 9/8
        Wk  4 10 11 12 13 14 15 16
        Wk  5 17 18 19 20 21 22 23
        Wk  6 24 25 26 27 28 29 30  pa2 due 9/29
        
                  October 2023
              Su Mo Tu We Th Fr Sa
        Wk  7  1  2  3  4  5  6  7
        Wk  8  8  9 10 11 12 13 14  fall recess: 10/12-10/13
        Wk  9 15 16 17 18 19 20 21  midterm: 10/17, pa3 due 10/20
        Wk 10 22 23 24 25 26 27 28
        Wk 11 29 30 31
        
                 November 2023
              Su Mo Tu We Th Fr Sa
        Wk 11           1  2  3  4
        Wk 12  5  6  7  8  9 10 11  pa4 due 11/10
        Wk 13 12 13 14 15 16 17 18
        Wk 14 19 20 21 22 23 24 25  thanksgiving: 11/22-11/24
        Wk 15 26 27 28 29 30
        
                 December 2023
              Su Mo Tu We Th Fr Sa
        Wk 15                 1  2  pa5 due 12/1
               3  4  5  6  7  8  9
              10 11 12 13 14 15 16  final exam: 12/12 (11am-1pm)
    If you have questions, please e-mail the instructor at <bill.cheng@usc.edu>.
  •