Sunday, August 31, 2008

TCP နဲ႔ Bandwidth


TCP Protocol ရဲ့ အဓိက ရည္ရြယ္ခ်က္က ကြန္ပ်ဴတာႏွစ္လုံး ဆက္သြယ္ၾကတဲ့အခါ ယံုၾကည္စိတ္ခ်ရေအာင္ျဖစ္ပါတယ္။
လမ္းခုလပ္မွာ အခ်က္အလက္ေတြ ေပ်ာက္ရွပ်က္စီးသြားရင္ေတာင္မွာ TCP က ျပန္ျပီးပုိ႔ေပးတာမ်ဳိးေပါ့။ Network ထဲမွာ bandwidth တုိ႔၊ delay တုိ႔ ေျပာင္းသြားတာကုိ မူတည္ျပီး အခ်က္အလက္ပုိ႔ေပးတဲ့ႏွုန္း အေႏွးအျမန္ကုိ TCP ကအလုိအေလ်ာက္ ထိန္းသိမ္းေပးပါတယ္။ congestion control လုိ႔ေခၚပါတယ္။
TCP မွာသုံးတဲ့ congestion control မွာ နည္းစံနစ္မ်ဳိးစုံပါ၀င္ပါတယ္။ ဥပမာေျပာရရင္
- ေနဂယ္ရဲ့ algorithm
- selective acknowledgement
- fast retransmit
- window flow control
- slow start
စတာေတြျဖစ္ပါတယ္။

အဲဒါေတြထဲက TCP Window နဲ႔ Bandwidth အေၾကာင္းေျပာသြားပါမယ္။ အဓိကမွတ္ထားေစခ်င္တာကေတာ့ congestion control ဆုိတာ Application တစ္ခုက အခ်က္အလက္ပုိ႔တဲ့ အေႏွးအျမန္ႏွုန္းကုိ TCP က အလုိအေလ်ာက္ ထိန္းသိမ္းေပးတဲ့ နည္းစံနစ္ေတြျဖစ္တယ္ဆုိတဲ့ အခ်က္ပါ။

Host0 နဲ႔ Host1 ဥပမာကုိဘဲ ဆက္သုံးၾကတာေပါ့။ Host0 ကအခ်က္အလက္ ပုိ႔ေပးတဲ့ ကြန္ပ်ဴတာ၊ Host1 က အခ်က္အလက္ လက္ခံမဲ့ ကြန္ပ်ဴတာ ေပါ့။
Host0 က Host1 ဆီကုိ TCP အသုံးျပဳျပီး အခ်က္အလက္ပုိ႔ေပးတဲ့အခါ လက္ခံတဲ့ကြန္ပ်ဴတာ Host1 က ရရွိတဲ့အေၾကာင္းျပန္ေျပာေပးရပါတယ္။ ဒါကုိ acknowledgment လုိ႔ေခၚပါတယ္။ Host0 က acknowledgment ျပန္မရခင္ Host1 ဆီကုိ အခ်က္အလက္ ဘယ္ေလာက္မ်ားမ်ား ပုိ႔ေပးႏုိင္တယ္ဆုိတာကုိ window size လုိ႔ေခၚပါတယ္။ Window size ဟာ TCP Packet ရဲ့ေခါင္းစီး (header) မွာပါတဲ့ field တစ္ခုျဖစ္ျပီး ၁၆-ဘစ္ အရြယ္အစား ရွိပါတယ္။ ဒါေၾကာင့္ အၾကီးဆုံး TCP Window size ဟာ ၂^၁၆ = ၆၄ ကီလုိဘုိက္ ျဖစ္ပါတယ္။ RFC-793 စာမ်က္ႏွာ ၁၄၊ အပုိင္း ၃.၁ မွာ TCP ေခါင္းစီးရဲ့အခ်က္အလက္သုိေလွာင္ပုံ (format) ကုိေလ့လာႏုိင္ပါတယ္။

