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.

My actual CS 353 class web site for Spring 2020 is not ready yet. Since many students are registering now, I felt that I should post some important rules about my sections 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.)


  • The midterm exam will be 72 minutes long and it will take place on Monday, March 9, 2020, during class, from 12pm to 1:12pm.

  • The dates and times for the final exams are 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 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. Our final exam will be 100 minutes long and it will go from 11am to 12:40pm on Friday, May 8, 2020.


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

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


  • The prerequisite for this course is CS 201 (Principles of Software Development). The prerequisite for CS 201 is CS 104L, and 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).

  • 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. Although it's not recommended, but if you are a Linux/Unix expert and are comfortable with a commandline interface to Linux/Unix systems (i.e., without a desktop graphical user interface), you can also try VagrantBox (i.e., Vagrant with VirtualBox) and use it to do your programming assignments. But please understand that if you do your development in a VagrantBox, it's your responsibility to make sure that your code runs perfectly on a 32-bit standard Ubuntu 16.04 machine running inside VirtualBox since that's the only platform the grader can use for grading.

    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.

Important Dates (programming assignments due dates may change)

  • (Jan 13, 2020) - first day of class
  • (Jan 20, 2020) - Martin Luther King Day, university holiday
  • (Jan 31, 2020) - PA1 due
  • (Feb 17, 2020) - Presidents' Day, university holiday
  • (Feb 21, 2020) - PA2 due
  • (Mar 9, 2020) - midterm (72 minutes), 12pm - 1:12pm (firm)
  • (Mar 13, 2020) - PA3 due
  • (Mar 16-20, 2020) - Spring recess
  • (Apr 10, 2020) - PA4 due
  • (May 1, 2020) - PA5 due
  • (May 8, 2020) - final exam (100 minutes), 11am - 12:40pm (firm)