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 class 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 2021 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 2021 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. (In general, I'm bound by my own written rules and I have to stick to them.)

Someone 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!



  • We will be using a flipped classroom model during this semester. (Although in a regular flipped classroom model, during live lectures, students will be taking quizzes and doing exercises. Since we have so many lab and programming assignments to do in this class, it would be too much to ask students to do more exercises during live lectures. I also don't have any quizzes planned.) Lectures will be pre-recorded into multiple videos (and posted on D2L) and will be made available before 6pm the day before the scheduled lecture time. You are expected to watch the lecture video beofre you come to the "live" class during the scheduled lecture time. During a live lecture (most likely will be over Zoom and it will be recorded since it's required by the university), we will be discussing materials covered in the recorded video. You are also welcome to ask me questions about programming assignments during live lectures. At the end of a live lecture, I will stop recording and leave the "room" but keep the Zoom session running so that students can use the remaining time to talk to one another over Zoom. When no students are left in the "room", I will close the Zoom session.

  • This semester starts on 1/15/2021 and it's a Friday where we have an 80-minute discussion section. I think the idea is that since the Monday after is a university holiday, we should use this discussion section as the first lecture. So, I will record an 80-minute long video for the first lecture for 1/15/2021 and you should watch this video before Lecture 2 on 1/20/2021. Lecture 1 is very important. It gives an overview of this class and mention many important rules I will stick to for the rest of the semester.


  • 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. According to university policy, no one is permitted to take the final exam at a different time. 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.


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


  • 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 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! We will not be giving out "solutions" to even lab assignments. If your code is not working, you are expected to come to office hours and helpdesk 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 bottomline 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!

    We will have (at most) 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.

Grade Normalization of Programming Assignments

  • In order to finish the grading of programming assignments in a timely manner, the same assignment most likely will be graded by multiple graders. Even if they have exactly the same grading rubric, practically, it's pretty much impossible to have every grader grade identically. For this class, we will normalize the grade of your programming assignments in the following way to try to make the grade more fair.

    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 assignment grade according to the average and standard deviation for each grader for that assignment and extrapolate your grade according to the overall class average and standard deviation for that assignment. For example, if the average for a particular assignment graded by a particular grader is 85 and standard deviation is 10 and you got a score of 87.5 (i.e., average plus a quarter of a standard deviation), your "normalized" score will be the overall class average plus a quarter of the overall class standard deviation for that assignment. This means that if you were graded by an "easy grader", your normalized score may be lower than your original score. If you were graded by a "harsh grader", your normalized score may be higher than your original score. This is not a perfect system. But I think it's an improvement over not normalizing your scores.

    This is only done for programming assignments and not labs since grading of labs are pretty straight-forward.

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 attend every lecture and submit all 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 labs you have missed.


  • 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 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 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 32-bit Ubuntu 16.04 machine running inside VirtualBox. Grading for 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 rusn 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 a non-Intel/AMD CPU, since such a system is so new, I have no idea if it can even run VirtualBox! If this is the case, at your earliest convenience, please follow the procedure install Ubuntu Linux into a Virtual Machine on it and let me know if you can successfully set up and run a 32-bit Ubuntu 16.04 system on it.

Important Dates

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