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

Giáo trình tập trung vào lĩnh vực Mô phỏng mạng máy tính với công cụ mô phỏng hướng sự kiện rời rạc NS2 (Network Simulator 2). Trong chương trình đào tạo bậc Đại học và Cao học thuộc các ngành Khoa học Máy tính, Kỹ thuật Mạng truyền thông và Công nghệ Thông tin, tài liệu đóng vai trò là học liệu chuyên sâu cho các học phần Mô phỏng mạng, Giao thức mạng nâng cao và Thiết kế hệ thống mạng.

Mục tiêu học tập (Learning Outcomes)

  • Về mặt kiến trúc: Phân tích và giải thích được cấu trúc hai tầng (Dual-language architecture) kết hợp giữa C++ (tối ưu hóa hiệu năng xử lý sự kiện cấp thấp) và OTcl (linh hoạt trong lập cấu hình kịch bản mô phỏng).
  • Về mặt mô hình hóa liên kết và hàng đợi: Làm chủ cơ chế hoạt động của lớp SimpleLink, lớp trễ đường truyền LinkDelay, lớp điều khiển hàng đợi Queue, PacketQueue, QueueHandler và chính sách loại bỏ gói tin DropTail.
  • Về mặt cấu trúc dữ liệu gói tin: Nắm vững cấu trúc hai mức của tiêu đề gói tin (Packet Header), cơ chế quản lý bộ nhớ thông qua danh sách gói tin tự do (free_ list), kỹ thuật truy cập trường dữ liệu thông qua độ dịch vị trí (offset_) và lớp quản lý PacketHeaderManager.
  • Về mặt giao thức tầng giao vận: Nắm vững nguyên lý và cơ chế triển khai tác tử (Agent) đối với giao thức không hướng kết nối UDP (Agent/UDP, Agent/Null) và giao thức hướng kết nối tin cậy TCP (quản lý kết nối, điều khiển lỗi theo thuật toán Jacobson/Allman và điều khiển tắc nghẽn dựa trên cửa sổ trượt).
  • Về mặt tùy biến hệ thống: Xây dựng và tích hợp được tiêu đề giao thức mới (PacketHeader), tải trọng dữ liệu mới (AppData, PacketData) và cấu hình luồng dữ liệu tùy chỉnh vào mã nguồn NS2.

Cấu trúc và cách tiếp cận

Giáo trình tiếp cận theo hướng từ dưới lên (Bottom-Up), kết hợp giữa lý thuyết mạng máy tính chuẩn và phân tích trực tiếp mã nguồn thực thi:

  • Đi từ các đối tượng trừu tượng nền tảng (NsObject, Connector, Event, Scheduler).
  • Khảo sát các thành phần cấu trúc mạng trung gian (Nút, Bộ phân loại Classifier, Kênh truyền SimpleLink, Hàng đợi Queue).
  • Giải phẫu cấu trúc gói tin và bộ nhớ (Packet, hdr_cmn, hdr_ip, PacketHeaderManager).
  • Hiện thực hóa các giao thức tầng giao vận (UDP, TCP) và tầng mạng (Agent, Routing).

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

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