Window size ရဲ့ အၾကီးဆုံးတန္ဖုိးဟာ ၆၄ ကီလုိဘုိက္ ျဖစ္တယ္ဆုိတာကုိ တနည္းေျပာရရင္ - Host0 က Host1 ဆီကုိ acknowledgment မရခင္မွာ အခ်က္အလက္ ၆၄ ကီလုိဘုိက္ထက္ ပုိျပီးပုံလုိ႔မရဘူးလုိ႔ ဆုိလုိပါတယ္။ Host0 နဲ႔ Host1 ၾကားက Network ရဲ့ latency က ၁၀ မီလီစကၠန္႔ဆုိပါစုိ႔။ Host0 က Host1 ကုိ packet တစ္ခုပုိ႔ျပီး၊ acknowledgment ျပန္ရမဲ့အခ်ိန္ကုိ တုိင္းတာခ်င္ရင္ latency ကုိ ၂ ဆပြားျပီးတြက္ခ်က္ရပါတယ္။ ဘာေၾကာင့္လဲဆုိေတာ့ Host0 ကေန Host1 ကုိ packet ပုိ႔ဖုိ႔ၾကာတာက ၁၀ မီလီစကၠန္႔၊ Host1 ကေန Host0 ကုိ acknowledgment ပုိ႔ေပးဖုိ႔ ၾကာတာက ၁၀ မီလီစကၠန္႔ - စုစုေပါင္း အသြားအျပန္ၾကာခ်ိန္ ၂၀ မီလီစကၠန္႔ျဖစ္ပါတယ္။ ဒါကုိ အသြားအျပန္ၾကာခ်ိန္ (RTT - Round Trip Time) လုိ႔ေခၚျပီး TCP နဲ႔ပတ္သက္တဲ့စာအုပ္ေတြ၊ Network နဲ႔ပတ္သက္တဲ့ စာအုပ္ေတြမွာ မၾကာခဏ ေတြ႔ရပါလိမ့္မယ္။

ကၽြန္ေတာ္တုိ႔ေဆြးေႏြးေနတဲ့ ဥပမာမွာ - Window size က ၆၄ ကီလုိဘုိက္၊ RTT က ၂၀ မီလီစကၠန္႔ ဆုိေတာ့ Host0 က Host1 ကုိ TCP သုံးျပီး အျမန္ဆုံးပုိ႔ေပးႏုိင္တဲ့ ႏွုန္းကုိ ေအာက္မွာေပးတဲ့ Formula နဲ႔တြက္မယ္ဆုိရင္

[ Window size / RTT = TCP ရဲ့အျမန္ႏွုန္း ]
၆၄ ကီလုိဘုိက္ / ၂၀ မီလီစကၠန္႔ = ၂.၅၆ မက္ဂါဘစ္ ပါ စကၠန္႔ (တစ္စကၠန္႔ကုိ ၂.၅၆ မက္ဂါဘစ္) ျဖစ္ပါတယ္။

ကြန္ပ်ဴတာ Network ေတြမွာ ၁၀၀ မက္ဂါဘစ္၊ ၁ ဂစ္ဂါဘစ္ အျမန္ႏွုန္းကုိ ေနရာတုိင္းလုိလုိမွာ ေတြ႔ေနရျပီျဖစ္ပါတယ္။ TCP Window size ရဲ့ကန္႔သတ္ခ်က္ေၾကာင့္ Network ရဲ့ အျမန္ႏွုန္းအတုိင္း အခ်က္အလက္ေတြကုိ မပုံ႔ႏုိင္ဘဲ့ ေႏွးေကြးေနတာ ျဖစ္တတ္ပါတယ္။ ၆၄ ကီလုိဘုိက္ window size ဆုိတာ ၁၉၈၁ ခုႏွစ္က သတ္မွတ္ခဲ့တဲ့ စံနစ္ျဖစ္တဲ့အတြက္ေၾကာင့္ ဒီေန႔ေခတ္မွာ အသုံးမတဲ့ေတာ့ပါဘူး။ ဒါေပမယ္လည္း TCP ေခါင္းစီးရဲ့ အခ်က္အလက္သုိေလွာင္ပုံကုိ ျပန္ျပင္ဖုိ႔ဆုိတာလည္း သိပ္မလြယ္ပါဘူး။ ဒီျပသနာကုိေျဖရွင္းဖုိ႔အတြက္ TCP Window Scaling Option ဆုိတာကုိ ၁၉၉၂ ခုႏွစ္မွာ တီထြင္ခဲ့ပါတယ္။ traceroute ကုိေရးခဲ့တဲ့ Van Jacobson က ေခါင္းေဆာင္ခဲ့တာျဖစ္ျပီး၊ RFC-1323 စာမ်က္ႏွာ ၇၊ အပုိင္း ၂ မွာအေသးစိတ္ဖတ္ၾကည့္ႏုိင္ပါတယ္။

