Friday, August 22, 2008

ေနဂယ္ ရဲ့ Algorithm


ဂၽြန္ေနဂယ္က ၁၉၈၄ ခုႏွစ္ မွာေရးခဲ့တဲ့ Algorithm ျဖစ္ျပီး၊ RFC-896 မွာ အသးစိတ္ဖတ္ၾကည့္ႏုိင္ပါတယ္။ TCP/IP Network တစ္ခုမွာ packet ေသးေသးေလးေတြ သြားေနတာကုိ သေဘာမက်လုိ႔ ေရးခဲ့တာပါ။ TCP Packet တစ္ခုမွာ ပုိ႔ခ်င္တဲ့ Data ဘယ္ေလာက္ရွိရွိ ေခါင္းစီးအခ်က္အလက္ (Header) က ၄၀ Bytes ေနရာယူပါတယ္။ Telnet လုိ Program မ်ဳိးမွာ Data က ၁ byte သာပါျပီး၊ ေခါင္းစီးက ၄၀ bytes ေနရာယူထားပါတယ္။ ေစ်းထဲက မက်ီးသီး ၅ က်ပ္သား၀ယ္တာ သတင္းစာ တစ္ေစာင္လုံးနဲ႔ ထုပ္ေပးလုိက္သလုိျဖစ္တာေပါ့။ ဒီ TCP Packet ေတြ Network ေပၚမွာသြားေတာ့ ဆင္ဖုိးထက္၊ ခၽြန္းဖုိးၾကီးဆုိသလုိ Header အခ်က္အလက္ေတြက Data ထက္ အဆ ၄၀ ပုိယူသလုိျဖစ္တာေၾကာင့္ Bandwidth အလဟသ ျဖစ္ရပါတယ္။ ၁၉၈၄ ခုႏွစ္ကဆုိ Bandwidth က နည္းကလည္းနည္း ေစ်းကလည္းၾကီးဆုိေတာ့ ဒီျပသနာကုိ ေျဖရွင္းဖုိ႔ဆုိတာ ေတာ္ေတာ္အေရးၾကီးတယ္လုိ႔ဆုိရပါမယ္။ (ဒီျပသနာကုိ Tinygram Problem လုိ႔ေခၚပါတယ္။)

ေနဂယ္ ရဲ့ Algorithm အလုပ္လုပ္ပုံကေတာ့ ပုိ႔စရာရွိတဲ့ အခ်က္အလက္ေတြကုိ ခ်က္ခ်င္းမပုိ႔ေသးဘဲေစာင့္ေနျပီး - အေတာ္အသင့္ မ်ားလာျပီဆုိမွ packet ကုိပုိ႔ေပးမယ္ဆုိျပီး ျပင္လုိက္တာျဖစ္ပါတယ္။ မဂၤလာဒုံကုိေျပးတဲ့ ၅၁ ကား ဆူးေလမွတ္တုိင္မွာ လူေစာင့္သလုိေပါ့။ ရုံးဆင္းခ်ိန္ဆုိရင္ လူျပည့္ဖုိ႔သိပ္ၾကာၾကာမေစာင့္ရဘဲ ခ်က္ခ်င္းထြက္ႏုိင္တယ္၊ ညဥ့္နက္လာရင္ေတာ့ ကားတစီးျပည့္ဖုိ႔ ေတာ္ေတာ္ ေစာင့္ရပါတယ္။ (အခု ၅၁ ကားဆက္ေျပးေသးလားဆုိတာေတာ့ မေျပာတပ္ဖူး။) ကားတစီးမွာ လူဘယ္ေလာက္ဆန္႔တယ္ဆုိတာ အကန္႔အသတ္ရွိသလုိ Packet တစ္ခုမွာ အခ်က္အလက္ ဘယ္ေလာက္ရွိတယ္ဆုိတာကုိ MSS (Maximum Segment Size) နဲ႔သတ္မွတ္ထားပါတယ္။ MSS ကေတာ့ Network Card ရဲ့ MTU (Maximum Transfer Unit) ျဖစ္ျပီး Ethernet မွာဆုိရင္ေတာ့ ၁၅၀၀ bytes ရွိပါတယ္။

