Малко теория за скоростите, TCP window scaling и т.н.
Първо една дефиниция:
TCP Window е количеството данни, което е изпратено, но не е потвърдено като прието.
Влияние на максималния TCP Window върху теоретичната скорост на връзката :
Класическият TCP протокол има максимален размер на прозореца 64Kbytes или 524288 бита.
Ако си представим връзка с теоретична скорост един мегабит в секунда и еднопосочно закъснение 100 милисекунди (това е от тук до Западния бряг на Щатите), се оказва, че по дължината на тази връзка се намират 100000 бита, които са изпратени от сървъра, но не са потвърдени от клиента. Отделно трябва да минат още 100ms преди сървъра да получи потвърждение.
Ако обаче си представим връзка със скорост 10 мегабита в секунда, то по тази връзка трябва се намират 2 непотвърдени мегабита данни. Проблема е, че това е невъзможно, сървъра ще спре да предава, ако е предал повече от половин мегабит и не е получил потвърждение.
Извода е, че масималната теоретична скорост на една сесия на класическо TCP с двупосочно закъснение 200ms е 2.5 Мбит или 300 Кбайта в секунда трансфер.
При това физическият канал може да има скорост 10 гигабита, скоростта на една сесия ще остане 300К. Сумарният трансфер на 100 едновременни сесии ще бъде 250 Мбит, или 30 Мегабайта за секунда.
С увеличаване на физическите скорости (не забравяйте, че преди 10-ина години цялата международна свързаност на България беше от порядъка на 10-20 мегабита, през 2001 беше примерно 100), максималния размер на прозореца става реален проблем.
На този проблем е измислено решение през 1992, в RFC1321, но реалното приложение започва по-късно. Решението се нарича TCP Window scaling.
Реализира с множител, които показва по полко трябва да се умножи размера на прозореца. Примерно за ftp.belnet.be този множител е 2048 (=2^11, window scaling 11), което при 60мс закъснение прави теоретично възможна скорост от порядъка на 2 Gbit.
Windows XP поддържа опцията, но тя не е разрешена по подразбиране, което обяснява огромния ефект на TCP Optimizer върху скоростта на една връзка.
При Linux scaling-а е разрешен по подразбиране от 2.6.8 - Август 2004, но максималния размер на прозореца зависи примерно от обема на паметта, поради две машини с абсолютно еднаква дистрибуция и версия на ядрото, но с различен обем RAM имат различна максимална скорост на трансфер.
Надявам се, че не съм се оплел много в обясненията ;)
За допълнително четене -
http://en.wikipedia.org/wiki/TCP_window_scale_option