1. Quản lý vùng đệm và đường liên kết với SimpleLink (Chương 7)

  • Khái niệm và vai trò của SimpleLink: SimpleLink là lớp dẫn xuất từ Link trong OTcl, dùng để kết nối hai nút mạng (Node). Đối tượng mô hình hóa ba thông số chính: thời gian truyền gói tin (Transmission time = $\text{kích thước gói} / \text{băng thông}$), thời gian trễ lan truyền (Propagation delay) và bộ đệm gói tin. Khác với kiến trúc router thực tế (hàng đợi tích hợp tại nút), NS2 tích hợp hàng đợi bên trong đối tượng kênh truyền (SimpleLink).
  • Các thành phần của SimpleLink:
    • head_: Điểm truy cập của liên kết.
    • queue_: Đối tượng của lớp Queue, mô hình hóa bộ đệm gói tin.
    • link_: Đối tượng của lớp DelayLink, mô hình hóa thời gian truyền và trễ kênh truyền.
    • ttl_: Đối tượng của lớp TTLChecker (thuộc file ns/common/ttl.cc), thực hiện giảm giá trị TTL và hủy gói nếu $TTL \le 0$.
    • drophead_: Điểm hủy gói tin, kết nối với tác tử rỗng của đối tượng Simulator.
    • Các đối tượng lưu vết: enqT_ (vào hàng đợi), deqT_ (ra khỏi hàng đợi), drpT_ (hủy tại hàng đợi), rcvT_ (nhận tại nút tiếp theo) được chèn vào khi biến $traceAllFile_ được khai báo.
  • Thủ tục khởi tạo và cấu hình trong OTcl:
    • Simulator::simplex-link và Simulator::duplex-link (trong file ~ns/tcl/lib/ns-lib.tcl) với các tham số: $node1, $node2, <bandwidth>, <delay>, <queue_type>.
    • Mảng liên kết lưu trữ: link_($sid:$did) với $sid là định danh nút nguồn và $did là định danh nút đích.
  • Cơ chế truyền gói tin qua lớp LinkDelay trong C++:
    • Lập lịch sự kiện gói tin rời nút truyền: Sử dụng biến sự kiện giả intr_ và hàm schedule(h, &intr_, txt) sau thời gian txt.
    • Lập lịch sự kiện gói tin đến nút nhận: Sử dụng con trỏ Handler thực tế với thời gian trễ txt + delay_, kích hoạt target_->recv(p).
  • Cơ chế khóa hàng đợi và gọi ngược (Callback Mechanism):
    • Trạng thái hàng đợi: blocked_ = 1 (đang truyền gói tin, khóa việc truyền gói tiếp theo) và blocked_ = 0 (mở khóa).
    • Lớp QueueHandler: Dẫn xuất từ Handler, kết nối hai chiều với Queue qua biến tham chiếu qh_ và queue_.
    • Khi LinkDelay hoàn thành truyền gói, bộ lập lịch gọi QueueHandler::handle(e), từ đó thực thi Queue::resume() để lấy gói tin kế tiếp từ PacketQueue và mở khóa hàng đợi nếu bộ đệm rỗng.
  • Lớp DropTail: Lớp con của Queue (ánh xạ sang Queue/DropTail trong OTcl), sử dụng con trỏ q_ trỏ tới PacketQueue. Hỗ trợ chính sách hủy gói ở cuối hàng đợi hoặc hủy ở đầu hàng đợi thông qua cờ drop_front_ = 1.