TCP ပုိ႔ေဆာင္ေရးစနစ္ဆုိတာ ယုံၾကည္စိတ္ခ်ရတဲ့စနစ္ျဖစ္ပါတယ္။ ကြန္ပ်ဴတာႏွစ္လုံး TCP ကုိအသုံးျပဳျပီး ဆက္သြယ္တယ္ဆုိရင္ လမ္းမွာ အခ်က္အလက္ အေျပာက္အရွ မရွိရေအာင္ TCP ကတာ၀န္ယူပါတယ္။ TCP ကုိသုံးျပီး ဆက္သြယ္ေနတဲ့ကြန္ပ်ဴတာ ၂ ခုုကုိ Host1 နဲ႔ Host2 လုိ႔ေခၚမယ္ဆုိပါစုိ႔။ လက္ခံရရွိတဲ့ကြန္ပ်ဴတာ (Host2) က Packet တစ္ခုရတုိင္း အသိအမွတ္ျပဳတဲ့အေၾကာင္း Packet တစ္ခုကုိ ျပန္ျပီး မူလကြန္ပ်ဴတာ (Host1) ဆီကုိပုိ႔ေပးရပါတယ္။ အသိအမွတ္ျပဳတဲ့ packet ကုိ acknowledgment packet (အတိုေကာက္ ack) လုိ႔ေခၚပါတယ္။ Host1 က packet တစ္ခုပုိ႔ျပီးတုိင္း Host2 ဆီက ack ကုိေစာင့္ပါတယ္။ Ack မရေသးရင္ Host1 က ေနာက္ထပ္ပုိ႔စရာရွိတဲ့ အခ်က္အလက္ေတြကုိ ဆက္မပုိ႔ဘဲ ေစာင့္ေနပါတယ္။ Ack မရတာ ေတာ္ေတာ္ၾကာသြားရင္ Host1 က ပထမပုိ႔လုိက္တဲ့ packet လမ္းမွာ ေပ်ာက္သြားျပီလုိ႔ ယူဆျပီး အဲဒီ packet ကုိ ထပ္ပုိ႔ေပးပါတယ္။ ဒါကုိ Retransmission လုိ႔ေခၚပါတယ္။


Packet တစ္ခုပုိ႔တုိင္း ack တစ္ခုရဖုိ႔ေစာင့္ရတယ္ဆုိတာ (one to one acknowledgment လုိ႔ေခၚပါတယ္) လက္ေတြ႔မွာ အရမ္းေႏွးျပီး၊ ack ေတြအရမ္းမ်ားလုိ႔ bandwidth အလဟသ ျဖစ္ရပါတယ္။ ဒီကေန႔အသုံးျပဳတဲ့ TCP ရဲ့ acknowledgment စံနစ္မွာေတာ့ one-to-one ထက္ပုိေကာင္းတဲ့ sliding window စံနစ္ကုိသုံးပါတယ္။ Host1, Host2 ဥပမာနဲ႔ ျပန္ေျပာပါမယ္။ Host1 နဲ႔ Host2 ၾကားမွာ အသိအမွတ္မျပဳေသးခင္မွာ အခ်က္အလက္ ဘယ္ေလာက္မ်ားမ်ားပုိ႔ႏုိင္တယ္ဆုိတာကုိ window size လုိ႔ေခၚပါတယ္။ Window size က ကြန္ပ်ဴတာ ဘယ္ေလာက္အလုပ္ရွုပ္တယ္ဆုိတာေပၚမွာ မူတည္းျပီး အနည္းအမ်ား ေျပာင္းလဲတပ္တာေၾကာင့္ dynamic window size လုိ႔ေခၚပါတယ္။ Host1 နဲ႔ Host2 အခ်က္အလက္ေတြ မပုိ႔ေပးခင္မွာ window size ဘယ္ေလာက္ရွိတဲ့အေၾကာင္း အခ်င္းခ်င္း သတင္းဖလွယ္ရပါတယ္။ Host2 က Host1 ကုိ "ငါ့ရဲ့ window size ကေတာ့ ၄၅၀၀" လုိ႔ေျပာတယ္ဆုိပါစုိ႔။ (၄၅၀၀ ကုိ Host2 ရဲ့ ေၾကျငာတဲ့ window size - advertising window size လုိ႔ေခၚပါတယ္။)
Host1 က Host2 ရဲ့ window size ၄၅၀၀ ျဖစ္ေၾကာင္းကုိသိျပီးတဲ့အတြက္ေၾကာင့္ -
၁၊ Host1 က Host2 ကုိ တခ်ိန္ထဲမွာ data ၄၅၀၀ bytes ပုိ႔ေပးလုိ႔ရတယ္။
၂၊ ၄၅၀၀ bytes ထက္ပုိတဲ့ အခ်က္အလက္ကေတာ့ Host2 ဆီက ack ရျပီးေတာ့မွ ဆက္ပုိ႔ေပးလုိ႔ရမယ္။
၃၊ Host2 က ၄၅၀၀ bytes လုံး လက္ခံရျပီးမွ ack တစ္ခါဘဲ ျပန္ပုိ႔ေပးလုိ႔ရတယ္။


