Bài tiểu luận môn học IP ứng dụng và bảo mật giới thiệu công cụ NS

77 894 0
Bài tiểu luận môn học IP ứng dụng và bảo mật giới thiệu công cụ NS

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài tiểu luận môn học IP ứng dụng và bảo mật giới thiệu công cụ NS

1 Giới thiệu về côngHỌ cụCmô phỏ g mạngNGHỆ NS VIỆ N nCƠNG VIỄN THƠNG 1.1 TởKHOA ng quan HỌ C VIỆ N CÔNG NGHỆ THÔNG QUAN HỆ QUỐC TẾ VÀ ĐÀO VIỄ TẠONSAU ĐẠI HỌC HỆn QUỐC TẾ VÀ ĐÀO TẠO SAU ĐẠI HỌC 1.2 Bộ KHOA định trìQUAN nh sự kiệ 1.3 Các thành phần mạng .8 1.4 Gói dữ liệu 10 Giao tiếp với bộ thông dịch: Liên kết OTcl 11 2.1 Các khái niệm 11 2.2 Tổng quan về mã lệnh .12 2.3 Lớp Tcl .12 2.3.1 Lấy tham chiếu tới instance của lớp Tcl 12 2.3.2 Gọi các hàm OTcl .12 2.3.3 Gửi và nhận kết quả từ bộ thông dịch 12 2.3.4 Thông báo lỗi và thoát 13 2.3.5 Các hàm băm bộ thông dịch 13 2.4 Lớp TclObject 13 2.4.1 Tạo và hủy đối tượng TclObject .13 IP – ỨNG DỤNG VÀ BẢO MẬT 2.4.2 Kết hợIP p biế 14 –nỨ NG DỤNG VÀ BẢO MẬT 2.4.3 Theo dõi giá trị biến 14 2.4.4 Hàm command: định nghĩa và cách gọi 14 2.5 Lớp TclClass 14 2.5.1 Kết hợp các biến thành viên tĩnh của lớp C++ 15 2.6 Lớp TclCommand 15 2.7 Lớp EmbeddedTcl 16 2.8 Lớp InstVar 16 Lớp Simlator 16 3.1 Khởi tạo mô .16 3.2 Bộ định trình kiện 17 3.2.1 Bộ định trình danh sách 18 Thầy hướng dẫn: Hoàng Đăng Hải 3.2.2 Bộ định trình xếp đống 18 Học Viên: Lê Đăng Phong [1-22] 3.2.3 Bộ định trình xếp hàng theo lịch 18 Vũ Anh Tuấn [23-44] 3.2.4 Bộ định trình thời gian thực .18 Nguyễn Việt Thắng [45-66] Đinh Hải Đăng [67-hết] 3.3 Các phương thức khác .18 3.4 Lướt qua lệnh .19 Các nút chuyển gói 20 4.1 Các cách thức mô phỏng: Tạo kiến trúc mạng 20 4.2 Các cách thức nút: đặt cấu hình nút 22 4.3 Cấu hình nút mặt chức .23 4.3.1 Giao diện cấu hình nút 23 Hà Nội 4.4 Bộ phân lớp 25 4.4.1 Bộ phân lớp địa 27 TIỂ NNMÔN TIỂUULUẬ LUẬ MÔNHỌ HỌCC i 4.4.2 Bộ phân lớp đa hướng 27 4.4.3 Bộ phân lớp đa đường 28 4.4.4 Bộ phân lớp băm .29 4.4.5 Bộ tạo 30 4.5 Module định tuyến tổ chức phân lớp 31 4.5.1 Module định tuyến 31 4.5.2 Giao diện nút .33 4.6 Xem qua vài lệnh 34 Các liên kết: Các liên kết đơn 35 5.1 Thủ tục cho Links SimpleLinks 36 5.2 Các Connector 37 5.3 Phân cấp đối tượng 38 Quản lý hàng đợi định trình gói .39 6.1 Lớp Queue C++ 39 6.1.1 Khóa hàng đợi 40 6.1.2 Lớp PacketQueue .42 6.2 Ví dụ: Loại bỏ phần cuối (Drop Tail) 42 6.3 Các kiểu khác đối tượng Queue .43 Trễ tuyến liên kết 47 7.1 Lớp LinkDelay 47 8.Các dịch vụ ns .49 8.1 Tổng quan .49 8.2 Sự thi hành (Implementation) 50 8.2.1 Hàng đợi RED cho Diffserv .50 8.3 Cấu hình 51 Agents 52 9.1 Trạng thái Agent 52 9.2 Các phương thức Agent 52 9.3 Protocol Agents 53 9.4 Liên kết OTcl 54 9.4.1 Tạo sửa đổi Agent 54 9.4.2 Các giá trị mặc định 54 9.4.3 Các phương thức OTcl 55 9.5 Ví dụ: Các agent Tcp, TCPSink .55 9.5.1 Tạo Agent 55 9.5.2 Khởi động Agent .56 9.5.3 Xử lý đầu vào bộ thu 57 9.5.4 Xử lý đáp ứng bên gửi 58 9.5.5 Các định thời .59 9.6 Tạo agent 59 ii 9.6.1 Ví dụ: Yêu cầu “ping” (Cấu trúc kế thừa) 59 9.6.2 Các phương thức recv() timeout() 60 9.6.3 Liên kết agent “ping” với OTcl .61 9.6.4 Sử dụng agent nhờ OTcl 62 9.7 Agent API .62 9.8 Các đối tượng agent khác .62 9.9 Các lệnh .63 10 Các định thời 63 10.1 Lớp sở C++ TimerHandler 63 10.1.1 Định nghĩa định thời 64 10.1.2 Ví dụ: Bộ định thời truyền lại TCP .65 10.2 Lớp định thời OTcl .68 10.3 Một số lệnh .68 11 Header gói định dạng .68 11.1 Header gói cho giao thức cụ thể 69 11.1.1 Thêm kiểu header gói .71 11.1.2 Lựa chọn header gói mô 71 11.2 Các lớp gói 72 11.2.1 Lớp Packet .72 11.2.2 Lớp p_info .74 11.2.3 Lớp hdr_cmn 74 11.2.4 Lớp PacketHeaderManager 75 11.3 Các lệnh .77 iii Giới thiệu công cụ NS Giới thiệu về công cụ mô phỏng mạng NS 1.1 Tổng quan NS là bộ công cụ mô phỏng mạng điều khiển theo các sự kiện rời rạc, được xây dựng và phát triển bởi trường đại học Berkeley – Mỹ, cho phép mô phỏng nhiều kiểu mạng IP khác nhau, mô phỏng các giao thức mạng: TCP, UDP cũng các dạng nguồn lưu lượng: FTP, Telnet, Web, CBR, VBR, mô phỏng các hàng đợi các bộ định tuyến: DropTail, RED, CBQ, mô phỏng các giải thuật định tuyến Ngoài NS còn cho phép thực hiện việc phát đa luồng và một số giao thức lớp MAC đối với mô phỏng LAN NS được xây dựng bằng ngôn ngữ lập trình hệ thống C++ và ngôn ngữ mô phỏng OTcl Otcl là dạng ngôn ngữ kịch bản Tcl được mở rộng theo mô hình hướng đối tượng Hình 1: NS theo quan điểm người dùng Theo quan điểm người dùng thuần túy, NS là một bộ thông dịch các kịch bản Tcl hướng đối tượng NS gồm có các bộ định trình các sự kiện mô phỏng, các thư viện đối tượng thành phần mạng, thư viện các môdule tạo lập mạng (thực tế việc kết nối các module được thực hiện bằng các hàm thành viên của các đối tượng mô phỏng bản) Khi sử dụng NS, người dùng phải lập trình bằng ngôn ngữ kịch bản Tcl Để tạo lập và triển khai một mạng mô phỏng, người dùng viết một kịch bản Tcl để khởi tạo một bộ định trình sự kiện, thiết lập topo mạng thông qua việc sử dụng các đối tượng thành phần mạng và các hành liên kết các thư viện của NS Việc thiết lập một mạng là ghép nối các đường dữ liệu giữa các đối tượng mạng bằng cách đặt trỏ của một đối tượng này tới địa chỉ của một đối tượng khác tương ứng Khi muốn tạo một đối tượng mạng mới, thì người dùng có thể tạo đối tượng đó bằng cách xây dựng một đối tượng mới hoặc tổ hợp các đối tượng có sẵn các thư viện đối tượng của NS và tạo các đường liên kết dữ liệu giữa chúng Một thành phần quan trọng của NS (bên cạnh các đối tượng mạng) là bộ định trình sự kiện Một sự kiện NS là một mã nhận dạng gói, mã này là nhất đối với một gói, sự kiện được định thời và gắn với một trỏ trỏ đến đối tượng sẽ xử lý sự kiện đó Trong NS, bộ định trình sự kiện giám sát toàn bộ thời gian mô phỏng, quản lý và kích hoạt các sự kiện theo một hàng đợi Khi một sự kiện được kích hoạt, bộ định trình sẽ gọi tới thành phần đối tượng mạng xử lý tương ứng (thường cũng là đối tượng Bài tiểu luận môn học IP-Ứng dụng và bảo mật Giới thiệu công cụ NS tạo sự kiện đó), cho phép đối tượng này thực hiện các tác vụ thích hợp lên gói gắn với sự kiện Các thành phần đối tượng mạng truyền thông với bằng cách trao đổi các gói Về nguyên tắc, tất cả các thành phần mạng cần phải có một khoảng thời gian nhất định để xử lý gói (trễ) Trễ này được thể hiện thông qua việc sử dụng các bộ định trình sự kiện: gửi một sự kiện gắn với gói và chờ sự kiện đó được kích hoạt trở lại trước xử lý các gói tiếp theo Ví dụ: một thành phần mạng mô phỏng một thiết bị chuyển mạch gói với 20 ms trễ, nó sẽ gửi một sự kiện trễ 20 ms gắn với gói cần phải chuyển mạch tới bộ định trình sự kiện, bộ định trình sau 20 ms sẽ đưa sự kiện đó khỏi hàng đội và kích hoạt nó trở lại thành phần mạng chuyển mạch, thành phần chuyển mạch sẽ thực hiện việc chuyển gói tương ứng tới đối tượng liên kết đầu của nó Một ứng dụng nữa của bộ định trình sự kiện là tạo các bộ định thời VD: giao thức TCP cần bộ định thời để giám sát thời gian chờ phát một gói nhằm thực hiện việc phát lại gói Khi đó, bộ định thời sử dụng bộ định trình tương tự trường hợp giả lập trễ, sự khác biệt nhất là bộ định thời đo giá trị thời gian gắn với một gói, thực hiện các tác vụ liên quan đến gói đó sau một khoảng thời gian nhất định trôi qua mà không thực hiện việc mô phỏng trễ NS được viết bằng hai ngôn ngữ OTcl và C++ Để đảm bảo tính hiệu quả NS phân chia đường dữ liệu và đường điều khiển riêng biệt Để giảm thời gian chương trình xử lý các sự kiện và gói (thời gian này không phải thời gian mô phỏng),thì bộ định trình sự kiện và các đối tượng mạng bản đường dữ liệu được viết và biên dịch bằng ngôn ngữ C++ Các đối tượng sau biên dịch vẫn có thể được sử dụng bởi bộ thông dịch Otcl thông qua các liên kết Otcl, các liên kết này tạo đối tượng OTcl tương ứng cho mỗi đối tượng C++, cũng tạo các hàm và các biến thành viên đối tượng Otcl tương ứng với các biến và hàm thành viên đối tượng C++ Bằng cách này việc điều khiển các đối tượng C++ có thể được thực hiện thông quan OTcl, ngoài ta cũng có thể thêm các biến và hàm thành viên khác vào đối tượng OTcl Các đối tượng được viết bằng C++ mà không cần thiết phải điều khiển trực tiếp quá trình mô phỏng cũng không cần phải liên kết sang OTcl Mặt khác một đối tượng không nằm đường số liệu có thể được xây dựng hoàn toàn bằng OTcl Hình minh họa một phân cấp đối tượng C++ và OTcl C++ OTcl Hình 2: Sự tương đồng giữa C++ và OTcl Bài tiểu luận môn học IP-Ứng dụng và bảo mật Giới thiệu công cụ NS Hình 3: Mô hình kiến trúc của NS Hình chỉ kiến trúc chung của công cụ mô phỏng NS Trong hình vẽ này, người sử dụng thiết kế, triển khai các mô phỏng bằng các câu lệnh Tcl, sử dụng các đối tượng mô phỏng từ thư viện Otcl, các bộ định trình sự kiện và phần lớn các đối tượng mạng được xây dựng bằng C++, và các đối tượng này vẫn có thể được sử dụng là các đối tượng Otcl thông qua các liên kết Toàn bộ các thành phần hình 3, kết hợp lại tạo nên một bộ công cụ mô phỏng mạng NS, là một bộ thông dịch Tcl được mở rộng hướng đối tượng và một tập các thư viện đối tượng mô phỏng mạng Các kết quả đạt được sau kết thúc quá trình mô phỏng, hình vẽ 1, là tập một hoặc nhiều file kết quả đầu dưới dạng văn bản text, chứa các dữ liệu mô phỏng chi tiết Các số liệu này có để được dùng để phân tích mô phỏng hoặc dùng làm đầu vào cho các công cụ trình diễn mô phỏng mạng dạng đồ họa: Nam, Xgraph Nam (Network Animator) có dạng giao diện tương tự một công cụ chơi CD, cho phép hiển thị thông tin dạng đồ hoạc như: thông lượng, số gói bị loại bỏ mỗi link 1.2 Bộ định trình sự kiện Như đã đề cập đến ở phần trên, đối tượng sử dụng chính của các bộ định trình sự kiện là các thành phần mạng, mô phỏng việc xử lý gói hoặc có sử dụng các bộ định thời Hình mô tả các đối tượng mạng sử dụng bộ định trình sự kiện Cần lưu ý rằng: một đối tượng gửi một sự kiện nào đó cũng chính là đối tượng xử lý sự kiện đó tại một thời điểm định sẵn và đường dữ liệu giữa các đối tượng khác với đường điều khiển (đường sự kiện) Thực tế, việc đưa các gói từ một đối tượng mạng này đến một đối tượng mạng khác được thực hiện bằng cách sử dụng hàm send(Packet *p) {target_-> recv(p)} của đối tượng gửi và hàm recv(Packet *, Handler * h =0) của đối tượng nhận Bài tiểu luận môn học IP-Ứng dụng và bảo mật Giới thiệu công cụ NS Hình 4: Bộ định trình sự kiện rời rạc NS có hai kiểu định trình sự kiện khác nhau: định trình thời gian thực và định trình không theo thời gian thực Định trình không theo thời gian thực bao gồm loại: List, Heap và Calendar Bộ định trình Calendar được sử dụng mặc định NS Các bộ định trình thời gian thực được sử dụng để thực hiện việc mô phỏng tương tác với mạng thực tế Ví dụ: việc lựa chọn một bộ định trình sự kiện cụ thể được thực hiện sau: set ns [new Simulator] $ns use-scheduler Heap Một ứng dụng nữa của các bộ định trình sự kiện là tạo các bộ định thời sự kiện mô phỏng như: nào thì bắt đầu một ứng dụng FTP, nào thì kết thúc mô phỏng, hoặc để tạo các kịch bản mô phỏng trước thực hiện mô phỏng Một đối tượng định trình sự kiện , bản thân nó có các hàm thành viên định thời mô phỏng, ví dụ hàm at time "string" thực hiện phát sự kiện AtEvent tại một thời điểm mô phỏng định sẵn: time Sự kiện AtEvent đối tượng lớp của lớp Event, có một biến để chứa giá trị chuỗi string đã cho Tuy nhiên sự kiện AtEvent vẫn được xử lý bình thường các sự kiện liên quan đến việc xử lý gói khác bộ định trình sự kiện Khi một quá trình mô phỏng bắt đầu, và đến thời điểm định sẵn đối với sự kiện AtEvent, sự kiện AtEvent được chuyển tới bộ xử lý sự kiện AtEvent, và câu lệnh OTcl nằm chuỗi string của sự kiện AtEvent sẽ được thực thi Ví dụ: set ns [new Simulator] $ns use-scheduler Heap $ns at 300 "finish_sim" proc finish_sim{}{ } Trong ví dụ trên, ta thấy rằng hàm at time "string" là hàm thành viên của đối tượng Simulator, cần phải lưu ý rằng đối tượng Simulator chỉ đóng vai trò giao Bài tiểu luận môn học IP-Ứng dụng và bảo mật Giới thiệu công cụ NS tiếp người sử dụng, nên thực nó sẽ gọi đến các hàm thành viên của các đối tượng mạng hoặc các đối tượng định trình để thực sự thực hiện công việc đó 1.3 Các thành phần mạng Trong NS, hầu hết các thành phần mạng là các đối tượng phức hợp Hình chỉ một phần của phân cấp theo lớp OTcl Hình 5: Một phần của phân cấp theo lớp Gốc của phân cấp này là lớp TclObject Lớ p TclObject là lớp sở của mọi đối tượng thư viện OTcl (định trình sự kiện, thành phần mạng, định thời, và các đối tượng khác) Lớp NsObject là lớp sở của mọi đối tượng thành phần mạng bản xử lý gói, các thành phần này kết hợp với tạo thành các đối tượng phức hợp, các đối tượng nodes hoặc links chẳng hạn Các thành phần mạng bản lại được chia thành hai phân lớp con, Connector và Classifier, dựa số lượng đường dữ liệu đầu có thể Các đối tượng mạng sở chỉ có một đường dữ liệu đầu nhất sẽ thuộc vào lớp Connector, các đối tượng chuyển mạch có thể có nhiều đường dữ liệu đầu thuộc vào lớp Classifier Nút và định tuyến Nút là một đối tượng phức hợp, được hợp thành bởi các đối tượng đầu vào nút và các bộ phân loại classifier Có hai loại nút NS Nút đơn hướng chỉ có một đối tượng phân loại địa chỉ thực hiện định tuyến đơn đường và một đối tượng phân loại cổng Nút đa hướng, ngoài hai đối tượng phân loại địa chỉ và phân loại cổng nút đơn hướng, còn có thêm một đối tượng phân loại gói đa hướng và một đối tượng phân loại thực hiện định tuyến đa luồng Bài tiểu luận môn học IP-Ứng dụng và bảo mật Giới thiệu công cụ NS Hình Nút (đơn hướng và đa hướng) Trong NS, các nút đơn hướng được sử dụng mặc định Để tạo nút đa hướng, người sử dụng phải khai báo tường minh kịch bản OTcl, sau tạo đối tượng định trình sự kiện, đó mọi nút được tạo sẽ là nút đa hướng Sau chỉ kiểu nút sử dụng, người sử dụng cũng có thể lựa chọn kiểu giao thức định tuyến xác định thay vì sử dụng giao thức ngầm định Đường kết nối Đường kết nối cũng là một đối tượng phức hợp chính khác NS, đối tượng Link Khi người sử dụng tạo một đường kết nối bằng cách sử dụng hàm thành viên duplex-link của đối tượng Simulator, hai kết nối đơn hai hướng sẽ được tạo hình vẽ Hình 7: Đường kết nối Cần lưu ý rằng hàng đợi đầu của một nút, thực là một phần của đối tượng Link đơn Các gói khỏi một hàng đợi Queue, sẽ được chuyển tới đối tượng Delay, đối tượng này mô phỏng trễ của link, còn các gói bị loại bỏ khỏi hàng đợi được gửi tới đối tượng Null Agent và được hủy tại đó Cuối cùng, đối tượng TTL tính toán tham số Time To Live đối với mỗi gói nhận được và thay đổi giá trị trường TTL của gói Theo dõi giám sát Trong NS, các tác vụ mạng được theo dõi mỗi đường kết nối đơn Nếu đối tượng mô phỏng được chỉ thị theo dõi các tác vụ mạng ( sử dụng lệnh $ns traceall file hoặc $ns trace-nam file), thì sau đó các đường kết nối được tạo sẽ được thêm vào các đối tượng theo dõi hình vẽ Người sử dụng có thể tạo đối tượng theo dõi thuộc một dạng nào đó giữa nút nguồn và nút đích bằng lệnh create-trace {type file src dst} Hình Các đối tượng theo dõi được thêm vào Khi mỗi đối tượng theo dõi nhận được một gói, nó sẽ ghi các thông số liên quan đến gói file theo dõi mà không ảnh hưởng đến thời gian mô phỏng, và chuyển các gói này tới đối tượng mạng tiếp theo Giám sát hàng đợi Về bản, các đối tượng theo dõi được thiết kế để ghi lại thời gian đến của gói dữ liệu Mặc dù người dùng có đủ các thông tin từ file theo dõi, có thể họ vẫn Bài tiểu luận môn học IP-Ứng dụng và bảo mật Giới thiệu công cụ NS quan tâm đến những gì xảy bên một hàng đợi nào đó Ví dụ: một người dùng quan tâm đến cách thức xử lý một hàng đợi RED chẳng hạn, có thể muốn đo sự thay đổi độ dài trung bình của hàng đợi và độ dài hiện thời của hàng đợi RED, điều đó có nghĩa là cần phải giám sát hàng đợi đó Việc giám sát hàng đợi được thực hiện bằng cách sử dụng các đối tượng giám sát hàng đợi và các đối tượng gián điệp hình 10 Hình 9: Giám sát hàng đợi Khi một gói đến, đối tượng gián điệp sẽ thông báo cho đối tượng giám sát hàng đợi và những thông tin này được sử dụng để giám sát hàng đợi 1.4 Gói dữ liệu Một gói NS được hình thành bởi một chồng các mào đầu, và một không gian dữ liệu hình 10 Hình 10: Khuôn dạng gói NS Khuôn dạng mào đầu gói được tạo đối tượng Simulator được khởi tạo, bao gồm một tập tất cả các mào đầu đã đăng ký, chẳng hạn các mào đầu thường được sử dụng: IP, TCP, RTP và các mào đầu theo dõi Điều này có nghĩa là cho dù một mào đầu cụ thể nào đó có được sử dụng hay không, thì một chồng gồm tất cả các mào đầu đã đăng ký vẫn được tạo một gói được cấp phát bởi một đối tượng Agent, và các đối tượng mạng có thể can thiệp tới bất kỳ mào đầu nào của gói Thường thì một gói chỉ có nhất một chồng mào đầu (và trỏ không gian dữ liệu được để bằng null) Mặc dù một gói có thể mang dữ liệu thực tế (từ một ứng dụng nào đó) bằng việc cấp phát không gian dữ liệu, lại có rất ít ứng dụng và Agent hỗ trợ việc này, bởi vì việc tải dữ liệu thực môi trường mô phỏng là điều vô nghĩa Tuy nhiên, nếu bạn muốn thực hiện một ứng dụng giao tiếp với một ứng dụng khác qua mạng, thì có thể bạn muốn sử dụng đặc tính này với một chút sửa đổi đối tượng Agent sở Bài tiểu luận môn học IP-Ứng dụng và bảo mật 10 Giới thiệu công cụ NS fid_ Flowid prio_ Priority agent_addr_ Address of this agent agent_port_ Port adress of this agent dst_addr_ Destination address for the agent dst_port_ Destination port address for the agent flags_ ttl_ TTL defaults to 32 9.9 Các lệnh Sau lênh liên quan đến agent sử dụng kịch mô phỏng: ns_ attach-agent $agent port $agent dst-port $agent attach-app $agent attach-source $agent attach-tbf $ns_ connect $ns_ create-connection $ns_ create-connection-list $ns_ simplex-connect $agent set $agent attach-trace 10 Các định thời Các định thời thực C++ OTcl Trong C++, định thời dựa lớp sở định nghĩa ~ns/timer-handler.h Các định thời thường sử dụng agent, chúng sử dụng số đối tượng khác Phần sau mô tả việc sử dụng định thời agent Các thủ tục hàm trình bày phần lấy ~ns/tcl/ex/timer.tcl, ~ns/timer-handler.{cc, h} Trong OTcl, lớp định thời đơn giản định nghĩa ~ns/tcl/ex/timer.tcl Các lớp dẫn xuất để tạo chế đơn giản để định trình kiện mức OTcl 10.1 Lớp sở C++ TimerHandler Lớp sở TimerHandler bao gồm hàm phận chung sau: Bài tiểu luận môn học IP-Ứng dụng và bảo mật 63 Giới thiệu công cụ NS void sched(double delay) schedule a timer to expire delay seconds in the future void resched(double delay) reschedule a timer (similar to sched(), but timer may be pending) void cancel() cancel a pending timer int status() TIMER_PENDING, or returns timer status (either TIMER_IDLE, TIMER_HANDLING) Lớp sở TimerHandler bao gồm phận bảo vệ sau: virtual void expire(Event* filled in by the timer client e) =0 this method must be virtual void handle(Event* e) consumes an event; invokes expire() and sets status_ of the timer appropriately int status_ keeps track of the current timer status Event event_ event to be consumed upon timer expiration Hàm ảo expire() định nghĩa lớp định thời dẫn xuất từ lớp sở Sau cùng, hai hàm nội tuyến riêng định nghĩa: inline void _sched(double delay) { (void)Scheduler::instance().schedule(this,&event_, delay); } inline void _cancel() { (void)Scheduler::instance().cancel(&event_); } Từ đoạn mã ta thấy định thời sử dụng phương thức lớp Scheduler 10.1.1 Định nghĩa định thời Để định nghĩa định thời mới, tiến hành phân lớp hàm định nghĩa hàm handle() cần (thường không yêu cầu hàm handle()): class MyTimer : public TimerHandler { public: MyTimer(MyAgentClass *a) : TimerHandler() { a_ = a; } virtual double expire(Event *e); protected: MyAgentClass *a_; }; Sau định nghĩa hiệu lực: double Bài tiểu luận môn học IP-Ứng dụng và bảo mật 64 Giới thiệu công cụ NS MyTimer::expire(Event *e) { // the work // return TIMER_HANDLED; // => not reschedule timer // return delay; // => reschedule timer after delay } Chú ý expire() trả cờ TIMER_HANDLED giá trị trễ, tuỳ theo yêu cầu định thời MyTimer nhóm với MyAgentClass, expire() gọi đến hàm chung MyAgentClass Các định thời truy cập trực tiếp từ mức OTcl, người dùng tự thiết lập phương thức kết nối 10.1.2 Ví dụ: Bộ định thời truyền lại TCP TCP ví dụ agent cần định thời Có định thời định nghĩa agent Tahoe TCP tcp.cc: rtx_timer_; /* Retransmission timer */ delsnd_timer_; /* Delays sending of packets by a small random amount of time, */ /* to avoid phase effects */ burstsnd_timer_; /* Helps TCP to stagger the transmission of a large window */ /* into several smaller bursts */ Trong ~ns/tcp.h, ba lớp dẫn xuất từ lớp sở TimerHandler: class RtxTimer : public TimerHandler { public: RtxTimer(TcpAgent *a) : TimerHandler() { a_ = a; } protected: virtual void expire(Event *e); TcpAgent *a_; }; class DelSndTimer : public TimerHandler { public: DelSndTimer(TcpAgent *a) : TimerHandler() { a_ = a; } protected: virtual void expire(Event *e); TcpAgent *a_; Bài tiểu luận môn học IP-Ứng dụng và bảo mật 65 Giới thiệu công cụ NS }; class BurstSndTimer : public TimerHandler { public: BurstSndTimer(TcpAgent *a):TimerHandler(){ a_ = a; } protected: virtual void expire(Event *e); TcpAgent *a_; }; Trong hàm khởi tạo cho TcpAgent tcp.cc, định thời khởi tạo với trỏ nó, ấn định đến trỏ a_ TcpAgent::TcpAgent() rtt_seq_(-1), : Agent(PT_TCP), rtx_timer_(this), burstsnd_timer_(this) rtt_active_(0), delsnd_timer_(this), { } Sau đây, ta tập trung vào định thời truyền lại (retransmission timer) Các phương thức trợ giúp khác định nghĩa cho kiện định thời, ví dụ: /* * Set retransmit timer using current rtt estimate By calling resched() * it running does not matter whether the timer was already */ void TcpAgent::set_rtx_timer() { rtx_timer_.resched(rtt_timeout()); } /* * Set new retransmission timer if not all outstanding * data has been acked Otherwise, if a timer is still * outstanding, cancel it */ void TcpAgent::newtimer(Packet* pkt) { hdr_tcp *tcph = (hdr_tcp*)pkt->access(off_tcp_); Bài tiểu luận môn học IP-Ứng dụng và bảo mật 66 Giới thiệu công cụ NS if (t_seqno_ > tcph->seqno()) set_rtx_timer(); else if (rtx_timer_.status() == TIMER_PENDING) rtx_timer_.cancel(); } Trong đoạn mã trên, phương thức set_rtx_timer() thiết lập định thời lại cho định thời truyền lại cách gọi rtx_timer_.resched() Chú ý rằng, không rõ định thời có chạy hay khơng việc gọi resched() huỷ định thời Trong hàm thứ hai, ví dụ sử dụng phương thức status() cancel(void) Cuối cùng, phải định nghĩa phương thức expire(void) cho lớp RtxTimer Trong trường hợp này, expire(void) gọi phương thức timeout(void) TcpAgent Có thể xảy điều timeout() hàm phận chung; khơng xảy RtxTimer phải khai báo lớp TcpAgent void TcpAgent::timeout(int tno) { /* retransmit timer */ if (tno == TCP_TIMER_RTX) { if (highest_ack_ slow_start_restart_) { == maxseq_ && ! /* * TCP option: * If no outstanding data, then don’t anything */ return; }; recover_ = maxseq_; recover_cause_ = 2; closecwnd(0); reset_rtx_timer(0,1); send_much(0, TCP_REASON_TIMEOUT, maxburst_); } else { /* * delayed-send timer, with random overhead * to avoid phase effects */ send_much(1, TCP_REASON_TIMEOUT, maxburst_); } Bài tiểu luận môn học IP-Ứng dụng và bảo mật 67 Giới thiệu công cụ NS } void RtxTimer::expire(Event *e) { a_->timeout(TCP_TIMER_RTX); } 10.2 Lớp định thời OTcl Một lớp định thời đơn giản định nghĩa ~ns/tcl/mcast/timer.tcl Các lớp của Timer định nghĩa cần Không hàm API định thời C++ (hàm sched() bị bỏ qua định thời thiết lập), hàm sched() resched() nhau; có nghĩa trạng thái định thời OTcl không giữ Trong lớp sở Timer, có định nghĩa phương thức sau đây: $self sched $delay ;# causes "$self timeout" to be called $delay seconds in the future $self resched $delay ;# same as "$self sched $delay" $self cancel ;# cancels any pending scheduled callback $self destroy ;# same as "$self cancel" $self expire ;# calls "$self timeout" immediately 10.3 Một số lệnh $timer sched $timer resched $timer cancel $timer destroy $timer expire 11 Header gói định dạng Các thủ tục hàm mô tả chương tìm ~ns/tcl/lib/nslib.tcl, ~ns/tcl/lib/ns-packet.tcl ~ns/packet.{cc, h} Các đối tượng lớp Packet đơn vị việc chuyển đổi đối tượng mô Lớp Packet cung cấp thông tin để liên kết gói vào danh mục (có nghĩa là, PacketQueue danh mục gói trống), tham chiếu đến đệm chứa header gói định nghĩa sở giao thức để tham chiếu đến đệm liệu gói Các giao thức cps thể định nghĩa header gói mở rộng header có trường bổ sung Các header gói đưa vào mô cách định nghĩa cấu trúc C++ có trường cần thiết, định nghĩa lớp tĩnh để tạo liên kết OTcl sau thay đổi số mã khởi tạo mô để ấn định byte offset gói nơi mà header dự định đặt Khi mô khởi tạo nhờ OTcl, người dùng chọn cho phép tập định dạng gói, tiết kiệm nhớ thực mô Hiện nay, hầu hết định dạng gói cho phép Việc quản lý định dạng gói cho phép mô điều khiển đối Bài tiểu luận môn học IP-Ứng dụng và bảo mật 68 Giới thiệu công cụ NS tượng quản lý headẻ gói đặc biệt mơ tả Đối tượng hỗ trợ phương thức OTcl sử dụng để quy định header gói dùng mô Nếu đối tượng mô sử dụng trường header không cho phép, chương trình ngừng lại 11.1 Header gói cho giao thức cụ thể Các nhà phát triển giao thức thường muốn tạo kiểu header để sử dụng gói Điều cho phép thực giao thức mà không chồng chéo lên trường header có Ta xem xét đơn giản giao thức RTP Header RTP yêu cầu trường số thứ tự trường định danh nguồn Các lớp sau tạo header cần thiết (xem ~ns/rtp.h ~ns/rtp.cc): Trong file rtp.h: /* rtp packet For now, just have srcid + seqno */ struct hdr_rtp { u_int32_t srcid_; int seqno_; /* per-field member functions */ u_int32_t& srcid() { return (srcid_); } int& seqno() { return (seqno_); } /* Packet header access functions */ static int offset_; inline static int& offset() { return offset_; } inline static hdr_rtp* access(const Packet* p) { return (hdr_rtp*) p->access(offset_); } }; Trong file rtp.cc: class RTPHeaderClass : public PacketHeaderClass { public: RTPHeaderClass() PacketHeaderClass("PacketHeader/RTP", : sizeof(hdr_rtp)) { bind_offset(&hdr_rtp::offset_); } } class_rtphdr; void RTPAgent::sendpkt() { Packet* p = allocpkt(); hdr_rtp *rh = hdr_rtp::access(p); Bài tiểu luận môn học IP-Ứng dụng và bảo mật 69 Giới thiệu công cụ NS lastpkttime_ = Scheduler::instance().clock(); /* Fill in srcid_ and seqno */ rh->seqno() = seqno_++; rh->srcid() = session_->srcid(); target_->recv(p, 0); } RTPAgent::RTPAgent() : session_(0), lastpkttime_(-1e6) { type_ = PT_RTP; bind("seqno_", &seqno_); } Cáu trúc đầu tiên, hdr_rtp, định nghĩa cách bố trí header gói RTP (về khái niệm chỗ đứng nó): trường cần thiết kích thước chúng Định nghĩa cấu trúc trình biên dịch sử dụng để tính byte offset trường; khơng có đối tượng cấu trúc định vị trực tiếp Cấu trúc tạo hàm phận để tạo lớp che dấu các liệu đối tượng muốn độc thay đổi trường header gói Chú ý biến lớp tĩnh offset_ dùng để tìm byte offset header rtp đặt nspacket Có phương thức sử dụng biến để truy nhập header gói bất kỳ: offset() access() Phương thức trước hầu hết người dùng lựa chọn để truy nhập header cụ thể gói; phương thức sau sử dụng lớp quản lý header gói dùng Ví dụ, để truy nhập header gói RTP gói trỏ p, ta cần sử dụng hdr_rtp::access(p) Liên kết thực offset_ đến vị trí header gói thực ~ns/tcl/lib/ns-packet.tcl ~ns/packet.cc Hằng số lệnh access() tạo truy nhập read-only đến Packet, thuộc tính read-only bị bắt buộc trỏ trả số Một cách xác để làm điều tạo phương thức, phương thức để truy nhập ghi, phương thức để truy nhập read-only Tuy nhiên, chưa thực điều Đối tượng tĩnh class_rtphdr lớp RTPHeaderClass dùng để liên kết đến OTcl header RTP cho phép thời điểm cấu hình Khi mơ chạy, đối tượng tĩnh gọi hàm khởi tạo PacketHeaderClass với lệnh "PacketHeader/RTP" sizeof(hdr_rtp) Như vậy, kích thước header RTP lưu lại sẵn sàng phục vụ đối tượng quản lý header gói thời điểm cấu hình (xem Section 12.2.4) Chú ý bind_offset() phải gọi hàm khởi tạo lớp này, đối tượng quản lý header gói biết nơi lưu giữ offset header gói Phương thức sendpkt() hàm phận ví dụ RTPAgent tạo gói để gửi cách gọi allocpkt(), điều khiển việc ấn định tất trường header gói lớp mạng (trong trường hợp IP) Các header khác IP điều khiển riêng Trong trường hợp này, agent sử dụng RTPHeader định nghĩa Hàm phận Packet::access(void) trả địa byte đệm dùng để mang thông tin header Giá trị trả trỏ đến header quan Bài tiểu luận môn học IP-Ứng dụng và bảo mật 70 Giới thiệu cơng cụ NS tâm, sau sử dụng hàm phận đối tượng RTPHeader để truy nhập trường riêng 11.1.1 Thêm kiểu header gói Giả thiết ta muốn tạo header newhdr, thực bước sau đây: tạo cấu trúc định nghĩa trường (gọi hdr_newhdr), định nghĩa offset_ phương thức truy nhập định nghĩa hàm phận cho trường cần thiết tạo lớp tính để thực liên kết với OTcl (định nghĩa PacketHeader/Newhdr), thực bind_offset() hàm khởi tạo sửa ~ns/tcl/lib/ns-packet.tcl phép định dạng gói (xem 12.2.2, 12.2.4) 11.1.2 Lựa chọn header gói mơ Mặc định ns bao gồm tất header gói tất giao thức ns tất gói mơ Như có nhiều overhead, tăng theo số giao thức thêm vào ns Với mơ “gói nhạy cảm”, overhead lớn Ví dụ, (2000), kích thước headẻ gói tất giao thức ns khoảng 1,9 Kb; nhiên, bạn dùng heder gói chung, header IP header TCP vào khoảng 100 Bytes Nếu bạn thực mơ lưu lượng web cỡ lớn có nhiều đường dẫn lớn việc giảm header gói khơng sử dụng giảm phần lớn nhớ Để tính header gói ta quan tâm mơ phỏng, ta làm sau (ví dụ bạn muốn loại header AODV ARP khỏi mô phỏng): remove-packet-header AODV ARP set ns [new Simulator] Chú ý remove-packet-header phải thực trước mô phỏn tạo Tất tên header gói nằm PacketHeader/[hdr] Bạn cần cung cấp phần [hdr] Để tìm tên header gói, bạn xem ~ns/tcl/lib/nspacket.tcl, chạy lệnh sau ns: foreach cl [PacketHeader info subclass] { puts $cl } Để tính tập hợp header mơ phỏng, ví dụ IP TCP, làm sau: remove-all-packet-headers add-packet-header IP TCP set ns [new Simulator] Quang trọng: Bạn không loại header chung khỏi mơ Bạn thấy ~ns/tcl/lib/ns-packet.tcl Bài tiểu luận môn học IP-Ứng dụng và bảo mật 71 Giới thiệu cơng cụ NS 11.2 Các lớp gói Có lớp gói C++ tương ứng để điều khiển gói header gói: Packet, p_info PacketHeader PacketHeaderManager Lớp Packet định nghĩa kiểu tất gói mơ phỏng; lớp Event nên gói định trình (ví dụ để đến sau vài hàng) Lớp packet_info giữ tất biểu diễn văn cho tên gói Lớp PacketHeader cung cấp lớp sở cho header gói cấu hình cho mơ Nó cung cấp trạng thái nội cần thiết để định vị header gói tập hợp header gói Lớp PacketHeaderManager định nghĩa lớp dùng để thu thập quản lý gói cấu hình Nó gọi phương thức OTcl thời điểm cấu hình mơ phép tập header gói biên dịch 11.2.1 Lớp Packet Lớp Packet định nghĩa cấu trúc gói cung cấp hàm phận để điều khiển danh sách đối tượng trống Nó định nghĩa packet.h sau: class Packet : public Event { private: friend class PacketQueue; u_char* bits_; u_char* data_; /* variable size buffer for ’data’ */ u_int datalen_; /* length of variable size buffer */ protected: static Packet* free_; public: Packet* next_; /* for queues and the free list */ static int hdrlen_; Packet() : bits_(0), datalen_(0), next_(0) {} u_char* const bits() { return (bits_); } Packet* copy() const; static Packet* alloc(); static Packet* alloc(int); inline void allocdata(int); static void free(Packet*); inline u_char* access(int off) { if (off < 0) abort(); return (&bits_[off]); } inline u_char* accessdata() { return data_; } }; Bài tiểu luận môn học IP-Ứng dụng và bảo mật 72 Giới thiệu công cụ NS Lớp giữ trỏ đến mảng ký tự chưa đánh dấu (thường gọi “túi bit” BOB) lưu trường header gói Nó giữ trỏ tới gói “dữ liệu” (thường khơng sử dụng mô phỏng) Biến bits_ chứa địa byte BOB BOB dãy gồm tất cấu trúc định nghĩa cho header gói (theo thoả thuận, cấu trúc có tên bắt đầu hdr_) cấu hình BOB thường có kích thước xác định tồn mơ kích thước ghi biến phận Packet::hdrlen_ Thích thước cập nhật cấu hình mơ OTcl Các phương thức khác lớp Packet dùng để tạo gói lưu trữ gói cũ (khơng sử dụng) danh sách riêng Việc định vị giải toả thực đoạn mã sau (trong ~ns/packet.h): inline Packet* Packet::alloc() { Packet* p = free_; if (p != 0) free_ = p->next_; else { p = new Packet; p->bits_ = new u_char[hdrsize_]; if (p == || p->bits_ == 0) abort(); } return (p); } /* allocate a packet with an n byte data buffer */ inline Packet* Packet::alloc(int n) { Packet* p = alloc(); if (n > 0) p->allocdata(n); return (p); } /* allocate an n byte data buffer to an existing packet */ inline void Packet::allocdata(int n) { datalen_ = n; data_ = new u_char[n]; if (data_ == 0) abort(); } inline void Packet::free(Packet* p) { p->next_ = free_; free_ = p; if (p->datalen_) { delete p->data_; p->datalen_ = 0; } } inline Packet* Packet::copy() const Bài tiểu luận môn học IP-Ứng dụng và bảo mật 73 Giới thiệu công cụ NS { Packet* p = alloc(); memcpy(p->bits(), bits_, hdrlen_); if (datalen_) { p->datalen_ = datalen_; p->data_ = new u_char[datalen_]; memcpy(p->data_, data_, datalen_); } return (p); } Phương thức alloc() hàm hỗ trợ dùng để tạo gói Nó gọi phương thức Agent::allocpkt() thay mặt cho agent khơng đối tượng gọi trực tiếp Đầu tiên cố gắng định vị gói cũ vào danh sách trống khơng định vị gói tốn tử new C++ Chú ý đối tượng lớp Packet BOB định vị riêng rẽ Phương thức free() giải phóng gói cách chuyển vào danh sách trống Chú ý gói khơng trả lại cho cấp phát nhớ hệ thống Thay vào đó, chúng lưu danh sách trống Packet::free() gọi Hàm phận copy() tạo gói với khác biệt trường uid_ Hàm dùng đối tượng Replicator để hỗ trợ phân tán đa lường mạng LAN 11.2.2 Lớp p_info Lớp gọi “keo dán” dùng để kết nơốicác giấtrị kiểu gói dạng số với tên tượng trưng chúng Khi kiểu gói định nghĩa, mã dạng số cần đuợc thêm vào bảng packet_t (xem ~ns/packet.h) tên tượng trưng cần thêm bào hàm khởi tạo p_info: enum packet_t { PT_TCP, PT_NTYPE // This MUST be the LAST one }; class p_info public: p_info() { name_[PT_TCP]= "tcp"; } } 11.2.3 Lớp hdr_cmn Các gói mơ có header chung định nghĩa ~ns/packet.h sau: struct hdr_cmn { double ts_; /* timestamp: for q-delay measurement */ Bài tiểu luận môn học IP-Ứng dụng và bảo mật 74 Giới thiệu công cụ NS packet_t ptype_; /* packet type (see above) */ int uid_; /* unique id */ int size_; /* simulated packet size */ int iface_; /* receiving interface (label) */ /* Packet header access functions */ static int offset_; inline static int& offset() { return offset_; } inline static hdr_cmn* access(Packet* p) { return (hdr_cmn*) p->access(offset_); } /* per-field member functions */ int& ptype() { return (ptype_); } int& uid() { return (uid_); } int& size() { return (size_); } int& iface() { return (iface_); } double& timestamp() { return (ts_); } }; Cấu trúc định nghĩa trường dùng để ghi lại dịng gói đo đại lượng khác Trường dấu thời gian dùng để đo trễ hàng đợi nút chuyển mạch Trường ptype_ dùng để định danh kiểu gói Trường uid_ dùng định trình để định trình thời gian gói đến Trường size_ sử dụng chung, cung cấp kích thước gói tính byte Chú ý số byte mơ khơng liên quan đến giá trị trường (có nghĩa size_ khơng có mối quan hệ với sizeof(struct hdr_cmn) cấu trúc khác ns) Hơn nữa, thường dùng để tính thời gian chuyển gói mạng 11.2.4 Lớp PacketHeaderManager Một đối tượng lớp PacketHeaderManager dùng để quản lý tập hợp kiểu header gói ấn định cho chúng offset BOB Nó định nghĩa C++ OTcl: Từ file tcl/lib/ns-packet.tcl: PacketHeaderManager set hdrlen_ foreach prot { AODV ARP aSRM Common CtrMcast Bài tiểu luận môn học IP-Ứng dụng và bảo mật 75 Giới thiệu công cụ NS Diffusion TORA UMP } { add-packet-header $prot } Simulator instproc create_packetformat {} { PacketHeaderManager instvar tab_ set pm [new PacketHeaderManager] foreach cl [PacketHeader info subclass] { if [info exists tab_($cl)] { set off [$pm allochdr $cl] $cl offset $off } } $self set packetManager_ $pm } PacketHeaderManager instproc allochdr cl { set size [$cl set hdrlen_] $self instvar hdrlen_ set NS_ALIGN ;# round up to nearest NS_ALIGN bytes, (needed on sparc/solaris) set incr ~($NS_ALIGN-1)] [expr ($size + ($NS_ALIGN-1)) & set base $hdrlen_ incr hdrlen_ $incr return $base } Từ file packet.cc: /* manages active packet header types */ class PacketHeaderManager : public TclObject { public: PacketHeaderManager() { bind("hdrlen_", &Packet::hdrlen_); } }; Bài tiểu luận môn học IP-Ứng dụng và bảo mật 76 Giới thiệu công cụ NS Đoạn mã ~ns/tcl/lib/ns-packet.tcl thực khởi tạo mô Như vậy, câu lệnh thực trước mô bắt đầu khởi tạo mảng lớp OTcl tab_ để chứa ánh xạ lớp tên tên lớp header gói hành Như trình bày 12.1, header gói truy nhập cách sử dụng hdr_> hdrname? ::access() Thủ tục create_packetformat{} phần lớp Simulator gọi lần cấu hình mơ Đầu tiên tạo đối tượng PacketHeaderManager Hàm khởi tạo C++ liên kết biến OTcl hdrlen_ (của lớp PacketHeaderManager) vào biến C++ Packet::hdrlen_ (một phận tĩnh lớp Packet) Sau tạo đối tượng quản lý gói, vịng lệnh cho phép header gói quan tâm Vịng lặp lặp lại danh mục header gói định nghĩa dạng @)ACBED_F1BHG ACB tên header thứ I F1B tên biến chứa vị trí header AJB BOB Việc đặt header thực thủ tục allochdr lớp PacketHeaderManager OTcl Thủ tục giữ biến chạy hdrlen_ chiều dài thời BOB header gói cho phép Nó xếp khoảng 8-byte cho header gói cho phép Điều cần để đảm bảo sử dụng đại lượng có chiều dài 2-word cần xếp khoảng 2word khơng bị lỗi truy nhập 11.3 Các lệnh Sau danh mục thủ tục liên quan đến header gói: Simulator::create_packetformat PacketHeaderManager::allochdr Bài tiểu luận môn học IP-Ứng dụng và bảo mật 77 ... tượng C++ và OTcl C++ OTcl Hình 2: Sự tương đồng giữa C++ và OTcl Bài tiểu luận môn học IP- Ứng dụng và bảo mật Giới thiệu công cụ NS Hình 3: Mô hình kiến trúc của NS Hình... và một đối tượng phân loại thực hiện định tuyến đa luồng Bài tiểu luận môn học IP- Ứng dụng và bảo mật Giới thiệu công cụ NS Hình Nút (đơn hướng và đa hướng) Trong NS, ... Handler*) { NsObject* node; int cl = classify(p); Bài tiểu luận môn học IP- Ứng dụng và bảo mật 25 Giới thiệu công cụ NS if (cl < || cl >= nslot_ || (node = slot_[cl]) == 0) { Tcl::instance().evalf("%s

Ngày đăng: 24/02/2016, 11:12

Từ khóa liên quan

Mục lục

  • 1. Giới thiệu về công cụ mô phỏng mạng NS

    • 1.1 Tổng quan

    • 1.2. Bộ định trình sự kiện

    • 1.3. Các thành phần mạng

    • 1.4. Gói dữ liệu

    • 2. Giao tiếp với bộ thông dịch: Liên kết OTcl

      • 2.1 Các khái niệm

      • 2.2 Tổng quan về mã lệnh

      • 2.3 Lớp Tcl

        • 2.3.1 Lấy tham chiếu tới instance của lớp Tcl

        • 2.3.2 Gọi các hàm OTcl

        • 2.3.3 Gửi và nhận kết quả từ bộ thông dịch

        • 2.3.4 Thông báo lỗi và thoát.

        • 2.3.5 Các hàm băm trong bộ thông dịch

        • 2.4 Lớp TclObject

          • 2.4.1 Tạo và hủy đối tượng TclObject

          • 2.4.2 Kết hợp biến

          • 2.4.3 Theo dõi giá trị biến

          • 2.4.4 Hàm command: định nghĩa và cách gọi

          • 2.5 Lớp TclClass

            • 2.5.1 Kết hợp các biến thành viên tĩnh của lớp C++

            • 2.6 Lớp TclCommand

            • 2.7 Lớp EmbeddedTcl

            • 2.8 Lớp InstVar

            • 3. Lớp Simlator

              • 3.1 Khởi tạo bộ mô phỏng

Tài liệu cùng người dùng

Tài liệu liên quan