TCP и UDP са двата основни протокола на транспортния слой в TCP/IP модела. И двата протокола - TCP и UDP - управляват комуникациите (обмен на данни) между приложения и са от типа “край до край” (end to end).
TCP гарантира надеждност на обмена на данни с установена връзка (connection-oriented), дефиниран в RFC 793, но внася допълнително закъснение именно поради функциите по надеждност, спазване на реда на подаване на единиците с данни (сегменти) и управление на потока.
Типични приложения на TCP са:
- Web браузъри и сървъри
- сигурен обмен на файлове (FTP)
UDP е по-опростен, осигурява НЕнадеждно обслужване с неустановена връзка (connectionless), дефиниран в RFC 768. Основното предимство на UDP протокола е високата скорост, с която се осъществява и респективно ниското закъснение, което обуславя и специфичното му приложение при стрийминг на живо, VPN и др.
Типични приложения на UDP са:
- Domain Name System (DNS)
- Video Streaming- Voice (Video) over IP (VoIP)
- Video over IP
- мониторинг и управление на мрежите (SNMP)
- опростен пренос на двоични файлове (Trivial FTP).
А сега нека се потопим в повече дълбочина и разгледаме в детайл двата протокола за обмен на данни - TCP и UDP - какво представялват, как се осъществяват, какви са техните предимства и недостатъци и в какви сценарии на приложение са по-подходящи.
Какво е TCP?
ТСР е абревиатура от Transmission Control Protocol. - мрежов протокол за управление на обмена на информация, един от основните, използвани в интернет.
Чрез TCP, приложенията в мрежата могат да създават връзки (connections) едно с друго и чрез тях да обменят данни в пакети.
Образно казано, информацията, която трябва да бъде транспортирана, бива разделена на голям брой пакети, всеки от които съдържа достатъчно информация да бъде пренасочен към точната си дестинация.
Надеждността на обмена се осигурява от контролни суми и сравнения между изпратените и пристигналите данни. Другата важна функция на протокола е да провери, че пакетите биват подредени в правилен ред по времето на пристигането си.
Протоколът се използва съвместно с IP протокола, като обикновено заедно се наричат TCP/IP protocol suite.
IP протоколът на мрежовия слой по своята същност е ненадежден. Той отговаря за доставянето на пакети от един IP адрес до друг без никакви гаранции за пристигането им, реда или дори пълнотата на данните в пакета. Именно тук в влиза TCP, за да осигури надеждно предаване на данни.
Можем да обобщим кои са 3-те важни характеристики на TCP:
- TCP се осъществява с установена връзка (connection-oriented).
- TCP е надежден и гарантира пристигането на сегментите, независимо от състоянието на мрежата.
- TCP е ориентиран към потока от битове (bitstream-oriented). С прилагането на TCP, данните от приложния слой са сегментирани. Транспортният слой не обръща внимание на границата на съобщението (разделението между две съобщения, изпратени по протокол). Освен това сегментите трябва да се обработват последователно, а дублираните сегменти се изхвърлят.
За да идентифицираме уникална TCP връзка, използваме следните полета, често наричани 4-tuple.
- IP адреси на източника и дестинацията. Разположени в IP хедъра, те насочват IP протокола към маршрутизиране на данни.
- Портове на източника и дестинацията. Намерени в TCP хедъра, те инструктират TCP протокола на кой процес трябва да получи сегментите.
TCP Header
Вече засегнахме портовете на източника и дестинация в TCP хедъра. Нека проучим допълнително други полета в TCP хедъра, особено тези, които са от съществено значение за установяване на TCP връзка.
- Sequence number (Пореден номер) - когато установим нова TCP връзка, произволна 32-битова стойност се присвоява като първоначален пореден номер. Получаващият край използва този пореден номер, за да изпрати обратно потвърждение (acknowledgment). Поредният номер служи като механизъм за осигуряване на последователна обработка на сегментите в приемащия край.
- Acknowledgment number (Номер за потвърждение) - този 32-битов номер се използва от получателя, за да поиска следващия TCP сегмент. Тази стойност е поредният номер, увеличен с единица. Когато изпращачът получи това потвърждение, той може да приеме, че всички предходни данни са получени успешно. Този механизъм работи за предотвратяване на всякакви загуби на данни.
- Flags (Флагове) - известни също като контролни битове, показват дали съобщението е за установяване на връзка, предаване на данни или прекратяване на връзка.
- ACK - Използва се за потвърждение.
- RST - Използва се за нулиране на връзката, когато има непоправими грешки.
- SYN - Използва се за първоначално 3-посочно ръкостискане. Полето за пореден номер (sequence number) трябва да бъде зададено.
- FIN - Използва се за прекъсване на връзката.
Установяване на TCP връзка с 3-посочно ръкостискане (handshaking)
- Първоначално и клиентът, и сървърът са в състояние CLOSED (затворено). Сървърът стартира, като слуша на конкретен порт за входящи връзки.
- Клиентът заявява връзка чрез изпращане на SYN сегмент към сървъра. Той присвоява произволно число на поредния номер, известен като начален пореден номер (Initial Sequence Number). SYN контролният бит е настроен на 1, прехвърляйки клиента в състояние SYN-SENT (изпратено).
- При получаване на SYN сегмента, сървърът присвоява произволен номер на поредния номер (sequence number) и задава номера за потвърждение (acknowledgment number) на client_isn+1. След това задава контролните битове SYN и ACK на 1 и изпраща този сегмент обратно на клиента. В този момент сървърът влиза в състояние SYN-RECEIVED (получено).
- Клиентът, след получаване на SYN+ACK сегмента, изпраща обратно ACK сегмент, като задава номера на потвърждение на server_isn+1. Този сегмент вече може да пренася данни от приложния слой и клиентът влиза в състояние ESTABLISHED (установено). След като сървърът получи ACK сегмента, той също влиза в състояние ESTABLISHED (установено)
Важно е да отбележим, че с първите две ръкостискания не могат да се пренасят данни, но с третото може.
След 3-посочното ръкостискане, клиентът и сървърът могат да започнат да обменят данни.
Какво се случва, когато се загуби сегмент?
TCP е надежден, но какво се случва, когато се загуби сегмент?
- Ако SYN е загубен - ако клиентът не получи SYN+ACK в рамките на зададен период от време, той изпраща отново SYN сегмента няколко пъти (по подразбиране е 5). Ако сегментът SYN+ACK все още не пристигне, клиентът прекъсва връзката, преминавайки от състояние SYN_SENT (изпратено) към състояние CLOSED (затворено).
- Ако SYN+ACK е загубен - клиентът не може да разграничи загубата на SYN сегмент или SYN+ACK сегмент, така че изпраща отново SYN сегмента и затваря връзката след няколко опита. Ако сървърът не получи ACK в рамките на определено време, той изпраща повторно сегмента SYN+ACK и затваря връзката след няколко опита.
- Ако ACK е загубен - ако сървърът не получи ACK сегмента, той инициира повторно изпращане. Имайте предвид, че клиентът не изпраща повторно ACK сегмента. Ако сървърът не успее да получи ACK сегмента, дори след повторно изпращане, той затваря връзката.
Прекратяване на TCP връзка с 4-посочно ръкостискане
- Клиентът изпраща FIN сегмент към сървъра, преминавайки в състояние FIN_WAIT_1 (изчакване).
- След получаване на FIN сегмента, сървърът отговаря с ACK сегмент и влиза в състояние CLOSE_WAIT (изчакване). След получаване на ACK сегмента, клиентът влиза в състояние FIN_WAIT_2 (изчакване).
- След като сървърът завърши обработката, той изпраща FIN сегмент на клиента и влиза в състояние LAST_ACK (последен сегмент).
- След получаване на FIN сегмента, клиентът изпраща ACK сегмент и влиза в състояние TIME_WAIT (изчакване). Сървърът, след получаване на ACK сегмента, преминава в състояние ЗАТВОРЕНО. След като изчака 2MSL (максимален живот на сегмента), клиентът също преминава в състояние ЗАТВОРЕНО. MSL е най-дългият период, който TCP сегмент може да съществува в мрежата, произволно определен като 2 минути.
Нека разгледаме три случая за прекратяване на връзката:
- Връзката на клиента е прекъсната
- Връзката на сървъра е прекъсната
- Мрежовият кабел е повреден
Какво се случва, ако клиентът е офлайн след установяване на TCP връзка?
Нека разгледаме сценарии, при който е установена TCP връзка между клиент и сървър, след това клиентът внезапно излиза офлайн.
Ако сървърът не се опита да изпрати данни на клиента, няма начин сървърът да знае за състоянието на клиента. Сървърът ще остане в състояние ESTABLISHED. Решението на този проблем е прилагането на TCP keepalive.
С TCP keepalive, набор от таймери са свързани с установената TCP връзка. Когато таймерът за поддържане на активността изтече, сървърът изпраща “keepalive probe” до клиента. Тази проба е ACK сегмент без данни. Ако няколко последователни пробни сегмента са изпратени без никакъв отговор от клиента, сървърът предполага, че TCP връзката е мъртва.
Сега, нека разгледаме TCP keepalive в четири сценария:
- Клиентът функционира нормално. Сървърът изпраща проба за проверка на активността и получава отговор. Таймерът за поддържане на активност се нулира и сървърът ще изпрати следващата проба, когато таймерът изтече отново.
- Процесът на клиента прекъсва. Операционната система от страната на клиента изпраща FIN сегмент на сървъра, когато възстановяваме ресурсите на процеса.
- Клиентската машина излиза офлайн и се рестартира. Както показва диаграмата по-долу, когато клиентът се върне онлайн, той не знае за предишната връзка. Когато сървърът се опита да изпрати данни на клиента през тази мъртва връзка, клиентът отговаря с RST сегмент, който принуждава сървъра да затвори връзката.
- Машината на клиента излиза офлайн и не се възстановява. След няколко проби без отговор, сървърът счита връзката за мъртва.
Подобни механизми се прилагат, когато сървърът прекъсне след установяване на TCP връзка, тъй като TCP е дуплексен протокол.
Какво представлява UDP?
User Datagram Protocol или UDP е комуникационен протокол използван в Интернет за възпроизвеждане на видео или DNS lookup. Той ускорява комуникациите, като не установява връзка, преди данните да бъдат прехвърлени. Това позволява данните да се прехвърлят много бързо, но също така може да доведе до загуба на пакети по време на предаване.
Каква е разликата между TCP и UDP?
UDP е по-бърз, но по-малко надежден от TCP. При TCP комуникация двата компютъра започват с установяване на връзка чрез автоматизиран процес, наречен „ръкостискане“. Само след като това ръкостискане е завършено, един компютър действително ще прехвърли данни към другия. UDP комуникациите не преминават през този процес. Вместо това един компютър може просто да започне да изпраща данни на другия:
Освен това TCP комуникациите посочват реда, в който трябва да бъдат получени пакетите с данни и потвърждават, че пакетите пристигат по предназначение. Ако пакет не пристигне — например поради претоварване в междинни мрежи — TCP изисква той да бъде изпратен повторно. UDP комуникациите не включват нито една от тези функции.
Тези разлики създават някои предимства. Тъй като UDP не изисква „ръкостискане“ или проверка дали данните пристигат правилно, той може да прехвърля данни много по-бързо от TCP.
Тази скорост обаче създава компромиси. Ако UDP дейтаграма бъде изгубена по време на предаване, тя няма да бъде изпратена повторно. В резултат на това приложенията, които използват UDP, трябва да могат да толерират грешки, загуба и дублиране.
За какво се използва UDP?
Гласовият и видео трафик често се изпращат с помощта на този протокол, тъй като те са чувствителни към времето (time-sensitive) и са проектирани да се справят с известно ниво на загуба. Например VoIP (voice over IP) , който се използва от много интернет базирани телефонни услуги, обикновено работи през UDP. Това е така, защото статичният телефонен разговор е за предпочитане пред този, който е кристално чист, но силно забавен.
Това също прави UDP идеалния протокол за онлайн игри. По същия начин, тъй като DNS сървърите трябва да бъдат бързи и ефективни, те работят и чрез UDP.
Използване на UDP при DDoS атаки
SYN flood атаките са изцяло TCP базирани. UDP „рисковете“ като загуба на пакети не са сериозен проблем в повечето случаи. UDP обаче може да се използва за злонамерени цели. Тъй като UDP не изисква ръкостискане, атакуващите могат да „наводнят“ таргетирания сървър с UDP трафик, без първо да получат разрешението на сървъра за започване на комуникация.
Кой протокол е по-добър: TCP или UDP?
Зависи от това какво правите онлайн и от вида на прехвърляните данни.
- UDP е по-добър, ако играете игри онлайн, защото неговият бърз трансфер на данни позволява предимно да играете без имате забавяне.
- TCP е по-добър, ако прехвърляте файлове, като снимки, защото гарантира, че данните пристигат точно както са били изпратени.
TCP е най-добрият за:
- Имейл или SMS
- Прехвърляне на файлове
- Уеб сърфиране
UDP е най-подходящ за:
- Предаване на живо (Live streaming)
- Онлайн игри
- Видео чат
Предимства и недостатъци на TCP и UDP
Нека заедно прегледаме какви са предимствата и недостатъците на TCP и UDP
Предимства на TCP
Протоколът за контрол на предаването (TCP) е протоколът, който трябва да изберете за максимална надеждност и качество. Може да не е най-бързият, но върши работата както трябва. Ето няколко предимства на TCP протокола:
- Той установява и поддържа връзка между подател и получател.
- Работи независимо от операционната система.
- Поддържа много протоколи за маршрутизиране.
- Той проверява за грешки, като гарантира, че данните пристигат до местоназначението си непроменени.
- Той потвърждава пристигането на данните след доставката или прави опит за повторно прехвърляне.
- Той може да изпраща данни в определена последователност.
- Той оптимизира скоростта на предаване на данни въз основа на получателя.
Недостатъци на TCP
TCP не е подходящ за някои типове трансфер на данни, особено такива, които изискват по-високи скорости. Ето и недостатъците на TCP:
- Той използва повече честотна лента и е по-бавен от UDP.
- Бавен в началото на прехвърляне на файлове.
- Може да предотврати зареждането на данни, ако някои данни бъдат загубени. Например, няма да зареди изображения на уеб страница, докато не бъдат доставени всички данни за страницата.
- Той намалява скоростта на трансфер, ако мрежата е претоварена, което води до още по-ниски скорости.
- Не е подходящ за LAN и PAN мрежи.
- Не поддържа multicast и broadcast.
Въпреки по-ниските си скорости, TCP е единственият протокол, който може да препредава изгубени пакети от данни.
Приложения на TCP
Кога трябва да активирате TCP трансфер на данни? Повечето трансфери на данни автоматично използват най-добрата опция за протокол. Но при определени обстоятелства – като например когато използвате VPN – може да се наложи да изберете протокол, за да оптимизирате изживяването си при сърфиране (browsing experience). Активирайте TCP за следните дейности:
- Имейл и текстови съобщения
- Поточно предаване на предварително записано съдържание на сайтове като Netflix, Hulu или HBO Max
- Прехвърляне на файлове между приложения и устройства
- Общо сърфиране в мрежата
- Администриране на отдалечено устройство или мрежа
Предимства на UDP
UDP доставя данни бързо и не забавя, нито се връща, за да си събере изгубените данни. Това го прави идеален протокол за доставяне на непрекъснати данни или broadcasting, като например за стрийминг на живо, видео разговори и съвпадане на сървъри с IP адреси. Ето някои от предимствата на UDP:
- Не е необходима връзка за изпращане или получаване на данни, така че приложенията и операционните системи работят по-бързо.
- Предлага се broadcast и multicast предаване, което означава, че едно UDP предаване може да изпраща данни до множество получатели.
- По-малкият размер на пакета и по-малкото натоварване намаляват забавянето от край до край.
- Работи в по-широк диапазон от мрежови условия от TCP.
- Може да предава данни на живо и в реално време.
Недостатъци на UDP
Въпреки че UDP осигурява скоростта, от която се нуждаете, за по-комфортно дигитално изживяване, UDP не е толкова надежден като TCP. Това е важно, като настройвате VPN , тъй като повечето VPN работят на UDP протоколи, за да поддържат висока скорост на връзката. Ето някои недостатъци на използването на UDP:
- Без връзка (connectionless), което прави преноса на данни ненадежден.
- Няма въведена система за потвърждаване на успешен трансфер на данни.
- Няма начин да разберете дали данните се доставят в първоначалното си състояние или изобщо.
- Той няма контрол на грешките, така че изпуска пакетите, когато бъдат открити грешки.
- В случай на сблъсък на данни (data collision), рутерите често изпускат UDP пакети и предпочитат TCP пакети.
- Множество потребители, приемащи UDP данни, могат да причинят задръстване и няма начин това да се смекчи.
- Той не може да подреди данни, така че данните могат да пристигнат в произволен ред или без ред.
Приложения на UDP
UDP е най-подходящ за прехвърляне на постоянен поток от живи данни. Това позволява на много потребители да имат лесен и бърз достъп до данните, дори и в перфектно състояние. Ето няколко приложения на UDP:
- Онлайн игри
- Multicasting
- Видео чат/конферентна връзка
- VoIP (гласово обаждане в приложение)
- Системи за имена на домейни (които превеждат имена на домейни в IP адреси)
Надяваме се с тази статия да сме Ви били полезни с информация за TCP и UDP протоколите за обмен на информация в Интернет!
За да не пропускате интересна информация, която споделяме, абонирайте се за нашия бюлетин и ни последвайте в социалните мрежи!