ေနဂယ္ ရဲ့ Algorithm အလုပ္လုပ္ပုံကုိ အၾကမ္းေျပာရရင္ -

၁၊ ပုိ႔စရာရွိတဲ့ အခ်က္အလက္ေတြ ေတာ္ေတာ္မ်ားမ်ားရွိလုိ႔ (MSS ထက္မ်ားရင္) Packet ကုိခ်က္ခ်င္းပုိ႔ေပးပါ။ (လူျပည့္လုိ႔ ကားထြက္သြားတာေပါ့။)
၂၊ ပုိ႔စရာရွိတဲ့ အခ်က္အလက္ေတြ သိပ္မမ်ားေပမယ့္ (MSS ထက္နည္းေနေသးတယ္) acknowledgment packet ရရင္ Packet ကုိခ်က္ခ်င္းပုိ႔ေပးပါ။
၃၊ ပုိ႔စရာရွိတဲ့ အခ်က္အလက္ေတြ သိပ္မမ်ားတဲ့အျပင္ (MSS ထက္နည္းေနေသးတယ္) acknowledgment packet လည္းမရေသးရင္ packet ကုိမပုိ႔ေသးဘဲေစာင့္ေနပါ။

Operating System အားလုံးလုိလုိက ေနဂယ္ ရဲ့ Algorithm ကုိ by default အရ enable လုပ္ထားပါတယ္။ ကုိယ္တုိင္ေရးတဲ့ Program ေတြမွာ ေနဂယ္ ရဲ့ Algorithm ကုိ disable လုပ္ခ်င္ရင္ TCP_NO_DELAY ဆုိတဲ့ flag ကုိသုံးလုိ႔ရပါတယ္။ C မွာဆုိရင္ setsockopt() function ရဲ့ flag တစ္ခုျဖစ္ပါတယ္။

ေနဂယ္ ရဲ့ Algorithm ေၾကာင့္ ေကာင္းတာရွိသလုိ ဆုိးတာလဲရွိပါတယ္။ ဆုိးတာေတြထဲက ၂ ခုကုိေျပာရရင္ -
၁၊ အခ်ိန္ေပၚမွာမူတည္တဲ့ အခ်က္အလက္ေတြကုိ ပုိ႔ေပးဖုိ႔အတြက္ ေနဂယ္ ရဲ့ Algorithm ကုိ မသုံးသင့္ပါ။ ဥပမာ Stock price လုိမ်ဳိး စကၠန္႔အစိတ္အပုိင္းအတြင္းမွာ ေျပာင္းေနတဲ့ အခ်က္အလက္ေတြဟာ ေနဂယ္ ရဲ့ Algorithm က ေႏွာင့္ေႏွးေစပါတယ္။
၂၊ ေနဂယ္ ရဲ့ Algorithm နဲ႔ TCP ရဲ့ အျခား feature တစ္ခုျဖစ္တဲ့ delayed acknowledgment တုိ႔ဟာ လုံးလုံး မတဲ့တဲ့ အတြက္ေၾကာင့္ မၾကာခဏ ျပသနာတြက္တာ ၾကဳံေတြ႔ရပါတယ္။ ဒီအေၾကာင္းကုိ ေနာက္ေခါင္းစဥ္တစ္ခုနဲ႔ ထပ္ေရးသြားပါမယ္။

Post a Comment