Как работи Skype?
Както обещах, ще напиша няколко думи за това как работи Skype v3. Информацията за това е събрана от няколко източника.
Skype предлага безплатна IP телефония PC-PC и евтина IP телефония PC-POTS телефон (Skype-Out), POTS-PC (Skype-In). Това е най-популярната IP телефонна услуга. Поради което е всички оператори предлагащи и IP телефония търсят механизъм да разграничат Skype от своите услуги. Поради това, че не само, че не могат, но и предлагат по-лошо качество (защо ще напиша след малко) за повече пари, всеки такъв оператор търси механизъм да изфилтрира Skype. Някой оператори (като ItalТel) правиха дори безуспешни опити да преговарят със Skype и да ги заплашват искайки пари от тях, нарушавайки Net neutrality-то си, търсейки странични механизми за растеж. Очевидно е, че това е трудно, защото технологията на Интернет е базирана и създадена изначално да носи трафика прозрачно и ако може дори една единствена услуга да мине, ще може да се осигури нещо проксирано върху нея. Нещо, което трудно осъзнават бизнес и финансовите мениджъри управляващи телекомуникационни компании.
Така или иначе Skype търси механизъм да работи във всякакви среди, при всякакви филтри, всякакви скорости на достъп, оставяйки в същия момент максимално незабелязана. Търсят се механизми да не може да бъде разпозната, за да бъде изфилтрирана само тях. Ето какво е постигнато в Skype v3:
Skype е основно Node базирана технология. Това означава, че всеки клиент комуникира с останалите през Node – машина, която маршрутизира трафика му. Така клиента не се налага да знае трафика от къде ще мине, и да поддържа някаква форма на маршрутизация. Node-тата на Skype не се изтеглят централизирано (защото това място може да бъде изфилтрирано) както са например IRC сървърите на Emule, а са предварително записани в изпълнимия код на Skype. Никой към момента не знае техния брой. Skype пробва да се закачи към някой от тях избирайки ги в случаен ред, със случайна пауза между пробите. Също така пробва да ги достъпи чрез PING (ICMP query), UDP и TCP. Ако на компютъра ви има инсталиран browser или сте с Windows се взимат конфигурациите на прокситата, и се пробва да се свърже и през тях автоматично. В процеса на пробите се пробват и случайни свободни портове, включително добре познатите 21, 23, 25, 53, 80. Заради тези проби може да се окаже, че не е възможно да си пуснете Web сървъра след като сте си стартирали Skype, защото той е заел вече порт 80. Понеже винаги клиента прави опит да се свърже към Node, трафика минава през всякакви Firewall-и, филтри и NAT. Node-тата приемат сесии към всякакви портове, така че портовете са случайни, не може да бъде изфилтрирана пробата по IP, протокол или порт. Освен, ако предварително не знаеш всички IP адреси на всички Nodes. Някой хора се занимават с това да пускат Skype с филтри върху виртуални машини, и с дълги проби и грешки събират списъци с IP адреси на Nodes. От тях се знае, че например в България, София, някъде също има Node.
След като Skype се свърже към Node, може да получи пренасочване към по оптимизиран Node, или дори друг Skype (който може да бъде електиран като Node), така дори при някоя динамична филтрация, клиента може да се превключи автоматично към някой близък комуникиращ си, и да започне да комуникира през него. Някой услуги в Skype, като например трансфера на файлове пробват първо да се направят директно (P2P механизъм), ако е неуспешно, през някой близък общ Node, пробват се и STUN подобни техники за отваряне на тунел между два клиента зад NAT (ако трафика преминава през Node, в статистиката пише, че е redirect-нат).
За да не може да бъде позната сесията на Skype по pattern-ите на командите предавани в нея, всичко предавано от Skype клиент е криптирано. Използва се RC4. За да не се познае по периодиката на пакетите и тяхната дължина комуникацията, се използва аритметична компресия. Сесийния ключ е случаен, предоговаря се периодично. Всяко договаряне изисква оторизационен механизъм подобен на Diffle-Hellman с автентикация по RSA, с цели 13 модула и 2048 битови сертификати.
За да не бъде познат от някой inspection firewall механизъм Skype трябва да си подсигури случайност и на съдържанието на трафика. Криптирането и компресията не са достатъчни, защото специално в началото на сесията, те не внасят особена случайност, а дори и по време на сесията може да има повторяеми елементи. За да реши този проблем в Skype има предварително закодирани 300 различни CRC алгоритъма, с различна дължина на думата и различна логика. При отваряне на сесия се избира случаен алгоритъм, приемащата страна пробва всички алгоритми, докато успее да декодира информацията. Ако оторизацията не премине, се прекъсва сесията, чака се случайно време и се пробва пак. Така дори да има неподдържан алгоритъм между двете страни, след 300 проби най-късно ще се постигне ефект.
Комбинирания ефект, който се получава е случайна функция внасяща шум + криптиране със случаен сесиен ключ и аритметична компресия срещу практически случаен IP адрес, случаен протокол, случаен source и destination порт. Трудно (макар и не невъзможно, има бъгове) ще се изфилтрира това.
Друг интересен елемент – за да не може да се извлекат IP адресите на нодовете от изпълнимия код, той е компресиран и верифициран с контролна сума. Когато Skype се стартира се разкомпресира on-demand в паметта и се проверява контролната сума преди и след разкомпресията. За да не може да бъде дебъгвана, периодично се проверява времето изминало между две защити в кода. Ако е по-голямо от коефициент обратнопропорционален на мегахерците на процесора, или се е променил много спрямо предния път, очевидно имаме debug с break points, и Skype стартира процедура по самоунищожение и приключва работата си.
Човек би казал – интересни механизми за защита, но това ще увеличава закъснението и jitter-а между двама комуникиращи си, как Skype решава този ключов проблем за класическата IP телефония?
Skype използва иновативен и много сериозен Echo Cancellation и sound recovery алгоритъм – NetEQ от Global IP Sound. Разчитайки на сериозното CPU на компютъра, този алгоритъм решава Echo проблеми със закъснения от секунда, без да внася допълнителен шум (а не както класическите Echo Cancellation алгоритми на ITU използвани в VoIP телефонията). Skype също използва много ефективен алгоритъм за кодиране на гласа, отново от Global IP Sound – iSAC. Основното нужно да се знае в този алгоритъм е, че той предава не 8Khz а 16Khz (тоест 8Khz чуваем диапазон). Това е два пъти повече отколкото който и да е класически ITU алгоритъм (например G.711), и създава правилния ефект у слушащия, за по-голямо богатство на гласа и по-добро качество. Отделно предавания глас се кодира с 4Khz, с 2Khz, и с 1Khz, едно спрямо друго. Всеки пакет съдържа 2Кбит/с кодирането за целия диапазон. Така ако имаме 50% загуби на пакети пада качеството до 8Khz (като G.711), а ако имаме дори над 90% загуби на пакети гласът е чуваем, макар и на моменти да звучи като от робот. Ако нямаме достатъчно капацитет (замерва се по увеличаването на закъснението), Skype просто спира да предава екстра 8те Khz. Качеството на гласа пада до стандартно, но и заетия капацитет пада. При конференция смесването на гласа все още се прави от този, който е отворил конференцията и той управлява всеки peer по отделно. Затова и му трябва голямо CPU. Използването на такъв хитър Codec не само повишава качеството при нормална комуникация, но и решава проблемите със загубите на пакети и големите закъснения. Този интелигентен подход е очевидно по-добър от този предприет в класическата IP телефония – няма нужда от специални мрежи, QoS, и е по-ефективен във всеки смисъл. Просто класическата IP телефония е допотопна, и пропуска еволюцията в Codec-ите, като iLBC, iSAC и Speech.
Skype е доста иновативен и използва не малко техники да се пази от злите оператори, опитващи се да нарушават Net neutrality-то, с цел чрез заробване на потребителите (определени услуги само от тях) да увеличат личните си приходи. Макар да е комерсиален и затворен, Skype показва един добър начин за това какви техники могат да се използват за да се запази независимостта на услугата от оператора на свързаността. В този смисъл доколкото Интернет технологиите са все още отворени, не виждам как Net Neutrality-то ще бъде заобиколено.






