MÔ TẢ HỌC THUẬT: GIÁO TRÌNH BÀI GIẢNG LẬP TRÌNH MẠNG

Tổng quan về giáo trình

Bài giảng Lập trình mạng do tác giả Lương Ánh Hoàng biên soạn thuộc Bộ môn Kỹ thuật máy tính, Viện Công nghệ thông tin và Truyền thông – Trường Đại học Bách khoa Hà Nội (hoàn thành tháng 8/2010). Đây là tài liệu giảng dạy học phần chuyên ngành trong chương trình đào tạo kỹ sư Công nghệ thông tin và Kỹ thuật máy tính ở bậc đại học và sau đại học.

Mục tiêu học tập của bài giảng là trang bị cho người học các nguyên lý truyền thông liên mạng và kỹ thuật lập trình xây dựng các ứng dụng khai thác hạ tầng mạng máy tính. Sau khi hoàn thành học phần, người học có khả năng phân tích hoạt động của bộ giao thức TCP/IP, làm chủ giao diện lập trình ứng dụng Winsock (Windows Sockets API) trên ngôn ngữ C/C++, đồng thời nắm vững phương pháp triển khai socket thông qua các thư viện hướng đối tượng như MFC Socket và .NET Framework (ngôn ngữ C#).

Cấu trúc giáo trình được thiết kế theo các bài giảng định lượng 3 tiết/bài, tiếp cận tuần tự từ kiến trúc giao thức nền tảng (IPv4, TCP, UDP, DNS) đến kỹ thuật lập trình socket ở mức hệ thống (khởi tạo Winsock, quản lý địa chỉ, xử lý I/O đồng bộ và bất đồng bộ) và các mô hình socket bậc cao.

Điểm đặc thù của tài liệu là phân tích sâu cấu trúc nội tại của hệ điều hành Windows liên quan đến ngăn xếp mạng (phân lớp từ WS2_32.DLL, Service Provider MSAFD.DLL đến kernel driver AFD.SYS và giao diện TDI). Toàn bộ nội dung lý thuyết đều được đối chiếu trực tiếp với các hàm API chuẩn của Windows, cấu trúc dữ liệu cụ thể và các đoạn mã nguồn C/C++ mẫu.


Nội dung kiến thức cốt lõi

Các chương/chủ đề chính

  • Chương 1: Giới thiệu các mô hình lập trình mạng (Bài giảng số 1 - 3 tiết): Định nghĩa lập trình mạng; phân tích môi trường và khả năng hỗ trợ của các ngôn ngữ lập trình (C/C++, Java, C#, Python, Perl, PHP); phân loại các thư viện lập trình mạng gồm Winsock (WS2_32.DLL), thư viện System.Net trên .NET Framework, thư viện MFC Socket trong Visual Studio C++, và các thư viện trong Java Runtime/PHP.
  • Chương 2: Bộ giao thức Internet (TCP/IP) (Bài giảng số 2 - 3 tiết): Phân tích mô hình TCP/IP 4 tầng (Tầng Ứng dụng, Tầng Giao vận, Tầng Liên mạng, Tầng Liên kết) đối chiếu với mô hình OSI 7 tầng; chi tiết giao thức IPv4 (theo chuẩn RFC 791 và MIL-STD-1777, không gian 32-bit với 4.294.967.296 địa chỉ, các lớp địa chỉ A, B, C, D, E, kỹ thuật phân chia mạng bằng mặt nạ mạng /n, các dải địa chỉ riêng RFC 1918 gồm 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, địa chỉ loopback 127.0.0.0/8); tổng quan về IPv6 (chuẩn IETF 1998); cấu trúc gói tin và nguyên lý của TCP (header 20 byte, sequence/acknowledgment number, cờ SYN/ACK/FIN/RST/PSH/URG, các cổng chuẩn 80, 21, 25, 110, 143); giao thức UDP (header 8 byte, phi kết nối, không kiểm soát thứ tự); hệ thống phân giải tên miền DNS (cấu trúc hình cây, quản lý bởi INTERNIC, hoạt động trên giao thức UDP cổng 53).
  • Chương 3: Winsock và lập trình ứng dụng (Bài giảng số 3, 4, 5 - 9 tiết): Kiến trúc phân lớp Winsock 2; phân loại đặc tính truyền thông: hướng thông điệp (Message-Oriented), hướng dòng (Stream-Oriented), giả dòng, hướng kết nối và phi kết nối, tính tin cậy/đúng trật tự, chu trình đóng kết nối bằng cờ FIN/ACK, cơ chế Broadcast, Multicast (lọc gói tin tại card mạng), và Chất lượng dịch vụ (QoS). Kỹ thuật lập trình Winsock trên C/C++: khởi tạo với WSAStartup(MAKEWORD(2,2), &wsaData), giải phóng WSACleanup(), kiểm tra lỗi qua WSAGetLastError(); cấu trúc địa chỉ sockaddr_in, in_addr; chuyển đổi thứ tự byte giữa Host Byte Order (Little-Endian) và Network Byte Order (Big-Endian) qua các hàm htonl, htons, ntohl, ntohs, inet_addr, inet_ntoa; phân giải tên miền bằng getaddrinfo và freeaddrinfo với cấu trúc struct addrinfo.
  • Kỹ thuật truyền thông TCP và UDP qua Winsock: Xây dựng TCP Server (socket, bind, listen, accept) và TCP Client (connect); gửi/nhận dữ liệu bằng send, recv, WSASend, WSARecv; đóng kênh truyền bằng shutdown(s, SD_BOTH) và closesocket(). Xây dựng UDP Receiver (recvfrom, WSARecvFrom) và UDP Sender (sendto, WSASendTo). Các hàm tiện ích mạng getpeername() và getsockname().
  • Các phương pháp vào/ra (Bài giảng số 6 - 3 tiết): Phân tích chế độ hoạt động đồng bộ (blocking) và bất đồng bộ (non-blocking qua ioctlsocket(s, FIONBIO, &ul) và mã trạng thái WSAEWOULDBLOCK); phân tích 6 mô hình vào/ra trong Winsock: Mô hình Blocking (sử dụng đa luồng), Mô hình select() (sử dụng cấu trúc fd_set, các macro FD_ZERO, FD_SET, FD_CLR, FD_ISSET và struct timeval), Mô hình WSAAsyncSelect (gắn kết socket với thông điệp cửa sổ Windows HWND), Mô hình WSAEventSelect, Mô hình Overlapped I/O, và Mô hình Completion Port (IOCP).
  • Các chủ đề tiếp theo: Lập trình mạng hướng đối tượng với thư viện MFC (CSocket, CAsyncSocket, xử lý sự kiện mạng) và lập trình mạng trên môi trường .NET Framework (Namespace System.Net, System.Net.Sockets, xây dựng ứng dụng TCP/UDP Server/Client bằng C#).

Kiến thức nền tảng được xây dựng

  • Lý thuyết phân tầng mạng: Cơ chế đóng gói (encapsulation) dữ liệu qua các tầng từ Ứng dụng xuống Liên kết, bổ sung header ở mỗi tầng và bóc tách dữ liệu ở phía nhận.
  • Nguyên lý địa chỉ hóa và định tuyến: Phân định phần mạng (Network) và phần máy (Host) trong không gian IPv4; tính toán số lượng host khả dụng ($2^{32-n} - 2$), xác định địa chỉ mạng (host bit = 0) và địa chỉ quảng bá (host bit = 1); nguyên lý chuyển dịch địa chỉ mạng (NAT).
  • Kiến trúc hệ điều hành cho truyền thông: Cơ chế trừu tượng hóa tài nguyên mạng qua đối tượng SOCKET; phân tách giữa không gian người dùng (User Mode với WS2_32.DLL) và không gian nhân (Kernel Mode với AFD.SYS); giao diện TDI (Transport Driver Interface) chuẩn hóa giao tiếp phần cứng.
  • Biểu diễn dữ liệu hệ thống: Cơ chế sắp xếp byte theo kiến trúc bộ vi xử lý (x86 sử dụng Little-Endian) và quy chuẩn truyền thông trên mạng Internet (Big-Endian).

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Sử dụng thành thạo tập hàm Win32 Winsock API trên C/C++; cấu hình tham số mạng cho socket; cấp phát và quản lý bộ đệm truyền nhận (WSABUF); biên dịch và liên kết thư viện mạng (ws2_32.lib, winsock2.h, ws2tcpip.h).
  • Kỹ năng phân tích (Analytical skills): Phân tích cơ chế bắt tay và ngắt kết nối TCP; xử lý các mã lỗi hệ thống (WSAECONNABORTED, WSAECONNRESET, WSAETIMEDOUT, WSAECONNREFUSED); đánh giá hiệu năng giữa truyền thông đồng bộ và bất đồng bộ.
  • Năng lực thực hành (Practical competencies): Triển khai ứng dụng TCP/UDP client-server hoàn chỉnh; lập trình đa luồng (multithreading) kết hợp cơ chế đồng bộ hóa luồng bằng đoạn găng (CRITICAL_SECTION) và sự kiện (HANDLE hEvent, SetEvent, WaitForSingleObject); kiểm soát đa kết nối trên một luồng đơn thông qua kỹ thuật I/O Multiplexing với select().

Phương pháp giảng dạy và học tập

Giáo trình sử dụng phương pháp diễn dịch kỹ thuật kết hợp thực hành thực chứng. Mỗi khái niệm lý thuyết (giao thức, mô hình mạng, cơ chế bắt tay) đều được cụ thể hóa bằng cấu trúc dữ liệu trong mã nguồn, nguyên mẫu hàm hệ thống và chương trình thực thi mẫu.

Bài tập và kịch bản thực hành trong giáo trình

  • Kịch bản TCP Client-Server cơ bản: Xây dựng máy chủ lắng nghe tại cổng 8888 trên giao diện INADDR_ANY, chấp nhận kết nối qua hàm accept(), nhận dữ liệu từ client bằng recv() và hiển thị lên màn hình console; xây dựng máy khách khởi tạo kết nối qua hàm connect() đến địa chỉ IP máy chủ và gửi thông điệp chuỗi "Hello Network Programming".
  • Kịch bản UDP Datagram: Xây dựng ứng dụng nhận dữ liệu không kết nối, liên kết socket với cổng 8888 qua bind(), sử dụng vòng lặp while(1) và hàm recvfrom() để thu thập datagram từ các máy nguồn trong mạng kèm cấu trúc trích xuất thông tin SOCKADDR_IN; xây dựng ứng dụng gửi datagram bằng hàm sendto() tới địa chỉ IP đích.
  • Kịch bản đồng bộ hóa đa luồng cho Blocking Socket: Thiết kế chương trình phân tách việc nhận và xử lý dữ liệu thành hai luồng riêng biệt (ReadThread và ProcessThread). Luồng ReadThread lặp để đọc đủ kích thước NUM_BYTES_REQUIRED vào bộ đệm buff[MAX_BUFFER_SIZE] trong đoạn găng CRITICAL_SECTION data, sau đó kích hoạt sự kiện hEvent để luồng ProcessThread (WaitForSingleObject) giải phóng dữ liệu và tính toán.
  • Kịch bản I/O Multiplexing với hàm select(): Khởi tạo tập fd_set bằng FD_ZERO, đưa socket vào tập bằng FD_SET, kiểm tra trạng thái sẵn sàng của socket mà không bị chặn luồng xử lý chính.

Phương pháp đánh giá và tự học

  • Đánh giá năng lực: Dựa trên khả năng hiện thực hóa các kịch bản mạng, độ chính xác trong việc xử lý thứ tự byte, giải phóng tài nguyên (shutdown, closesocket, WSACleanup, freeaddrinfo) và kiểm soát lỗi runtime.
  • Hướng dẫn tự học: Người học cần chuẩn bị môi trường Microsoft Windows (Windows XP trở lên), sử dụng bộ công cụ Visual Studio C++, đối chiếu các định nghĩa hàm trên hệ thống tài liệu trực tuyến MSDN (Microsoft Developer Network) và phân tích các chuẩn RFC (RFC 791, RFC 760).

Điểm nổi bật và cập nhật

  • Cập nhật chuẩn Winsock 2: Phân tích sự chuyển dịch từ Winsock 1.1 (phân phối trên Windows 95) lên Winsock 2 (tích hợp từ Windows 2000, XP, Vista, Windows 7). Giáo trình cập nhật các hàm I/O mở rộng có tiền tố WSA như WSASend, WSARecv, WSASendTo, WSARecvFrom hỗ trợ cờ điều khiển mở rộng (MSG_PARTIAL, MSG_PEEK, MSG_OOB) và cơ chế vào/ra bất đồng bộ.
  • Chuẩn hóa phân giải tên miền: Thay thế các hàm cũ chỉ hỗ trợ IPv4 như gethostbyname() bằng các hàm tiêu chuẩn getaddrinfo() và getnameinfo() (khai báo trong ws2tcpip.h và wspiapi.h), hỗ trợ giải quyết địa chỉ độc lập với giao thức, tương thích cho cả IPv4 (AF_INET) và IPv6 (AF_INET6, AF_UNSPEC).
  • Kiến trúc hệ thống hướng module: Mô tả chi tiết mô hình phân lớp của Microsoft, giải phóng ứng dụng khỏi phần cứng cụ thể thông qua chuẩn TDI (Transport Driver Interface), cho phép các nhà sản xuất phần cứng viết trình điều khiển tương thích trực tiếp với ngăn xếp mạng của hệ điều hành.
  • Ứng dụng thực tế theo phân loại giao thức: Phân định rõ phạm vi ứng dụng thực tế: giao thức hướng kết nối TCP được sử dụng cho các dịch vụ đòi hỏi tính toàn vẹn (Web cổng 80, FTP cổng 21, SMTP cổng 25, POP3 cổng 110, IMAP cổng 143); giao thức không kết nối UDP được áp dụng cho các ứng dụng thời gian thực chấp nhận sai sót như phân giải tên miền (DNS cổng 53), truyền phát đa phương tiện (RTSP, MMS), và truyền thoại/video.

Đối tượng sử dụng giáo trình

  • Sinh viên chuyên ngành: Sinh viên năm thứ 3 và năm thứ 4 chuyên ngành Công nghệ thông tin, Kỹ thuật máy tính, Mạng máy tính và Truyền thông dữ liệu tại các trường đại học kỹ thuật.
  • Điều kiện tiên quyết:
    • Kỹ năng lập trình ngôn ngữ C/C++ (thao tác con trỏ, quản lý bộ đệm, ép kiểu cấu trúc, macro hệ thống).
    • Kiến thức nền tảng về Hệ điều hành (tiến trình, luồng, đoạn găng CRITICAL_SECTION, cơ chế tín hiệu Event).
    • Kiến thức cơ sở về Mạng máy tính (mô hình mạng, giao thức mạng, cổng dịch vụ).
  • Giảng viên: Sử dụng làm đề cương chi tiết và tài liệu giảng dạy học phần Lập trình mạng. Cấu trúc bài giảng chia theo đơn vị 3 tiết/buổi thuận tiện cho việc phân bổ thời lượng lý thuyết trên lớp và bài tập thực hành trong phòng lab.
  • Kỹ sư và người tự học: Lập trình viên hệ thống, kỹ sư phát triển phần mềm desktop/hệ thống trên nền tảng Windows cần tài liệu tham khảo chi tiết về Win32 Socket API và các mô hình xử lý vào/ra mạng hiệu năng cao.

Câu hỏi thường gặp

1. Giáo trình này phù hợp với ai?

Tài liệu phù hợp với sinh viên đại học ngành Công nghệ thông tin, Kỹ thuật máy tính và các kỹ sư phần mềm cần nghiên cứu sâu về lập trình truyền thông mạng từ mức giao tiếp hệ điều hành (Winsock API C/C++) đến các thư viện lớp mạng bậc cao (MFC, C# .NET).

2. Cần kiến thức nền nào để học?

Người học cần có kiến thức lập trình C/C++ vững chắc, hiểu biết về nguyên lý hệ điều hành (quản lý đa luồng, cơ chế đồng bộ hóa luồng) và các khái niệm cơ bản của bộ giao thức mạng TCP/IP.

3. Điểm khác biệt của giáo trình so với các tài liệu lập trình mạng khác?

Giáo trình phân tích trực diện cấu trúc bên dưới của hệ điều hành Windows (kiến trúc tầng của Winsock từ WS2_32.DLL đến kernel driver AFD.SYS), trình bày chi tiết 6 mô hình vào/ra (Blocking, Select, WSAAsyncSelect, WSAEventSelect, Overlapped I/O, IOCP) và cung cấp mã nguồn C/C++ nguyên bản, không phụ thuộc hoàn toàn vào các thư viện bọc trừu tượng cấp cao.

4. Làm sao để tự học giáo trình hiệu quả?

Người học nên cài đặt môi trường Microsoft Visual Studio trên hệ điều hành Windows, tự gõ và biên dịch từng đoạn mã nguồn mẫu trong bài giảng, cấu hình liên kết thư viện ws2_32.lib, thực hành gỡ lỗi mạng bằng hàm WSAGetLastError(), và đọc kèm tài liệu tra cứu MSDN cho từng API.

5. Có tài liệu bổ trợ nào kèm theo?

Tài liệu học tập đi kèm bao gồm: hệ thống tài liệu trực tuyến Microsoft Developer Network (MSDN Library), các tệp tiêu đề của Windows SDK (winsock2.h, ws2tcpip.h, wspiapi.h), và các văn bản đặc tả tiêu chuẩn của IETF như RFC 791 (IPv4) và RFC 760.


Kết luận

Bài giảng Lập trình mạng của tác giả Lương Ánh Hoàng (ĐHBK Hà Nội) cung cấp hệ thống kiến thức chuẩn xác, có tính hệ thống cao về lập trình truyền thông trên nền tảng hệ điều hành Windows. Nội dung tài liệu kết nối chặt chẽ giữa lý thuyết giao thức mạng chuẩn quốc tế và kỹ thuật lập trình Socket API thực tế.

Lộ trình tiếp cận kiến thức đề xuất:

  1. Nắm vững mô hình phân tầng TCP/IP, cấu trúc địa chỉ IPv4 và header TCP/UDP (Chương 1, 2).
  2. Làm chủ các thao tác Winsock API cơ bản trên C/C++ cho TCP/UDP Client-Server (Chương 3).
  3. Làm chủ các mô hình vào/ra nâng cao và cơ chế xử lý bất đồng bộ (Chương 4).
  4. Mở rộng sang các thư viện lớp mạng hướng đối tượng MFC Socket và .NET System.Net (Chương 5, 6).

Nguồn tài nguyên bổ trợ khuyến nghị sử dụng song song gồm thư viện MSDN Library và các chuẩn RFC của tổ chức IETF.