Gói dữ liệu có định dạng trong OPNET

Hầu hết các giao thức (protocol) trong mạng máy tính đều có cấu trúc gói dữ liệu (packet format) hao hao giống nhau. Làm việc với gói dữ liệu trong OPNET khá dễ dàng và tiện nghi với các hàm cung cấp sẵn.

Lấy ví dụ AODV_DATA trong giao thức AODV (Ad hoc On-Demand Distance Vector Routing).

image

Các lệnh như sau có thể được dùng để tạo giá trị cho trường “Type” và “Payload”

Packet                *pk_payload, *pk_data_tosend_ptr;
pk_data_tosend_ptr = op_pk_create_fmt ("ROLL_DATA");
op_pk_nfd_set(pk_data_tosend_ptr, "Type"         ,DATA_P2P);
op_pk_nfd_set(pk_data_tosend_ptr, "Payload"        ,pk_payload);

Trong đó pk_payload là gói dữ liệu “thô” cần gởi, thông thường có thể tạo ra (một cách giả tạo, vì mô phỏng mà) bằng lệnh

pk_payload  = op_pk_create (pksize);

pk_payload và pk_data_tosend_ptr đều là các con trỏ, nên tôi phải xóa cả 2 con trỏ khỏi bộ nhớ khi không dùng tới nữa.

op_pk_nfd_get(pk_ptr,"Payload", &pk_payload); //extract payload field
op_pk_destroy (pk_ptr);
op_pk_destroy (pk_payload);

Nếu không xóa những vùng này đi thì cũng không sao, đổi lại tôi sẽ tốn nhiều bộ nhớ của hệ điều hành hơn cho những gói không dùng tới ở trên. Tôi không rõ OPNET có quản lý các vùng nhớ này không; nếu không các tích lũy sau nhiều lần chạy, đặc biệt khi tôi mô phỏng những hệ thống lớn, dẫn tới tài nguyên RAM bị tổn thương trầm trọng. Cẩn tắc vô áy náy, đồng thời tạo thói quen lập trình tốt, tôi cẩn thận xóa đi những gói không hữu dụng như

– Gói đó không dành cho nốt hiện tại. Khi một nốt gởi một gói, muốn hay không những nốt xung quanh sẽ nghe được (nếu chúng đang trong chế độ hoạt động). Nếu gói đó không phải là gói broadcast, và nốt hiện tại không phải là điểm đến mong muốn của gói được nhận, tôi xóa chúng đi.

– Gói đó dành cho nốt hiện tại. Đọc thông tin. Sau đó cẩn thận xóa chúng đi. Hoặc giả là nốt trung gian (relayer), gói gém kĩ càng rồi chuyển tiếp đi.

Một điều khá đặt biệt là các gói đều được dán tem thời gian. Thời gian được tính tương đối, từ lúc chương trình chạy (t = 0).

Từ đích đến (sink), muốn biết thời gian vận chuyển từ nguồn (lúc gói pk_payload sinh ra) tới đích, thực hiện phép trừ

op_sim_time() – op_pk_stamp_time_get(pk_payload);

Tính toán này thường được dùng để thống kê kết quả. Tôi cũng có thể gán thời gian tại bất kì thời điểm nào ta muốn

op_pk_stamp(pk_data_tosend_ptr);

lệnh này rất hữu dụng trong mạng multihop, khi ta muốn biết độ trễ từ điểm tới điểm (point-to-point delay).

Tôi chỉ dán thời gian vào gói pk_data_tosend_ptr mà không dán vào gói pk_payload.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s