11 коментара:
Интересен пост. Единственото, което му липсва май е механизма за presence и механизма за ауторизация при логване.
Тях не съм ги изследвал въобще, предполагам, че оторизацията на потребителското име и парола става след като се установи сесията към Node, към някой централен логин сървър за проверка, освен ако всеки си няма допълнителен персонален сертификат, който се сваля първия път, а след това се проверява от Node. Трябва да потърся информация. А presense предполагам, че е routing query към Node, защото често не знае че някой е online, а ако питаше крайните клиенти (като ICQ) или имаше централизиран presense сървър (като Yahoo), този проблем нямаше да го има...
За съжаление - "Това което не се купува с пари се купува с МНОГО пари".
Пример в ОАЕ тамошното БТК (Etisalat - държавна собственост и АБСОЛЮТЕН монополист на пазара на интернет, стационарни и мобилни мрежи) са закупили нещо (тук вече източниците не казват) което успешно блокира Skype в OAE. Това беше втората атака.
При първата падна сайта на Skype и източниците не можеха да се регистрират, свалят нови версии и да купуват кредити. Така ако в OAE влезеше с Skype инсталационно или вече инсталирано - то си работеше.
Знам продукта използван в OAE, за сега работи успешно. Механизма на работа е комбинация от познаване на Skype чрез предварително известни IP адресите на Node-тата (сингронизират се от обща база, която се попълва на ръка някъде си), и допълнителна филтрация за този Source IP адрес, към други IP адреси, ако сесията е Skype подобна. Знам обаче, че в OAE заобикалят ограничението успешно с тунелни механизми и проксита, а и да не забравяме - Skype 4 идва.
Много интересна статия и все пак има нещо, което не ми стана съвсем ясно - защо например когато уеб сървър-а е пуснат преди да се стартира skype, след включването му, skype отново заема този порт (в края на краищата казваш, че той прави проверка и би трябвало след като останови, че порта е зает да продължи с изпълнението на останалите операции) и сървъра на практика отново остава недостъпен (всъщност той си е достъпен просто http сесията отново не се изпълнява)?
Ако Skype правеше отново недостъпен порта, след като е пуснато някакво си httpd, това е равносилно на убиване на процеса на httpd-то. Не знам за какви сесии говориш.
Не, ако убиваше httpd-то щеше да даде грешка 404. В този случей просто показва бял екран дакато процеса не се изключи. Точно това питам, как така при условие, че 1 приложение заема точно 1 порт се получава това. Ситуацията е подобна на обратния вариант.
Skype когато ползва TCP пробва и добре познати портове. Често ако има прост филтър някъде (DMZ) това е начин той да бъде заобиколен. Ако Skype заеме порт 80, на него няма да може да се стартира по-късно HTTP сървъра, затова го споменах, защото ми се е случвало.
Ако www сървъра не е стартиран и някой се опитва да се закачи към нещо ще получи timeout или refused connection. Грешка 404 значи, че сървъра е стартиран, но търсения файл не може да бъде намерен
"Ако www сървъра не е стартиран и някой се опитва да се закачи към нещо ще получи timeout или refused connection. Грешка 404 значи, че сървъра е стартиран, но търсения файл не може да бъде намерен."
Изключително груба грешка от моя страна извинявам се за което. Това имах предвид.
Хах, много интересно като идея, в момента мой познат, работи в министерството на Русия, там имат скайп но не се сварзва и не работа.... гадовете са го измислели, въпрос на време е да се направи скриптче, кракче или допълнение към някой Firewall и да се даде за масов DOWNLOAD :)
Публикуване на коментар