2. Cấu trúc gói tin, tiêu đề và định dạng gói tin (Chương 8)

  • Kiến trúc mô hình gói tin: NS2 trích xuất các thuộc tính cần xử lý từ dữ liệu người dùng và đưa lên phần tiêu đề (Packet Header), ví dụ kích thước gói được lưu trong trường hdr_cmn::size_.
  • Cấu trúc lớp Packet trong C++:
    • Dẫn xuất từ lớp Event.
    • Biến thành viên: bits_ (chuỗi byte chứa toàn bộ header), data_ (con trỏ trỏ tới đối tượng AppData), fflag_ (cờ trạng thái sử dụng), ref_count_ (số lượng tham chiếu), next_ (con trỏ liên kết danh sách), hdrlen_ (kích thước header).
    • Các hàm thành viên chính: alloc(), alloc(n), allocdata(n), free(p), copy(), refcopy(), access(off).
  • Cơ chế quản lý bộ nhớ gói tin (Free Packet List):
    • NS2 không giải phóng đối tượng Packet về hệ điều hành khi hủy mà duy trì danh sách liên kết gói tin tự do thông qua con trỏ tĩnh free_.
    • Hàm alloc(): Ưu tiên lấy đối tượng sẵn có từ đầu danh sách free_, thiết lập fflag_ = true, đặt lại uid_ = 0, time_ = 0 và gọi init(p) để xóa vùng nhớ bits_. Chỉ gọi toán tử new khi danh sách free_ rỗng.
    • Hàm free(p): Kiểm tra điều kiện an toàn (fflag_ == 1, định danh sự kiện âm để đảm bảo gói không nằm trên dòng thời gian mô phỏng, ref_count_ == 0), giải phóng bộ nhớ data_, đưa gói vào đầu danh sách free_ và đặt fflag_ = false.
  • Kiến trúc tiêu đề hai mức và cơ chế truy cập:
    • Mức 1: Các tiêu đề theo giao thức (Protocol Specific Headers) được xếp liên tục trong chuỗi bits_, xác định vị trí bằng biến độ dịch offset_.
    • Mức 2: Biểu diễn nội tại của từng header bằng kiểu dữ liệu cấu trúc struct trong C++.
    • Cấu trúc hdr_cmn (Common Header): Lưu size_, uid_, dir_, ptype_, offset_. Cung cấp hàm truy cập tĩnh hdr_cmn::access(p).
    • Cấu trúc hdr_ip (IP Header): Lưu src_ (addr, port), dst_ (addr, port), ttl_, fid_, prio_, offset_.
    • Kiểu gói tin: Biến ptype_ thuộc kiểu liệt kê enum packet_t (mặc định định nghĩa sẵn 60 loại gói tin, từ PT_TCP, PT_UDP đến PT_NTYPE = 59), được ánh xạ sang chuỗi mô tả qua lớp p_info và đối tượng toàn cục packet_info.
  • Bộ ba lớp của Header theo giao thức:
    1. Lớp C++ (struct hdr_<xxx>): Khai báo cấu trúc thuộc tính và hàm access(p).
    2. Lớp OTcl (PacketHeader/<XXX>): Cung cấp giao tiếp cấu hình trong kịch bản.
    3. Lớp ánh xạ (<XXX>HeaderClass): Dẫn xuất từ PacketHeaderClass / TclClass, đăng ký kích thước hdrlen_ qua sizeof() và liên kết địa chỉ biến offset_ bằng hàm bind_offset().
  • Tiến trình 3 bước khởi tạo Header gói tin:
    • Bước 1 (Thời điểm biên dịch): Khởi tạo biến ánh xạ tĩnh, gọi hàm bind(), đọc file ~ns/tcl/lib/ns-packet.tcl để nạp danh sách giao thức hoạt động vào mảng tab_.
    • Bước 2 (Pha cấu hình mạng): Hàm Simulator::create_packetformat{} khởi tạo đối tượng PacketHeaderManager, duyệt danh sách tab_, thực thi thủ tục allochdr{} để tính toán kích thước tổng và thiết lập giá trị offset_ cho từng header.
    • Bước 3 (Pha mô phỏng): Tác tử (Agent) gọi allocpkt(), cấp phát bộ nhớ và gán giá trị mặc định qua hàm initpkt(p).
  • Tải trọng dữ liệu (Data Payload):
    • Lớp trừu tượng AppData (quản lý kiểu ứng dụng type_ thuộc enum AppDataType, hàm ảo copy() và size()).
    • Lớp PacketData kế thừa từ AppData (quản lý chuỗi data_ và độ dài datalen_). Thao tác dữ liệu qua các hàm accessdata(), userdata(), setdata(), datalen().
  • Kỹ thuật tùy biến gói tin: Quy trình 4 bước tạo header mới (hdr_myhdr), tích hợp vào enum packet_t, đăng ký lớp ánh xạ MyHeaderClass, kích hoạt hoặc vô hiệu hóa thông qua các thủ tục OTcl: add-packet-header, remove-packet-header, remove-all-packet-header để tối ưu dung lượng bộ nhớ (giảm kích thước header mặc định từ 1.9 kB xuống mức chỉ cần thiết, ví dụ 0.1 kB cho common + IP + TCP).

