1. Mô phỏng các gói tin UDP/TCP
1.2. TCP Agents
Có hai loại TCP agent chính là agent một chiều và hai chiều.Tác tử một chiều được chia nhỏ hơn thành các tập hợp bên gửi TCP (tuân theo các công nghệ điều khiển lỗi và chống tắc nghẽn khác nhau) và bên nhận (“sinks”).Các tác tử hai chiều đối xứng trong cảm nhận, mô tả cả bên gửi và bên nhận.
Các agent gửi TCP một chiều hiện được hỗ trợ là : Agent/TCP - a “tahoe” TCP sender
Agent/TCP/Reno - a “Reno” TCP sender
Agent/TCP/Newreno - Reno with a modification
Agent/TCP/Sack1 - TCP with selective repeat (follows RFC2018) Agent/TCP/Vegas - TCP Vegas
Agent/TCP/Fack - Reno TCP with “forward acknowledgment” The one-way TCP receiving agents currently supported are: Agent/TCPSink - TCP sink with one ACK per packet
Agent/TCPSink/DelAck - TCP sink with configurable delay per ACK Agent/TCPSink/Sack1 - selective ACK sink (follows RFC2018) Agent/TCPSink/Sack1/DelAck - Sack1 with DelAck
Bên gửi thử nghiệm hai chiều hiện hỗ trợ chỉ một dạng Reno của TCP: Agent/TCP/FullTcp
Sau đây gồm ba phần: Phần I là nhìn tổng quan và các ví dụ cấu hình TCP cơ bản send/sink
agents (sink không cần cấu hình). Phần hai mô tả bên trong của tác tử gửi , và phần cuối là mô tả mở rộng các loại agent khác.
1.2.1. TCP Sender một chiều
Bộ giả lập hỗ trợ nhiều phiên bản của một bộ gửi TCP.Các đối tượng này cố gắng bám sát cách điều khiển lỗi và tắc nghẽn TCP,nhưng không được như sự thực thi TCP trong thực
tế.Chúng không bao gồm quảng bá cửa sổ động, chúng thực hiện số phân đoạn và tính toán số ACK trong đơn vị gói tn, không có kết nối SYN/FIN và không có sự chuyển dũ liệu .
1.2.1.1 TCP Sender cơ bản (Tahoe TCP)
Tác tử TCP “Tahoe” Agent/TCP thực hiện điều khiển tắc nghẽn và ước lượng thời gian quay vòng - round-trip-time tương tự như phiên bản TCP với 4.3BSD “Tahoe” UN’X của UC Berkeley.Cửa sổ tắc nghẽn được tăng bởi một gói tin cho mỗi ACK mới nhận được trong khi khởi động chậm(khi cwnd_<ssthresh_) hay khi chống tắc nghẽn(khi cwnd_>=ssthresh_)
Responses to Congestion : Tahoe TCP cho rằng môt gói tin bị mất (do tắc nghẽn) khi thực hiện
NUMDUPACKS (định nghĩa trong file tcp.h,) sao lại các gói tin ACK, hay khi bộ đếm truyền lại hết hiệu lực.Nói cách khác, Tahoe TCP tác động trở lại bởi thiết lập ssthresh_ tới một nửa kích cỡ của sổ hiện tại(nhỏ nhất của cwnd_ và window_) hay 2, cái nào lớn hơn.Nó sẽ khởi tạo giá trị
cwnd_trở về giá trị của windowInit_. Đây là nguyên nhân điển hình làm cho TCP bật slow-start.
Round-Trip Time Estimation hay RTO Timeout Selection: Bốn biến được dùng để ước lượng
thời gian quay vòng và thiết lập bộ đếm truyền lại: rtt_, srtt_, rttvar_, tcpTick_, và backoff_. TCP khởi tạo rttvar_ là 3/tcpTick_ và backoff_ là 1.Khi bộ đếm truyền lại được thiết lập, thời gian timeout của nó đựoc thiết lập tới thời gian hiện tại cộng thêm max(bt(a+4v+1),64) giây, với b là giá trị của backoff_ hiện tại, t là giá trị của tcpTick_, a là giá rị của srtt_và v là giá trị của rttvar_. Cácmẫu thử thời gian quay vòng RTT Round-trip time với các ACK mới được tính toán với sự khác nhau của thời gian hiện hành và trường “time echo” trong gói tin ACK.Khi mẫu thử đầu tiên được tạo ra, giá trị của nó được dùng là giá trị khởi tạo của srtt_. Một nửa của mẫu thử đầu tiên được dùng như giá trị khởi tạo của rttvar_. Với các mẫu thử tuần tự tiếp theo, giá trị được cập nhất như sau: Srtt= ×srtt+ ×sample 8 1 8 7 Rttvar= ×rtt + × sample−srtt 4 1 var 4 3 1.2.1.2 Cấu hình
Chạy một bộ giả lập TCP cần phải tạo ra và cấu hình agent, gắn với một nguồn dữ liệu cấp ứng dụng (một bộ khởi tạo lưu lượng ), và khởi động chúng.
1.2.1.3 Cấu hình đơn giản
Tạo Agent
set ns [new Simulator] ; # preamble initialization
set node1 [$ns node] ; #agent to reside on this node
set node2 [$ns node] ; #agent to reside on this node
set tcp1 [$ns create-connection TCP $node1 TCPSink $node2 42]
$tcp set window_ 50 ; # configure the TCP agent
set ftp1 [new Application/FTP] $ftp1 attach-agent $tcp1
$ns at 0.0 "$ftp start"
Ví dụ này giải thích dùng bộ giả lập xây dựng chức năng tạo kết nối, node nguồn, agent tác vụ được tạo ra và ID luồng được dùng trên kết nối.Chức năng này được thực hiện bằng cách
tạo hai agent, thiết lập trường ID luồng flow ID trong các agent, gắn nguồn và các agent đích tới các node tương ứng, sau đó hoàn thành kết nối (thiết lập nguồn và các cổng, địa chỉ đích thích hợp).Giá trị trả về của hàm này là tên của agent nguồn được tạo ra.
TCP Data Source : là TCP agent không tạo ra bất cứ dữ liệu ứng dụng nào trên bản thân nó, thay
vào đó người sử dụng có thể kết nối các module sinh lưu lượng tới TCP agent để tạo ra dữ liệu.Hai ứng dụng thường được dùng cho TCP: FTP và Telnet. FTP minh họa truyền một lượng lớn dữ liệu và telnet chọn ngẫu nhiên kích cỡ truyền của nó từ tcplib (file tcplib-telnet.cc).
1.2.1.4 Các tham số cấu hình khác
Ngoài các tham số window_ được liệt kê ở trên, TCP agent hỗ trợ các biến cấu hình,, mỗi biến được mô tả trong mục nhỏ là một biến lớp và biến instance.Việc thay đổi biến lớp làm thay đổi giá trị mặc định đối với tất cả các agent được tạo ra tuần tự.Việc hay đổi biến instance của agent đặc biệt chỉ ảnh hưởng giá trị đwocj dùng bởi agent đó.Ví dụ:
Agent/TCP set window_ 100 ; # Changes the class variable
$tcp set window_ 2.0 ; # Changes window_ for the $tcp object only
Tham số mặc định của mỗi TCP agent là:
Agent/TCP set window_ 20 ; # max bound on window size
Agent/TCP set windowInit_ 1 ; # initial/reset value of cwnd
Agent/TCP set windowOption_ 1 ; # cong avoid algorithm (1: standard)
Agent/TCP set windowConstant_ 4 ; # used only when windowOption != 1
Agent/TCP set windowThresh_ 0.002 ; # used in computing averaged window
Agent/TCP set overhead_ 0 ; # !=0 adds random time between sends
Agent/TCP set ecn_ 0 ; # TCP should react to ecn bit
Agent/TCP set packetSize_ 1000 ; # packet size used by sender (bytes)
Agent/TCP set bugFix_ true ; # see explanation
Agent/TCP set slow_start_restart_ true ; # see explanation
Agent/TCP set tcpTick_ 0.1 ; # timer granulatiry in sec (.1 is NONSTANDARD)
Agent/TCP set maxrto_ 64 ; # bound on RTO (seconds)
Agent/TCP set dupacks_ 0 ; # duplicate ACK counter
Agent/TCP set ack_ 0 ; # highest ACK received
Agent/TCP set cwnd_ 0 ; # congestion window (packets)
Agent/TCP set awnd_ 0 ; # averaged cwnd (experimental)
Agent/TCP set ssthresh_ 0 ; # slow-stat threshold (packets)
Agent/TCP set rtt_ 0 ; # rtt sample
Agent/TCP set srtt_ 0 ; # smoothed (averaged) rtt
Agent/TCP set rttvar_ 0 ; # mean deviation of rtt samples
Agent/TCP set backoff_ 0 ; # current RTO backoff factor
Agent/TCP set maxseq_ 0 ; # max (packet) seq number sent
Với nhiều bộ giả lập, một số ccác tham số cấu hình được yêu cầu thay đổi, thường là : window_ và packetSize_. Window_ ràng buộc window TCP ,và đwocj coi như đóng vai trò của cửa sổ được quảng bá bên nhận trong thế giới TCP thực(mặc dù nó vẫn cố định).Kích cỡ gói tin mang chức năng giống như kích cỡ MMS trong thế giới TCP thực.Thay đổi các tham số này có
thể có một ảnh hưởng sâu sắc tới cách thực hiện của TCP.Tổng quát, các TCP với kích cỡ gói tin, cửa sổ lớn hơn và thời gian quay vòng nhỏ hơn (một kết quả của tô pô và tắc nghẽn) sẽ làm linh họat hơn trong việc giành được băng thông mạng.
1.2.1.5 One-Way TCP Sender khác
Reno TCP Reno TCP agent ương tự như Tahoe TCP agent, ngoại trừ nó bao gồm fast recovery,với của sổ tắc nghẽn hiện tại được tăng lên bởi số các bản sao ACK mà TCP sender nhận được trwocs khi nhận một ACK mới.Một ACK mới tức là ACK với giá trị cao hơn so với giá trị cao nhất trước đó.Thêm vào đó, Reno TCP agent không quay về slow-start trong quá trình truyền lại nhanh.Hơn nữa, nó giảm tập hợp cửa sổ tắc nghẽn xuống một nửa và khởi tạo lại ssthresh_ khớp với giá trị này.
Newreno TCP Được dựa trên Reno TCP agent, nhưng thay đổi hoạt động khi nhận các
ACK mới, để thoát trạng thái phục hồi nhanh - fast recovery,bên gửi phảib nhận một ACK với số sequence cao nhất gửi đi.Như vậy, các “partial ACK” mới (chúng được xem như các ACK mới nhưng không phải là một ACK với dữ liệu tồn tại) không làm giảm cửa sổ (và có thể đưa đến một sự trì hoãn, đặc tính của Reno).
Sack TCP thực hiện lặp lại có chọn lọc, dựa trên các ACK được cung cấp bởi bên nhận. Fack TCP Thực hiện các “forward ACK” TCP, là sự biến đổi của Sack TCP .
1.2.2 TCP Receivers (sinks)
Bên gửi TCP đwocj mô tả trên miêu tả bên gửi dữ liệu một chiều, chúng phải tương đương với một đối tượng “TCP sink”
1.2.2.1 TCP Sink cơ bản
Đối tượng TCP sink (Agent/TCPSink) có trách nhiệm gửi trả về các ACK tới đối tượng nguồn TCP tương đương.Nó tạo ra một ACK với mỗi gói tin nhận được.Kích cỡ các ACK có thể được cấu hình Việc tạo và cấu hình đối tượng TCP sink thường được thực hiện tự động bởi một thư viện gọi.
Các tham số cấu hình
Agent/TCPSink set packetSize_ 40
1.2.2.2 Delayed-ACK TCP Sink
Một đối tượng delayed-ACK sink (Agent/Agent/TCPSink/DelAck) có thể dùng để mô phỏng một TCP receiver mà các ACK nhận ít hơn một lần trên một gói tin.Đói tượng này chứa một biến ràng buộc interval_ là số giây đợi giữa các ACK.Delayed ACK sink thực hiện một chế độ ACK linh hoạt nhờ đó chỉ các ACK hợp lệ là bị trễ.Các gói tin không hợp lệ ngay lập tức sẽ sinh ra ACK
Tham số cấu hình
Agent/TCPSink/DelAck set interval_ 100ms
1.2.2.3 Sack TCP Sink
Selective-acknowledgment TCP sink (Agent/TCPSink/Sack1) thực hiện mô hình sinh SACK sau định nghĩa SACK trong chuẩn RFC 2018.Đối tượng này bao gồm biến ràng buộc maxSackBlocks_ là số lượng cực đại các khối thông tin trong một ACK có thể dùng rong việc nắm giữ thông tin SACK.Giá trị mặc định của biến này là 3, phù hợp với mong muốn dùng SACK với RTTM (RFC 2018, section 3). Delayed và selective ACKs cùng được thực hiện bởi một đối tượng loại Agent/TCPSink/Sack1/DelAck.
Tham số cấu hình:
Agent/TCPSink set maxSackBlocks_ 3
1.2.3 Các TCP Agent hai chiều (FullTcp)
Đối tượng Agent/TCP/FullTcp được thêm vào bộ TCP agent đwocj hôx trợ cho việc mô phỏng và vẫn đang phát triển.Có sự khác nhau giữa các agent này nhưng dùng cung một cơ chế.Chúng khác nhau ở các điểm sau:
- Các kết nối có thể được thiết lập và ngắt - town down (Các gói tin SYN/FIN được trao đổi)
- Hỗ trợ truyền dữ liệu hai chiều
- Các số tuần tự - sequence number trong các byte đúng hơn là các gói tin
Sự sinh ra các gói tin SYN (và các ACK của chúng) có thể có thể có độ quan trọng tới hạn trong việc cố gắng đạt tới mô hình thực tế khi dùng nhiều sự truyền dữ liệu rất ngắnPhiên bản này của TCP hiện được mặc định gửi dữ liệu trên các phân đoạn thứ ba của một bắt tay 3 lần đầu tiên, có thể hơi khác so với mô hình TCP thực tế.Một kết nối TCP điển hình được thực iện với việc kích hoạt một opener gửi một SYN, opener thụ động tương ứng với một SYN+ACK, opener chủ đông tướng ứng với một ACK, và sau một thời gian sau việc gửi phân đoạn đầu tiên với dữ liệu (tương ứng với viết ứng dụng đầu tiên ).Do đó phiên bản này của TCP gửi dữ liệu sớm hơn so với loại điển hình thực hiện.TCP này có thể được cấu hình để gửi dữ liệu trên phân đoạn SYN khởi tạo.Tương lai FullTCP có thể bao gồm viẹc diều chỉnh để gửi phân đoạn dữ liệu đầu tiên sau đó, và có thể thực hiện chức năng T/TCP Hiện tại FullTCP chỉ thực hiện với điều khiển tắc nghẽn Reno, và cuối cùng nó có thể có một dải đầy đủ của các thuật toán điều khiển tắcnghẽn(như Tahoe, SACK, Vegas, etc.).
1.2.3.1 Cấu hình cơ bản
Chạy một mô phỏng Full TCP đòi hỏi tạo và cấu hình agent, gắn vào một nguồn dữ liệu cấp ứng dụng(một traffic generator), và khởi tạo agent cũng như traffic generator.
Tạo Agent
# set up connection (do not use "create-connection" method because
# we need a handle on the sink object)
set src [new Agent/TCP/FullTcp] ; # create agent
set sink [new Agent/TCP/FullTcp] ; # create agent
$ns_ attach-agent $node_(s1) $src ; # bind src to node
$ns_ attach-agent $node_(k1) $sink ; # bind sink to node
$src set fid_ 0 ; # set flow ID field
$sink set fid_ 0 ; # set flow ID field
$ns_ connect $src $sink ; # active connection src to sink
# set up TCP-level connections
$sink listen ; # will figure out who its peer
is
$src set window_ 100;
Việc tạo ra FullTcp agent tương tự như các agent khác, nhưng sink được tạo ra tại trạng thái listening bởi phương thức listen.Do bên nhận được yêu cầu phù hợp với cuộc gọi, việc tạo kết nối cuộc gọi ở trên có thể sẽ không được dùng.
Agent/TCP/FullTcp set segsperack_ 1 ; # segs received before generating ACK
Agent/TCP/FullTcp set segsize_ 536 ; # segment size (MSS size for bulk xfers)
Agent/TCP/FullTcp set tcprexmtthresh_ 3 ; # dupACKs thresh to trigger fast rexmt
Agent/TCP/FullTcp set iss_ 0 ; # initial send sequence number
Agent/TCP/FullTcp set nodelay_ false ; # disable sender-side Nagle algorithm
Agent/TCP/FullTcp set data_on_syn_ false ; # send data on initial SYN?
Agent/TCP/FullTcp set dupseg_fix_ true ; # avoid fast rxt due to dup segs+acks
Agent/TCP/FullTcp set dupack_reset_ false ; # reset dupACK ctr on !0 len data segs containing dup ACKs
Agent/TCP/FullTcp set interval_ 0.1 ; # as in TCP above, (100ms is non-std)
1.2.3.2 BayFullTcp
Một sự thực hiện khác của TCP hai chiều được gọi là BayFullTcp. Sự khác nhau cơ bản giữa BayFullTcp và FullTcp như sau:_
- BayTcp hỗ trợ mô hình ứng dụng client-server trong khi FullTcp không giả định về lớp ứng dụng của nó..
- Giao diện ứng dụng tcp khác nhau
- FullTcp hỗ trợ ack cục bộ (BayTcp thì không).
- FullTcp hỗ trợ các dạng khác của tcp (tahoe, reno etc) còn baytcp thì không - Sự thực hiện của cả hai khác nhau tập các API .
1.2.4 Kiến trúc bên trong
TCP agent cơ bản (class Agent/TCP) được xây dựng như một tập các chu trình gửi gói tin, xử lý ACK, quản lý việc gửi cửa sổ và nắm bắt thời gian timeout..Tổng quát, mỗi chu trình có thể đuợc xác định bởi một chức năng cùng tên trong lớp xuất phát..
The TCP header: TCP header đwocj định nghĩa trong cấu trúc hdr_tcp trong file ~ns/tcp.h. Agent cơ bản chỉ dùng các tập con của các trường sau
ts_ /* current time packet was sent from source */
ts_echo_ /* for ACKs: timestamp field from packet associated with this ACK */ seqno_ /* sequence number for this data segment or ACK (Note: overloading!) */ reason_ /* set by sender when (re)transmitting to trace reason for send */
Các hàm gửi dữ liệu: tổng quan,TCP không bao giờ thục sự gử dữ liệu, nó chỉ thiết lập kích
cỡ các gói tin.
+ send_much(force, reason, maxburst) Hàm này cố gắng gửi nhiều gói tin đến mức
cửa sổ truyền hiện hành cho phép.Nó cũng giữ việc theo dõi bao nhiêu gói tin đã được gửi đi, và giới hạn là maxburst.
+ output(seqno, reason) gửi một gói tin với số tuần tự và cấp nhật biến số tuần tự gửi đi
cực đại (maxseq_) để nắm bắt số tuần tự nếu nó quá lớn.Hàm này cũng chỉ định các trường khác nhau trong TCP header (sequence number, timestamp, reason for transmission). Hàm này cũng thiết lập một bộ đếm truyền lại nếu bên nào đó đang chờ đợi
- window().Nó trả về tối thiểu của cửa sổ tắc nghẽn và biến wnd_, mô tả cửa sổ quảng bá của bên nhận.
- opencwnd() - Chức năng này mở của sổ tắc nghẽn được gọi khi một ACK mới
đến.Trong chế độ slow-start,hàm này hiếm khi gia tăng cwnd_ bởi mỗi ACK được nhậnKhi tránh tắc nghẽn, cấu hình chuẩn gia tăng cwnd_ bởi số nghịch đảo của nó.Cửa sổ khác tăng lựa chọn được hỗ trợ trong khi tránh tắc nghẽn.
- closecwnd(int how) –Hàm này giảm cửa sổ tắc nghẽn, có thẻ được gọi bằng nhiều cách:
Khi thực hiện truyền lại nhanh fast retransmit, dựa vào bộ đếm hết hiệu lực hay khia báo tắc nghẽn.(bit ECN được thiết lập ).Đối số của nó cho biết cách của sổ tắc nghẽn đượcgiảm.Giá trị 0 được dùng để truyền lại timeout và truyền nhanh trong Tahoe TCP.Đó là nguyên nhân điển hình TCP thiết lập slow-start và giảm ssthresh_ xuống một nửa cửa sổ hiện tại.Giá trị 1 được dùng bởi Reno TCP cho quá trình phục hồi nhanh -fast recovery (ngăn ngừa việc trở về slow-start).Giá trị 2 được dùng để giảm cửa sổ dựa vào ECN indication. Nó sẽ thiết lập lại cửa sổ tắc nghẽn về