Window Scaling Option ရဲ့အလုပ္လုပ္ပုံကေတာ့ TCP window size ကုိ အဆပြားႏုိင္တဲ့ ဂဏန္းတစ္ခုကုိ Host0 နဲ႔ Host1 တုိ႔သေဘာတူၾကဖုိ႔ျဖစ္ပါတယ္။ Window scaling factor ကုိ TCP ေခါင္းစီးရဲ့ option field ကုိအသုံးျပဳပါတယ္။ ဆုိပါစုိ႔ TCP Window size field က ၃၂ ကီလုိဘုိက္ျဖစ္ျပီး window scale factor က ၁၀၀၀ ျဖစ္ရင္ - ကြန္ပ်ဴတာက ပုိ႔ေပးႏုိင္တဲ့ စုစုေပါင္းအရြယ္အစားက ၃၂ မက္ဂါဘုိက္ျဖစ္ပါမယ္။

တမ်ဳိးလွည့္ျပီးစဥ္းစာၾကည့္ရေအာင္။ Host0 ကေန Host1 ကုိ 1Gpbs ႏွုန္းတဲ့ TCP ကုိသုံးျပီးပုိ႔ခ်င္ရင္ Window size ဘယ္ေလာက္ထားသင့္သလဲ။ RTT က ၂၀ မီလီစကၠန္႔ဘဲ ဆုိပါစုိ႔။ အရင္သုံးတဲ့ formula ကုိ နည္းနည္းေျပာင္းလုိက္တာပါဘဲ။

[ TCP အျမန္ႏွုန္း * RTT = Window Size ]
၁ ဂစ္ဂါဘစ္ ပါ စကၠန္႔ * ၂၀ မီလီစကၠန္႔ = ၂.၅ မက္ဂါဘုိက္ - TCP Window size ကုိသုံးရပါမယ္။

ျပန္ေျပာရရင္ ၂၀ မီလီစကၠန္႔ အသြားအျပန္ၾကာခ်ိန္ (RTT - Round Trip Time) ရွိတဲ့ Network မွာ TCP ကုိသုံးျပီး 1Gbps အျမန္ႏွုန္းနဲ႔ပုိ႔ခ်င္ရင္ 2.5 MBytes TCP Window size ကုိ သုံးရပါမယ္။

စာၾကြင္း -
၁၊ Operating Systems အားလုံးလုိလုိရဲ့ Default window size က 64KBytes ျဖစ္ပါတယ္။
၂၊ IPERF ဆုိတဲ့ free software tool ကုိသုံးျပီး ကိုယ့္ Network ရဲ့ TCP အျမန္ႏွုန္း ဘယ္ေလာက္ရွိတယ္ဆုိတာကုိ တုိင္းတာႏုိင္ပါတယ္။
၃၊ Window scaling option ကုိသုံးျပီး OS ရဲ့ 64KBytes default limit ကုိ program မွာျပင္လုိ႔ရပါတယ္။ C ကုိသုံးထားတဲ့ ဥပမာကုိၾကည့္ၾကည့္ပါ။ setsockopt() function ကုိသံုးတာျဖစ္ပါတယ္။


/* An example of client code that sets the TCP window size */

int window_size = 128 * 1024; /* 128 kilobytes */
sock = socket(AF_INET, SOCK_STREAM, 0);
/* These setsockopt()s must happen before the connect() */
setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(char *) &window_size, sizeof(window_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(char *) &window_size, sizeof(window_size));
connect(sock, (struct sockaddr *) &address, sizeof(address));



/* An example of server code that sets the TCP window size */
int window_size = 128 * 1024; /* 128 kilobytes */
sock = socket(AF_INET, SOCK_STREAM, 0);
/* These setsockopt()s must happen before the accept() */
setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(char *) &window_size, sizeof(window_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(char *) &window_size, sizeof(window_size));
listen(sock, 5);
accept(sock, NULL, NULL);

Post a Comment