3. Tác tử tầng Giao vận: Tổng quan và triển khai UDP/TCP (Chương 9 & 10)

  • Kiến trúc hệ thống truyền thông: Ứng dụng $\rightarrow$ Tác tử tầng Giao vận (Transport Agent) $\rightarrow$ Mạng cấp thấp (Nút, Kênh truyền, Bộ phân loại, Phân kênh dmux_).
  • Giao thức UDP: Giao thức không hướng kết nối, không đảm bảo độ tin cậy, thực hiện dồn kênh/phân kênh dựa trên số hiệu cổng nguồn (src_.port) và cổng đích (dst_.port), truyền trực tiếp dữ liệu xuống tầng Mạng.
  • Giao thức TCP: Giao thức hướng kết nối và truyền tin cậy với 3 pha hoạt động:
    1. Thiết lập kết nối: Bắt tay 3 bước (SYN $\rightarrow$ SYN-ACK $\rightarrow$ ACK).
    2. Truyền dữ liệu: Điều khiển lỗi và điều khiển tắc nghẽn.
    3. Hủy bỏ kết nối: Bắt tay 4 bước (FIN $\rightarrow$ FIN-ACK song song).
  • Cơ chế điều khiển lỗi trong TCP:
    • Sử dụng cơ chế báo nhận tích lũy (Cumulative ACK) và ngưỡng thời gian chờ truyền lại (Retransmission Timeout - RTO).
    • Khi xảy ra mất gói, bên nhận gửi các gói báo nhận đúp (Duplicate ACKs). Hết thời gian RTO, bên gửi truyền lại gói tin bị mất.
    • Thuật toán Jacobson/Allman tính toán RTO động dựa trên mẫu RTT ($t(k)$): $$\bar{t}(k + 1) = \alpha \cdot \bar{t}(k) + (1 - \alpha) \cdot t(k + 1) \quad (\text{với } \alpha = 7/8)$$ $$\sigma_t(k + 1) = \beta \cdot \sigma_t(k) + (1 - \beta) \cdot |t(k + 1) - \bar{t}(k + 1)| \quad (\text{với } \beta = 3/4)$$
    • Giá trị RTO được xác định trong khoảng chặn $[lb, ub]$ kết hợp với hệ số lùi nhị phân (Binary Exponential Backoff - BEB $\gamma$, nhân đôi khi timeout và đặt lại về 1 khi nhận ACK mới).
  • Cơ chế điều khiển tắc nghẽn: Dựa trên kỹ thuật cửa sổ trượt (Sliding Window), giới hạn số lượng gói tin được phép gửi liên tục mà không cần chờ ACK thông qua kích thước cửa sổ tắc nghẽn (cwnd).

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

Phương pháp tiếp cận sư phạm

Giáo trình kết hợp chặt chẽ giữa lý thuyết giao thức mạng chuẩn quốc tế (IETF RFCs) và phương pháp phân tích kiến trúc phần mềm hướng đối tượng. Người học không chỉ cấu hình kịch bản mạng ở mức bề mặt mà phải phân tích trực tiếp cách các đối tượng C++ tương tác với cây thông dịch OTcl thông qua cơ chế TclClass và TclObject.

Bài tập thực hành và tình huống nghiên cứu (Case Studies)

  • Mô hình mạng 2 nút (Two-Node Network Topology):
    • Thiết lập kịch bản kết nối giữa nút n1 và n2 qua kênh simplex-link với băng thông <bw>, độ trễ <delay> và hàng đợi DropTail.
    • Gắn tác tử nguồn Agent/UDP vào n1 và tác tử đích Agent/Null vào n2.
    • Theo dõi toàn bộ chu trình chuyển tiếp gói tin: Agent/UDP $\rightarrow$ Điểm truy cập nút n1 $\rightarrow$ Bộ phân loại classifier_ (DestHashClassifier) $\rightarrow$ SimpleLink $\rightarrow$ Queue $\rightarrow$ LinkDelay $\rightarrow$ TTLChecker $\rightarrow$ Điểm truy cập nút n2 $\rightarrow$ Bộ phân kênh dmux_ $\rightarrow$ Tác tử Agent/Null.
  • Tùy biến và lập trình mở rộng:
    • Bài tập tạo một tiêu đề giao thức mới (hdr_myhdr) trong C++, ánh xạ sang OTcl và đo đạc sự thay đổi kích thước bộ nhớ của đối tượng Packet.
    • Bài tập can thiệp hàm allocpkt() trong file ~ns/common/agent.cc để in vết loại gói tin (packet_info.name(pt)) trong quá trình thực thi mô phỏng.

