CHƯƠNG 1. TỔNG QUAN ĐÁNH GIÁ HIỆU NĂNG MẠNG
1.1.Khái niệm hiệu năng mạng
Hiệu năng mạng là một vấn đề phức tạp do các yếu tố có thể tổng hợp đưa
ra nhằm đánh giá vấn đề hiệu năng chưa thực sự rõ ràng. Đã có nhiều khái niệm,
tham số được đưa ra nhằm minh chứng cho bản chất của vấn đề hiệu năng, lý
giải cho việc truyền thông tin hiệu quả hay kém hiệu quả giữa các hệ thống trong
mạng. Tuy nhiên, trong thực tế rất cần có những khái niệm bản chất và sát thực
tiễn với mục tiêu đánh giá được toàn bộ vấn đề hiệu năng bao gồm cả các yếu tố
đo đạc, theo dõi, điều khiển đều được tính đến. Có thể sơ lược khái niệm hiệu
năng mạng như sau: Hiệu năng mạng là hiệu quả và năng lực hoạt động của hệ
thống mạng. Như vậy, việc đánh giá hiệu năng mạng chính là tính toán và xác
định hiệu quả, năng lực thực sự của hệ thống mạng trong các điều kiện khác
nhau.
Các điều kiện được sử dụng trong đánh giá hiệu năng là rất quan trọng,
chúng ảnh hưởng trực tiếp tới các kết quả thu được. Trong các điều kiện ảnh
hưởng tới quá trình đánh giá hiệu năng thì kịch bản mô tả là yếu tố then chốt
quyết định giá trị hiệu năng tại điểm cần đo. Trong kịch bản cần xác định các
tham số đầu vào rõ ràng như các nút tham gia hệ thống, thiết bị kết nối, tác nhân
tham gia, giao thức hoạt động, ứng dụng triển khai, thời gian thực hiện, và rất
nhiều yếu tố khác kết hợp tạo ra một kịch bản hoàn thiện.
1.2.Các phương pháp đánh giá hiệu năng
1.2.1. Phương pháp toán học
Việc sử dụng các phương pháp toán trong tính toán hiệu năng mạng đã
được thực hiện từ lâu, trong đó các công cụ toán học đã được sử dụng rất linh
hoạt và đa dạng như xác suất thống kê, đồ thị, quy hoạch, luồng, để giải quyết
nhiều vấn đề trong hiệu năng. Ưu điểm chính của phương pháp toán học là có
1
thể xác định các ngưỡng giá trị của hệ thống qua việc xác định mối tương quan
giữa các yếu tố trước khi tồn tại hệ thống. Nhưng khi áp dụng trong thực tế, việc
mô tả đầy đủ các yếu tố đầu vào cho bài toán là cực kỳ khó khăn do vậy kết quả
của phương pháp này còn nhiều hạn chế.
1.2.2. Phương pháp đo thực tế
Sau khi hệ thống mạng đã được xây dựng, đây là một hệ thống tổng thể
kết nối của các thiết bị với những công nghệ khác nhau do vậy việc đo đạc để
đưa ra kết quả từ mô hình thật là rất quan trọng. Khi thực hiện đo thực tế, người
đo phải dựng ra được các kịch bản cần đo từ đó tạo ra những điều kiện giống với
kịch bản thực tế và sử dụng các công cụ đo như phần mềm, thiết bị đo để thu
nhận các kết quả thực tế từ hoạt động của hệ thống theo kịch bản. Thông thường
với phương pháp đo thực tế cho chúng ta kết quả với độ chính xác rất cao, tuy
nhiên việc đầu tư quá lớn trước khi biết kết quả hoạt động nhiều khi gây ra sự
lãng phí vì vậy giải pháp đo thực tế chỉ được sử dụng để giám sát hoạt động
mạng. Để đo được giá trị hiệu năng, quan trọng nhất là lấy thông tin chính xác về
hệ thống. Hiện nay phổ biến có 3 phương pháp lấy thông tin sau:
• Truy vấn các nút mạng để lấy trực tiếp thông tin đang lưu trữ.
• Theo dõi luồng thông tin thực tế trên hệ thống.
• Xây dựng kịch bản với dữ liệu thử nghiệm để đo hệ thống.
1.2.3. Phương pháp mô phỏng
Để giảm sai số của phương pháp toán học, giảm chi phí đầu tư cho hệ
thống trước khi đo trong thực tế, phương pháp mô phỏng đã được sử dụng. Việc
mô phỏng hệ thống đòi hỏi phải mô tả chính xác, chân thực tính năng, kỹ thuật,
yếu tố ràng buộc giữa các nhân tố tham gia và ảnh hưởng tới hệ thống trong thực
tế khi xây dựng. Như vậy, để kết quả chính xác đòi hỏi công tác mô tả kịch bản
2
phải rất chuẩn xác. Trong khuôn khổ môn học, chúng ta sẽ đi sâu vào tìm hiểu và
áp dụng phương pháp mô phỏng vào đánh giá hiệu năng mạng. Có hai phương
pháp chính được sử dụng trong mô phỏng hệ thống mạng là mô phỏng thời gian
thực và mô phỏng rời rạc. Để mô phỏng theo thời gian thực là rất khó do vậy
phương pháp phổ biến hiện nay là mô phỏng rời rạc tức là các sự kiện được xác
định rõ ràng và có thời điểm mô tả trên trục thời gian.
1.3.Các tham số đánh giá hiệu năng
Để lượng hóa vấn đề hiệu năng mạng, cần thiết phải có bộ tham số tiêu biểu
đặc trưng cho vấn đề này. Trong đó, 5 tham số sau đây được sử dụng như những
khái niệm điển hình mà nhìn vào chúng có thể cho thấy kết quả của đánh giá
hiệu năng mạng.
1.3.1. Tính sẵn sàng (Availability)
Tính sẵn sàng là thước đo đầu tiên khi xác định và đánh giá hiện trạng mạng
có khả năng phục vụ, đáp ứng yêu cầu hay không. Tham số này cho phép chỉ ra
luồng thông tin có đang được chuyển tiếp qua hệ thống mạng hay bị tắc nghẽn
cần phải xử lý, các dịch vụ mạng đang được cung cấp có sẵn sàng cho việc trả
lời các yêu cầu đưa ra. Vấn đề liên thông giữa các hệ thống trong mạng cũng
được đề cập trong tính sẵn sàng.
Một trong các công cụ, phương pháp đơn giản thường được sử dụng khi
kiểm tra tính sẵn sàng của hệ thống mạng là sử dụng chương trình ping. Chương
trình khi thực hiện sẽ gửi các gói tin dưới giao thức ICMP tới phía máy cần kiểm
tra và đợi kết quả trả lời, nếu có kết quả trả lời chúng ta có thể xác định được
tính sẵn sàng của hệ thống đích
3
Hình 1.1 Kiểm tra tính sẵn sàng với chương trình ping
Trong ví dụ trên, yêu cầu gửi đi đã có kết quả đáp ứng, trong một số trường
hợp và tình huống thực tế việc mất gói tin thường xuyên xảy ra, điều nay có thể
do nhiều nguyên nhân khác nhau, trong đó có một số nguyên nhân điển hình sau:
- Xung đột xảy ra giữa các phân đoạn mạng: Các giao thức điều khiển
truy cập đóng vai trò quan trọng trong quá trình kiểm soát xung đột,
việc lựa chọn giao thức phù hợp ảnh hưởng lớn tới xử lý các gói tin
khi hệ thống gặp vấn đề.
- Các gói tin bị hủy bởi các thiết bị mạng: Mỗi thiết bị đều có những bộ
đệm nhằm lưu trữ những gói tin chưa kịp xử lý. Để kiểm soát bộ đệm,
thông thường các thiết bị sẽ sử dụng một số giải thuật nhằm duy trì
trật tự của bộ đệm như giải thuật DropTail, RED, DDR, trong các
giải thuật này luôn tồn tại phương án hủy gói tin khi thỏa mãn điều
kiện hủy nhằm duy trì hoạt động tốt nhất cho thiết bị, tránh tắc nghẽn
và quá thời gian xử lý.
4
Hình 1.2 Hiện tượng hủy gói tin trên bộ đệm của thiết bị
1.3.2. Thời gian đáp ứng (Response time)
Khi yêu cầu được gửi tới, sẽ có một khoảng thời gian dành cho việc xử lý
trước khi trả về kết quả, khoảng thời gian này được gọi là thời gian đáp ứng, bao
gồm thời gian đi, thời gian xử lý yêu cầu và thời gian về. Đây là tham số rất quan
trọng ảnh hưởng tới quá trình đánh giá khả năng giải quyết vấn đề khi có yêu cầu
và hạ tầng truyền thông. Thời gian đáp ứng chậm thường do khả năng giải quyết
vấn đề của ứng dụng, hạn chế trong truyền và nhận thông tin trên giao thức và hạ
tầng truyền thông tin. Có thể chỉ ra một số các yếu tố ảnh hưởng trực tiếp tới thời
gian đáp ứng như sau:
• Quá tải trong các phân đoạn mạng
• Các lỗi xuất hiện trên mạng
• Khiếm khuyết khi mở rộng mạng
• Xử lý các thông tin quảng bá trên mạng chưa tốt
• Thiết bị mạng kém chất lượng
• Quá tải trên các nút mạng
5
Trong hình 1.1 khi sử dụng chương trình ping cho chúng ta kết quả như
sau:
64 bytes from 192.168.1.100: icmp_seq=0 ttl=255
time=0.712 ms
Thời gian đáp ứng được đo bằng milli giây (ms). Thông thường với các
kết nối mạng LAN thì thời gian đáp ứng nhỏ hơn 1 hoặc 2 milli giây, với các kết
nối mạng WAN thời gian đáp ứng có thể lên tới 200 hoặc 300 milli giây là chấp
nhận được, giá trị cụ thể tùy thuộc vào tốc độ đường truyền giữa các hệ thống.
Trong minh họa trên, thời gian đáp ứng trung bình khi sử dụng chương
trình ping đã được xác định
round-trip min/avg/max/stddev =
2.940/2.992/3.133/0.060 ms
1.3.3. Khả năng sử dụng mạng (Network utilization)
Khi hệ thống mạng hoạt động, việc đánh giá khả năng sử dụng mạng là
yếu tố quan trọng khi cần đánh giá hiệu năng mạng. Hệ thống mạng có thể hoạt
động ở trạng thái bình thường trong đa số thời gian, tuy nhiên trong thực tế thì hệ
thống có thể chưa hoạt động hết công suất và khả năng, như vậy phần dư thừa
khi xây dựng mạng chưa tính đến cũng là yếu tố giảm đi hiệu năng của hệ thống.
Để tính tham số khả năng sử dụng mạng, thông thường công thức chính được sử
dụng là phần trăm thời gian sử dụng mạng trong suốt thời gian hoạt động mạng.
Trong rất nhiều tình huống, có những thời điểm hệ thống sử dụng 100% công
suất nhưng có những thời điểm là về 0% cho trạng thái không có yêu cầu. Để
tăng tính chính xác khi xác định khả năng sử dụng mạng, việc tính toán lưu
lượng dữ liệu được truyền qua hệ thống trong tổng thời gian hoạt động đã được
sử dụng. Giá trị cụ thể khi tính toán còn phụ thuộc nhiều vào phương thức truyền
trên các kết nối được sử dụng tại các giao diện mạng. Ví dụ ở chế độ truyền bán
6
song công (Half duplex) chỉ có dữ liệu một chiều tại một thời điểm và như vậy
việc tính khả năng sử dụng mạng liên quan tới tỷ lệ tổng lượng vào ra trong suốt
thời gian trên khả năng của thiết bị tại thời điểm đo. Công thức tính khả năng sử
dụng mạng như sau:
NU = 100*(DS + DR) / (TP * ST)
NU (Network Ultilization): Khả năng sử dụng mạng,
được đo bằng tỉ lệ phần trăm
DS (Data send): Lượng dữ liệu được gửi đi trong
thực tế
DR (Data receive): Lượng dữ liệu nhận về trong thực
tế
TP (Throughput): Thông lượng cho phép của kết nối
ST (Sample Time): Thời gian hoạt động.
Ví dụ: Với thông lượng cho phép 10MB ở chế độ kết nối bán song công,
thực hiện đo trong thời gian 5 giây, lượng dữ liệu gửi đi là 700,000 bytes và dữ
liệu nhận về là 175,000 bytes, chúng ta có
NU = 100*8(700,000 + 175,000) / (10*1024*1024 * 5) =
14%
Trong ví dụ trên, việc tính toán khả năng sử dụng mạng tại một nút có thể
được thực hiện rất đơn giản, tuy nhiên trong trường hợp cần tính toán khả năng
sử udngj mạng giữa 2 hay nhiều nút thì độ phức tạp của bài toán đã khác biệt.
Bạn phải tính khả năng sử dụng mạng trên từng phân đoạn mạng trong toàn bộ
kết nối cần đo, áp dụng các phương pháp toán học, thống kê, trong việc xác
định và lựa chọn công thức phù hợp cho từng trường hợp. Nhưng trong trường
hợp này, thông thường người ta không tính toán thông số khả năng sử dụng
mạng mà xác định giá trị thông lượng mạng tại 2 điểm cần đo.
7
1.3.4. Thông lượng mạng (Network throughput)
Về bản chất, khả năng sử dụng mạng chính là tỉ lệ làm việc thực tế của hệ
thống còn thông lượng mạng là tổng lượng dữ liệu chuyển tiếp qua các nút cần
đo trong một thời điểm xác định.
Người quản trị hệ thống mạng có thể xác định thông lượng mạng bằng
phương pháp tìm nút cổ chai giữa 2 điểm cần đo. Đồng thời, trong một số tình
huống nhiều người sẽ khẳng định thông lượng của hai điểm sẽ được xác định
bằng giá trị băng thông (Bandwidth) tại 2 điểm đó. Những điểm nêu trên là hoàn
toàn không chính xác bởi 2 lý do chính sau đây:
- Giá trị băng thông không phụ thuộc vào thời gian đo và đây là khái
niệm khác hoàn toàn với thông lượng.
- Thông lượng thực tế phụ thuộc rất nhiều vào tổng thể kết nối, thiết bị
sử dụng, ứng dụng hoạt động, dịch vụ cung cấp của hệ thống tại thời
điểm cần đo.
Hình 1.3 Độ phức tạp khi xác định thông lượng giữa client và server
1.3.5. Khả năng của băng thông mạng (Network bandwidth capacity)
Khả năng của băng thông là một trong những yếu tố để xác định thông
lượng mạng trong thời điểm cần đo. Tổng dung lượng băng thông có khả năng
giữa hai nút mạng sẽ ảnh hưởng lớn tới hiệu năng của mạng điều này là khá hiển
8
nhiên, khi ta kết nối mạng 100BaseTX thì đương nhiên luôn nhanh hơn với kết
nối T1. Tuy nhiên việc xác định khẳ năng của băng thông giữa 2 điểm cần đo
thường rất phức tạp do tổng thể kết nối của hệ thống tác động (mô tả tại hình
1.3), do vậy đòi hỏi phải có kỹ thuật cụ thể trong việc xác định giá trị lớn nhất
trong khả năng của băng thông mạng khi hoạt động. Có 2 kỹ thuật chính được sử
dụng để xác định khả năng băng thông đó là kỹ thuật packet pair/packet train và
kỹ thuật thống kê gói tin.
.
Hình 1.4 Minh họa kỹ thuật packet pair/packet train
1.4.Phần mềm đánh giá hiệu năng
1.4.1. Ns2
Đây là phần mềm mô phỏng mạng được phát triển từ đại học California
Berkeley nhằm thay thế cho phương pháp đo đạc trên hệ thống thực. Ns2 là gói
phần mềm mô phỏng theo phương pháp rời rạc, đây là phần mềm tổng thể có sự
tham gia của ngôn ngữ C++, Tcl, oTcl. Hiện tại số lượng các module đã được
xây dựng trong gói phần mềm Ns2 là rất lớn như nam, ns, xgraph, awk,
1.4.2. SSFNet
SSFNet ứng dụng bộ công cụ phát triển SSF (Scalable Simulation
Framework), đây là ngôn ngữ mô phỏng tương đối chuẩn, có khả năng triển khai
mô hình hóa mô phỏng của nhiều yếu tố mạng, lưu lượng mạng. Ngoài SSFNet
sử dụng trong SSF để mô phỏng mạng còn có phần mềm DaSSF (Dartmouth
9
SSF). Cả hai gói trên đều có thể triển khai mô hình mạng khi mô phỏng các
mạng cỡ lớn. Gói DaSSF sử dụng ngôn ngữ C++ để mô phỏng thiết bị, kết nối,
sự kiện. Gói SSFNet sử dụng ngôn ngữ Java.
1.4.3. Một số phần mềm
Ngoài hai phần mềm bên trên, còn có nhiều phần mềm mô phỏng mạng,
viễn thông, vệ tinh, giao thức như OPNET, OmNet++, Packet Tracer Tuy
nhiên mỗi phần mềm thường tập trung riêng biệt cho các đối tượng sử dụng cụ
thể và chạy trên hệ điều hành đã xác định do vậy chúng đều có những hạn chế
nhất định. Để đáp ứng nhu cầu mô phỏng hệ thống trên các cấp độ khác nhau thì
phần mềm NS2 được đánh giá là hàng đầu bởi tính mở cũng như khả năng
chuyên sâu của hệ thống.
10
CHƯƠNG 2. CÔNG CỤ MÔ PHỎNG MẠNG - NS2
2.1. Tổng Quan NS2
NS (Network Simulator) là phần mềm mô phỏng mạng theo phương thức
điều khiển sự kiện rời rạc và hướng đối tượng. Được phát triển tại đại học
California Berkeley, viết bằng ngôn ngữ C++ và OTcl, Tcl. NS rất hữu ích cho
việc mô phỏng mạng diện rộng (WAN) và mạng nội bộ (LAN), ngoài ra NS còn
có khả năng mô phỏng rất nhiều lĩnh vực như mạng thông tin di động, thông tin
vệ tinh, Khi sử dụng NS chúng ta có thể thực hiện được một số khả năng sau:
• Khả năng kiểm tra tính ổn định của các giao thức mạng
• Khả năng đánh giá các giao thức mới trước khi đưa vào sử dụng
• Khả năng thực thi những mô hình mạng lớn mà gần như ta không thể triển
khai được trong thực tế
• Khả năng mô phỏng nhiều loại mạng khác nhau
Đã có nhiều phiên bản NS khác nhau nhưng hiện nay phổ biến là phiên bản
Ns2 có thể cài đặt và hoạt động cả trên Windows32 và Linux.
2.2. Một số lớp trong môi trường NS2
2.2.1. TclObject
Lớp TclObject là lớp cơ sở đối cho hầu hết các lớp khác trong trình thông
dịch và trình biên dịch phân cấp. Mỗi đối tượng trong lớp TclObject được tạo ra
bởi người dùng từ bên trong trình thông dịch. Một đối tượng bóng (shadow
object) tương đương được tạo ra trong trình biên dịch phân cấp. Hai đối tượng có
quan hệ chặt chẽ với nhau. Lớp TclClass bao gồm các cơ chế dùng để thực thi
đối tượng bóng (shadow) này.
Điểm khác biệt với NS v1: lớp TclObject được đưa vào sớm hơn lớp NsObject.
Vì thế nó lưu trữ giao diện các kết nối thay đổi, kết nối các đặc tính khác nhau
11
trong các đối tượng thông dịch sao cho phù hợp với các biến thành viên của đối
tượng biên dịch. Quá trình kết nối mạnh hơn trong NS v1 vì bất kỳ sự thay đổi
nào liên quan đến các biến của OTcl đều được giữ lại, và các giá trị hiện tại của
C++ và OTcl đều được nhất quán sau mỗi truy suất trong trình thông dịch. Sự
nhất quán được thực hiện thông qua lớp InstVar. Và cũng không giống NS v1,
các đối tượng trong lớp TclObject không lưu trữ dài như trong một danh sách
liên kết chung. Thay vì vậy, chúng được lưu trữ trong bảng phân cấp (hash table)
bên trong lớp Tcl.
Minh họa cấu hình của một đối tượng TclObject: Ví dụ sau đây minh họa cho
quá trình cấu hình một tác nhân SRM (lớp Agent/SRM/Adaptive).
set srm [new Agent/SRM/Adaptive]
$srm set packetSize_ 1024
$srm traffic-source $s0
Quy ước trong NS, lớp Agent/SRM/Adaptive là lớp con của Agent/SRM,
Agent/SRM là lớp con của Agent, Agent là lớp con của TclObject. Tương ứng
với lớp biên dịch phân cấp là ASRMAgent, là lớp con của SRMAgent,
SRMAgent là lớp con của Agent, Agent là lớp con của TclObject.
Dòng lệnh đầu tiên cho biết cách một đối tượng TclObject được tạo ra (hay hủy
bỏ).
Dòng lệnh thứ hai cấu hình một biến giới hạn (bound variable).
Dòng lệnh cuối cùng trình bày quá trình đối tượng thông dịch gọi phương thức
C++ khi chúng đã là một thủ tục đặc tính (instance).
2.2.2. TclClass
12
Lớp biên dịch này (TclClass) là một lớp ảo hòan tòan. Các lớp này xuất phát từ
lớp cơ sở cung cấp hai chức năng sau:
Tạo cấu trúc cho lớp trình trình thông dịch phân cấp để phản ánh lớp biên dịch
phân cấp.
Cung cấp các phương thức để minh họa đối tượng TclObject mới.
Mỗi lớp con đó có quan hệ chặt chẽ với môt lớp biên dịch đặc biệt trong lớp biên
dịch phân cấp, và có thể minh họa cho các đối tượng mới trong các lớp kết hợp
(associated).
Ví dụ, xem xét lớp RenoTcpClass. Nó là xuất phát từ lớp TclClass, và được có
quan hệ chặt chẽ với lớp RenoTcpClass. Nó sẽ minh họa cho các đối tượng mới
trong lớp RenoTcpAgent. Lớp biên dịch phân cấp của RenoTcpAgent là lớp xuất
phát từ TcpAgent, mà là lớp xuất phát từ Agent, mà là lớp xuất phát TlcObject.
RenoTcpClass được định nghĩa như sau:
static class RenoTcpClass: public TclClass {
public:
RenoTcpClass() : TclClass("Agent/TCP/Reno") {}
TclObject* create(int argc, const char*const* argv) {
return (new RenoTcpAgent());
}
} class_reno;
Chúng ta có thể theo dõi từ những định nghĩa sau:
⇒ Lớp chỉ xác định một quá trình tạo cấu trúc, và một phương thức thêm vào,
để tạo ra các đặc tính cho các đối tượng liên kết TclObject.
13
⇒ NS sẽ tiến hành tạo cấu trúc cho RenoTcpClass với biến tĩnh class_reno vào
lúc bắt đầu. Nó sẽ cài đặt các phương thức và lớp thông dịch phân cấp phù
hợp.
⇒ Quá trình tạo cấu trúc ghi rõ lớp thông dịch như Agent/TCP/Reno. Điều này
cũng được chỉ định rõ trong lớp thông dịch phân cấp.
⇒ Quá trình tạo cấu trúc trong lớp TclClass tạo ra 3 lớp, Agent/TCP/Reno là lớp
con của Agent/TCP, là lớp con của lớp Agent là lớp con của lớp TclObject.
⇒ Nhớ rằng quy ước trong NS sử dụng ký hiệu “/”để phân tách. Ví dụ, A/B/C/D
là lớp con của A/B/C, A/B/C là lớp con của A/B, ….
⇒ Lớp này liên kết chặt chẽ với lớp RenoTcpAgent; nó tạo ra các đối tượng mới
trong lớp liên kết này.
⇒ Phương thức The RenoTcpClass::create trả về đối tượng TclObjects trong lớp
RenoTcpAgent.
⇒ Khi người sử dụng ghi rõ new Agent/TCP/Reno, thủ tục
RenoTcpClass::create đựơc gọi.
⇒ Các đối số vector (argv) gồm có:
argv[0] lưu trữ tên của đối tượng.
s argv[1 3] lưu trữ $self, $class, and $proc. Vì create được gọi thông
qua thủ tục đặc tính create-shadow
argv[3] lưu trữ create-shadow.
argv[4] lưu trữ bất kỳ đối số được thêm vào (đưa vào một chuỗi) cung
cấp bởi người sử dụng.
Lớp Trace minh hoạ các đối số điều khiển bởi các phương thức TclClass
class TraceClass : public TclClass {
public:
14
TraceClass() : TclClass("Trace") {}
TclObject* create(int args, const char*const* argv) {
if (args >= 5)
return (new Trace(*argv[4]));
else
return NULL;
}
} trace_class;
Một đối tượng Trace mới được tạo như sau:
new Trace “X”
Cuối cùng, thực chất của vấn đế là làm thế nào để lớp thông dịch phân cấp được
cấu trúc hóa:
1. Quá trình tạo cấu trúc đối tượng được thực thi khi NS bắt đầu.
2. Quá trình tạo cấu trúc này gọi quá trình tạo cấu trúc lớp TclClass với tên của
lớp thông dịch như đối số của nó.
3. Cấu trúc của lớp Tcl lưu trữ tên của lớp, và thêm đối tượng này vào trong một
danh sách liên kết của các đối tượng TclClass.
4. Trong suốt quá trình khởi tạo của trình mô phỏng, Tcl_AppInit(void) gọi
TclClass::bind(void)
5. Đối với mỗi đối tượng trong danh sác các đối tượng TclClass, bind() gọi
register{}, ghi rõ tên của lớp thông dịch như đối số của nó.
6. register{} thiết lập lớp phân cấp, quá trình tạo lớp được yêu cầu và chưa được
tạo.
7. Cuối cùng, bind() xác định các thủ tục đặc tính (instance) create-shadow và
delete-shadow cho lớp mới này.
2.2.3. TclCommand
15
Lớp này cung cấp cơ chế để NS đưa các lệnh đơn giản đến trình thông dịch, sau
đó có thể được thi bên trong một ngữ cảnh chung (context) bởi trình thông dịch.
2.2.4. EmbeddedTcl
NS cho phép phát triển các chức năng ở trong mã trình biên dịch hay thông qua
mã thông dịch, điều đó được xác định tại quá trình khởi tạo.
2.2.5. InstVar
Phần này mô tả các phần bên trong lớp InstVar. Lớp này định nghĩa các phương
thức và các cơ chế để kết nối một biến thành viên C++ trong đối tượng của trình
biên dịch shadow đến biến đặc tả OTcl trong đối tượng tương đương của trình
thông dịch. Quá trình kết nối được cài đặt sao cho giá trị của biến có thể được
tập hợp hay truy suất trong cả trình thông dịch lẫn trình biên dịch tại tất cả các
thời điểm. Có 5 lớp biến:
- Lớp InstVarReal
- Lớp InstVarTime
- Lớp InstVarBandwidth
- Lớp InstVarInt
- Lớp InstVarBool
Tương đương với quá trình kết nối các biến có giá trị real, time, bandwidth,
interger và Boolean theo thứ tự.
Bây giờ, chúng ta mô tả cơ chế thông qua quá trình cài đặt các biến. Chúng ta sử
dụng lớp InstVarReal cho mô tả cơ sở. Tuy nhiên cơ chế này có thể ứng dụng
với cả 5 dạng của các biến.
Khi cài đặt một biến cho trình thông dịch để truy suất đến một biến thành viên,
các hàm thành viên của lớp InstVar thực thi bên trong quá trình thực thi các
phương pháp tiếp cận. Vì vậy, chúng không yêu cầu trình thông dịch phải xác
định ngữ cảnh nào biến này phải tồn tại.
16
Để đảm bảo mức chính xác trong quá trình thực thi, một biến chỉ biên dịch khi
lóp của nó sẵn sàng thiết lập bên trong trình thông dịch, và trình thông dịch phải
đang được tiến hành trên một đối tượng trong lớp đó. Chú ý rằng những nhà phát
minh yêu cầu khi một phương thức được đưa ra trong một lớp phải làm cho các
biến có thể truy suất thông qua trình thông dịch, ở đó phải là là lớpliên kết
TclClass. Phương thức tiếp cận quá trình thực thi có thể được tạo ra bởi một hay
hai cách:
- Cách thứ nhất là khi một đối tượng TclObject được tạo ra bên trong trình thông
dịch. Từ đây cài đặt quá trình thực thi phương thức bên trong trình thông dịch.
Khi biên dịch đối tượng shadow của trình thông dịch, đối tượng TclObject được
tạo ra. Quá trình tạo ra cấu trúc mà đối tượng biên dịch có thể kết nối các biến
thành viên của đối tượng đó để thông dịch các biến trong khi tạo ra đối tượng
thông dịch mới hơn.
- Cách thứ hai là định nghĩa một biến kết hợp bên trong một hàm lệnh, sau đó
được gọi thông qua phương thức cmd. Quá trình thực thi phương thức một cách
chính xác được thiết lập để mà thực thi phương thức cmd Ngược lại, mã trình
biên dịch được đang thực thi trên quá trình tiếp cận đối tượng shadow và có thể
vì vậy kết nối một cách cẩn thận các biến thành viên yêu cầu.
Một biến được tạo ra bằng cách chỉ ra tên của biến thông dịch, và địa chỉ của các
biến thành viên trong quá trình biên dịch. Quá trình tạo cấu trúc cho lớp cơ sở
InstVar tạo ra một biến cụ thể trong trình thông dịch và sau đó cài đặt thủ tục giữ
lại (trap) để bắt tất cả các truy suấ đến biến thông qua trình thông dịchl.
Bất cứ khi nào biến được đọc thông qua trình thông dịch, thủ tục trap cũng được
gọi trước khi đọc. Thủ tục gọi một tập các hàm thích hợp trả về giá trị hiện tại
của biến. Giá trị này sau đó được sử dụng để tập hơp giá trị của biến trình thông
dịch sau đó được đọc bởi trình thông dịch.
17
Ngược lại, bất cứ khi nào biết được tập hợp thông qua quá trình thông dịch, thủ
tục trap được gọi sau khi tập hợp giá trị của thành viên biên dịch đến giá trị hiện
được tập hợp bên trong trình thông dịch.
2.3. Mô phỏng (Simulation)
Toàn bộ việc mô phỏng được mô tả bởi Tclclass Simulation. Nó cung cấp một
tập hợp giao diện để cấu hình một mô phỏng và lựa chọn kiểu lập trình sự kiện
thường dùng điều khiển mô phỏng. Một tập lệnh mô phỏng thường bắt đầu bằng
việc tạo một trường hợp cụ thể của lớp này và gọi các phương thức khác nhau để
tạo nút, các cấu hình (topologies), và cấu hình diện mạo bên ngoài của việc mô
phỏng
2.3.1. Khởi tạo mô phỏng.
Khi một đối tượng mô phỏng mới được tạo ra trong Tcl, các thủ tục khởi tạo
thực thi các hoạt động sau:
- Khởi tạo định dạng gói tin ( gọi create_packetformat)
- Tạo một lịch lập trình( mặc định tới một lịch lập trình)
- Tạo một “null agent”: tác nhân rỗng (loại bỏ vùng đã được sử dụng trong các
nơi khác nhau ).
Việc khởi tạo định dạng gói sẽ thiết lập vùng offset trong phạm vi các gói đã
được sử dụng bởi toàn bộ việc mô phỏng. Nó được mô tả chi tiết hơn trong các
chương tiếp theo. Lịch lập trình chạy mô phỏng theo cách điều khiển sự kiện và
có thể được thay thế bởi các lịch lập trình luân phiên được cung cấp với ngữ
nghĩa khác.(Xem phần tiếp theo để biết chi tiết hơn.)
Tác nhân rỗng (null agent) được tạo với việc gọi:
set nullAgent_ [new Agent/Null]
Tác nhân này nói chung rất có ích như một vùng cho việc loại bỏ các gói hay
như một đích đến cho các gói không có giá trị hay không ghi lại được.
18
2.3.2. Lịch lập trình và các sự kiện.
Việc mô phỏng là một mô phỏng điều khiển sự kiện. Hiện nay có 4 kiểu
lịch lập trình, mỗi cái sử dụng một cấu trúc dữ liệu khác nhau: một danh sách
liên kết đơn, heap (vun đống), hàng đợi lịch, và một kiểu đặc biệt được gọi là
“thời gian thực” (real-time). Mỗi cái sẽ được mô tả cụ thể dưới đây. Lịch lập
trình chạy bằng cách chọn ra sự kiện sớm nhất kế tiếp, thực thi nó tới khi hoàn
thành và quay trở lại thực thi sự kiện tiếp theo. Đơn vị thời gian sử dụng trong
lịch lập trình là giây. Hiện tại việc mô phỏng là đơn tuyến, chỉ một sự kiện được
thực thi tại một thời điểm. Nếu có nhiều hơn một sự kiện được lập trình để thực
thi trong cùng thời gian thì việc thực thi được thực hiện trên một lịch lập trình
đầu tiên – cái đầu tiên được gởi đi. Các sự kiện đồng thời không được sắp xếp lại
theo bất cứ lịch lập trình nào và tất cả các lịch lập trình nên sắp theo thứ tự
giống nhau để gởi đi đến cùng một điểm vào.
2.3.3. Danh sách lịch lập trình
Lớp Scheduler hay List (class Scheduler/List) thực thi lập lịch lập trình sử
dụng cấu trúc danh sách liên kết đơn. Danh sách được giữ trong một thứ tự thời
gian (từ sớm nhất đến muộn nhất), vì thế sự kiện thêm vào và xóa đi yêu cầu
phải quét qua danh sách để tìm phần tử tương ứng. Lựa chọn sự kiện tiếp theo để
thực thi yêu cầu phải là phần tử đầu tiên trên cùng của danh sách. Việc thực thi
này duy trì việc thực thi các sự kiện theo cơ chế FIFO (First In First Out) cho các
sự kiện đồng bộ.
2.3.4. Lập trình heap.
Lập trình heap (class Scheduler/ Heap) thực thi lịch lập trình sử dụng một
cấu trúc heap (hay vun đống). Cấu trúc này dùng cho một số lượng lớn các sự
kiện, như việc thêm vào và xoá thời gian O(log n) cho n sự kiện. Việc thực thi
này trong NS version 2 được vay mượn từ MaRS-2.0 simulator[1]. Nó tin tưởng
19
rằng MaRS tự nó mượn code từ NetSim [12], mặc dù nguồn gốc của nó không
được xác định hoàn toàn.
2.3.5. Lập trình hàng đợi
Lập trình hàng đợi lịch (class Scheduler/Calendar) sử dụng một cấu trúc
dữ liệu tương tự lịch bàn trong một năm, trong đó các sự kiện trên các
tháng/ngày giống nhau của nhiều năm có thể sắp xếp lại trong một ngày. Việc
thực thi lập trình hàng đợi lịch này trong NS version2 được đóng góp bởi David
Wetherall
2.3.6. Lập trình thời gian thực
Lập trình thời gian thực (class Scheduler/RealTime) cố gắng tạo ra sự đồng thời
việc thực thi các sự kiện trong thời gian thực. Hiện tại nó hoạt động như một lớp
con của lập trình theo danh sách. Dung lượng thời gian thực trong NS vẫn chưa
được phát triển, nhưng thường được sử dụng để giới thiệu một NS mô phỏng
mạng vào một cấu hình thế giới thực với cấu hình mạng đơn giản hơn, vượt qua
lưu lượng,… Điều này chỉ hoạt động trong mạng với lưu lượng và tốc độ dữ liệu
chậm. Sự đồng bộ này hiện tại không có hiệu lực.
2.3.7. Các phương thức khác
Lớp mô phỏng cung cấp một số các phương thức khác thường sử dụng thiết lập
mô phỏng. Nó thường rơi vào 3 trường hợp sau: phương pháp tạo và quản lí cấu
hình, quản lí liên kết, và phương pháp thực thi dò tìm, chức năng trợ giúp phân
chia với lịch lập trình. Dưới đây là một danh sách không cấu trúc liên quan tới
các phương thức mô phỏng.
- Simulator instproc now (trả về khái niệm lập trình của thời gian hiện tại)
- Simulator instproc at args (Thực thi lập trình mã hoá ở thời gian đặc biệt)
- Simulator instproc cancel args ( huỷ sự kiện)
- Simulator instproc run args (bắt đầu lập trình)
20
- Simulator instproc halt (Ngưng lập trình)
- Simulator instproc flush-trace (Thêm tất cả các đối tượng dò tìm vào bộ đệm)
- Simulator instproc create-trace type files src dst (tạo đối tượng dò tìm)
- Simulator instproc create_packetformat( thiết lập định dạng các gói mô phỏng.)
2.4. Quá trình chuyển tiếp các node và gói
Phần nay trình bày một phương diện của quá trình tạo một topo trong NS, nghĩa
là tạo ra các node. . Lớp này cung cấp các thủ tục đặc tính để tạo và quản lý topo,
và bộ lưu trữ bên trong tham chiếu đến mỗi thành phần của topo
2.4.1. Node Basics
Cơ sở đầu tiên để tạo ra một node là:
set ns [new Simulator]
$ns node
Thủ tục đặc tính Node tạo cấu trúc một node bên ngoài các đối tượng phân lớp
(classifier) đơn giản. Tự bản thân Node chính là một lớp chuẩn độc lập trong
OTcl. Tuy nhiên, hầu hết các thành phần cấu thành của node lại chính là các
TclObject. Dạng cấu trúc của một node unicast được biểu diễn trong hình dưới
đây. Đây là dạng cấu trúc đơn giản, gồm có hai đối tượng TclObjects:
- Địa chỉ phân lớp (classifer_)
- Cổng phân lớp (dmux_).
Chức năng của những phân lớp này được dùng để phân phối đến các packet đển
các agent xác định hay gởi đi các link.
Tất cả các node lưu trữ ít nhất một trong các thành phần sau:�
- Địa chỉ hay id_, tăng lên 1 cách đều đặn (từ giá trị ban đầu 0) khi các node
được tạo ra
- Danh sách của các lân cận (neighbor_)
21
Hình 2.1. Cấu trúc của một node Unicast
22
Entry_ là một biến nhãn đơn giản thay thế cho một đối tượng thực (real), ví dụ
như classifier_.
- Danh sách của các agent (agent_)
- Định danh dạng node (nodetype_), và một module định tuyến.
Mặc định rằng các node trong NS được tạo cấu trúc cho các quá trình mô phỏng
unicast. Để có thể mô phỏng multicast, quá trình mô phỏng cần phải được tạo ra
cùng với tùy chọn “-multicast on”, ví dụ:
set ns [new Simulator -multicast on]
Cấu trúc bên trong của node dạng multicast được biểu diễn trong hình 2.4.1b
Khi trình mô phỏng định tuyến multicast, bit cao nhất của địa chỉ chỉ ra địa chỉ
đặc biệt là một địa chỉ multicast hay unicast. Nếu bit là 0, địa chỉ đưa ra là địa
chỉ unicast, ngược lại, đó là địa chỉ multicast.
Hình 2.2. Cấu trúc bên trong của Node dạng Multicast
23
2.4.2. Các phương thức của Node
Các thủ tục dùng để cấu hình một node độc lập có thể được phân lớp thành:
⇒ Các chức năng điều khiển
⇒ Quản lý địa chỉ và chỉ số Port, các chức năng định tuyến unicast
⇒ Quản lý agent
⇒ Thêm vào các lân cận (neighbor)
a. Chức năng điều khiển
$node trả con trỏ đến một node. Đây là phần tử đầu tiên sẽ điều khiển các
packet đến node đó. Biến cụ thể của node, entry_, lưu trữ tham chiếu đến phần
tử này. Đối với các node unicast, đây là địa chỉ phân lớp xem xét các bit mức cao
của địa chỉ đích đến (destination). Biến cụ thể, classifier_ lưu trữ tham chiếu đến
phân lớp này. Tuy nhiên, đối với các node multicast, điểm nhập là switch_ xem
xét các bit đầu tiên để quyết định nên chuyển packet sang phân lớp unicast hay
phân lớp multicast cho thích hợp. Ngoài ra, $node reset sẽ điều chỉnh tất cả các
agent tại node.
b. Quản lý địa chỉ và chỉ số cổng
- Thủ tục $node id trả về chỉ số node của node. Chỉ số này tự động tăng và gán
cho mỗi node trong quá trình tạo bởi phương thức của lớp Simulator là $ns node.
- Lóp Simulator cũng lưu trữ một biến cụ thể dạng mảng (array), Node_, được
chỉ thị bởi node id, và lưu trữ một tham chiếu đến node với id đó.
- Thủ tục $node agent <port> trả về kết quả tìm kiếm agent tại port. Nếu
không có agent nào tại chỉ số port là biến, thủ tục trả về chuỗi giá trị null.
- Thủ tục alloc-port trả về biến của chỉ số port kế tiếp. Nó sử dụng một biến cụ
thể, np_, để kiểm tra chỉ số port vị trí kế tiếp không xác định được.
24
- Các thủ tục, add-route và add-routes được sử dụng bới định tuyến unicast để
thêm các router vào vùng phân lớp classifier. Sử dụng cú pháp là:
$node add-route <destination id><TclObject>.
- TclObject là chỉ mục của dmux_, port demultiplexer tại node, nếu id đích giống
với id của node này, nó thường là phần đầu của link để gửi các packet đến đích
đó, nhưng cũng có thể là chỉ mục cho các phân lớp khác hay các dạng khác của
phân lớp.
- $node add-routes <destination id><TclObjects> được sử
dụng để thêm nhiều router đến cùng một đích cùng một lúc trong dạng luân
chuyển (round robin manner) để mở rộng băng thông sử dụng để đến được đích
đó thông qua tất cả các link tương tự. Nó chỉ được sử dụng nếu biến cụ thể
multiPath_ được đặt là 1, và quá trình điều hành chi tiết định tuyến động có hiệu
quả, và yêu cầu sử dụng một phân lớp với multipath.
- Đi kèm với add-routes{} là delete-routes{}.
* add-routes{} Tạo ra id, một danh sách của TclObjects, và tham chiếu đến
nullagent của trình mô phỏng.
* delete-routes{} Gỡ bỏ TclObject trong danh sách của quá trình cài đặt
các tuyến (routes) trong phân lớp multipath. Nếu tuyến nhập vào trong phân lớp
classifrier không trỏ đến phân lớp multipath, thông thường thì xóa bỏ chỉ mục từ
classifirer_, và cài đặt nullagent trong không gian của nó.
- Chi tiết quá trình định tuyến động cũng sử dụng hai phương thức thêm vào:
* Thủ tục init-routing{} thiết lập biến cụ thể multiPath_ tương tự như lớp
biến cùng tên. Nó cũng thêm vào một tham chiếu đến đối tượng điều khiển định
tuyến trong biến cụ thể, rtObject_.Thủ tục rtObject?{} trả về quyền điều khiển
cho đối tượng định tuyến tại node.
25