Tài liệu học tập kỹ thuật mô phỏng - Trường Đại học kinh tế - Kỹ thuật công nghiệp

pdf 233 trang Gia Huy 17/05/2022 1750
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu học tập kỹ thuật mô phỏng - Trường Đại học kinh tế - Kỹ thuật công nghiệp", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftai_lieu_hoc_tap_ky_thuat_mo_phong_truong_dai_hoc_kinh_te_ky.pdf

Nội dung text: Tài liệu học tập kỹ thuật mô phỏng - Trường Đại học kinh tế - Kỹ thuật công nghiệp

  1. BỘ CÔNG THƢƠNG TRƢỜNG ĐẠI HỌC KINH TẾ - KỸ THUẬT CÔNG NGHIỆP KHOA CÔNG NGHỆ THÔNG TIN TÀI LIỆU HỌC TẬP KỸ THUẬT MÔ PHỎNG Đối tƣợng: HSSV trình độ Đại học, Cao đẳng Ngành đào tạo: Dùng chung cho Khối ngành Công nghệ Lƣu hành nội bộ
  2. M C L C DANH M C VIẾT TẮT 5 LỜI NÓI ĐẦU 7 CHƢƠNG 1. MÔ PHỎNG MẠNG MÁY TÍNH 9 1.1. Mạng máy tính và kiến trúc phân tầng. 9 1.1.1. Khái niệm phân tầng 9 1.1.2. Mô hình tham chiếu OSI và TCP/IP 11 1.2. Mô hình hệ thống 13 1.2.1. Tiếp cận theo phƣơng pháp phân tích 13 1.2.2. Tiếp cận theo phƣơng pháp mô phỏng 13 1.3. Khái niệm cơ bản về mô phỏng mạng máy tính 14 1.3.1. Định nghĩa chuẩn về mô phỏng 14 1.3.2. Các thành phần của mô phỏng 15 1.4. Mô phỏng phụ thuộc thời gian 16 1.4.1. Mô phỏng hƣớng thời gian 16 1.4.2. Mô phỏng hƣớng sự kiện 17 1.5. Ví dụ về mô phỏng mạng máy tính 19 CHƢƠNG 2. GIỚI THIỆU VỀ NS2 26 2.1. Giới thiệu 26 2.2. Kiến trúc cơ bản 27 2.3. Cài đặt 28 2.3.1. Cài đặt NS2 bằng bộ cài tích hợp trên các hệ thống nền Unix 28 2.3.2. Cài đặt NS2 bằng bộ cài tích hợp trên các hệ thống nền Windows 29 2.4. Thƣ mục và quy ƣớc 29 2.4.1. Thƣ mục 29 2.4.2. Các quy ƣớc 30 2.5. Chạy mô phỏng NS2 32 2.6. Các thành phần C++ trong NS2 và Công cụ Make 39 CHƢƠNG 3. LIÊN KÉT GIỮA OTCL VÀ C++ TRONG NS2 43 3.1. Khái niệm hai ngôn ngữ trong NS2 44 3.2. Tạo và huỷ một đối tƣợng ánh xạ TclObject 55 3.3. Liên kết các biến trong cây thông dịch và cây biên dịch 58 3.4. Các lệnh OTcl 60 3.5. Tạo đối tƣợng TclObject 66 3.6. Gọi lệnh TclCommand 67 - 1 -
  3. 3.7. Lớp EmbeddeđTcl 70 CHƢƠNG 4. MÔ PHỎNG ĐIỀU KHIỂN SỰ KIỆN TRONG NS2 72 4.1. Phân biệt Event-Driven và Time-Driven 72 4.1.1. Mô phỏng hƣớng thời gian 73 4.1.2. Bƣớc nhảy thời gian trong mô phỏng hƣớng thời gian 73 4.1.3. Mô phỏng hƣớng sự kiện 74 4.2. Khái niệm mô phỏng NS2 75 4.3. Events và Handlers 75 4.3.1. Tổng quan về sự kiện và thẻ quản lý 75 4.3.2. Lớp NsObject 76 4.3.3. Lớp Packet và lớp AtEvent 77 4.4. Bộ lập lịch 78 4.4.1. Các thành phần chính của bộ lập lịch 79 4.4.2. Đóng gói dữ liệu và khái niệm đa hình 79 4.4.3. Các hàm chính của bộ lập lịch 80 4.4.4. Tính động của ID định danh sự kiện 81 4.4.5. Cơ chế Lập lịch-Thực thi (Scheduling-Dispatching) 82 4.4.6. Lập lịch cho sự kiện rỗng và sự kiện giả 83 CHƢƠNG 5. CÁC THÀNH PHẦN CHÍNH TRONG NS2 89 5.1. Các thành phần chính trong NS2 89 5.2. Cây phân lớp C++ 90 5.3. Phân lớp NSObjects 91 5.3.1.Lớp NsObject .91 5.3.2. Cơ chế chuyển tiếp gói tin của NsObject 92 5.4. Phân lớp Connector 92 5.4.1. Khai báo của lớp Connector 93 5.4.2. Lệnh cấu hình của lớp Connector trong OTcl 94 5.5. Cơ chế chuyển tiếp gói tin 96 CHƢƠNG 6. CÁC NÚT NHƢ ROUTERS VÀ COMPUTER HOSTS 99 6.1. Tổng quan về các nút trong NS2 99 6.1.1. Các thủ tục instproc của lớp Node 100 6.1.2. Nút mặc định và Giao tiếp cấu hình nút 102 6.2. Cơ chế định tuyến trong NS2 102 6.3. Tuyến đƣờng logic 104 6.4. Phân lớp Classifier 105 6.5. Định tuyến 114 - 2 -
  4. 6.5.1. Tổng quan về module định tuyến 114 6.5.2. Lớp RoutingModule trong C++ 117 6.5.3. Lớp RtModule trong OTcl 119 6.5.4. Lớp BaseRoutingModule và RtModule/Base 120 6.6. Cấu hình các đối tƣợng Node 120 6.7. Khởi tạo nút 123 6.8. Cấu hình đƣờng 127 CHƢƠNG 7. QUẢN LÝ VÙNG ĐỆM VÀ ĐƢỜNG LIÊN KẾT 131 7.1. Giới thiệu về đối tƣợng SimpleLink 131 7.1.1. Các thủ tục instproc để cấu hình đối tƣợng SimpleLink 132 7.1.2. Khởi tạo của Lớp SimpleLink 133 7.2. Mô hình truyền gói tin 134 7.3. Quản lý vùng đệm 136 7.4. Một ví dụ mạng Two-Node 143 CHƢƠNG 8. PACKETS, PACKETS HEADERS, VÀ HEADERS FORMAT 145 8.1. Tổng quan về nguyên tắc tạo gói tin 145 8.2. Sắp xếp và phân bổ gói tin 150 8.2.1. Cấp phát gói tin 150 8.2.2. Thu hồi gói tin 153 8.3. Tiêu đề gói tin 155 8.3.1. Truy cập header gói tin ở Mức 1 156 8.3.2. Header gói tin thông dụng 157 8.3.3. Header gói IP 157 8.3.4. Loại gói tin 158 8.3.5. Header theo giao thức 161 8.4. Tải trọng dữ liệu 171 8.4.1. Tùy biến gói tin 174 8.4.2. Tự tạo các gói tin 174 CHƢƠNG 9. TỔNG QUAN VÀ TRIỂN KHAI UDP 178 9.1. Khái niệm cơ bản về UDP và TCP 178 9.1.1. Cơ bản về giao thức UDP 178 9.1.2. Cơ bản về giao thức TCP 178 9.2. Tác tử cơ bản 183 9.2.1. Chƣong trình ứng dụng, tác tử và mạng cấp thấp 183 9.2.2. Cấu hình tác tử 185 9.2.3. Cơ chế bên trong của tác tử 186 9.2.4. Định nghĩa một tác tử mới tầng giao vận 189 - 3 -
  5. 9.3. UDP và tác tử NULL 190 CHƢƠNG 10. TCP 195 10.1. Tổng quan về tác tử TCP trong NS2 195 10.1.1. Thiết lập kết nối TCP 195 10.1.2. Truyền gói tin và cơ chế báo nhận 195 10.1.3. TCP Header 196 10.1.4. Định nghĩa TCP gửi và TCP nhận 197 10.2. TCP Receiver 202 10.2.1. Lớp Acker 202 10.2.2. Lớp TcpSink 205 10.3. TCP Sender 207 10.4. Chức năng truyền gói tin TCP 207 10.4.1. Hàm sendmsg(nbytes) 208 10.4.2. Hàm send_much(force, reason, maxburst) 209 10.4.3. Hàm output(seqno, reason) 211 10.4.4. Hàm sendone() 213 CHƢƠNG 11. TẦNG ỨNG D NG 215 11.1. Mối quan hệ giữa tầng ứng dụng và tầng giao vận 215 11.2. Phân tích phân lớp tầng ứng dụng 218 11.2.1. Các hàm của lớp Application và Lớp Agent 219 11.2.2. Các hàm public của lớp Application 219 11.2.3. Các hàm public có liên quan của Lớp Agent 220 11.2.4. Các lệnh OTcl của Lớp Application 221 11.3. Phần tử sinh lƣu lƣợng 221 11.4. Lớp CBR Traffic: Một ví dụ về bộ sinh lƣu lƣợng 228 11.5. Ứng dụng mô phỏng 230 11.5.1. (File Transfer Protocol) 230 11.5.2. Telnet 231 TÀI LIỆU THAM KHẢO 232 - 4 -
  6. DANH M C VIẾT TẮT Tên viết tắt Nội dung CBR (Constant Bit Rate) Tốc độ bit cố định CBQ (Class Based Queueing ) Hàng đợi dựa trên lớp FTP (File Transfer Protocol) Giao thức truyền tập tin Lƣu lƣợng nỗ lực tối đa có độ ƣu tiên HBT (High priority Best effort Traffic) cao nhất HTTP (Hypertext Transfer Protocol) Giao thức truyền tải siêu văn bản ID (Identifier) Mã nhận dạng IEEE (Institute of Electrical and Electronic Engineers ) Viện kỹ thuật điện điện tử IP (Internet Protocol) Giao thức internet LAN (Local Area Network) Mạng cục bộ MAC (Media Access Control) Điều khiển truy cập đƣờng truyền MMS (MPLS Network Simulation) Mô phỏng mạng MPLS MPLS (Multicast-Protocol Label Switching ) Chuyển mạch nhãn đa giao thức NAM (Network Animator) Minh họa mạng NFS (Network FileSystems) Các tập tin hệ thống mạng NS (Network Simulator) Mô phỏng mạng OSPF (Open Shortest Path First ) Đƣờng dẫn ngắn nhất mở đầu tiên RED (Random Early Detection) Hàng đợi dò sớm ngẫu nhiên RT (Realtime Traffic ) Lƣu lƣợng thời gian thực SBT (Simple Best Effort Traffic) Lƣu lƣợng nỗ lực tối đa đơn giản SPF (Shortest Path First ) Đƣờng dẫn ngắn nhất đầu tiên ST (Signaling Traffic) Lƣu lƣợng tín hiệu TCP (Transmission Control Protocol ) Giao thức điều khiển truyền TTL (Time-To-Live) Thời gian tồn tại UDP (User Datagram Protocol) Giao thức gói ngƣời dùng VBR (Variable Bit Rate) Tốc độ bit thay đổi đƣợc - 5 -
  7. Tên viết tắt Nội dung WAN (Wide Area Network) Mạng diện rộng WLAN (Wireless Local Area Network) Mạng cục bộ không dây CBR (Constant Bit Rate) Tốc độ bit cố định CBQ (Class Based Queueing ) Hàng đợi dựa trên lớp FTP (File Transfer Protocol) Giao thức truyền tập tin Lƣu lƣợng nỗ lực tối đa có độ ƣu tiên HBT (High priority Best effort Traffic) cao nhất HTTP (Hypertext Transfer Protocol) Giao thức truyền tải siêu văn bản - 6 -
  8. LỜI NÓI ĐẦU Cùng với sự phát triển của khoa học và kỹ thuật, Công nghệ thông tin ở nƣớc ta trong những năm gần đây phát triển rất mạnh. Lĩnh vực Truyền thông và Mạng máy tính cũng đã phát triển một cách nhanh chóng và đa dạng cả về quy mô, hệ điều hành và ứng dụng. Do nhu cầu và trình độ cao, những ngƣời hoạt động chuyên ngành Công nghệ thông tin cần luôn phải nâng cao trình độ để đáp ứng. Tuy nhiên, các mạng máy tính cũng có cùng các điểm chung thông qua đó chúng ta có thể khảo sát, mô phỏng phân loại và đánh giá chúng. Tuy nhiên để nghiên cứu, đánh giá về các hệ thống mạng truyền thông hiện có cũng nhƣ đề xuất về các hệ thống mới thì không phải nhà khoa học nào cũng có điều kiện triển khai bằng thực nghiệm trên các hệ thống thực tế. Do đó, các công cụ mô hình hóa, mô phỏng, phân tích đánh giá về hiệu năng mạng hiện nay đang là các công cụ trợ thủ giúp đắc lực trong các nghiên cứu đóng góp vào sự phát triển của lĩnh vực Truyền thông và Mạng máy tính. Trong số các công cụ mô phỏng hệ thống mạng thì NS (Network Simulator) là một hệ mô phỏng hƣớng sự kiện mã nguồn mở đang đƣợc sử dụng rộng rãi trong học tập và nghiên cứu. Do là một hệ mô phỏng mã nguồn mở nên kể từ khi đƣợc giới thiệu vào năm 1989, NS đã phát triển một cách mạnh mẽ với sự đóng góp cỉa cộng đồng nghiên cứu quốc tế. Hiện nay NS đã đƣợc tích hợp hầu hết các module mô phỏng các thành phần mạng nhƣ các giao thức định tuyến, các giao thức tầng vận chuyển, các giao thức tầng ứng dụng và đang là phần mềm đƣợc sử dụng rộng rãi nhất trong số các phần mềm mô phỏng mạng dùng cho nghiên cứu, học tập về lĩnh vực Truyền thông và mạng máy tính. Để đáp ứng với yêu cầu học tập của sinh viên chuyên ngành công nghệ thông tin, Trƣờng Đại học Kinh tế - Kỹ thuật Công nghiệp tổ chức biên soạn bài giảng ―Kỹ thuật mô phỏng‖. Đây là một học phần chuyên sâu của sinh viên chuyên ngành Đại học và Cao đẳng Công nghệ thông tin. Học phần cung cấp cho sinh viên tổng quan về kiến trúc của hệ mô phỏng NS, cách thức cài đặt và sử dụng NS, đồng thời phân tích và thảo luận một cách chi tiết về các đối tƣợng cơ bản nhƣ : Nút mạng, gói tin, module định tuyến, bộ đệm, liên kết, nhằm giúp cho học viên làm chủ đƣợc hệ mô phỏng này. Bài giảng đƣợc biên soạn theo đúng chƣơng trình đào tạo và các quy định về cách trình bày của Nhà trƣờng. Nội dung của bài giảng bao gồm 11 chƣơng: Chƣơng 1: Giới thiệu với bạn đọc một số lý thuyết cơ bản về mạng máy tính và bài toán mô phỏng mạng. Trọng tâm của chƣơng là phƣơng pháp mô phỏng hƣớng sự kiện đƣợc sử dụng để phát triển NS. Chƣơng 2: Cung cấp các kiến thức tổng quan về NS nhƣ : Kiến trúc hai ngôn ngữ của NS, tổ chức thƣ mục NS, các quy ƣớc đƣợc sử dụng, Cách cài đặt NS trên hệ điều hành Unix và Windows - 7 -
  9. Chƣơng 3: Trình bày chi tiết về kiến trúc hai ngôn ngữ của NS bao gồm 6 lớp C++ chính : Tcl, Instvar, TclObject, TclCommand và EmbeddedTcl. Chƣơng 4 và 5: Trình bày các thành phần mô phỏng quan trọng trong NS. Chƣơng 4 tập trung vào việc giải thích phƣơng pháp triển khai bài toán mô phỏng sự kiện bằng NS. Chƣơng 5 tập trung vào các đối tƣợng mạng cũng nhƣ cơ chế chuyển tiếp gói tin. Chƣơng 6 đến chƣơng 11, Sinh viên sẽ đƣợc tiếp cận với các module đƣợc sử dụng phổ biến nhất trong NS. Module biểu diễn đối tƣợng nút mạng đƣợc phân tích trong chƣơng 6. Liên kết giữa các nút mạng bằng đối tƣợng simpleLink đƣợc trình bày trong chƣơng 7, Chƣơng 8 sẽ cung cấp cho bạn đọc các kiến thức cơ bản nhất về đối tƣợng mô phỏng gói tin Packet. Các toán tử dùng để tạo gói tin đƣợc biểu diễn bằng đối tƣợng Agent sẽ đƣợc đề cập tới trong chƣơng 9 và chƣơng 10. Chƣơng 11 sẽ trình bàu về đối tƣợng Application dùng để mô phỏng các yêu cầu truyền dữ liệu của ngƣời sử dụng. Mong rằng nội dung bài giảng sẽ giúp cho sinh viên và bạn đọc những kiến thức cần thiết, làm cơ sở để có thể đi sâu vào thiết kế, làm chủ NS. Bài giảng đƣợc dùng để giảng dạy cho sinh viên ngành Công nghệ thông tin, xong cũng có thể giúp sinh viên các ngành điện tử, viễn thông của các trƣờng đại học và bạn đọc cần tham khảo các vấn đề về mô phỏng và đánh giá hiệu năng mạng bằng NS. Vì bài giảng đƣợc biên soạn lần đầu, chúng tôi đã rất cố gắng hoàn chỉnh, song không tránh khỏi thiếu sót. Rất mong nhận đƣợc sự góp ý của bạn đọc để bài giảng đƣợc hoàn thiện hơn. Xin chân thành cám ơn! - 8 -
  10. CHƢƠNG 1. MÔ PHỎNG MẠNG MÁY TÍNH Mục tiêu Trong một vài thập kỷ qua, nhiều công nghệ và kỹ thuật hỗ trợ truyền thông giữa con ngƣời đã đƣợc phát triển. Từ hệ thống mạng điện thoại cố định đến mạng truyền thanh, mạng truyền hình rồi mạng máy tính. Ban đầu khi mới ra đời, các hệ thống này hoạt động độc lập với nhau và giờ đây con ngƣời mong muốn tích hợp chúng trong cùng một hệ thống. Trên thực tế có thể xem mạng truyền thông máy tính là kết quả của sự hội tụ này. Chƣơng này sẽ cung cấp cho bạn đọc một cách nhìn tổng quan về mạng truyền thông máy tính và những vấn đề cơ bản để mô phỏng chúng. Mục 1.1. Giới thiệu về mạng máy tính với mô hình tham chiếu mô tả kiến trúc của mạng truyền thông máy tính. Mục 1.2. Trình bày vắn tắt về phƣơng pháp thiết kế và mô hình hóa các hệ thống mạng máy tính phức tạp. Trong Mục 1.3. Các vấn đề cơ bản về mô phỏng mạng máy tính đƣợc đề cập đến. Mục 1.4. Trình bày về các kỹ thuật phổ biến khi mô phỏng theo phƣơng pháp mô phỏng theo thời gian. Mục 1.5 đƣa ra một ví dụ điển hình và Mục 1.6 sẽ tổng kết lại các vấn đề của chƣơng. Mạng máy tính và kiến trúc phân tầng. Một mạng máy tính đƣợc định nghĩa là một tập các máy tính có kết nối với nhau để thu thập, xử lý và phân bố thông tin. Thuật ngữ máy tính đƣợc hiểu tƣơng đối rộng bao gồm các thiết bị nhƣ máy trạm, máy chủ, router, modem, các trạm cơ sở, các điểm mở rộng truy cập không dây, Các máy tính này đƣợc kết nối bởi các liên kết truyền thông nhƣ cáp quang, cáp đồng, hay các liên kết sóng vi ba, sóng vệ tinh, sóng radio. Một mạng máy tính có thể đƣợc xây dựng bên trong một mạng máy tính khác hoặc kết nối với một mạng máy tính khác. Internet là một ví dụ điển hình về mạng máy tính. Trên thực tế, Internet là mạng của các mạng. 1.1.1. Khái niệm phân tầng Một mạng máy tính là một hệ thống rất phức tạp. Để đơn giản hóa trong việc thiết kế và triển khai một hệ thống nhƣ vậy, ngƣời ta đƣa ra khái niệm phân tầng. Sử dụng kiến trúc phân tầng, các chức năng của một hệ thống mạng máy tính đƣợc tổ chức nhƣ là một ngăn xếp các tầng. Mối quan hệ ngang hàng (hay liên kết ảo) diễn ra giữa 2 tầng đồng mức của 2 nút truyền thông với nhau. Luồng dữ liệu sẽ đi theo chiều dọc trong một tầng từ tầng cao nhất xuống tầng thấp nhất bên nút gửi, tiếp theo sẽ đi qua đƣờng truyền vật lý rồi đến tầng thấp nhất bên nút nhận, sau đó đi ngƣợc lên đến tầng cao nhất bên nút nhận. Mỗi tầng biểu diễn một phần đặc trƣng đƣợc định nghĩa trƣớc của hệ thống và cung cấp một số dịch vụ nào đó cho tầng phía trên. Tầng trên truy cập xuống tầng dƣới thông qua giao tiếp tầng (interface). Các dịch vụ thƣờng định nghĩa những công việc sẽ đƣợc thực hiện theo thuật ngữ các - 9 -
  11. hoạt động mạng hoặc các nguyên tắc nhƣng đặc biệt lại không chỉ ra cách thực hiện chúng nhƣ thế nào. Vì vậy một giao thức sẽ định nghĩa chi tiết về việc một dịch vụ đƣợc thực hiện nhƣ thế nào. Ví dụ, mạch truyền tại máy tính nguồn có thể sử dụng một giao thức riêng (chẳng hạn nhƣ một kỹ thuật mã hóa dữ liệu) tại tầng vật lý để truyền các bit thông tin tới máy tính nhận. Mạch nhận sẽ sử dụng giao thức riêng này để giải mã thông tin nhận đƣợc trên cơ sở các quy tắc của giao thức. Một trong các ƣu điểm rất lớn của khái niệm phân tầng này là tính độc lập của tầng. Điều này có nghĩa là một thay đổi trong một giao thức của một tầng nào đó không ảnh hƣởng tới toàn bộ hệ thống miễn là các giao tiếp của tầng không thay đổi. Ở đây, ta chú ý vào các thuật ngữ dịch vụ, giao thức và giao tiếp tầng để nhấn mạnh rằng sự tƣơng tác giữa các thành phần này tạo nên khái niệm phân tầng. Môi trƣờng truyền Hình 1.1: Biểu diễn một cách nhìn tổng quan về khái niệm phân tầng đƣợc sử dụng để truyền thông giữa 2 máy tính đầu cuối với nhau. Trong sơ đồ này, các chức năng của mỗi một máy tính đƣợc chia thành 4 tầng. Khi có một liên kết ảo giữa các tầng trên 2 máy tính thi các tầng đó đƣợc gọi là các tầng ngang hàng (peer). Mặc dù không kết nối trực tiếp với nhau nhƣng các tầng ngang hàng giao tiếp với nhau bằng cách sử dụng một giao thức nào đó đƣợc biểu diễn bởi mũi tên 2 chiều trong hình. Nhƣ đã nói ở trên, cần có một tiến trình truyền thông thực sự truyền dữ liệu đi qua ngăn xếp các tầng. Giả sử một tiến trình của ứng dụng chạy ở Tầng 4 của nút nguồn sinh ra dữ liệu hoặc thông điệp muốn truyền tới nút đích. Việc truyền thông bắt đầu bằng việc sinh ra thông diệp D rồi truyền xuống tầng 3. Tại tầng 3, dữ liệu đƣợc phân tách thành 2 gói là D1 và D2 cùng các thông tin điều khiển chứa trong phần header H3 của tầng 3 đƣợc gắn vào đầu của hai gói này. Các thông tin điều khiển có thể là các số thứ tự, kích thƣớc gói, thông tin kiểm soát lỗi. Các thông tin này đƣợc tầng ngang hàng tƣơng ứng bên nút đích đọc và sử dụng để khôi phục lại thông điệp D. Dữ liệu kết quả (VD: H3+D1) do tầng thấp hơn tiếp tục quản lý và tiến trình gắn thêm thông tin điều khiển của các giao thức tầng dƣới lại tiếp tục đƣợc thực hiện. Tiến trình này tiếp tục cho đến khi thông điệp tới đƣợc tầng thấp nhất, tại đó việc truyền thông tin thực sự đƣợc thực hiện qua một môi trƣờng vật lý. Chú ý rằng, theo dòng tiến trình này, có thể cần có thêm các tiến trình phân tách - 10 -
  12. dữ liệu từ các tầng trên thành các gói nhỏ hơn cho các mục đích khác. Khi thông điệp tới đích, tiến trình ngƣợc lại sẽ diễn ra. Khi dữ liệu di chuyển lần lƣợt qua các tầng theo chiều từ dƣới lên trên ở bên nút đích, phần header của chúng sẽ đƣợc gỡ bỏ theo từng tầng tƣơng ứng. Nếu cần thiết, nhiều gói sẽ đƣợc ghép lại với nhau trƣớc khi truyền lên tầng cao hơn. Tiến trình này sẽ tiếp tục cho đến khi thông điệp nguyên thủy (D) đƣợc khôi phục tại tầng 4. 1.1.2. Mô hình tham chiếu OSI và TCP/IP Mô hình OSI (Open Systems Interconnection) là một mô hình tham chiếu đầu tiên do ISO (Tổ chức tiêu chuẩn hóa quốc tế) phát triển để cung cấp một khung chuẩn nhằm mô tả các ngăn xếp giao thức trong một mạng máy tính. Nó bao gồm 7 tầng trong đó mỗi tầng đƣợc thiết kế để thực hiện một nhóm chức năng đã định nghĩa trƣớc. Các tầng trong mô hình OSI bao gồm tầng vật lý, tầng liên kết dữ liệu, tầng mạng, tầng giao vận, tầng phiên, tầng trình diễn và tầng ứng dụng. Mô hình OSI chỉ đƣa ra chức năng của từng tầng trong nó mà không chỉ định một cách chính xác rằng những dịch vụ hoặc giao thức nào sẽ đƣợc sử dụng trong mỗi tầng. Mặc dù mô hình này không đƣợc triển khai trong các hệ thống hiện tại nhƣng tính triết lý của mô hình OSI lại thiết lập một nền móng vững chắc cho các nghiên cứu phát triển trong lĩnh vực mạng máy tính. Mô hình tham chiếu TCP/IP ((Transmission Control Protocol/Internet Protocol) là mô hình dựa trên 2 giao thức cơ sở là TCP và IP đƣợc sử dụng cho Internet hiện nay. Các giao thức này qua thực tế đã chứng minh đƣợc sức mạnh của mình và kết quả là chúng đã đƣợc sử dụng và triển khai rộng rãi trong rất nhiều hệ thống mạng máy tính. Mô hình TCP/IP do ARPANET phát triển từ một nghiên cứu do Bộ quốc phòng Mỹ tài trợ và nó đƣợc xem là mô hình gốc của mọi hệ thống mạng máy tính. Trong mô hình TCP/IP, ngăn xếp giao thức đƣợc chia thành 5 tầng: tầng vật lý, tầng liên kết dữ liệu, tầng mạng, tầng giao vận và tầng ứng dụng. Mỗi tầng chịu trách nhiệm về một số dịch vụ nào đó và sẽ đƣợc mô tả ngắn gọn sau đây. Chú ý rằng, tầng ứng dụng trong mô hình TCP/IP có thể đƣợc xem là sự kết hợp của tầng phiên, tầng giao vận và tầng ứng dụng trong mô hình OSI. Tầng ứng dụng Tầng ứng dụng là tầng cao nhất trong ngăn xếp tầng. Nó sử dụng các dịch vụ của Tầng giao vận để hỗ trợ nhiều giao thức cấp cao chẳng hạn nhƣ HTTP (Giao thức truyền dữ liệu siêu văn bản) dành cho các ứng dụng World Wide Web, SMTP (Giao thức truyền email đơn giản) cho các ứng dụng thƣ điện tử, giao thức Telnet cho các ứng dụng máy trạm ảo kết nối từ xa giao thức DNS (dịch vụ tên miền) cho ứng dụng chuyển đổi tên miền sang địa chỉ mạng và giao thức FTP (Giao thức truyền file) dành cho việc truyền tệp. Tầng giao vận Mục đích của tầng Giao vậnlà vận chuyển các thông điệp từ tầng ứng dụng của nút nguồn tới tầng ứng dụng của nút đích. Đe hoàn thành mục đích này, tại tầng Giao vậncó - 11 -
  13. định nghĩa 2 giao thức chuẩn Ịà TCP và UDP (User Datagram Protocol). Trong khi TCP đƣợc thiết kế với mục đích đảm bảo truyền thông hƣớng kết nối một cách tin cậy giữa 2 nút thì UDP hỗ trợ truyền thông không hƣớng kết nối không tin cậy. TCP thích hợp với các ứng dụng yêu cầu độ chính xác cao hơn là thời gian truyền và ngƣợc lại đối với giao thức UDP. Thông tin điều khiển thƣờng liên quan tới thông tin điều khiển luồng và kiểm soát lỗi cần đƣa vào trong thông điệp. Tiến trình phân đoạn dữ liệu đƣợc diễn ra trƣớc khi gắn thêm phần header vào thông điệp. Sau khi phân đoạn dữ liệu lớn từ tầng ứng dụng, đơn vị dữ liệu tại tầng này đƣợc gọi là segment. Tầng Mạng Tầng này cung cấp dịch vụ định tuyến cho tầng giao vận. Tầng mạng đƣợc thiết kế để vận chuyển các đơn vị dữ liệu thƣờng đƣợc gọi là các packet dọc theo các con đƣờng từ nút nguồn tới nút đích. Để thực hiện chức năng định tuyến, các header chứa thông tin nhƣ địa chỉ mạng nguồn và địa chỉ mạng đích đƣợc gắn vào các đơn vị dữ liệu giao thức tại tầng giao vận để hình thành đơn vị dữ liệu giao thức tại tầng mạng. Tầng Liên kết dữ liệu Đơn vị dữ liệu do tầng mạng tạo ra là packet thƣờng đƣợc định tuyến qua nhiều liên kết truyền thông và các nút trung gian trƣớc khi chúng thực sự tới đƣợc đích. Để định tuyến thành công các packet từ nguồn tới đích, phải có các cơ chế truyền dữ liệu trên mỗi một liên kết vật lý từ nút này sang nút khác. Một giao thức ở tầng liên kết dữ liệu có nhiệm vụ vận chuyển dữ liệu qua một liên kết truyền thông. Giao thức tầng liên kết dữ liệu có 3 chức năng chính. Chức năng thứ nhất là điều khiển luồng dữ liệu liên quan đến tốc độ truyền trong một liên kết truyền thông. Chức năng thứ hai là điều khiển lỗi để đảm bảo tính toàn vẹn dữ liệu khi truyền. Chức năng thứ ba là dồn kênh/tách kênh cho phép ghép nhiều luồng dữ liệu vào một liên kết truyền thông và tách các luồng dữ liệu ra từ một liên kết truyền thông. Việc lựa chọn giao thức tầng liên kết dữ liệu có thể thay đổi trên mỗi một liên kết truyền thông. Ví dụ, các giao thức/công nghệ tầng liên kết dữ liệu đƣợc sử dụng rộng rãi bao gồm Ethernet, PPP , IEEE 802.11, ATM, Tầng Vật lý Tầng Vật lý giải quyết bài toán truyền các bit dữ liệu qua một liên kết truyền thông vật lý. Mục đích chính của nó là đảm bảo các tham số truyền (chẳng hạn nhƣ mức hiệu điện thế, kỹ thuật điều chế) đƣợc thiết lập thích hợp để đạt đƣợc hiệu năng truyền phù hợp (chẳng hạn nhƣ đạt đƣợc hiệu năng về tỷ suất lỗi bit thích hợp). Cuối cùng, cả 5 tầng trong mô hình TCP/IP vừa đƣợc mô tả ở trên đều là các tầng phổ biến trong mô hình OSI. Nhƣ đã nói ở trên, mô hình OSI còn 2 tầng phía trên tầng giao vận là tầng phiên và tầng trình diễn. Tầng phiên đơn giản chỉ làm nhiệm vụ cho phép những ngƣời dùng trên nhiều máy tính khác nhau có thể tạo các phiên truyền thông với - 12 -
  14. nhau. Tầng trình diễn có nhiệm vụ cơ bản là giải quyết bài toán biểu diễn các loại dữ liệu khác nhau khi truyền qua mạng. Ví dụ, một hệ thống quản lý mạng thu thập dữ liệu có định dạng khác từ các máy tính khác nhau thì cần phải chuyển đổi định dạng dữ liệu thu thập đƣợc về định dạng dữ liệu đồng nhất của nó. Mô hình hệ thống Mô hình hóa hệ thống có thể hiểu nhƣ là việc biểu diễn một hệ thống thực tế theo một cách đơn giản nào đó. Mô hình hóa hệ thống là một công việc cực kỳ quan trọng trong thiết kế và phát triển hệ thống bởi vì nó dự đoán trƣớc đƣợc hệ thống sẽ thực thi bằng cách nào trƣớc khi đƣợc triển khai trong thực tế. Khi mô hình hóa, các tham số của hệ thống có thể thay đổi, kiểm nghiệm và phân tích. Điều quan trọng là nếu việc mô hình hóa đƣợc xây dựng hợp lý thì có thể giúp tiết kiệm chi phí và giá thành khi phát triển hệ thống. Để mô hình hóa một hệ thống, ngƣời ta phải đƣa ra các giả định làm đơn giản hóa hệ thống. Tuy nhiên khi càng đƣa ra nhiều giả định đơn giản hóa thì hệ thống càng đơn giản nhƣng hệ thống đƣợc mô hình hóa lại càng kém chính xác so với hệ thống thực. Theo truyền thống, có 2 cách tiếp cận mô hình hóa hệ thống: tiếp cận theo phƣơng pháp phân tích và tiếp cận theo phƣơng pháp mô phỏng. 1.1.3. Tiếp cận theo phƣơng pháp phân tích Mô hình hóa hệ thống theo phƣơng pháp phân tích thƣờng bắt đầu bằng việc mô tả một hệ thống toán học với sự trợ giúp của các công cụ toán ứng dụng chẳng hạn nhƣ các lý thuyết hàng đợi và lý thuyết xác suất, sau đó áp dụng các phƣơng pháp số học để rút ra các kết quả phân tích từ mô hình toán học đã phát triển. Khi hệ thống thực tế tƣơng đối nhỏ và đơn giản, mô hình hóa theo phƣơng pháp phân tích có thể là phƣơng pháp phân tích phù hợp hơn so với phƣơng pháp mô phỏng. Trong trƣờng hợp này, có thể dễ dàng vận dụng các công cụ toán học vào việc phân tích và các thuật giải số học vào mô hình này mà không yêu cầu quá nhiều thời gian và tài nguyên tính toán. Nếu đƣợc triển khai thành công, mô hình hóa hệ thống tiếp cận theo phƣơng pháp phân tích sẽ có thể có tính hiệu quả cao về mặt giá thành và có thể đƣa ra một cách nhìn nhận hấp dẫn về mối tƣơng tác giữa các thành phần trong hệ thống. Tuy nhiên nếu sử dụng nhiều giả định ban đầu làm đơn giản hóa hệ thống, mô hình hóa theo phƣơng pháp phân tích có thể biểu diễn không chính xác về hệ thống thực. 1.1.4. Tiếp cận theo phƣơng pháp mô phỏng Phƣơng pháp mô phỏng đƣợc sử dụng rộng rãi vào mô hình hóa hệ thống ứng dụng trong nhiều lĩnh vực nhƣ: Nghiên cứu kỹ thuật, phân tích thƣơng mại, lập kế hoạch sản xuất và thí nghiệm sinh học, So với phƣơng pháp phân tích, phƣơng pháp mô phỏng thƣờng yêu cầu ít kỹ thuật trừu tƣợng hóa hơn trong một mô hình (chẳng hạn nhƣ ít các giả định đơn giản hóa hơn), khi đó hầu hết các đặc tính chi tiết của hệ thống thực có thể đƣa vào hệ thống mô hình hóa để mô tả hệ thống thực một cách chính xác nhất. Khi hệ thống thực lớn và phức tạp, phƣơng pháp mô hình hóa hệ thống bằng toán học không còn - 13 -
  15. thích hợp và trong trƣờng hợp này, phƣơng pháp mô hình hóa hệ thống bằng mô phỏng thƣờng đƣợc sử dụng. Phƣơng pháp mô hình hóa hệ thống bằng mô phỏng cũng có thể bỏ đi một vài đặc tính chi tiết của hệ thống thực bởi vì nếu có quá nhiều đặc tính chi tiết đƣợc đƣa vào, nó có thể dẫn đến tình trạng không thể quản lý đƣợc hệ thống mô phỏng và yêu cầu tài nguyên tính toán quá lớn. Đây là điều quan trọng cần đƣợc cân nhắc khi đƣa những đặc tính chi tiết không thích đáng vào hệ thống mô phỏng. Khái niệm cơ bản về mô phỏng mạng máy tính Một quá trình mô phỏng ít hoặc nhiều đều là sự kết hợp của khoa học và nghệ thuật. Trong khi phần khoa học yêu cầu kỹ năng lập trình máy tính và nắm bắt sử dụng các công cụ toán ứng dụng một cách thuần thục thì phần nghệ thuật lại yêu cầu kỹ năng phân tích và phát biểu một cách rõ ràng mô hình khái niệm, về cơ bản, các bƣớc cần phải thực hiện trong một tiến trình mô phỏng đƣợc chia thành 3 tác vụ chính và mỗi một tác vụ có một cấp độ quan trọng khác nhau. Theo Shannon, trong quá trình mô hình hóa hệ thống bằng phƣơng pháp mô phỏng, nếu xét trên phƣơng diện tài nguyên thời gian và năng lực, nên dành 40% để định nghĩa bài toán, thiết kế mô hình thích hợp và đƣa ra tập các thử nghiệm sẽ thực hiện trên mô hình mô phỏng. Tiếp theo, nên dành 20% cho việc lập trình các thành phần kết quả của bƣớc 1. Cuối cùng 40% tài nguyên còn lại nên sử dụng để thực hiện việc kiểm tra/xác thực mô hình mô phỏng, thực hiện các thử nghiệm với các tham số đầu vào đã đƣợc thiết kế trƣớc (có thể tính chỉnh lại các thử nghiệm) và phân tích kết quả. Chú ý rằng công thức này hoàn toàn không cứng nhắc. Bất kỳ một tiến trình mô phỏng bất kỳ nào trong thực tế cũng có thể yêu cầu ít hoặc nhiều tài nguyên hơn phụ thuộc vào ngữ cảnh thực tế và bản thân ngƣời thực hiện việc mô phỏng. Một quá trình mô phỏng có thể đƣợc xem nhƣ là một dòng các tiến trình của các thực thể trong mạng (chẳng hạn nhƣ các nút, các gói tin). Khi những thực thể này di chuyển qua hệ thống, chúng tƣơng tác, kết hợp với các thực thể khác, kích hoạt các sự kiện làm thay đổi trạng thái của hệ thống và kết thúc tiến trình. Theo thời gian, một thực thể có thể cạnh tranh hoặc đợi các tài nguyên với các thực thể khác. Điều này dẫn đến việc phải có một trinh tự thực thi một cách logic sao cho mọi hành động trong hệ thống đều đƣợc xảy ra theo nghĩa có thể hiểu và quản lý đƣợc chúng. Một trình tự thực thi đóng một vai trò quan trọng trong việc giám sát một quá trình mô phỏng và đôi khi chúng đƣợc sử dụng để nhận biết loại mô phỏng. 1.1.5. Định nghĩa chuẩn về mô phỏng Theo Shannon, mô phỏng là ―tiến trình thiết kế một mô hình của hệ thống thực và áp dụng các thí nghiệm với mô hình này nhằm mục đích hiểu đƣợc hành vi của hệ thống và/hoặc đánh giá các chiến lƣợc cho hoạt động của hệ thống‖ Do bản chất của mạng máy tính là động nên trong thực tế ngƣời ta phát triển mô hình động. - 14 -
  16. 1.1.6. Các thành phần của mô phỏng Các thành phần cấu thành của một mô phỏng bao gồm: Thực thể (Entity) Thực thể là các đối tƣợng tƣơng tác với các đối tƣợng khác trong một chƣơng trình mô phỏng để gây ra những thay đổi về tình trạng của hệ thống. Trong ngữ cảnh mạng máy tính, thực thể có thể là các nút mạng, các gói tin các luồng gói tin hoặc các đối tƣợng phi vật lý chẳng hạn nhƣ đồng hồ mô phỏng. Để phân biệt các thực thể khác nhau, ngƣời ta sử dụng các thuộc tính định danh duy nhất thực thể chẳng hạn nhƣ độ dài gói tin, số thứ tự, độ ƣu tiên và phần thông tin điều khiển header. Tài nguyên Tài nguyên là một phần của một hệ thống phức tạp. Thông thƣờng, các thực thể chia sẻ nhau một số lƣợng tài nguyên có hạn. Ví dụ trong mạng máy tính các tài nguyên có thể là băng thông, thời gian truyền, số lƣợng máy chủ. Hoạt động và Sự kiện Theo thời gian, các thực thể sẽ tiến hành các hoạt động của mình. Hoạt động của các thực thể sẽ tạo ra các sự kiện và kích hoạt sự thay đổi trạng thái của hệ thống. Ví dụ điển hình của hoạt động là độ trễ (delay) và xếp hàng (queuing). Khi một máy tính cần gửi một gói tin nhƣng môi trƣờng truyền đang bận, nó sẽ đợi cho đến khi môi trƣờng truyền rỗi, khi đó thực thể gói tin đang tiến hành hoạt động đợi. Bộ lập lịch Một bộ lập lịch bao gồm một danh sách các sự kiện và thời gian thực hiện chúng. Trong quá trinh mô phỏng, các sự kiện trong bộ lập lịch sẽ đƣợc kích hoạt chạy bởi đồng hồ hệ thống mô phỏng. Biến toàn cục Trong mô phỏng, một biến toàn cục (public/global) có thể đƣợc truy cập bởi bất kỳ một hàm hoặc một thực thể nào trong hệ thống và về cơ bản nó thƣờng lƣu trữ các giá trị chung dùng trong mô phỏng. Ví dụ nhƣ đối với mạng máy tính, biến toàn cục có thể biểu diễn độ dài của hàng đợi gói tin trong một mạng có một máy chủ, có thể biểu diễn thời gian trễ hoặc có thể biểu diễn số gói tin đã đƣợc truyền. Bộ sinh số ngẫu nhiên Một mô hình mô phỏng yêu cầu một bộ sinh số ngẫu nhiên (RNG) để tính ra các số ngẫu nhiên trong hệ thống. Các số ngẫu nhiên đƣợc sinh ra bằng cách lấy liên tiếp các số từ một dãy xác định các số ngẫu nhiên giả cho đến khi số đƣợc lấy ra từ dãy đƣợc xem nhƣ là số ngẫu nhiên. Trong hầu hết mọi trƣờng hợp, dãy số ngẫu nhiên giả đƣợc xác định trƣớc và đƣợc sử dụng bởi mọi bộ sinh số ngẫu nhiên. Trong những tình huống yêu cầu nhiều kết quả thống kê, một bộ RNG cần bắt đầu lấy số từ một vị trí khác (hạt giống - seed) trong cùng một dãy số ngẫu nhiên giả. Nói cách - 15 -
  17. khác rất có thể kết quả của mọi lần chạy sẽ là giống nhau. Khi triển khai trong thực tế, một bộ RNG sẽ khởi tạo một hạt giống. Một hạt giống sẽ xác định vị trí bắt đầu trong dãy số ngẫu nhiên giả mà trong đó bộ RNG sẽ bắt đầu lấy số. Các mô phỏng khác nhau sẽ khởi tạo các giá trị hạt giống khác nhau do đó kết quả sinh ra sẽ khác nhau. Ví dụ trong mô phỏng mạng máy tính, tiến trình một gói tin đến, tiến trình đợi và tiến trình phục vụ thƣờng đƣợc mô hình hóa bởi các tiến trình ngẫu nhiên. Một tiến trình ngẫu nhiên đƣợc biểu diễn bởi một dãy các số ngẫu nhiên. Các tiến trình ngẫu nhiên thƣờng đƣợc thực hiện với sự trợ giúp của một bộ RNG. Bộ thu thập thống kê Nhiệm vụ chính của một bộ thu thập thống kê là thu thập dữ liệu sinh ra từ một mô phỏng để suy ra ý nghĩa của dữ liệu thu thập đƣợc. Mô phỏng phụ thuộc thời gian Loại hình mô phỏng chính đƣợc sử dụng hiện nay là mô phỏng theo thời gian trong đó việc xử lý diễn ra theo trình tự thời gian. Loại mô phỏng này duy trì một đồng hồ mô phỏng lƣu trữ thời gian mô phỏng hiện tại. Trong hầu hết mọi trƣờng hợp, bộ mô phỏng sẽ chạy cho đến khi đồng hồ đạt đến một giá trị ngƣỡng xác định trƣớc. Mô phỏng theo thời gian có thể đƣợc chia thành 2 loại là mô phỏng hƣớng thời gian (time-driven simulation) và mô phỏng hƣớng sự kiện (event- drivent simulation). Một bộ mô phỏng hƣớng thời gian sẽ thực thi sự kiện vào các khoảng thời gian cố định. Nói cách khác, nó sẽ hoạt động từ một khoảng thời gian này tới một khoảng thời gian khác và thực thi các sự kiện (nếu có) cho đến khi nó đạt tới một giới hạn nào đó. Đối với một bộ mô phỏng hƣớng sự kiện, các sự kiện có thể diễn ra vào bất kỳ một thời điểm nào. Bộ mô phỏng sẽ di chuyển từ một sự kiện này tới một sự kiện khác và tiếp tục thực thi các sự kiện (nếu có) cho đến khi quá trinh mô phỏng kết thúc. Điều quan trọng cần chú ý đối với loại mô phỏng theo thời gian là việc mô phỏng phải diễn ra theo trình tự thời gian. Chú ý này là rất rõ ràng theo loại mô phỏng hƣớng thời gian. Đối với loại mô phỏng hƣớng sự kiện, có 2 điểm quan trọng khi triển khai mô phỏng theo thời gian: Thứ nhất, mọi sự kiện mới đƣợc lập lịch trong danh sách sự kiện phải đƣợc gán một nhãn thời gian có giá trị lớn hơn hoặc bằng với giá trị nhãn thời gian của sự kiện hiện tại. Nói cách khác không có sự kiện nào trong quá khứ đƣợc lập lịch thực hiện. Thứ hai, sự kiện tiếp theo của bộ mô phỏng đƣợc thực thi phải là sự kiện có giá trị nhãn thời gian nhỏ nhất trong danh sách các sự kiện. Điều này sẽ làm cho bộ mô phỏng phát triển theo hƣớng trình tự thời gian tiến và không bao giờ quay trở lại một sự kiện có trong quá khứ. 1.1.7. Mô phỏng hƣớng thời gian Trong các mô phỏng hƣớng thời gian, nhịp chạy của đồng hồ mô phỏng luôn tiến lên một cách chính xác bởi một đơn vị thời gian A xác định trƣớc. Sau mỗi nhịp chạy của đồng hồ, bộ mô phỏng sẽ tìm kiếm các sự kiện có thể diễn ra vào khoảng thời gian cố định - 16 -
  18. đó. Nếu có, các sự kiện này sẽ đƣợc xem nhƣ chúng đã xảy ra vào thời điểm kết thúc của khoảng thời gian này. Hình 1.2. Bƣớc nhảy thời gian trong mô phỏng hƣởng thời gian Trong hình 1.2, các mũi tên cong biểu diễn tiến triển các sự kiện theo thời gian và a, b, c đánh dấu thời điểm xảy ra các sự kiện. Trong khoảng thời gian thứ nhất, không có sự kiện nào xảy ra, trong khi khoảng thời gian thứ hai chứa sự kiện a. Tuy nhiên sự kiện này chỉ đƣợc quản lý khi thời gian hệ thống có giá trị 2, tức là vào cuối khoảng thời gian thứ hai. Nhƣợc điểm của loại mô phỏng tiến triển theo thời gian đƣợc bộc lộ ra trong khoảng thời gian thứ năm, trong đó sự kiện b và c đều đƣợc coi là xảy ra vào thời điểm 5A. Điều này dẫn đến thủ tục xác định xem sự kiện nào xảy ra trƣớc để quản lý trƣớc. Một trong các giải pháp để giải quyết tình huống này là giảm giá trị khoảng thời gian A xuống sao cho mỗi một khoảng thời gian chỉ xảy ra nhiều nhất là một sự kiện. Tuy nhiên điều này lại tạo ra một gánh nặng tính toán lớn nên hệ thống thực hiện mô phỏng. Do đó, loại mô phỏng hƣớng thời gian đƣợc khuyến cáo không nên sử dụng trong các mô hình hệ thống có các sự kiện xảy ra vào các thời điểm ngẫu nhiên. Ví dụ 1.1. chƣơng trình 1.1 minh họa mã lập trình mô phỏng hƣớng thời gian. dòng 1 và 2 khởi tạo các biến trạng thái hệ thống và đồng hồ mô phỏng. Dòng 3 biểu diễn điều kiện dừng, đó là từ dòng 4 tới dòng 7 sẽ chạy khi đồng hồ mô phỏng (SimClock) nhỏ hơn một ngƣỡng xác định trƣớc (StopTime). Các dòng từ 4 đến 7 minh họa việc thu thập dữ liệu thống kê, thực hiện các sự kiện và tăng giá trị đồng hồ mô phỏng tới thời gian sự kiện hiện tại. 1.1.8. Mô phỏng hƣớng sự kiện Mô phỏng hƣớng sự kiện đƣợc khởi tạo và chạy bằng tập các sự kiện. Thông thƣờng, phải thƣờng xuyên duy trì và cập nhật danh sách chứa mọi sự kiện đã đƣợc lập - 17 -
  19. lịch qua tiến trình mô phỏng. Nói theo ngôn ngữ kỹ thuật, vòng lặp chính trong chƣơng trình mô phỏng thực sự phải chạy qua danh sách này và phải quản lý một sự kiện sau một sự kiện khác cho đến khi danh sách các sự kiện trống hoặc điều kiện dừng đƣợc thỏa mãn. Cơ chế quản lý sự kiện đƣợc minh họa trong hình 1.3. Trong đó, sự kiện a, b và c đƣợc thực thi theo thứ tự. Khoảng thời gian giữa 2 sự kiện là không cố định. Bộ mô phỏng tiến triển từ một sự kiện này tới một sự kiện khác thay vì từ một khoảng thời gian này tới một khoảng thời gian khác nhƣ trong mô phỏng hƣớng thời gian. Ngoại trừ cơ chế tiến triển của bộ mô phỏng, cơ chế mô phỏng hƣớng sự kiện tƣơng đối giống với cơ chế mô phỏng hƣớng thời gian. Tới sự kiện Hình 1.3. Bƣớc nhảy thời gian trong mô phỏng hƣớng sự kiện Trong một mô phỏng hƣớng sự kiện, mọi sự kiện trong toàn bộ mô phỏng có thể không đƣợc tạo ra tại thời điểm ban đầu. Khi bộ mô phỏng tiến triển, một sự kiện cỏ thể sinh ra một hoặc nhiều sự kiện khác. Một sự kiện mới thƣờng đƣợc chèn vào danh sách các sự kiện sắp xếp theo trình tự thời gian. Mô phỏng tiến triển theo sự kiện sẽ bỏ qua các khoảng thời gian không hoạt động bằng cách tăng giá trị đồng hồ mô phỏng từ thời gian của sự kiện này tới thời gian của sự kiện khác. Tiến trình này sẽ lặp lại cho đến khi mọi sự kiện trong danh sách đều đã đƣợc thực hiện hoặc khi hệ thống đạt đƣợc một trạng thái nào đó (chẳng hạn nhƣ thời gian mô phỏng đạt tới một giá tri xác định trƣớc). Theo cách này, ngƣời ta cần một cơ chế để thu thập một vài thông tin thống kê hoặc thông tin trạng thái của hệ thống nhằm phục vụ cho việc phân tích. Tiến trình thu thập thông tin có thể thực hiện bằng cách thu thập ngay sau khi mọi sự kiện đƣợc thực hiện hoặc sử dụng một thực thể đặc biệt để thu thập các thông tin trong quá trình mô phỏng diễn ra. Ví dụ 1.2. Chƣơng trình 1.2 minh họa khung công việc thông thƣờng của một chƣơng trình mô phỏng tiến triển theo sự kiện. Dòng 1 và 2 khởi tạo các biến trạng thái của hệ thống và danh sách các sự kiện. Dòng 3 xác định điều kiện dừng. Từ dòng 4 tới dòng 6 sẽ đƣợc thực hiện khi dòng 3 có giá trị TRUE. Ở đây, sự kiện đƣợc thực hiện trƣớc đó sẽ bị xóa khỏi danh sách các sự kiện, đồng hồ mô phỏng đƣợc thiết lập giá trị của thời gian đƣợc lập lịch trƣớc của sự kiện hiện tại và sự kiện hiện tại đƣợc thực hiện. Trong một vòng lặp, các biến trạng thái hệ thống có thể đƣợc điều chỉnh để lƣu trữ những sự thay đổi xảy ra trong hệ thống tùy theo sự kiện đã đƣợc thực hiện. - 18 -
  20. Ví dụ về mô phỏng mạng máy tính Phần này minh họa mô phỏng của một hệ thống hàng đợi đơn kênh. Xét một liên kết truyền thông điểm - điểm qua đƣờng truyền vật lý có dây đƣợc biểu diễn trong hình 1.4. Để đơn giản, ta chỉ xét 1 chiều truyền thông từ nút A tới nút B. Đặc biệt, ta quan tâm đến một hệ thống hàng đợi gửi gói tin nội bộ tại nút A, tại đó mỗi thời điểm từng gói tin đƣợc lấy ra từ hàng đợi và truyền đi (hoặc phục vụ). Thời gian truyền phụ thuộc vào băng thông hoặc khả năng đáp ứng của liên kết. Hình 1.4. Minh họa về hệ thống hàng đợi đơn kênh Giả sử, các gói tin do các ứng dụng khác nhau bên trong nút A sinh ra một cách ngẫu nhiên và không giới hạn đi tới hàng đợi theo một số phân bố xác suất. Khi đó, mỗi gói tin có thể có độ dài bất kỳ và các điều kiện của kênh truyền có thể biến đổi làm cho thời gian truyền mỗi gói tin có thể thay đổi một cách ngẫu nhiên và tuân theo một số phân bố xác suất. Trong trƣờng hợp này, thời gian truyền mỗi gói tin đƣợc định nghĩa là khoảng thời gian trôi qua từ thời điểm bắt đầu truyền gói tin đi tới thời điểm nút B nhận thành công gói tin. Nguyên lý hàng đợi triển khai tại nút A là FIFO, nghĩa là các gói tin đƣợc đƣa vào hàng đợi và đƣợc truyền đi theo thứ tự đến. Để đơn giản, cơ chế hàng đợi tại nút B đƣợc bỏ qua. Thêm vào đó, để đảm bảo tính ổn định của hệ thống, ta giả định rằng tốc độ gói tin - 19 -
  21. đi tới hàng đợi nhỏ hơn tốc độ truyền gói tin và không có rằng buộc khi xây dựng hàng đợi. Các thực thể Mô phỏng này bao gồm các thực thể chính sau:  Kênh truyền: có 2 thuộc tính rỗi và bận  Gói tin: có 2 thuộc tính là thời gian đi tới hàng đợi và thời gian truyền  Hàng đợi: có 2 thuộc tính trống và không trống  Tài nguyên Trong ví dụ này, chỉ có duy nhất một tài nguyên là thời gian truyền trong kênh truyền Các biến trạng thái hệ thống và các sự kiện  Đối với biến trạng thái hệ thống: có 2 biến là:  num_system: là số lƣợng gói tin trong hệ thống bao gồm cả gói tin đang đƣợc phục vụ và các gói tin trong hàng đợi.  channel_free: là trạng thái của kênh (phục vụ) với 2 trạng thái là rỗi và bận  Đối với sự kiện: có 2 sự kiện là:  pkt_arrival: tƣơng ứng với sự kiện một gói tin do ứng dụng sinh ra cần truyền đi. Sự kiện này xảy ra khi một gói tin đi tới hàng đợi. Nhƣ hình vẽ 1.5 minh họa, khi một gói tin sinh ra, nó có thể đi trực tiếp vào môi trƣờng truyền hoặc đƣợc đƣa vào trong hàng đợi phụ thuộc vào trạng thái của kênh truyền là rỗi hay bận. Hình 1.5. Sự kiện gói tin đến - pkt_complete: tƣơng ứng với sự kiện truyền thành công một gói tin. Sự kiện này chỉ ra rằng nút B đã nhận thành công một gói tin. Tại thời điểm hoàn thành, nút A sẽ bắt đầu truyền (phục vụ) một gói tin khác đang đợi trong hàng đợi của mình. Nếu không còn gói tin nào nữa đƣợc gửi đi, kênh truyền sẽ chuyển vào trạng thái rỗi. Tiến trình này đƣợc minh họa trong Hình 1.6. - 20 -
  22. Hình 1.6. Sự kiện truyền gói tin thành công Hai thành phần quan trọng khác trong một mô phỏng tiến triển theo sự kiện là đồng hồ mô phỏng và danh sách sự kiện. Đồng hồ mô phỏng duy trì thời gian mô phỏng hiện tại. Danh sách sự kiện là một chuỗi các sự kiện đƣợc lập lịch (sự kiện truyền gói tin đi và sự kiện nhận gói tin thành công) kết nối với nhau theo một trình tự thời gian. Trình mô phỏng sẽ thực hiện một sự kiện sau khi một sự kiện khác kết thúc trong danh sách sự kiện và cập nhật lại đồng hồ mô phỏng trên cơ sở thời gian thực hiện sự kiện. Các độ đo hiệu trong mô phỏng Trong ví dụ này, ta xét tới 3 độ đo hiệu năng sau:  Thời gian đợi trung bình: là thời gian trung bình lƣu giữ một gói tin trong hàng đợi. Trong mô phỏng, ta định nghĩa một biến public lƣu tổng thời gian của tất cả các gói tin trong hàng đợi đã đƣợc truyền đi. Sau khi kết thúc mô phỏng, ta lấy giá trị này chia cho tổng số gói tin đã đƣợc truyền đi sẽ đƣợc giá trị trung bình thời gian đợi  Độ trễ trung bình khi truyền gói tin: Là thời gian trung bình để truyền thành công một gói tin (từ thời điểm gửi gói tin gửi đi tới thờỉ điểm gói tin đến đích). Giá trị này đƣợc tính bằng cách lấy tổng thời gian truyền thành công các gỏi tin chia cho tổng số gói tin đã đƣợc truyền.  Độ khai thác kênh truyền trung bình: là phần trăm thời gian khi kênh truyền ở trạng thái bận. Trong khi mô phỏng ta ghi lại tổng thời gian kênh truyền ở trạng thái bận, sau đó ta chia thời gian này cho tổng thời gian mô phỏng sẽ đƣợc kết quả là mức độ khai thác kênh trung bình. Cần chú ý rằng mọi độ đo ở trên đều là các giá tri trung bình theo thời gian, điều này chỉ ra rằng nếu thời gian mô phỏng càng dài thì các thông số thống kê này càng chính xác. Chƣơng trình 1.3 minh họa khung của một chƣơng trình mô phỏng có thể đƣợc sử dụng để triển khai hệ thống hàng đợi đơn kênh đã mô tả ở trên Chƣơng trình bắt đầu bằng việc khởi tạo các biến trạng thái hệ thống. Ta khai báo 2 biến là num_queue (dòng 3) và num_system (dòng 4) để lƣu trữ số lƣợng các gói tin đang đợi và số lƣợng tất cả các gói tin hiện có trong hệ thống (trong cả hàng đợi và kênh truyền). Biến SimClock đƣợc khởi tạo với giá trị 0. Tiếp theo, dòng 7 thực hiện việc tạo một danh sách sự kiện bằng cách gọi tiến trình create_list(). Ta giả định rằng hàm này tự động sinh ra các gói tin và liên kết mỗi gói tin với thời gian gói tin đi tới hàng đợi và thời - 21 -
  23. gian gói tin đi từ hàng đợi vào kênh truyền. Tiếp theo ta giả định rằng event_list ở đây đƣợc xây dựng bằng cách sử dụng một vài cấu trúc dữ liệu thích hợp biểu diễn loại sự kiện (đi tới hoặc hoàn thành) và đƣợc liên kết với nhãn thời gian (thời gian đi tới và thời gian phục vụ). Khởi đầu, chỉ có các sự kiện gói tin đi tới đƣợc đƣa vào trong event_list. Trong vòng lặp chính, mỗi lần lặp sẽ kiểm tra xem điều kiện kết thúc mô phỏng có thỏa mãn hay không. Điều kiện dừng trong dòng 9 là danh sách sự kiện ở trạng thái rỗng hoặc đồng hồ mô phỏng đạt tới ngƣỡng đƣợc định nghĩa trƣớc. Nếu điều kiện này không thỏa mãn, từ dòng 10 đến dòng 12 sẽ thực thi sự kiện tiếp theo bằng cách gọi thủ tục pkt_arrỉval() (dòng 15 đến 25) hoặc thủ tục pkt_complete() (dòng 26 đến 35). - 22 -
  24. Khi một gói tin đi tới, thủ tục pkt_arrival() (dòng 15-25) sẽ kiểm tra xem kênh truyền có ở trạng thái rỗi hay không. Nếu kênh truyền rỗi, kênh truyền đƣợc thiết lập ở trạng thái bận và sự kiện truyền gói tin thành công đƣợc đƣa vào danh sách sự kiện event_list. Nhãn thời gian đƣợc gán với sự kiện này có giá trị bằng với thời gian đồng hồ hiện tại (SimClock) cộng với thời gian truyền gói tin trên kênh truyền (T) đƣợc sinh một cách ngẫu nhiên. Ngƣợc lại, nếu kênh truyền bận, gói tin đƣợc đƣa vào trong hàng đợi và bộ đếm số gói tin trong hàng đợi num_queue đƣợc tăng lên 1 đơn vị. Số lƣợng gói tin trong hệ thống đƣợc cập nhật. Khi SimClock tiến đến sự kiện truyền một gói tin thành công, thủ tục pkt_complete đƣợc thực hiện (dòng 26 đến 35). Ở đây, số lƣợng gói tin trong hệ thống (num_system) đƣợc cập nhật. Bộ đếm num_queue đƣợc giảm đi 1 đơn vị. Sau mỗi lần truyền thành công một gói tin, cần thiết phải kiểm tra xem hàng đợi có rỗng hay không. Nếu không gói tin ở đầu hàng đợi sẽ đƣợc phục vụ ở lần kế tiếp. Điều này đƣợc thực hiện bằng cách đƣa gói tin vào kênh truyền và lập lịch cho nó sẽ truyền thành công tại thời điểm SỉmClock + T. Tuy nhiên, nếu hàng đợi rỗng, kênh truyền đƣợc thiết lập ở trạng thái rỗi và số lƣợng gói tin trong hàng đợi và hệ thống đƣợc thiết lập là 0. Thời gian sinh ra gói tin trong hệ thống và thời gian truyền gói tin đƣợc giả định là tuân theo các hàm xác suất số lớn có giá trị trong Bảng 1.1 Bảng 1.1. Xác suất sinh gói tin và thời gian truyền gói tin Đơn vị Sinh gói tin Thời gian truyền gói tin thời gian (xác suất) (xác suất) 1 0,2 0,5 2 0,2 0,3 3 0,2 0,1 4 0,2 0,05 5 0,1 0,05 6 0,05 7 0,05 Bảng 1.2 đƣa ra kết quả mô phỏng cho 10 gói tin. Thời gian gói tin sinh ra và thời gian truyền gói tin trên kênh truyền đƣợc biểu diễn trong cột 1 và cột 2. Cột 3 và cột 4 là thời gian gói tin đến hàng đợi và thời gian bắt đầu truyền. Cột 5 biểu diễn thời gian gói tin đợi trong hàng đợi cho đến khi đƣợc truyền. Thời gian đợi chính là kết quả của thời gian bắt đầu truyền gói tin trừ đi thời gian gói tin đi vào hàng đợi. Cuối cùng, cột 6 biểu diễn thời gian trễ khi truyền gói tin. Giá trị thời gian trễ là tổng thời gian gói tin đợi trong hàng đợi cộng với thời gian truyền gói tin trên kênh truyền. - 23 -
  25. Bảng 1.2. Mô phỏng hệ thống hàng đợi đơn kênh Thời gian Gói Thời gian Thời gian Thời gian đến Thời gian bắt Thời gian trong sinh ra truyền hàng đợi đầu truyền hàng đợi trễ 1 - 5 0 0 0 0 2 2 4 2 5 3 7 3 4 1 6 9 3 4 4 1 1 7 10 3 4 5 6 3 13 13 0 3 6 7 1 20 20 0 1 7 2 1 22 22 0 1 8 1 4 23 23 0 4 9 3 0 26 27 1 4 10 5 2 31 31 0 2 Bảng 1.3. Trình tự các sự kiện của gói tin theo thời gian mô phỏng Sự kiện Gói tin Đồng hồ mô phỏng Đi tới hàng đợi 1 0 Đi tới hàng đợi 2 2 Truyền thành công 1 5 Đi tới hàng đợi 3 6 Đi tới hàng đợi 4 7 Truyền thành công 2 9 Truyền thành công 3 10 Truyền thành công 4 11 Đi tới hàng đợi 5 13 Truyền thành công 5 16 Trên cơ sở kết quả trong Bảng 1.2, ta tính toán thời gian đợi trung bình và thời gian trễ trung bình bằng cách tính trung bình giá trị các cột 6 và cột 7. Kết quả của thời gian đợi trung bình trong hàng đợi là 1,0 và thời gian trễ trung bình là 3,5. - 24 -
  26. Bảng 1.3 đƣa ra trình tự theo thời gian xảy ra các sự kiện đối với 5 gói tin đầu tiên tƣơng ứng với thời gian mô phỏng (SimClock) Hình 1.7 biểu diễn sự biến đổi số lƣợng các gói tin theo thời gian trong hàng đợi. Khi gói tin đầu tiên đƣợc truyền, gói tin thứ hai đi tới hàng đợi ở thời điểm 2. Số lƣợng gói tin trong hệ thống lúc này là 2 (1 gói trong hàng đợi và 1 gói đang đƣợc truyền). Trong hình 1.7, sự kiện này tƣơng ứng với hình ảnh đồ thị chuyển tới mức 2 tại thời điểm 2. Tại thời điểm 5, khi nút B nhận thành công gói tin đầu tiên, gói tin tiếp theo trong hàng đợi sẽ đƣợc truyền. Do đó, đồ thị chuyển xuống mức 1 để biểu diễn rằng trong hệ thống chỉ có một gói tin. Tiến trình này tiếp tục diễn ra cho đến khi mọi gói tin đều đã đƣợc truyền. Theo Hình 1.7, giá trị độ khai thác kênh truyền trung binh đƣợc tính là 14/16 = 0,875. Hình 1. 7. Số lƣợng gỏi tin theo thời gian trong hệ thống - 25 -
  27. CHƢƠNG 2. GIỚI THIỆU VỀ NS2 2.1. Giới thiệu Network Simulator (phiên bản 2) hầu nhƣ đƣợc gọi với tên gọi NS2 là một công cụ mô phỏng hƣớng sự kiện đƣợc xây dựng để sử dụng trong nghiên cứu về lĩnh vực mạng và truyền thông. NS2 có thể mô phỏng các chức năng và các giao thức của cả mạng có dây cũng nhƣ mạng không dây chẳng hạn nhƣ các thuật toán định tuyến, giao thức TCP, giao thức UDP, Nói chung, NS2 cung cấp cho ngƣời dùng cách thức đặc tả các giao thức mạng và mô phỏng hoạt động của chúng. Do tính chất linh hoạt và mô đun hóa tự nhiên, NS2 đã đƣợc sử dụng rộng rãi trong cộng đồng những nhà nghiên cứu về lĩnh vực mạng truyền thông kể từ khi đƣợc sinh ra vào năm 1989. Kể từ khi ra đời cho đến nay, NS2 đã phát triển và biến đổi mạnh mẽ đánh dấu sự lớn mạnh và trƣởng thành của công cụ này với sự đóng góp của rất nhiều tổ chức và cá nhân trong lĩnh vực nghiên cứu về mạng và truyền thông. Trong số đó phải kể đến trƣờng đại học California và trƣờng đại học Comell đã phát triển công cụ mô phỏng mạng có tên là REAL là nền móng cơ sở để xây dựng NS. Vào năm 1995, Cục nghiên cứu các dự án quốc phòng cao cấp của Mỹ (DARPA) hỗ trợ phát triển NS qua dự án VINT. Hiện nay, Quỹ khoa học quốc gia của Mỹ đã phối hợp tài trợ để phát triển NS. Cuối cùng, một số lƣợng không nhỏ những nhà nghiên cứu và nhà phát triển trên toàn thế giới đang làm việc không ngừng để góp phần làm cho NS2 ngày càng mạnh mẽ và linh hoạt hơn. Mục tiêu chính của giáo trình này là cung cấp cho độc giả một cái nhìn sâu sắc vào kiến trúc bên trong của NS2. Chƣơng này đƣa ra các mô tả ngắn gọn về NS2. Những ngƣời mới bắt đầu học về NS2 nên sử dụng triệt để các tài nguyên trực tuyến về NS2. Ví dụ, website chính thức của NS2 ( cung cấp nhiều mã nguồn cũng nhƣ hƣớng dẫn cài đặt cho NS2. Các trang web: và là một trong các địa chỉ bạn đọc nên tham khảo. Tại đây bạn đọc có thể tìm thấy các các hƣớng dẫn và các ví dụ chi tiết khi thiết lập NS2 ở mức độ cơ bản. Khi bạn cần cần danh sách mã nguồn đầy đủ của NS2 do các nhà nghiên cứu cung cấp, bạn có thể truy cập và tải về từ ụa chỉ website: - tributed Code. Nội dung của chƣơng này chủ yếu là các kiến thức giới thiệu tồng quan về NS2. Cụ thể là, mục 2.2 trình bày về kiến trúc cơ bản của NS2. Mục 2.3 cung cấp thông tin phục vụ quá trình cài đặt NS2. Mục 2.4 đƣa ra các thƣ mục và các quy ƣớc của NS2. Mục 2.5 trình bày các bƣớc chính trong quá trình mô phỏng bằng NS2. Các ví dụ mô phỏng đơn giản đƣợc đƣa ra trong mục 2.6. Mục 2.7 mô tả cách tích.hợp các module C++ vào NS2 và cuối cùng, mục 2.8 tổng kết lại các vấn đề của chƣơng. - 26 -
  28. 2.2. Kiến trúc cơ bản Hình 2.1 cho ta thấy kiến trúc cơ bản của NS2. Ngƣời dùng sẽ sử dụng lệnh ns cùng với tham số đi kèm là tên file script mô phỏng. Thông thƣờng sau khi chạy mô phỏng, ngƣời dùng sẽ sử dụng file trace đƣợc tạo ra để vẽ đồ thị hoặc tạo mô phỏng trực quan. Hình 2.1. Kiến trúc cơ bản của NS2 Hai ngôn ngữ chính trong NS2 là C++ và OTcl (Object-Oriented Tool Command Language). Trong khi C++ tạo ra các mô tả bên trong cho các đối tƣợng mô phỏng thì OTcl thiết lập mô phỏng bằng cách liên kết và cấu hình các đối tƣợng cũng nhƣ lập lịch cho các sự kiện rời rạc. C++ và OTcl đƣợc liên kết với nhau bằng Tclcl. Một biến trong OTcl ánh xạ vào một đối tƣợng đƣợc gọi là một tham chiếu, về bản chất, một tham chiếu là một biến chuỗi trong miền OTcl và nó không chứa bất kỳ một hàm nào. Các hàm này đƣợc định nghĩa trong đối tƣợng C++ đƣợc nó ánh xạ tới. Trong miền OTcl, một tham chiếu hoạt động nhƣ một điểm truy cập để tƣơng tác với ngƣời dùng và các đối tƣợng OTcl khác. Thủ tục và biến có thể đƣợc định nghĩa trong một tham chiếu để thực hiện các tƣơng tác. Chú ý rằng trong một lớp miền OTcl, thủ tục thành viên đƣợc gọi là thủ tục instproc và biến thành viên đƣợc gọi là biến instvar. NS2 cung cấp một số lƣợng lớn các đối tƣợng C++ đã đƣợc xây dựng sẵn. Ta nên sử dụng các đối tƣợng C++ này trong khi thiết lập trình mô phỏng bằng cách sử dụng mã lệnh Tcl (script). Tuy nhiên, những ngƣời dùng cấp cao có thể thấy các đối tƣợng C++ này chƣa phù hợp với nhu cầu của họ. Trong tình huống này họ cần phải phát triển các đối tƣợng C++ của chính mình và sử dụng giao tiếp cấu hình OTcl để đƣa các đối tƣợng này vào sử dụng. Sau khi thực hiện một mô phỏng, NS2 kết xuất kết quả dƣới dạng text hoặc mô phỏng trực quan. Để dịch và biểu diễn kết quả mô phỏng trực quan, ngƣời ta sử dụng 2 công cụ là NAM (Network AniMator) và Xgraph. Một phần kết quả dạng text có thể đƣợc trích ra nhằm phục vụ cho các phân tích sâu hơn về kết quả mô phỏng. - 27 -
  29. 2.3. Cài đặt NS2 là một công cụ mô phỏng miễn phí. Có thể tải về NS2 từ địa chỉ chính thống là: Nó có thể chạy đƣợc trên nhiều nền hệ điều hành khác nhau bao gồm UNIX (hoặc Linux), Windows và Mac. Vì NS2 đƣợc phát triển trên môi trƣờng Unix cho nên dễ dàng cài đặt NS2 nhất trên môi trƣờng này. Để cài đặt NS2 trên môi trƣờng Windows, cần phải sử dụng một công cụ mô phỏng Unix trên Windows có tên gọi là Cygwin. Mã nguồn NS2 đƣợc đƣa ra ở 2 dạng. Thứ nhất là theo gói cài đặt tích hợp. Thứ hai là theo gói cài đặt từng thành phần. Với gói cài đặt tích hợp, ngƣời dùng sẽ có mọi thành phần cần thiết cùng với một vài thành phần tùy chọn của NS2. Những ngƣời mới bắt đầu sử dụng NS2 nên lựa chọn gói này. Khi đó, họ có thể sử dụng lệnh ―install‖ để cấu hình môi trƣờng NS2 và lệnh ―make‖ để tạo file NS2 có thể thực thi đƣợc. Gói NS2 tích hợp bao gồm các thành phần chính sau:  NS release 2.30  Tcl/Tk release 8.4.13  OTcl release 1.12  TclCLrelease 1.18 Ngoài ra nó còn bao gồm các thành phần tùy chọn sau:  NAM release 1.12: Công cụ hiển thị kết quả mô phỏng trực quan  Zlib version 1.2.3: Thƣ viện cần thiết cho NAM  Xgraph version 12.T. Công cụ vẽ dữ liệu mô phỏng với các nút tƣơng tác nhƣ di chuyển, phóng to/thu nhỏ, in ấn, Cách cài đặt NS2 theo dạng cài đặt từng thành phần là cách cho phép cài đặt riêng rẽ từng thành phần NS2 đã liệt kê ở trên theo nhu cầu của từng ngƣời sử dụng. Cách làm này giúp tiết kiệm lƣợng dữ liệu phải download và không gian lƣu trữ. Tuy nhiên, cách làm này là tƣơng đối phức tạp đối với những ngƣời dùng mới bắt đầu do đó chỉ những ngƣời dùng có kinh nghiệm mới nên sử dụng cách cài đặt này. 2.3.1. Cài đặt NS2 bằng bộ cài tích hợp trên các hệ thống nền Unix Trên các hệ điều hành Unix hoặc nền Unix, việc cài đặt NS2 rất đơn giản bằng việc chạy lệnh install và theo các chỉ dẫn cài đặt sau đó. Yêu cầu duy nhất là máy tính phải có trình biên dịch C ++ các lệnh sau là các lệnh cài đặt và kiểm tra NS2 theo bộ cài đặt tích hợp: shell>./install shell>./validate - 28 -
  30. Tiến trình kiểm tra NS2 đƣợc thực hiện một cách đơn giản bằng cách chạy một số lƣợng các lệnh làm việc để kiểm tra các chức năng cơ bản của các thảnh phần đã đƣợc cài đặt. 2.3.2. Cài đặt NS2 bằng bộ cài tích hợp trên các hệ thống Windows Để chạy NS2 trên các hệ điều hành Windows, cần phải đi đƣờng vòng một chút. Tƣ tƣởng cơ bản của phƣơng pháp nảy là tạo ra một chƣơng trinh mô phỏng các chức năng giống nhƣ trong môi trƣờng Unix trên các máy tính chạy hệ điều hành Windows. Một trong những chƣơng trình mô phỏng rất phổ biến là Cygwin. Sau khi đã cài đặt đảm bảo Cygwin có thể làm việc đƣợc thì cách cài đặt NS2 diễn ra giống nhƣ khi cài trên các hệ thống nền Unix. Mô tả chi tiết về việc cài đặt NS2 trên hệ điều hành Windows có trên website NS2‘s Wiki ( trong đó có thể tìm thấy cả những thông tin về các biện pháp giải quyết khi việc cài đặt gặp lỗi. Chú ý rằng Cygwin không cài đặt mọi gói cần thiết để chạy NS2. Ngƣời dùng, cần cài thêm các gói đƣợc liệt kê trong Bảng 2.1 sau: Bảng 2.1. Các gói Cygwin bổ sung cần thiết để chạy NS2 Nhóm Các gói Phát triển (Development) gcc, gcc-objc, gcc-g++, make Công cụ (Utils) patch Xll xorg-xl 1-base, xorg-xl 1-level Cygwin là một phần mềm miễn phí. Ta có thể tải về và xem thêm các thông tin khác về nó từ địa chỉ www.cygwin.com. cần chú ý là các phiên bản Cygwin khác nhau có thể cài các gói mặc định khác nhau. Phụ thuộc vào từng phiên bản của Cygwin mà ngƣời dùng có thể phải cài thêm ít hoặc nhiều các gói bổ sung. 2.4. Thƣ mục và quy ƣớc 2.4.1. Thƣ mục Giả sử NS2 đƣợc cài đặt trong thƣ mục có tên là nsallinone – 2.30. Hình 2.2 đƣa ra cấu trúc thƣ mục nằm phía trong thƣ mục nsallinone – 2.30. Trong cây thƣ mục nsallinone – 2.30. là thƣ mục 1. Ở mức 2 có thƣ mục Tclcl-1.18. là thƣ mục chứa các lớp trong TclCL (VD: lớp Tcl, TclObject, Tcl Class) Mọi module mô phỏng của NS2 đều nằm trong thƣ mục ns-2.30 ở mục 2. Từ đây trở về sau ta sẽ quy ƣớc viết thƣ mục ns2-2.30 là ~ ns/ là thƣ mục tclcl-1.18 là ~tclcl/. - 29 -
  31. Hình 2.2: cấu trúc thƣ mục của NS2 Ở mức 3, các module trong cây phân lớp thông dịch đều nằm trong thực mục tcl. Trong số các module này, những module đƣợc sử dụng thƣờng xuyên nhất đều đƣợc lƣu trong thƣ mục lib ở mức 4. Các module mô phỏng trong cây biến dịch đƣợc phân bố trong các thƣ mục ở mức 2. Ví dụ thƣ mục tools chứa các lớp sinh số ngẫu nhiên. Thƣ mục common chứa các module cơ bản liên quan tới quá trình chuyển tiếp gói tin nhƣ simulator, scheduler, connector, lacket, Các thƣ mục queue, tcp, trace chứa các module mô phỏng tƣơng ứng với hàng đợi, giao thức TCP và tệp vết. 2.4.2. Các quy ƣớc Trong cuốn sách này và trong NS2 sử dụng một số thuật ngữ và định dạng nhƣ sau: Các thuật ngữ  Mã lệnh mô phỏng của NS2 đƣợc gọi là mã lệnh mô phỏng Tcl.  Cây phân cấp lớp C++ đƣợc gọi là cây biên dịch (compiled hierachy). Cây phân cấp lớp OTcl đƣợc gọi là cây thông dịch (interpreted hierachy). Biến và hàm thành viên thuộc một lớp biên dịch đƣợc gọi là biến và hàm. Biến thành viên và hàm thành viên thuộc một lớp thông dịch đƣợc gọi là biến instvar và thủ tục instproc. Ta sẽ thấy trong mục 3.4.4, command là một thủ tục instproc đặc biệt đƣợc thực thi trong cây biên dịch. Do đó mọi đối tƣợng OTcl sẽ liên quan tới các biến instvar và các thủ tục instprc trong khi một đối tƣợng C++ sẽ liên quan tới các biến và các hàm.  Mặc dù có đôi chút khác biệt nhƣng thuật ngữ ―OTcl‖ và ―thông dịch đƣợc sử dụng thay thế cho nhau trong suốt cuốn sách này. Tƣơng tự nhƣ vậy đối với thuật ngữ ―C++‖ và ―Biên dịch‖. Các biến OTcl và các biến thông dịch đều đƣợc coi là các biến trong cây thông dịch, các hàm C++ và các hàm biên dịch đều đƣợc coi là các hàm trong cây biên dịch. Trình biên dịch C++ đƣợc gọi là trình biên dịch và trình thông dịch OTcl đƣợc gọi là trình thông dịch.  Đối tƣợng ―LopMoPhong‖ là cách gọi tắt của một đối tƣợng của lớp ―LopMoPhong‖. Con trỏ ―LopMoPhong‖ là cách gọi tắt của một con trỏ tham chiếu đến một đối tƣợng của lớp ―LopMoPhong‖. Ví dụ nhƣ trong các câu lệnh ―Queue* q‖ và - 30 -
  32. ―Packet* p‖ thì q đƣợc xem là đối tƣợng Queue và p đƣợc xem là con trỏ Packet. Ta cũng giả định thêm rằng, nếu các lớp ―LopConl‖ hoặc ―LopCon2‖ là các lớp có dẫn xuất từ lớp ―LopCha‖ thì thuật ngữ đối tƣợng ―LopCha‖ sẽ tham chiếu tới bất kỳ một đối tƣợng nào là thể hiện của lớp ―LopCha‖ hoặc tới các đối tƣợng là thể hiện của các lớp dẫn xuất từ ―LopCha‖ (chẳng hạn nhƣ các đối tƣợng của các lớp ―LopConl‖ hoặc ―LopCon2‖)  Đối tƣợng đƣợc khởi tạo từ lớp C++ hoặc lớp OTcl đều đƣợc gọi là đối tƣợng trong cuốn sách này.  NS2 gồm 2 ngôn ngữ. Giả sử rằng ―A‖ và ―B‖ là 2 đối tƣợng đƣợc viết trên 2 ngôn ngữ tƣong ứng với nhau. Khi đó ―A‖ dƣợc gọi là đối tƣợng bóng (shadow object) của ―B‖ và ―B‖ lại đƣợc gọi là đối tƣợng bóng của ―A‖.  Xét hai nút trong Hình 3.2. Trong sơ đồ này, nút bên phải luôn luôn gửi các gói tin cho nút bên trái. Các nút bên phải đƣợc gọi là các nút gửi dữ liệu (upstream objects) và các nút bên trái đƣợc gọi là các nút nhận dữ liệu (downstream objects) hay các nút đích (target objects). Thông thƣòng, một đối tƣợng có thể có một hoặc nhiều đích tuy nhiên mỗi gói tin chỉ đƣợc gửi tới một đích cụ thể trong số các đích này. Trên gói của đối tƣợng gửi, một đối tƣợng nhận có thể đƣợc xem là một đối tƣợng chuyển tiếp gói tin (forwarding object). Các ký hiệu  Giống nhƣ trong C++, ta quy ƣớc ký hiệu chỉ ra phạm vi cùa các hàm và thủ tục instproc. Ví dụ: TcpAgent::send( )  Giá trị của biến đƣợc biểu diễn trong cặp dấu =7.  Dấu nhắc lệnh trong NS2 bắt đầu bằng dấu ―»‖ -  Trong cuốn sách này, mã lệnh minh hoạ đƣợc trích từ các file NS2. Tên file chứa mã lệnh có trong dòng đầu tiên của đoạn mã lệnh minh hoạ.  Tên lớp có thể bao gồm nhiều từ. Chữ cái đầu tiên của mỗi từ đƣợc viết hoa. Trong cây các lớp thông dịch, một lớp thừa kế đƣợc viết với phần tiền tố là tên của các lớp cha và đƣợc ngăn cách bởi dấu ‗V‘. Đối với một lớp thuộc cây các lớp biên dịch, tên lớp đƣợc viết với phần hậu tố là tên các lớp cha viết liền kề. Bảng 2.2 minh hoạ các ví dụ về quy ƣớc đặt tên trong NS2 - 31 -
  33. Bảng 2.2. Ví dụ về các quy ƣớc đặt tên trong NS2 Thành phần Cây thông dịch Cây biên dịch Lớp cơ sở Agent Agent Lớp thừa kế Agent/TCP TcpAgent Lớp thừa kế (mức 2) Agent/Tcp/Reno RenoTcpAgent Hàm thuộc lớp installNext install_next Biến thuộc lớp windowOption_ wnd_option_ 2.5. Chạy mô phỏng NS2 . Triệu gọi chƣơng trình NS2 Sau khi đã cài đặt và/hoặc biên dịch lại NS2 (xem mục 2.7), file thực thi ns2 đƣợc tạo ra trong thƣ mục gốc NS2. Để gọi ns2 chạy, ta sử dụng cú pháp lệnh sau từ môi trƣờng Shell: >>ns [ ] [ ] ở đây và là các tham số tuỳ chọn. Nếu ta chạy lệnh này mà không có tham số, lệnh này sẽ khởi tạo môi trƣờng NS2 mà trong đó NS2 sẽ đợi ngƣời dùng nhập lệnh từ bàn phím để chạy trực tiếp từng dòng lệnh một. Nếu tham số đầu tiên đƣợc chỉ định, NS2 sẽ thông dịch file script đầu vào theo cú pháp Tcl. Các tham số nếu có số lƣợng nhiều hơn 1 đƣợc phân tách nhau bằng dấu cách đƣợc đƣa vào file Tcl . Trong file này, tham số đầu vào đƣợc lƣu trữ trong biến xây dựng bên trong agrv. . Các bƣớc mô phỏng chính bằng NS2 Kịch bản mô phỏng bằng NS2 bao gồm ba bƣớc chính sau: Bƣớc 1: Thiết kế mô phỏng Bƣớc đầu tiên trong quá trình mô phỏng mạng là thiết kế mô phỏng. Trong bƣớc này, ngƣời sử dụng phải xác định các thông tin bao gồm: mục đích mô phỏng, cấu hình mạng và các giả định, các độ đo về hiệu năng và loại kết quả mô phỏng mong muốn đạt đƣợc. Bƣớc 2: Cấu hình và chạy mô phỏng Bƣớc này sẽ triển khai phần thiết kế trong bƣớc 1. Bƣớc này gồm hai giai đoạn chính:  Giai đoạn cấu hình mạng: Trong giai đoạn này, các thành phần mạng (chẳng hạn nhƣ node, TCP, UDP, ) đƣợc tạo ra và cấu hỉnh theo thiết kế mô phỏng. Các sự kiện truyền dữ liệu cũng đƣợc lập lịch về thời gian bắl đầu diễn ra. - 32 -
  34.  Giai đoạn mô phỏng: Giai đoạn này khởi động tiến trình mô phỏng đã đƣợc cấu hình trong pha cấu hình mạng. Giai đoạn này sẽ phải duy trì một bộ đồng hồ mô phỏng và thực hiện các sự kiện theo trình tự thời gian. Giai đoạn này thƣờng kết thúc khi đồng hồ mô phỏng đạt tới một ngƣỡng giá trị thời gian xác định trƣớc trong giai đoạn cấu hình mạng. Trong hầu hết mọi trƣờng hợp, nên định nghĩa kịch bản mô phỏng trong file script Tcl và đƣa file này vào làm tham số đầu vào cho lời triệu gọi chạy ns2. Bƣớc 3: Xử lý kết quả mô phỏng Các tác vụ chính trong bƣớc này là việc kiểm tra độ toàn vẹn của chƣơng trình và đánh giá hiệu năng mô phỏng. Trong khi tác vụ đầu tiên thƣờng là tác vụ gỡ rối thì tác vụ thứ hai thƣờng thực hiện việc thu thập các kết quả một cách chính xác và so sánh các kết quả thu thập đƣợc. Ví dụ mô phỏng Trong ví dụ này, ta sẽ thực hiện mô phỏng một mạng đơn giản qua ba bƣớc sau: Bƣớc 1: Thiết kế mô phỏng Hình 2.3 đƣa ra cấu hình của mạng đƣợc mô phỏng đang xét tới trong ví dụ này. Mạng này bao gồm 5 nút từ nút n0 tới nút n4. Nút n0 gửi các gói tin với tốc độ cố định (CBR) tới nút n3 và nút nl sử dụng giao thức FTP gửi dữ liệu tới nút n4. Luồng dữ liệu từ n0 tới n3 sử dụng giao thức UDP và luồng dữ liệu từ nl tới n4 sử dụng giao thức TCP. Trong NS2, đối tƣợng truyền của hai giao thức này là UDP agent và TCP agent trong khi các đối tƣợng nhận tƣơng ứng là Null agent và TCP sink agent. Hình 2.3. Mô hình mạng mô phỏng - 33 -
  35. Bƣớc 2: Cấu hình và chạy mô phỏng Chƣơng trình 2.1-2.2 đƣa ra hai phần của mã lệnh mô phỏng Tcl thực hiện mô hình bài toán ví dụ mô phỏng trong Hình 2.3. Xét Chƣơng trình 2.1. Chƣơng trình này tạo ra một đối tƣợng mô phỏng Simulator trong dòng 1. Tiếp theo nó tạo ra một file vết trace trong các dòng 2-3 và một file vết mô phỏng trực quan NAM trong các dòng 4-5. Nó định nghĩa thủ tục KetThuc () trong các dòng 6-13. Cuối cùng, nó tạo ra các nút và liên kết chúng với nhau tƣơng ứng trong các dòng 14-18 và 19-24. Lệnh ―new Simulator‖ trong dòng 1 tạo ra đối tƣợng Simulator. Biến ns chứa tham chiếu của đối tƣợng Simulator đƣợc tạo ra. Các dòng 2 và 4 mở các file out.tr và out.nam để ghi. Các biến FileLuuVet và flie Nam là các tham chiếu của 2 file tƣơng ứng. Các dòng 3 và 5 dùng để thiết lập chế độ lƣu vết thông thƣờng và lƣu vết mô phỏng đồ họa vào các tham chiếu của các file tƣơng ứng đã tạo ra. Thủ tục KetThuc [] đƣợc gọi trƣớc khi hoạt động mô phỏng kết thúc. Từ khoá ―global‖ báo cho trình biên dịch Tcl biết rằng các biến ns, tệp Trace và tệp NAM đƣợc định nghĩa là các biến public. Dòng 8 đẩy dữ liệu trong bộ đệm lƣu vết các gói tin vào các biến tƣơng ứng. Dòng 9-10 đóng các file có tham chiếu là tệp Trace và tệp NAM. Dòng 11 thực thi lệnh ―nam out.nam” từ môi trƣợng Shell và dòng 12 thực thi lệnh thoát NS2 với mã trả về là 0. # Tao mot simulator set ns [new Simulator] # Mo trace file set f [open cai.tr w] $ns trace-all $f # Mo nam trace file set nf [open cai.nam w] $ns namtrace-all $nf # Define a 'KetThuc' procedure proc finish {} { global ns nf $ns flush-trace # Close the trace file close $nf - 34 -
  36. # Execute nam on the trace file exec nam cai.nam & exit 0 } # Tao 8 nut set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] set n4 [$ns node] set n5 [$ns node] set n6 [$ns node] set n7 [$ns node] # Dinh nghia mau $ns color 0 Green ; $ns color 1 Red ; $ns color 2 Blue; # Tao link giua cac nut $ns duplex-link $n0 $n3 1.5Mb 5ms DropTail $ns duplex-link $n1 $n3 1.5Mb 5ms DropTail $ns duplex-link $n2 $n3 1.5Mb 5ms DropTail $ns duplex-link $n3 $n4 2Mb 10ms DropTail $ns duplex-link $n4 $n5 1.5Mb 5ms DropTail $ns duplex-link $n4 $n6 1.5Mb 5ms DropTail $ns duplex-link $n4 $n7 1.5Mb 5ms DropTail # Dinh nghia kick thuoc hang doi cho lien ket giua n3 va n4 $ns queue-limit $n3 $n4 15 # Xac dinh cach bo tri cua cau truc lien ket $ns duplex-link-op $n0 $n3 orient down $ns duplex-link-op $n1 $n3 orient right $ns duplex-link-op $n2 $n3 orient up $ns duplex-link-op $n3 $n4 orient right $ns duplex-link-op $n4 $n5 orient up - 35 -
  37. $ns duplex-link-op $n4 $n6 orient right $ns duplex-link-op $n4 $n7 orient down Dòng 14-18 tạo ra các đối tƣợng nút mạng bằng cách sử dụng thủ tục ―node‖ của đối tƣợng Simulator với tham chiếu là ns. Các dòng 19-23 sử dụng thủ tục ―duplex-link (src dst bw delay qtype} của lớp Simulator để kết nối mỗi cặp nút bằng liên kết hai chiều với src là nút bắt đầu, dst là nút kết thúc, bw là băng thông của liên kết, delay là độ trễ của liên kết và qtype là kiểu của hàng đợi giữa nút src và nút dst. Tƣơng tự nhƣ thủ tục duplex-link { }, dòng 23 tạo một liên kết một chiều bằng cách sử dụng thủ tục sỉmplex- link { } của lớp Simulator. Cuối cùng, dòng 24 thiết lập kích cỡ hàng đợi giữa nút n2 và nút n3 là 40 gói tin. Tiếp theo, ta hãy xem xét phần hai của mã lệnh mô phỏng Tcl trong Chƣơng trình 2.2. - 36 -
  38. Các dòng 25-30 tạo kết nối UDP, dòng 31-34 tạo nguồn lƣu lƣợng phát gói tin CBR, dòng 35-40 tạo kết nối TCP và 41-42 tạo phiên FTP. Các dòng từ 43- 47 lập lịch cho các sự kiện rời rạc. Cuối cùng trình mô phỏng đƣợc khởi động bằng các sử dụng thủ tục run{} đƣợc liên kết với tham chiếu ns của chƣơng trình mô phỏng. Để tạo một kết nối UDP, dòng 25 tạo ra tác tử gửi kiểu udp và dòng 27 tạo ra tác tử nhận kiểu null. Dòng 26 là thủ tục attach-agentl } của lớp Simulator với 2 tham số đầu vào là một nút và một tác tử. Nó thực hiện nhiệm vụ gắn kết tác tử udp và nút n0. Tƣơng tự nhƣ vậy, dòng 28 thực hiện việc gắn kết tác tử null với nút n3. Thủ tục connect{from_agt to_agt} trong dòng 29 thiết iập kết nối để tác tử from_agt sẽ truyền dữ liệu đƣợc sinh ra tới tác tử to_agt. Và cuối cùng, dòng 30 thiết lập định danh dòng UDP là 1. Từ dòng 35 tới 40 là phần thiết lập kết nối TCP tƣơng tự nhƣ phần thiết lập kết nối UDP (từ dòng 25 tới 30) đã đƣợc giải thích. Dòng 31 tạo ra một nguồn lƣu lƣợng dữ liệu CBR. Nó đƣợc gắn vào tác tử udp trong dòng 32. Kích thƣớc gói tin và tốc độ truyền của kết nối CBR đƣợc thiết lập là 1000 byte và 2 Mpbs. Tƣơng tự nhƣ vậy, dòng 41 tạo ra một phiên FTP và gắn nó vào tác tử tcp trong dòng 42. Trong NS2, các sự kiện rời rạc đƣợc lập lịch bằng cách sử dụng thủ tục at của lớp Simulator. Thủ tục này có 2 tham số đầu vào là giá trị thời điểm thực thi và chuỗi chứa lệnh sẽ đƣợc thực thi tại thời điểm đó. Dòng 43 và 44 thực thi phiên ứng dụng FTP tại thời điểm giây thứ 0,05 và thực thi truyền lƣu lƣợng CBR tại giây thứ 0,1. Dòng thứ 45 và 46 kết thúc truyền lƣu lƣợng FTP và CBR tƣơng ứng tại giây thứ 60 và 60,5. Dòng 47 kết thúc chƣơng trình mô phỏng bằng cách gọi thủ tục KetThuc tại giây 61. Chú ý rằng các nguồn lƣu lƣợng FTP và CBR đƣợc khởi động bằng lệnh start và dừng bằng lệnh stop{}. Ta thực hiện chạy đoạn mã mô phỏng trên bằng cách thực hiện lệnh »ns chuongtrinh.tcl trong môi trƣờng Shell. Khi các file lƣu vết (trace) đƣợc tạo ra vào cuối thời gian mô phỏng, chƣơng trình mô phỏng trực quan NAM sẽ đƣợc thực thi (từ thủ tục KetThuc () ) Bƣớc 3: Xử lý sau mô phỏng - Phân tích vết gói tin Việc lƣu vết gói tin sẽ ghi lại các thông tín chi tiết về quá trình các luồng truyền gói tin. Có 2 kỹ thuật lƣu vết là lƣu vết kiểu dữ liệu text và lƣu vết kiểu dữ liệu mô phỏng trực quan (NAM). • Lƣu vết theo kiểu dữ liệu text Việc lƣu vết kiểu dữ liệu text ghi lại chi tiết quá trình truyền các gỏi tin qua điểm lấy dữ liệu trong mạng. Một phần của dữ liệu lƣu vết kiểu text đƣợc đƣa ra ở dƣới đây - 37 -
  39. Ta thấy mỗi một dòng trong file lƣu vết bao gồm 12 cột. Ý nghĩa của các cột nhƣ sau:  Định danh kiểu: Kiểu bản ghi. Bao gồm 4 kiểu sự kiện đối với gói tin o ―r‖: nhận gói o ―+‖: đƣa gói vào hàng đợi o ―-― lấy gói ra khỏi hàng đợi o ―d‖: gói bị thất lạc  Thời gian (time); thời điểm xảy ra sự kiện  Nút nguồn: định danh nút nguồn gửi gói tin  Nút đích: định danh nút đích nhận gói tin  Tên gói: Tên loại gói tin của tầng ứng dụng  Kích thƣớc gói tin: Độ dài gói tin tính theo đơn vị byte.  Cờ: Trƣờng này sẽ hiển thị là trong trƣờng hợp không xác định  Định danh luồng: Giá trị xác định tính duy nhất của luồng dữ liệu  Địa chỉ nguồn: Địa chỉ của nút nguồn gửi gói tin.  Địa chỉ đích: Địa chỉ của nút đích nhận gói tin. - 38 -
  40.  Số thứ tự: Giá trị nguyên xác định số thứ tự của gói tin  Định danh gói tin: Giá tri xác định tính duy nhất của gói tin Toàn bộ dữ liệu lƣu vết nếu xử lý thủ công có thể sẽ rất khó khăn và không cần thiết trừ khi ta thực hiện một trong các phƣơng pháp phân tích trên dữ liệu này để trích ra một tập con dữ liệu cần thiết cho các phân tích sau đó. Ví dụ nhƣ thông lƣợng trung bình của một liên kết nào đó có thể đƣợc tính bằng cách chỉ trích các cột và các trƣờng có liên quan đến liên kết đó trong file lƣu vết. Có hai ngôn ngữ phổ biến đƣợc sử dụng trong những công việc nhƣ thế này là AWK và Perl. Tiến trình lƣu vết gói tin trên theo kiểu dữ liệu text đƣợc kích hoạt bằng lệnh ―$ns trace-all $FileLuuVet‖, trong đó, ns là tham chiếu của đối tƣợng Simulator và FileLuuVet là tham chiếu của đối tƣợng file lƣu vết gói tin kiểu text. Câu lệnh này báo cho NS2 cần phải làm công việc là lƣu vết các gói tin. Khi tạo ra một đối tƣợng, NS2 cũng tạo ra một đối tƣợng lƣu vết để thu thập mọi thông tin chi tiết về quá trình di chuyển của gói tin trong mạng mô phỏng. Do đó, câu lệnh ―trace-all‖ phải đƣợc thực hiện trƣớc khi các đối tƣợng đƣợc tạo ra. • Lƣu vết kiểu dữ liệu mô phỏng trực quan (NAM) Lƣu vết kiểu NAM ghi lại chi tiết về quá trình mô phỏng trong một file text và sử dụng file text để trình diễn lại tiến trình mô phỏng đã lƣu vết dƣới dạng đồ họa trực quan. Lƣu vết kiểu NAM đƣợc kích hoạt bằng lệnh ―$ns namtrace-all $FỉleNAM‖ trong đó ns là tham chiếu của đối tƣợng Simulator và FileNAM là handle của file chứa dữ liệu lƣu vết kiểu NAM. Sau khi kết xuất dữ liệu ra file lƣu vết NAM, tiến trình trình diễn có thể đƣợc gọi trực tiếp từ dấu nhắc lệnh qua lệnh sau: >> nam filename.nam Trong NAM có nhiều đặc tính trình diễn đồ hoạ, chẳng hạn nhƣ các luồng truyền các gói tin với màu sắc khác nhau, các nút kéo thả (di chuyển vị trí), hiển thị nhãn nút tại một tình huống cụ thể, thiết lập hình dạng các nút, tạo màu cho các liên kết đặc biệt và theo dõi hàng đợi. 2.6. Các thành phần C++ trong NS2 và Công cụ Make Trong khi phát triển một ứng dụng mô phỏng NS2, ta thƣờng hay phải tạo ra các module C++ của riêng mình để bổ sung vào các thƣ viện đã có. Chẳng hạn nhƣ khi một nhà phát triển gặp phải công việc phải theo dõi mọi tất cả các file đƣợc tạo ra nhƣ là một phần của NS2. Khi có sự thay đổi trong một file, thông thƣờng cần phải dịch lại một số file phụ thuộc vào file thay đổi. Việc dịch lại mỗi file nhƣ vậy là không khả thi trong thực tế. Trong Unix, có một công cụ tên là make có thể đƣợc dùng để giải quyết vấn đề này. Trong phần này, ta sẽ giới thiệu về công cụ này và thảo luận cách sử dụng nó theo hƣớng phát triển trình mô phỏng trong NS2. Công cụ make rất hữu ích trong việc quản lý việc phát triển các phần mềm đƣợc viết bằng các ngôn ngữ tƣơng thích với ngôn ngữ lập trình bao gồm cả ngôn ngữ C++. Nói - 39 -
  41. chung, chƣơng trình make sẽ tự động theo dõi mọi file đƣợc tạo ra trong quá trình phát triển. Các file phụ thuộc lẫn nhau sẽ đƣợc tự động biên dịch và liên kết lại nếu một trong số chúng có sự thay đổi trong quá trình phát triển. . Gọi công cụ Make Công cụ ―make‖ có thể đƣợc gọi từ môi trƣờng Shell của UNIX bằng lệnh sau: >> make [-f myfile] Trong đó ―make‖ là từ khoá bắt buộc, nội dung trong cặp ngoặc vuông là tuỳ chọn. Mặc định, lời gọi make không có tham số đầu vào. Trong trƣờng hợp này make sẽ thực hiện việc biên dịch lại và liên kết lại các mã nguồn theo chỉ định có trong file mô tả mặc định tên là Makefile. Nếu lời gọi make có kèm theo tham số thi công cụ này sẽ tìm file mô tả trong thƣ mục chứa file Makefile mặc định và sử dụng file mô tả này thay thế cho file Makefile . File mô tả cho công cụ Make File mô tả cho công cụ make chứa các chỉ dẫn về cách thức biên dịch lại và liên kết lại các mã lập trình. File mô tả mặc định có tên là ―Makefile‖. Nội dung của file mô tả bao gồm tên của các file tạo nên file thực thi đƣợc, các phụ thuộc giữa chúng và cách thức biên dịch lại cho mỗi file. Những mô tả nhƣ vậy đƣợc xác định qua các chuỗi gọi là ―luật phụ thuộc‖. Mỗi một luật phụ thuộc bao gồm ba thành phần: các đích, các phụ thuộc và các lệnh. Định dạng của luật phụ thuộc đƣợc biểu diễn nhƣ sau: [ ]: [ ] [ ] Một đích với dấu hai chấm đi kèm là thành phần bắt buộc. Mọi thứ khác trong cặp ngoặc vuông là tuỳ chọn. Thông thƣờng là tên của một file cần tạo lại nếu trong các file phụ thuộc chỉ ra sau dấu hai chấm (:) có bất kỳ sự thay đổi nào. Nếu có sự thay đổi nào đƣợc phát hiện, sẽ đƣợc thực thi để tạo lại file đích. Ví dụ 2.2 (Ví dụ file mô tả): Giả sử ta có một file thực thi đƣợc có tên là channel bao gồm ba file nguồn là main.c, face.c và model.c. File model.c phụ thuộc và file model.h. File Makefỉle trong trƣờng hợp này sẽ có nội dung nhƣ sau: - 40 -
  42. Trong mã nguồn của Ví dụ 2.2, dòng đầu tiên bắt đầu bằng dấu thăng (#) là chú thích. Khi lệnh make đƣợc gọi, nó sẽ bắt đầu kiểm tra lần lƣợt từng đích một. Đầu tiên nó sẽ kiểm tra đích channel. Khi đó nó thấy rằng channel phụ thuộc vào các file đối tƣợng main.o, fade.o và model.o. Tiếp theo nó sẽ kiểm tra và thấy rằng các file đối tƣợng này đƣợc chỉ định là các file đích. Trong trƣờng hợp này, lệnh make sẽ tiếp tục kiểm tra các phụ thuộc của file đối tƣợng main.o và phát hiện ra rằng file đối tƣợng nàv phụ thuộc vào file main.c. Sau đó, make sẽ lại tiếp tục kiểm tra trong phần còn lại xem file maỉn.c có còn phụ thuộc vào file nào nữa hay không và rõ ràng là nó không tìm thấy. Khi đó nó sẽ chạy lệnh ―cc -c main.c‖ để tạo ra file đối tƣợng main.o. Tiếp theo make sẽ xử lý tƣơng tự đối với các đích là fade.o và model.o. Khi một trong các file đối tƣợng đƣợc cập nhật, make sẽ quay trở lại đích channel và thực thi lệnh ―cc - o channel main.o fade.o model.o‖ để biên dịch 3 file đối tƣợng này tạo thành file thực thi channel. Cuối cùng, ta chú ý rằng có một đích đặc biệt đƣợc gọi là đích giả mạo. Đích này không chứa tên của bất kỳ file nào trong cây phụ thuộc. Đó là đích ―clean‖. Thông thƣờng nó sẽ thực hiện một hàm ―clean‖ để xoá mọi file đối tƣợng không cần thiết nữa sau quá trinh biên dịch và liên kết. Trong Ví dụ 2.2, chuỗi ―main.o fade.o mode.o‖ đƣợc sử dụng nhiều hơn một lần. Để tránh khỏi việc gõ lại chuỗi này (có thể bị lỗi chính tả hoặc thiếu sót khi gõ), ta định nghĩa một macro thay thế. Ví dụ ta có thể định nghĩa một macro thay thế chuỗi ―maỉn.o fade.o model.o‖ nhƣ sau: OBJS = main.o fade.o model.o Sau khi định nghĩa macro này, ta sẽ thay thế chuỗi này trong file mô tả make theo dạng $(OBJS) hoặc ${OBJS}. . File mô tả của NS2 File mô tả của NS2 định nghĩa trong file Makefile nằm trong thƣ mục gốc của NS2. Nó chứa các mô tả chi tiết cần thiết để biên dịch và liên kết lại NS2. Các chi tiết cần quan tâm chính bắt đầu bằng các từ khoá sau:  INCLUDES = : Các mục đằng sau từ khoá này là các thƣ mục sẽ đƣợc đƣa vào trong môi trƣờng NS2.  OBJ_CC = và OBJ_STL = : Các mục đằng sau hai từ khoá này bao gồm toàn bộ các file đối tƣợng NS2. Khi ta phát triển một module C++ mới, ta phải thêm tên file đối tƣợng của module này vào đây.  NS_TCL_LIB = : Các mục đằng sau từ khoá này là các file Tcl của NS2. Khi ta phát triển một module OTcl mới, ta phải thêm tên file Tcl của module này vào đây Giả sử ta có một module bao gồm các file C++ là myc.cc, myc.h và mytcl.tcl nằm trong thƣ mục myfỉles trong thƣ mục gốc NS2 thì các bƣớc để tích hợp module này vào NS2 bao gồm: - 41 -
  43.  Bƣớc 1: Thêm chuỗi ―-L/myfỉles‖ vào dòng đƣợc bắt đầu bằng cụm ký tự ―INCLUDE =‖ trong file Makefile.  Bƣớc 2: Thêm chuỗi ―myfỉles/myc.o‖ vào dòng bắt đầu bằng cụm ký tự ―OBJ_CC =‖ hoặc ―OBJ_STL =‖ trong file Makefile  Bƣớc 3: Thêm chuỗi ―myfiles/mytcl.tcl‖ vào dòng bắt đầu bằng cụm ký tự ―NS_TCL_LIB =‖ trong file Makefile  Bƣớc 4: Chạy lệnh make từ môi trƣờng Shell Sau khi chạy lệnh ―make‖, file thực thi ns sẽ đƣợc tạo ra và giờ đây ta có thể sử dụng file ns này để chạy mô phỏng. - 42 -
  44. CHƢƠNG 3. LIÊN KẾT GIỮA OTCL VÀ C++ TRONG NS2 NS2 là một bộ mô phỏng hƣớng đối tƣợng đƣợc viết bằng ngôn ngữ OTcl và C++. Trong khi OTcl đóng vai trò đảm nhận các hoạt động phía trƣớc (giao diện ngƣời dùng) thì C++ đóng vai trò đảm nhận các hoạt động phía sau để chạy các mô phỏng thực sự (Hình 3.1). Nhƣ đã nhìn thấy trong hình 3.1, cây phân lớp của 2 ngôn ngữ có thể đứng độc lập hoặc liên kết với nhau bằng cách sử dụng một giao tiếp OTcl/C++ gọi là TclCL. Có 2 loại lớp trong mỗi miền. Loại thứ nhất bao gồm các lớp đƣợc liên kết với nhau giữa 2 miền C++ và OTcl. Cây phân lớp OTcl đƣợc gọi là cây thông dịch và cây phân cấp lớp C++ đƣợc gọi là cây biên dịch. Loại lớp thứ hai là các lớp không liên kết với nhau giữa hai miền. Các lớp này không thuộc cây thông dịch đồng thời cũng không thuộc vào cây biên dịch. Trong chƣơng này, ta sẽ thảo luận về cách các ngôn ngữ OTcl và C++ tạo thành NS2 nhƣ thế nào. Hình 3.1: Hai ngôn ngữ cấu trúc của NS2. Các cây phân lớp của cả hai ngôn ngữ cỏ thể đứng độc lập hoặc liên kết với nhau. Cây thông dịch của OTcl và cây hiên dịch của C++ là những cây phân lớp đƣợc liên kết với nhau. Giao tiếp TclCL đƣợc viết bằng C++ bao gồm sáu lớp chính:  Lớp Tcl: cung cấp các phƣơng thức truy cập vào cây thông dịch (từ cây biên dịch; đƣợc định nghĩa trong file —tclcl/tclcLh và -tclcl/Tcl.cc).  Lớp InstVar: kết nối các biến thành viên giữa 2 cây phân lớp với nhau (đƣợc định nghĩa trong file ~tclcl/TcLcc).  Lớp TclObject: là lớp cơ sở của mọi đối tƣợng mô phỏng C++ trong cây biên dịch (đƣợc định nghĩa trong file ~tclcl/Tcl.cc).  Lớp TclClass: ánh xạ tên các lớp trong cây thông dịch với tên các lớp trong cây biên dịch (đƣợc định nghĩa trong file -tclcl.tclcl.h và ~tclcl/Tcl.cc).  Lớp TclCommand: cung cấp phƣơng thức truy cập ở cấp độ public từ cây thông dịch vào cây biên dịch (đƣợc định nghĩa trong file ~tclcl/tclcl.h và ~tclcl/Tcl.cc).  Lớp EmbeddedTcl: dịch mã OTcl thành mã C++ (đƣợc định nghĩa trong file ~tclcl/tclcl.h, ~tclcl/Tcl.cc và ~tclcl/tclAppInit.cc). Nội dung của chƣơng này đƣợc tổ chức nhƣ sau. Mục 3.1 mô tả khái niệm đằng sau hai ngôn ngữ trong NS2. Từ mục 3.2 tới mục 3.7 thảo luận về sáu thành phần chính của - 43 -
  45. TclCL bao gồm lớp Tcl, lớp InstVar, lớp TclObject, lớp TclClass, lớp TclCommand và lớp EmbeddedTcl. 3.1. Khái niệm haỉ ngôn ngữ trong NS2 Chúng ta có thể đặt ra câu hỏi là tại sao lại có hai ngôn ngữ trong NS2? Câu trả lời là NS2 sử dụng OTcl để tạo và cấu hình mạng trong khi nó sử dụng C++ để chạy mô phỏng. Mọi mã C++ đều cần phải đƣợc biên dịch và liên kết với file thực thi. Khi cấu trúc của NS2 tƣơng đối lớn thì thời gian dành cho việc biên dịch cũng lớn. Điều này gây bất tiện cho ngƣời sử dụng. Chỉ với một sự thay đổi rất nhỏ xảy ra trong mã, chẳng hạn nhƣ đƣa khai báo ―int i=0;‖ vào trong mã, một máy tính Pentium 4 cần vài giây (đủ dài đối với hầu hết các lập trình viên) để biên dịch và liên kết các mã. Theo một cách tiếp cận khác, ngôn ngữ OTcl là ngôn ngữ thông dịch chứ không phải là ngôn ngữ biên dịch. Bất kỳ một sự thay đổi nào trong file OTcl không cần phải biên dịch lại. Tuy nhiên, vì OTcl không chuyển đổi mọi mã thành ngôn ngữ máy nên mỗi dòng mã cần thời gian thực hiện lớn hơn. Nói tóm lại, ngôn ngữ C++ chạy nhanh nhƣng thay đổi chậm thích hợp cho việc chạy các mô phỏng lớn và ngôn ngữ OTcl chạy chậm nhƣng đáp ứng nhanh với những sự thay đổi nên thích hợp để chạy các mô phỏng nhỏ lặp lại nhiều lần (mỗi lần có các tham số khác nhau). NS2 đƣợc xây dựng trên cơ sở kết hợp các ƣu điểm của hai ngôn ngữ này. Khi lựa chọn ngôn ngữ để lập trình trong NS2 thông thƣờng ngƣời ta tuân theo các chỉ dẫn sau đây: Sử dụng Otcl  Cho việc cấu hình, cài đặt hoặc mô phỏng một lần  Để chạy mô phỏng với các module NS2 có sẵn Lựa chọn này thích hợp cho hầu hết với những ngƣời mới bắt đầu vì nó không bao gồm các cơ chế phức tạp bên trong của NS2. Tuy nhiên thật không may là các module sẵn có của NS2 lại hạn chế về số lƣợng. Vì vậy đối với nhu cầu của những nhà nghiên cứu, lựa chọn này gần nhƣ không đáp ứng đƣợc. Sử dụng C++  Khi phải giải quyết các vấn đề cụ thể trong gói tin  Khi phải chỉnh sửa các module có sẵn trong NS2. Lựa chọn này có thể là khó khăn đối với những ngƣời mới bắt đầu sử dụng NS2 về nguyên lý, một ngƣời có thể phát triển một chƣơng trình C++ bằng ba cách. Thứ nhất là kiểu ―C++ cơ bản‖. Đây là dạng đơn giản nhất mà trong chƣơng trinh chỉ có các lệnh C++ cơ bản. Loại chƣơng trinh này gặp vấn đề về tính linh hoạt vì khi thay đổi các tham số cần phải biên dịch lại toàn bộ chƣơng trinh. Để giải quyết vấn đề này ngƣời ta sử dụng loại chƣơng trình thứ hai kiểu ―C++ với các tham số đầu vào‖. Loại chƣơng trình này lấy các tham số hệ thống làm các tham số đầu vào. Khi các tham số hệ thống thay đổi, - 44 -
  46. ta chỉ cần thay đổi tham số đầu vào mà không cần phải biên dịch lại toàn bộ chƣơng trình, vấn đề chính của loại chƣơng trình thứ hai này là lời gọi chƣơng trình có thể rất dài nếu có một số lƣợng lớn các tham số đầu vào. Dạng chƣơng trình thứ ba là ―C++ với file cấu hình‖. Loại chƣơng trình này đƣa mọi tham số hệ thống vào trong một file cấu hình và chƣơng trình sẽ có những đoạn mã lệnh đọc các tham số hệ thống từ file cấu hình. Dĩ nhiên loại chƣơng trình này có tính linh hoạt rất cao và nó tạo điều kiện thuận lợi cho việc phát triển chƣơng trình. Để thay đổi các tham số hệ thống, ta chỉ cần thay đổi nội dung của file cấu hình. Trên thực tế, loại chƣơng trình này là loại cơ bản trong quá trình phát triển NS2. Trong Chƣơng 2, ở mục 2.5 ta đã viết mã mô phỏng Tcl và đƣa nó làm tham số đầu vào NS2 khi chạy trình mô phỏng (VD: thực hiện lệnh ―ns chuongtrinh1.tcl‖). Trong đó, ―ns‖ là một file thực thi C++ đạt đƣợc sau quá trình biên dịch và chuongtrinhl.tcl là file cấu hình đầu vào xác định các tham số hệ thống và cấu hình chẳng hạn nhƣ các nút, các liên kết và cách chúng kết nối với nhau. Việc NS2 đọc cấu hình hệ thống từ mã mô phỏng Tcl tƣơng tự nhƣ việc một chƣơng trình C++ đọc một file script. Tiếp theo khi ta thay đổi các tham số, ta không cần phải biên dịch lại toàn bộ mã lệnh NS2. Mọi điều chúng ta làm là chỉnh sửa file mã mô phỏng Tcl và chạy lại trình mô phỏng. Ví dụ 3.1: Xét topo mạng trong Hình 3.2. Ta định nghĩa rằng thời gian trễ khi truyền là thời gian cần thiết để mang gói tin từ biên bên trái tới nút biên bên phải trong đó thời gian trễ trong liên kết i là delay và số lƣợng nút là num_nodes. Ta muốn đo thời gian trễ tổng cộng khi truyền và hiển thị kết quả lên trên màn hình. - 45 -
  47. Giả sử mọi liên kết có cùng thời gian trễ là 1 giây và số lƣợng nút là 11. Chƣơng trinh 3.1 đƣa ra mã C++ viết theo kiểu chƣơng trình C++ cơ bản (tên file là sim.cc). Khi thời gian trễ của liên kết là cố định, ta chỉ cần tăng giá trị delay lên 1 đơn vị qua num_nodes một lần (dòng 4-5). Sau khi biên dịch và liên kết file sim.cc, ta có đƣợc file chạy sim. Bằng cách thực hiện lệnh ―./sim‖ từ dấu nhắc lệnh của môi trƣờng Shell, ta sẽ nhìn thấy kết quả sau trên màn hình: >>./sim Thời gian trễ tổng cộng của gói tin la 10.0 giây. Cho dù rất đơn giản nhƣng loại chƣơng trình này gặp vấn đề về tính linh hoạt. Giả sử ta muốn thay đổi thời gian trễ của các liên kết là 2 giây, ta phải sửa lại mã lệnh C++ trong file sỉm.cc, biên dịch và liên kết lại file sim.cc để tạo thành file sim có thể thể thi hành đƣợc. Sau đó ta mới có thể chạy lại lệnh ―./sim‖ từ môi trƣờng shell để nhận đƣợc kết quả khác (với delay = 2 giây) Kiểu chƣơng trình C++ với tham số đầu vào Để tránh khỏi việc biên dịch lại và liên kết lại nhƣ trên, ta đƣa các tham số hệ thống làm các tham số đầu vào cho chƣơng trình. Chƣơng trình 3.2 minh hoạ việc đƣa tham số thời gian trễ của liên kết và số lƣợng nút làm các tham số đầu vào. Dòng 1 cho thấy mã lệnh lập trình có tham số đầu vào. Biến argc chứa số lƣợng các tham số đầu vào. Biến argv là một vector tham số chứa mọi tham số đầu vào do ngƣời gọi chƣơng trình cung cấp. Với kiểu chƣơng trình này, ta chỉ cần biên dịch và liên kết chƣơng trình một lần. Sau khi có đƣợc file thực thi sim, ta có thể có đƣợc kết quả chạy chƣơng trình bằng cách thay đổi tham số đầu vào. Ví dụ: - 46 -
  48. Mặc dù mã lập trình kiểu nhƣ trên giải quyết đƣợc vấn đề về tính linh hoạt nhƣng nó lại gặp vấn đề bất tiện khi có một số lƣợng lớn tham số đầu vào. Ví dụ, nếu độ trễ của mọi liên kết trong ví dụ 3.1 khác nhau, mỗi lần chạy chƣơng trình, ta phải nhập mọi giá trị độ trễ liên kết. Kiểu chƣơng trình C++ với file cấu hình Chƣơng trình 3.3 đƣa ra mã C++ mô phỏng dùng cho Ví dụ 3.1. Chƣơng trinh này nhận tham số đầu vào là tên file cấu hình. Hàm readArgFromFỉle(fp,d) đọc file cấu hình liên kết với con trỏ file fp để thiết lập các biến num_nodes và d. Trong trƣờng hợp này, file cấu hình (config.txt) đƣợc biểu diễn trong các dòng 10-11. Khi gọi lệnh ―./sim cauhinh.txt‖, màn hình sẽ hiển thị kết quả nhƣ sau: >>./sim config.txt Thời gian trễ tổng cộng là 55.0 giây. Để thay đổi các tham số hệ thống, ta chỉ cần thay đổi nội dung file ―cauhinh.txt‖. Rõ ràng là dạng mã này khắc phục đƣợc vấn đề phải biên dịch lại toàn bộ chƣơng trình và độ dài của lời gọi chƣơng trình. . Lớp Tcl Lớp Tcl là một lớp C++ hoạt động nhƣ là một giao tiếp tới miền OTcl. Khai báo của lớp này có trong file ~tclcl/Tcl.cc. Lớp này cung cấp các phƣơng thức dành cho các thao tác sau:  Lấy tham chiếu tới đối tƣợng của Tcl đang chạy (sử dụng hàm instance)  Gọi các thủ tục OTcl từ miền C++ (sử dụng các hàm eval(-), evalc(-) và evalf(*))  Truyền hoặc nhận các kết quả tới/từ OTcl (sử dụng các hàm result(-) và resultf ())  Báo lỗi và thoát chƣơng trình theo một dạng đồng nhất (sử dụng hàm error( ))  Lấy tham chiếu tới các đối tƣợng TclObjects (sử dụng các hàm enter( ), deleteh") vả lookup ). . Lấy tham chiếu tới đối tƣợng Tcl đang chạy Trong C++, các hàm thành viên của lớp đƣợc gọi qua một đối tƣợng của lớp theo cú pháp đối_tƣợng .hàm. Để gọi các hàm của lớp Tcl từ C++, ta cần phải có một đối tƣợng của lớp TcL Lớp Tcl cung cấp hàm ―instance‖ trả về biến tĩnh Tcl: Tcl&tcl = Tcl::instance(); Hàm instance() trả về giá trị là biến tĩnh instance_ của lớp Tcl. Vì đây là biến tĩnh nên trong một chƣơng trình mô phỏng, chỉ có duy nhất một đối tƣợng Tcl là đối tƣợng instance_. Nếu trong chƣơng trình mô phỏng hàm instance đƣợc gọi tới nhiều lần thì kết - 47 -
  49. quả của những lời gọi hàm này đều tham chiếu tới cùng một đối tƣợng Tcl đang chạy thông qua biến tĩnh _instance. Sau khi có đƣợc tham chiếu tới đối tƣợng Tcl đang chạy, ta có thể gọi các hàm của lớp Tcl thông qua tham chiếu này (Ví dụ nhƣ hàm eval(), hàm result ()). . Gọi thủ tục của Tcl Khi lập trình trong C++, có đôi khi ta cần phải gọi các thủ tục của OTcl. Ví dụ ta có thể lấy thời gian mô phỏng hiện tại bằng thủ tục now() của lớp Simulator trong cây thông dịch. Lớp Tcl cung cấp bốn hàm sau để gọi các thủ tục của OTcl:  Tcl.eval(char* str): Thực thi lệnh chứa trong chuỗi str  Tcl.evalc(const char* str); thực thi lệnh dạng chuỗi là tham số đầu vào trực tiếp của hàm.  Tcl.eval(): thực thi lệnh lƣu trữ trong biến bp_ (bộ đệm của tcl)  Tcl.evalf(const char* frm,—): sử dụng định dạng frm của lệnh printf("*) trong C++ để định dạng một lệnh dạng chuỗi và truyền chuỗi đã định dạng tới trình thông dịch Ví dụ 3.1: Sử dụng mã trong C++ để báo cho OTcl in ra chuỗi ―Do tre cua goi tin la 10 giay‖ lên trên màn hình Cách 1: Sử dụng lệnh eval(char* str) Cách 2: Sử dụng lệnh evalc(const char* str) Cách 3: Sử dụng lệnh eval() Cách 4: Sử dụng lệnh evalf(const char* fmt. ) - 48 -
  50. . Truyền kết quả tới và nhận kết quả từ OTcl Sau khi thực hiện một vài câu lệnh, có thể ta cần truyền các giá trị tới trình thông dịch hoặc nhận các giá trị từ trình thông dịch. Chẳng hạn trong Ví dụ 3.1, thay vì việc in kết quả thời gian trễ của gói tin ra màn hình, ta muốn truyền kết quả này tới trình thông dịch. Lớp Tcl cung cấp ba hàm sau để truyền kết quả vào và ra trình thông dịch: - Tcl::result(const char* slt); truyền chuỗi slt là kết quả tới trình thông dịch. Ví dụ, đoạn mã sau truyền giá trị 10 tới trình thông dịch Tcl& tcl = Tcl::instance(); tcl.result(―10‖); return TCL_OK; - Tcl::resultf(const char* result): Sử dụng định dạng của lệnh printf( ) trong C++ để định dạng chuỗi kết quả và truyền chuỗi đã đƣợc định dạng tới trình thông dịch Vỉ dụ 3.2. Trong C++, lệnh returnDelay của lớp Chain trả về giá trị do biến delay lƣu trữ với định dạng một chữ số sau dấu phẩy. Lệnh này đƣợc thực hiện thông qua đoạn mã sau: TclSc tcl=Tcl::ỉnstance(); tcl.resultf("%l.lf",delay); return TCL_OK; Trong OTcl, lệnh sau lƣu trữ kết quả của biến ―delay‖ của đối tƣợng Chain của C++ vào biến ―d‖ set Chain [new Chain] set d [$chain returnDelay]  Tcl::result (void): Nhận kết quả dƣới dạng chuỗi từ trình thông dịch. Ví dụ, đoạn lệnh sau lƣu trữ giá trị của biến d trong OTcl vào biến delay trong C++. Tcl& tcl=Tcl::instance(); tcl.evalc("$d"); char* delay = tcl.result(); Lớp Tcl sử dụng biến thành viên tcl_->result() để truyền giá trị kết quả giữa hai cây phân lớp C++ và OTcl. Ở đây, tcl_ là biến thành viên của lớp Tcl và là con trỏ tham chiếu tới đối tƣợng TcUnterp. NS2 ngăn không cho truy cập trực tiếp vào biến tcl_ ->result() của lớp Tcl do đó nó cung cấp ba hàm để truy cập vào biến này. Hàm Tcl.result(const char* result), Tcl.resultf(const char* result) thiết lập giá trị của tcl_->result. Sau khi thiết lập giá trị của tcl_->result() trong C++, NS2 có thể trả về một giá trị kết quả nào đó tới OTcl (chẳng hạn nhƣ TCL_OK, TCL_ERROR). Ta sẽ thảo luận về những cơ chế trả về giá trị này trong mục 3.4.4. Sau khi trả lại giá trị cho Otcl, OTcl sẽ đọc kết quả của tcl- >result(). Tƣơng tự nhƣ vậy, sau khi thực hiện lệnh của OTcl (chẳng hạn nhƣ lệnh tcl.evalc(―$delay‖)), kết quả thực hiện lệnh đƣợc lƣu trong biến tcl- >result(d). Hàm - 49 -
  51. Tcl::result(void) trong trình biên dịch sẽ trả lại kết quả đƣợc trình thông dịch lƣu trữ trong tcl~>result(). . Báo lỗi và thoát chƣơng trình Lớp Tcl cung cấp hàm ―error( )‖ để thoát chƣơng trình theo cách in chuỗi đƣợc lƣu trong biến ―str‖ và tcl―>result() ra màn hình rồi thoát chƣơng trình với mã trả về có giá trị bằng 1. Tcl::error(const char* str) Có một vài sự khác biệt giữa hàm Tcl::error(str) và lệnh return TCL_ERROR. Hàm Tcl::error(str) chỉ in thông điệp báo lỗi và thoát chƣơng trình trong khi đó nếu sử dụng lệnh return TCL_ERROR, NS2 sẽ thực hiện việc bẫy lỗi ở nhiều điểm khác nhau và kết quả là ngƣời dùng có thể bẫy các lỗi để khôi phục lỗi, xác định vị trí lỗi hoặc in các lỗi xảy ra nằm trong bộ nhớ lỗi. . Lấy tham chiếu tới các đối tƣợng TclObjects Mỗi đối tƣợng trong cây thông dịch đều có một đối tƣợng tƣơng ứng trong cây biên dịch. Trong nhiều trƣờng hợp, ta cần lấy tham chiếu tới một đối tƣợng trong cây biên dịch tƣơng ứng với một đối tƣợng xác định trƣớc trong cây thông dịch. NS2 tạo liên kết giữa hai đối tƣợng thuộc hai cây phân cấp này thông qua bảng băm. Lớp Tcl cung cấp các hàm sau để bổ sung, xoá hoặc truy cập vào các thành phần trong bảng băm  Td::enter(TclObject* o}: Chèn đối tƣợng ―c*o‖ vào bảng bám và liên kết đối tƣợng này với chuỗi chứa tên đƣợc lƣu trữ trong biến name_ của OTcl. Khi tạo ra một đối tƣợng mới, hàm TclClass:create_shadow( ) sẽ gọi tới đối tƣợng này.  Tcl::delete(TclObject* o): Xoá một thành phần liên kết với đối tƣợng ―*o‖ trong bảng bám. Hàm này đƣợc hàm TclClass:delete_shadow() gọi tới khi huỷ một đối tƣợng.  TcLlookupichar* str): Trả về kết quả tham chiếu tới một đối tƣợng TclObject có tên là ―str‖ Ví dụ 3.3: Xét đoạn mã C++ trong Chƣong trình 3.4. Ở đây, argv[2] là tham số đầu vào truyền từ OTcl (Trong trƣờng hợp này argv[2] là một đối tƣợng của OTcl). Dòng 8 sử dụng hàm Tcl0bject::lookup(argv[2]) để lấy tham chiếu tới đối tƣợng C++ tƣơng ứng với đối tƣợng OTcl đƣợc xác định bởi argv[2]. - 50 -
  52. Đối tƣợng lấy về đƣợc chuyển kiểu sang kiểu đối tƣợng NsObject và lƣu trữ trong biến *target_). Ta sẽ thảo luận chi tiết về hàm command trong mục 3.4.4. o Lớp InstVar Lớp InstVar là lớp kết nối giữa một biến thành viên của một lớp trong C ++ với một biến thành viên của một lớp trong OTcl. Khi một biến thuộc lớp trong C++ đã đƣợc liên kết rằng buộc với một biến thuộc lớp trong OTcl, mọi sự thay đổi từ biến C ++này sẽ tự động đƣợc cập nhật sang biến OTcl và ngƣợc lại. NS2 hỗ trợ liên kết rằng buộc cho 5 kiểu dữ liệu của NS2 là số thực (real), số nguyên (integer), băng thông (bandwỉdth), thời gian (tỉme) và logic (boolean). Các kiểu dữ liệu này không phải là kiểu dữ liệu của C++ cũng nhƣ là của OTcl mà chúng đƣợc định nghĩa ở đây để thực hiện việc gán các giá trị củaNS2. Bảng 3.1. Các kiểu dữ liệu của OTcl và các lớp liên kết tƣơng ứng của C+ + Kiểu dữ liệu OTcl Lớp liên kết của C++ Số thực (Real) InstVarReal Số nguyên (Integer) InstVarlnt Băng thông (Bandwidth) InstV arBandwidth Thời gian (Time) InstVarTime Logic (Boolean) InstVarBool Nhƣ ta thấy trong Bảng 3.1, các kiểu dữ liệu này đƣợc định nghĩa trong các lớp C++ bao gồm InstVarReal, InstVarlnt, InstVarBandwidth, InstVarTime và InstVarBool tƣơng ứng với năm kiểu dữ liệu trên. Các lớp này đều đƣợc thừa kế từ lớp InstVar. C++ sử dụng kiểu dữ liệu double để lƣu trữ cho các kiểu dữ liệu real, bandwidth và time trong khi đó nó sử dụng các kiểu dữ liệu là int và bool để lƣu trữ cho các kiểu dữ liệu tƣơng ứng là integer và boolean của NS2. o Biến có giá trị kiểu số thực (Real) và số nguyên (Integer) Trong NS2 có hai loại dữ liệu kiểu số thực và số nguyên. Khi lập trình bằng ngôn ngữ Tcl, ta có thể sử dụng kiểu biểu diễn ―e ‖ cho các giá trị ―x ‖ với là giá trị lƣu trữ trong biến n. - 51 -
  53. Ví dụ 3.4. Cho realvar và intvar là các biến thành viên của một đối tƣợng OTcl có tên là ―obj‖ có kiểu dữ liệu NS2 tƣơng ứng là kiểu thực và kiểu nguyên. Các cách thiết lập giá trị của realvar và intvar đƣợc minh hoạ dƣới đoạn mã dƣới đây: o Biến có giá trị kiểu băng thông (bandwidth) Băng thông đƣợc chỉ định là một giá tri kiểu số thực. Đơn vị mặc định của băng thông là số bit truyền trên một giây (bps). Ngoài ra ta có thể tuỳ chọn sử dụng các đơn vị băng thông sau: NS2 chỉ xét tới ký tự đầu tiên trong phần ký tự biểu diễn đơn vị của băng thông. Do đó đơn vị băng thông là ―M‖ và ―Mbps‖ là giống nhau trong NS2. Ví dụ 3.5: Giả sử bwvar là một biến thành viên của đối tƣợng ―obj‖ có kiểu dữ liệu NS2 là bandwidth. Đoạn mã sau đây minh hoạ các cách khác nhau để thiết lập giá trị cho biến bwvar là 8 Mbps: . o Biến có giá trị kiểu thời gian (Time) Thời gian trong NS2 đƣợc lƣu trữ trong dƣới dạng số thực. Đơn vị mặc định của thời gian là giây. Ta có tuỳ chọn một số đơn vị khác của thời gian sau: -―m‖ : mini hoặc 10-3 -―n‖ : mini hoặc 10-9 -―p‖ : mini hoặc 10-12 Chú ý rằng NS2 chỉ xét tới ký tự đầu tiên trong chuỗi ký tự biểu diễn đơn vị cho nên đơn vị ―p‖ và ―ps‖ đều đƣợc NS2 coi là nhƣ nhau. Ví dụ 3.6: Giả sử timevar là biến thành viên của đối tƣợng ―obj‖ chứa giá trị thời gian. Đoạn mã sau minh hoạ các cách khác nhau thiết lập cho biến tỉmevar giá trị 2 ms. - 52 -
  54. o Biến có giá trị kiểulogic (boolean) Biến có giá trị kiểu logic chỉ có hai giá trị là đúng (true) hoặc sai (false). Nó đƣợc thiết lập giá trị true nếu ký tự đầu tiên của giá trị biến có giá trị lớn hơn 0 hoặc là ―t‖ hoặc là ‗‘T‖. Ngƣợc lại nó sẽ có giá trị là false Ví dụ 3.7: Giả sử boolvar là một biến thành viên kiểu logic của đối tƣợng ―obj‖. Đoạn mã sau sẽ minh hoạ các cách khác nhau để thiết lập giá trị cho biến boolvar là true hoặc false: NS2 bỏ qua mọi ký tự ngoại trừ ký tự đầu tiên. Nhƣ ta thấy trong Ví dụ 3.7, có một vài lệnh có vẻ hơi lạ khi thiết lập giá tri cho biến logic (chẳng hạn nhƣ thainguyen, hanoi, -5.29). Để hiểu rõ hơn, bạn đọc nên thử nghiệm chạy và tìm hiểu cơ chế thiết lập giá trị cho biến logic debug_ và biến kiểu số thực rate_ trong đoạn mã sau: - 53 -
  55. Sau khi gán giá trị cho một biến OTcl, NS2 chuyển đổi chuỗi giá trị thành giá trị có kiểu tƣơng ứng trong C++. Ngoại trừ kiểu logic, NS2 sẽ chuyển đổi kiểu giá trị của chuỗi thành giá trị kiểu double hoặc int. Trong quá trình chuyển đổi, đơn vị của giá trị cũng đƣợc chuyển đổi (Ví dụ nhƣ đơn vị ―M‖ sẽ đƣợc chuyển thành giá trị 106). Với kiểu dữ liệu logic, NS2 chỉ quan tâm đến ký tự đầu tiên trong chuỗi ký tự là giá trị của biến. Nếu ký tự đầu tiên có kiểu số nguyên, NS2 sẽ không phải làm công việc chuyển đổi. Nếu ký tự đầu tiên có kiểu không phải là số nguyên, NS2 sẽ chuyển đổi giá trị theo kiểu xác định xem nó có phải là ký tự ―t‖ hoặc ―T‖ hay không. Sau khi chuyển đổi chuỗi thành một giá trị số nguyên, NS2 sẽ chuyển đổi số nguyên này thành dạng logic và cập nhật biến liên kết rằng buộc với nó trong miền biên dịch. o Lớp TclObject Lớp TclObject cung cấp các cơ chế để tạo ra đối tƣợng trong C++ ánh xạ tƣơng ứng với đối tƣợng trong OTcl khi tạo ra đối tƣợng OTcl. Lớp C++ TclObject đƣợc ánh xạ với lớp Splitobject của OTcl. Đây là hai lớp cơ sở của mọi lớp khác (ngoại trừ các lớp độc lập) trong hai cây phân cấp lớp của miền biên dịch và miền thông dịch. Khi một đối tƣợng đƣợc khởi tạo từ miền OTcL hàm khởi tạo của lớp SplitObject đƣợc gọi và khởi tạo ra đối tƣợng của lớp. Một trong các công việc khởi tạo là khởi tạo đối tƣợng liên kết trong trình biên dịch. Mục 3.4.1 trình bày cách tham chiếu một đối tƣợng TclObject trong cả hai cây phân lớp. Mục 3.4.2 giải thích các thủ tục tạo và xoá đối tƣợng liên kết trong C++. Tiến trình liên kết biến trong quá trình khởi tạo đƣợc thảo luận trong mục 3.4.3. Cuối cùng mục 3.4.4 thảo luận về một hàm đặc biệt là hàm command(-). Đây là hàm cung cấp khả năng truy cập vào các lớp C++ từ miền OTcl. o Tham chiếu tới một đối tƣợng TclObject OTcl và C++ sử dụng các phƣơng pháp khác nhau để truy cập vào các đối tƣợng của chúng. Vì là ngôn ngữ biên dịch, C++ truy cập trực tiếp vào không gian bộ nhớ đƣợc phân bố cho một đối tƣợng nào đó (ví dụ nhƣ 0xd6f9c0) còn đối với OTcl, do là ngôn ngữ thông dịch nên nó không truy cập trực tiếp vào bộ nhớ mà thay vào đó, nó sử dụng một - 54 -