Phương pháp đánh giá

  • Đánh giá quá trình: Các bài thực hành kiểm tra khả năng lập trình kịch bản Tcl, cấu hình thông số mạng và trích xuất dữ liệu từ các đối tượng lưu vết (enqT_, deqT_, drpT_, rcvT_).
  • Đánh giá chuyên sâu: Đồ án môn học yêu cầu chỉnh sửa hoặc viết mới một module hàng đợi (kế thừa từ Queue) hoặc một tác tử giao vận (kế thừa từ Agent), biên dịch lại mã nguồn C++ của NS2 và đánh giá hiệu năng thông lượng, độ trễ và tỷ lệ mất gói.

Điểm nổi bật và đặc tính kỹ thuật

Thành phần kỹ thuật Cơ chế triển khai trong NS2 Ý nghĩa và hiệu năng
Kiến trúc Hàng đợi Hàng đợi (Queue) được tích hợp trong kênh truyền (SimpleLink), không nằm tại Node. Giảm thiểu độ phức tạp trong mô hình hóa hàng đợi tại nút, tập trung kiểm soát trễ và mất gói trên liên kết.
Quản lý bộ nhớ gói tin Sử dụng danh sách gói tin tự do tĩnh (Packet::free_) và tái sử dụng qua alloc() / free(). Tránh cấp phát/giải phóng bộ nhớ liên tục qua new/delete từ hệ điều hành, tối ưu hóa tốc độ thực thi mô phỏng.
Tổ chức Tiêu đề gói Kiến trúc hai mức (Mức 1: dịch chuyển offset; Mức 2: struct C++). Gom dữ liệu vào hdr_cmn::size_. Không cần phân tích khung dữ liệu thực tế tại thời gian chạy, tiết kiệm không gian bộ nhớ khi xử lý hàng triệu gói tin.
Cấu hình Header động Thủ tục add-packet-header và remove-packet-header trong OTcl. Cho phép giảm kích thước vùng nhớ header của mỗi gói tin từ mức mặc định 1.9 kB xuống 0.1 kB tùy thuộc vào số lượng giao thức thực tế.
Thuật toán TCP chuẩn Ước lượng RTT/RTO động theo công thức Jacobson/Allman kết hợp hệ số BEB. Phản ánh chính xác động thái thích ứng của giao thức TCP thực tế trong môi trường mạng biến động trễ.

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

  • Sinh viên bậc Đại học (Năm 3, Năm 4): Thuộc các ngành Kỹ thuật Mạng, Khoa học Máy tính, Hệ thống Thông tin, Kỹ thuật Viễn thông. Cần trang bị kiến thức để hoàn thành đồ án môn học, khóa luận tốt nghiệp liên quan đến đánh giá hiệu năng mạng.
  • Học viên Cao học và Nghiên cứu sinh: Sử dụng làm tài liệu tham khảo kỹ thuật để xây dựng môi trường kiểm thử cho các đề tài nghiên cứu về giao thức định tuyến mới, cơ chế điều khiển tắc nghẽn hoặc chính sách quản lý hàng đợi chủ động (Active Queue Management - AQM).
  • Yêu cầu kiến thức tiên quyết (Prerequisites):
    • Ngôn ngữ lập trình C++ nâng cao: Hiểu rõ cơ chế con trỏ, ép kiểu con trỏ (unsigned char* sang struct pointer), nạp chồng hàm, hàm ảo nguyên thủy và đa kế thừa.
    • Ngôn ngữ kịch bản Tcl/OTcl cơ bản: Cú pháp biến, mảng liên kết, lệnh điều kiện, vòng lặp và hướng đối tượng trong OTcl (instproc, instvar).
    • Kiến thức nền tảng về Mạng máy tính: Mô hình OSI 7 tầng, kiến trúc TCP/IP, nguyên lý chuyển mạch gói, địa chỉ hóa và phân cổng.
  • Giảng viên chuyên ngành: Sử dụng cấu trúc chương hồi và các đoạn mã mẫu (Program 7.1 đến Program 8.20) để thiết kế bài giảng lý thuyết và giáo án thực hành phòng Lab.

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

