Bài tiểu luận môn hoc IP ứng dụng và bảo mật giới thiệu công cụ ns
1 Giới thiệu về công cụC VIỆN ng mạng NS HỌ mô phỏ CƠNG NGHỆ VIỄN THƠNG 1.1 Tởng quan KHOA QUAN HỆ QUỐC TẾ VÀ ĐÀO TẠO SAU ĐẠI HỌC 1.2 Bộ định trình sự kiện 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 .13 2.3.1 Lấy tham chiếu tới instance của lớp Tcl 13 2.3.2 Gọi các hàm OTcl .13 2.3.3 Gửi và nhận kết quả từ bộ thông dịch 13 2.3.4 Thông báo lỗi và thoát 14 2.3.5 Các hàm băm bộ thông dịch 14 2.4 Lớp TclObject 14 2.4.1 Tạo và hủy đối tượng TclObject .14 IP – ỨNG DỤNG VÀ BẢO MẬT 2.4.2 Kết hợp biến 15 2.4.3 Theo dõi giá trị biến 15 2.4.4 Hàm command: định nghĩa và cách gọi 15 2.5 Lớp TclClass 15 2.5.1 Kết hợp các biến thành viên tĩnh của lớp C++ 16 2.6 Lớp TclCommand 16 2.7 Lớp EmbeddedTcl 17 2.8 Lớp InstVar 17 Lớp Simlator 17 3.1 Khởi tạo mô .18 3.2 Bộ định trình kiện 18 3.2.1 Bộ định trình danh sách 19 Thầy hướng dẫn: Hoàng Đăng Hải 3.2.2 Bộ định trình xếp đống 19 3.2.3 Bộ định trình xếp hàng theo lịch 19 3.2.4 Bộ định trình thời gian thực .20 3.3 Các phương thức khác .20 3.4 Lướt qua lệnh .20 Các nút chuyển gói 22 4.1 Các cách thức mô phỏng: Tạo kiến trúc mạng 22 4.2 Các cách thức nút: đặt cấu hình nút 24 4.3 Cấu hình nút mặt chức .26 4.3.1 Giao diện cấu hình nút 26 4.4 Bộ phân lớp 28 4.4.1 Bộ phân lớp địa 31 TIỂU LUẬN MÔN HỌC i 4.4.2 Bộ phân lớp đa hướng 31 4.4.3 Bộ phân lớp đa đường 33 4.4.4 Bộ phân lớp băm .33 4.4.5 Bộ tạo 35 4.5 Module định tuyến tổ chức phân lớp 36 4.5.1 Module định tuyến 37 4.5.2 Giao diện nút .38 4.6 Xem qua vài lệnh 40 Các liên kết: Các liên kết đơn 41 5.1 Thủ tục cho Links SimpleLinks 43 5.2 Các Connector 44 5.3 Phân cấp đối tượng 45 Quản lý hàng đợi định trình gói .46 6.1 Lớp Queue C++ 46 6.1.1 Khóa hàng đợi 47 6.1.2 Lớp PacketQueue .49 6.2 Ví dụ: Loại bỏ phần cuối (Drop Tail) 50 6.3 Các kiểu khác đối tượng Queue .51 Trễ tuyến liên kết 56 7.1 Lớp LinkDelay 56 8.Các dịch vụ ns .58 8.1 Tổng quan .59 8.2 Sự thi hành (Implementation) 59 8.2.1 Hàng đợi RED cho Diffserv .59 8.3 Cấu hình 61 Agents 62 9.1 Trạng thái Agent 62 9.2 Các phương thức Agent 62 9.3 Protocol Agents 63 9.4 Liên kết OTcl 64 9.4.1 Tạo sửa đổi Agent 64 9.4.2 Các giá trị mặc định 64 9.4.3 Các phương thức OTcl 65 9.5 Ví dụ: Các agent Tcp, TCPSink .65 9.5.1 Tạo Agent 65 9.5.2 Khởi động Agent .66 9.5.3 Xử lý đầu vào bộ thu 67 9.5.4 Xử lý đáp ứng bên gửi 68 9.5.5 Các định thời .69 9.6 Tạo agent 69 ii 9.6.1 Ví dụ: Yêu cầu “ping” (Cấu trúc kế thừa) 70 9.6.2 Các phương thức recv() timeout() 70 9.6.3 Liên kết agent “ping” với OTcl .71 9.6.4 Sử dụng agent nhờ OTcl 73 9.7 Agent API .73 9.8 Các đối tượng agent khác .73 9.9 Các lệnh .73 10 Các định thời 74 10.1 Lớp sở C++ TimerHandler 74 10.1.1 Định nghĩa định thời 75 10.1.2 Ví dụ: Bộ định thời truyền lại TCP .76 10.2 Lớp định thời OTcl .79 10.3 Một số lệnh .79 11 Header gói định dạng .79 11.1 Header gói cho giao thức cụ thể 80 11.1.1 Thêm kiểu header gói .82 11.1.2 Lựa chọn header gói mơ 82 11.2 Các lớp gói 83 11.2.1 Lớp Packet .83 11.2.2 Lớp p_info .86 11.2.3 Lớp hdr_cmn 86 11.2.4 Lớp PacketHeaderManager 87 11.3 Các lệnh .89 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 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 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 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ạ 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" 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 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 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ớ TclObject là lớp sở p 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 traceBà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 all 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 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 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 $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: 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 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 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 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 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 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_; }; class BurstSndTimer : public TimerHandler { public: BurstSndTimer(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 76 Giới thiệu công cụ NS 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_); 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() Bài tiểu luận môn học IP-Ứng dụng và bảo mật 77 Giới thiệu công cụ NS 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_); } } void RtxTimer::expire(Event *e) { a_->timeout(TCP_TIMER_RTX); } Bài tiểu luận môn học IP-Ứng dụng và bảo mật 78 Giới thiệu công cụ NS 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 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 Bài tiểu ḷn mơn học IP-Ứng dụng và bảo mật 79 Giới thiệu công cụ NS 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); lastpkttime_ = Scheduler::instance().clock(); /* Fill in srcid_ and seqno */ Bài tiểu luận môn học IP-Ứng dụng và bảo mật 80 Giới thiệu công cụ NS 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 tâm, sau sử dụng hàm phận đối tượng RTPHeader để truy nhập trường riêng Bài tiểu luận môn học IP-Ứng dụng và bảo mật 81 Giới thiệu công cụ NS 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 82 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]); } Bài tiểu luận môn học IP-Ứng dụng và bảo mật 83 Giới thiệu công cụ NS inline u_char* accessdata() { return data_; } }; 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) Bài tiểu luận môn học IP-Ứng dụng và bảo mật 84 Giới thiệu công cụ NS { 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 { 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 Bài tiểu luận môn học IP-Ứng dụng và bảo mật 85 Giới thiệu công cụ NS 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 */ 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_); } Bài tiểu luận môn học IP-Ứng dụng và bảo mật 86 Giới thiệu công cụ NS 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 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)] { Bài tiểu luận môn học IP-Ứng dụng và bảo mật 87 Giới thiệu công cụ NS 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_); } }; Đ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 Bài tiểu luận môn học IP-Ứng dụng và bảo mật 88 ... tin) Vài ví dụ kịch Otcl thấy thư mục ns/ tcl/ex Dưới danh sách chung lệnh mô sử dụng mô scripts: set ns_ [new Simulator] Bài tiểu luận môn học IP- Ứng dụng và bảo mật 20 Giới thiệu công. .. $ns_ clearMemTrace Sử dụng cho mục đích gỡ rối nhớ $ns_ is-started Bài tiểu luận môn học IP- Ứng dụng và bảo mật 21 Giới thiệu công cụ NS chạy Trả giá tr ị mô chạy trả sại không $ns_ ... hashnode* ht_[256]; const hashnode* lookup(nsaddr_t src, nsaddr_t dst) const; }; int MCastClassifier::classify(Packet *const pkt) { IPHeader *h = IPHeader::access(pkt->bits()); nsaddr_t src = h->src()