1. Giáo trình này phù hợp nhất với những môn học nào trong chương trình đào tạo?

Giáo trình được thiết kế trực tiếp cho các môn học: Mô phỏng mạng máy tính, Giao thức mạng, Hệ thống phân tán và Chuyên đề mạng truyền thông nâng cao ở bậc đại học và sau đại học.

2. Cần chuẩn bị những công cụ và môi trường nào để thực hành theo giáo trình?

Người học cần môi trường hệ điều hành Linux (Ubuntu/Debian hoặc tương đương) đã cài đặt trình mô phỏng NS2 (bao gồm ns, bộ hiển thị đồ họa mạng nam, thư viện tclcl, otcl và trình biên dịch gcc/g++).

3. Điểm khác biệt lớn nhất giữa mô hình gói tin trong NS2 và gói tin mạng thực tế là gì?

Trong mạng thực tế, dữ liệu người dùng được mã hóa thành các chuỗi bit đặt trong khung tải trọng (Data Payload). Trong NS2, nhằm tối ưu hiệu năng mô phỏng, dữ liệu tải trọng hiếm khi được tạo ra dưới dạng bit; thay vào đó, các thông số kích thước gói tin được lưu trực tiếp vào trường hdr_cmn::size_ của tiêu đề gói để tính toán thời gian truyền ($txt = size_ / bandwidth$).

4. Tại sao NS2 không giải phóng hoàn toàn đối tượng Packet khi một gói tin kết thúc hành trình?

NS2 áp dụng cơ chế quản lý bộ nhớ thông qua con trỏ tĩnh Packet::free_ nhằm tái sử dụng các đối tượng Packet đã cấp phát. Việc này giúp loại bỏ chi phí hệ thống (system overhead) do việc cấp phát (malloc/new) và thu hồi (free/delete) bộ nhớ liên tục đối với hàng triệu sự kiện gói tin trong một phiên mô phỏng.

5. Có thể tìm thấy mã nguồn chi tiết của các lớp được đề cập trong giáo trình ở đâu?

Mã nguồn nằm trực tiếp trong cấu trúc thư mục của gói cài đặt NS2:

  • Lớp TTLChecker: file ~ns/common/ttl.cc.
  • Lớp Agent và hàm allocpkt(): file ~ns/common/agent.cc.
  • Cấu hình kịch bản và khởi tạo liên kết: file ~ns/tcl/lib/ns-lib.tcl.
  • Quản lý danh sách tiêu đề gói tin: file ~ns/tcl/lib/ns-packet.tcl.

Kết luận

Giáo trình cung cấp một hệ thống kiến thức hoàn chỉnh về kiến trúc nội tại của công cụ mô phỏng mạng NS2, tập trung vào việc mô hình hóa kênh truyền (SimpleLink), cơ chế điều khiển hàng đợi (Queue), cấu trúc dữ liệu gói tin (Packet) và các giao thức tầng giao vận (UDP, TCP). Bằng cách giải phẫu chi tiết cơ chế ánh xạ giữa C++ và OTcl, tài liệu cung cấp nền tảng kỹ thuật vững chắc giúp sinh viên, học viên cao học và nhà nghiên cứu không chỉ làm chủ công cụ mô phỏng mà còn có khả năng tự phát triển, tùy biến và hiện thực hóa các giao thức mạng mới trên nền tảng phần mềm mã nguồn mở.