10.Transmission Control Protocol (TCP) – мултиплексиране, надежност, управление на потока от данни.

 

ТСР осигурява на протоколите от по-горните слоеве двупосочна (пълен дуплекс) система за предаване на данните, която използва потвърждения за получаване и поддържа управлението на потока. Данните се предават в непрекъснат поток от байтове, които се идентифицират с номер на последователността. Освен това, ТСР може да поддържа многобройни едновременни преобразувания на пакетите към формата на по-горния слой.

ТСР установява логическа връзка “от край до край” (end-to-end) между двата хоста, които провеждат комуникация. Преди предаване на данни между двете крайни точки се разменя управляваща информация чрез процедура, наречена “ръкостискане” (handshake) , за да се установи връзка. След нейното установяване се стартира предаването на информационния поток.

ТСР предава двупосочен непрекъснат поток от байтове (октети), като го пакетира в сегменти. Програмните модули, които реализират протокола  ТСР, вземат решенията кога да предават или блокират данните.

ТСР е надежден протокол. Това означава, че ТСР поддържа средства, чрез които се извършва възстановяване на повредени или загубени данни, откриват се дублирани данни или такива, които не съответстват на текущата последователност. Всичко това е постигнато чрез присвояване на номер на последователността към всеки предаден октет, като от получаващия ТСР модул се изисква да потвърди, че успешно е приел данните. Ако не се получи потвърждение (АСК) в рамките на даден интервал от време, данните се предават отново. Получателят използва номерата на последователността, за да подреди сегментите, които пристигат не в реда, в който са изпратени и да премахне дублиранията. Повредените данни се откриват чрез добавяне към всеки сегмент на контролна сума, която се проверява от получателя.

 

User Datagram Protocol (UDP)

 

UDP е много по-прост транспортен протокол от ТСР, който осигурява на приложените програми възможност за изпращане на съобщения по Интернет с минимално натоварване на операционната система. UDP е ненадежден протокол, тъй като не предвижда средства за потвърждение, че данните са достигнали до получателя. Поради простотата на протокола неговото изпълнение в операционните системи се характеризира с повишено бързодействие. Той се използва, когато механизмите за постигане на надеждност на ТСР не са необходими или влизат в конфликт с други изисквания- например при интерактивно предаване на мултимедийна информация. В този случай използването на ТСР би довело до голямо забавяне, когато се налага препредаване на информация. Освен това, UDP е подходящ за едновременно предаване на група хостове (multicasting) и е предпочитан транспортен протокол при предаване на мултимедийна информация в реално време.

  

Транспортни протоколи

 

Протокол ТСР

 

Протоколът за управление на предаването ТСР (Transmission Control Protocol) съответства на транспортното ниво в седмослойния модел на OSI. Той предоставя транспортни услуги на протоколите от по-горните нива, като използва IP протокола на по-ниския Интернет слой. ТСР/IP групата протоколи е получила името си поради това, че повечето протоколи от по-високите нива в нея използват ТСР за транспортен протокол. Първоначалната спецификация на ТСР е дадена в RFC793.

Данните, обменяни по протокола ТСР, са организирани логически като поток от байтове. При това за по-високите слоеве се скрива, че фактическото предаване на данни в мрежата се извършва чрез дейтаграми. ТСР не вмъква автоматично никакви разделители между записите. Този начин на предаване се нарича обслужване на поток от данни (byte stream service).

При предаване ТСР получава данни от приложните програми или от по-горните слоеве, разделя ги на части, наречени “сегменти”, и заедно с адреса на местоназначението ги  изпраща на IP протокола. Той от своя страна опакова сегментите в дейтаграми (фиг.10.1)  и извършва маршрутизирането на всяка дейтаграма. При приемане IP протоколът разопакова пристигналите дейтаграми, след което предава получените сегменти на ТСР протокола, който сглобява сегментите в съобщения към по-горните слоеве. При това той подрежда сегментите така, че приложните програми да ги получават в реда, в който те са били изпратени. На фиг.10.2 е показан форматът на заглавната част на протокола ТСР. Ако няма опции, размерът на заглавната част е 20 байта.

 

Мултиплексиране

ТСР връзка (TCP connection) се нарича обменът на сегменти по протокола ТСР между две различни приложни програми. Всеки край на такава връзка се идентифицира с IP адресът на съответния хост и номерът на порта, съответстващ на приложната програма. Както беше споменато, комбинацията от адреса на хоста и номера на порта се нарича гнездо (socket). Всеки ТСР сегмент съдържа номерата на портовете на източника и получателя (фиг.10.2). Tова позволява на ТСР протокола да определи за коя приложна програма е предназначен съответния сегмент. Комбинацията от гнездото на източника (номер на порт, IP адрес) и гнездото на получателя (номер на порт, IP адрес) е уникален и идентифицира ТСР връзката. Това позволява едно гнездо да се използва едновременно от няколко ТСР връзки (да се мултиплексира). Съответствието между номер на порт и приложна програма се осъществява локално във всеки хост. За най-често използваните приложни програми съществуват стандартно зададени номера на портове- така наречените добре известни портове (well- known ports).

 

Надеждност

За да се осигури получаването на данните по реда на тяхното изпращане, всеки изпратен байт се номерира. Когато данните не са достигнали до получателя (т.е. не е получено потвърждение на получаването им), то те се препредават. Протоколът ТСР използва 32-битови поредни номера (sequence numbers) на байтовете. Във всеки ТСР сегмент е записан поредният номер на началния байт на сегмента и дължината на предаваните данни. Например, ако протоколът ТСР предава данни с размер на сегмента 500 байта, то в първия сегмент ще бъде записан пореден номер 0, във втория- пореден номер 500, в третия- пореден номер 1000 и т.н. За потока от данни по дадена ТСР връзка, протоколът ТСР номерира всеки байт с 32-битово положително число, тако след достигане на 2³²-1, стойността му се установява в 0.

Контролната сума (checksum) се изчислява върху целия ТСР сегмент- включително заглавна част и данни. Това поле е задължително и трябва да бъде изчислено и записано от предавателя и проверено от получателя. Това е контролна сума “от край до край”, чиято цел е да открива грешките, възникнали при предаването на данни. Ако се получи сегмент с невалидна контролна сума, той се отхвърля от протокола ТСР на приемника, който не изпраща потвърждение. Това довежда до препредаване на сегмента.

При получаване на сегмент, ТСР трябва да изпрати обратно “потвърждение”. То представлява също сегмент, в който е запълнено полето “номер на потвърждението”. Например, ако в това поле има стойност 1025, то това означава, че са получени всички данни от байт с номер 1024 включително. Ако изпращачът не получи потвърждение за даден интервал от време, данните се изпращат отново. Номерът за потвърждение (acknowledgment number) съдържа следващия пореден номер, който хостът, изпращащ потвърждението, очаква да получи. Тъй като всички байтове, които се обменят по ТСР връзката, са номерирани, номерът на потвърждението е поредния номер на последния успешно получен байт данни +1. Това поле е валидно само при вдигнат флаг АСК.

Изпращането на потвърждение (АСК) не изисква предаване на допълнителна информация, тъй като полето за номер на потвърждение е винаги включено в заглавната част, както и флагът АСК. След като ТСР връзката е установена, това поле винаги съдържа данни и флагът АСК е вдигнат.

ТСР протоколът поддържа дуплексна връзка спрямо приложното ниво, което означава, че данните се предават и в двете посоки и всеки край на връзката трябва да поддържа собствен пореден номер на данните в съответната посока.

ТСР не поддържа избирателни потвърждения, т.е. не е възможно да се изпрати потвърждение, че е получен байт със зададен номер или избрана част от потока данни. Номерът на потвърждение в заглавната част на ТСР означава, че са получени всички байтове с номера по-малки от този номер. Например, ако байтовете с номера от 1 до 1024 са получени успешно, и следващият получен сегмент съдържа байтове 2049-3072, получателят не може да потвърди този сегмент, тъй като байтовете 1025-2048 се губят. Може само да се изпрати потвърждение с номер 1025, което всъщност означава за предавателната страна негативно потвърждение на сегмента с байтове 2049-3072. Също, ако се получи сегментът с байтове 1025-2048, но с грешка в контролната сума, ТСР може да изпрати само потвърждение с номер 1025.

 

Управление на потока от данни

Не е ефективно да се изчаква потвърждение за всеки изпратен сегмент, преди да се изпрати нов. От друга стана, ако данните се изпращат непрекъснато, получателят може да не успее да ги обработи. За да се определи какво количество данни може да се изпраща във всеки момент се използва протокол на плъзгащия се прозорец. Всеки край на ТСР връзката посочва колко байта може да получи, като записва тази стойност в полето “размер на прозореца”. При получаване на данни, размерът на прозореца намалява. Ако той стане равен на нула, изпращачът трябва да престане да предава данни. След като данните се обработят (например бъдат предадени към по-горен слой), получателят увеличава размера на прозореца, което означава, че е готов да получава нови данни.

ТСР прозорецът посочва количеството данни (непотвърдени от получателя), които изпращачът може да предаде преди да получи потвърждение от получателя. Например нека два хоста обменят данни по ТСР връзка с размер на прозореца 64КВ. Изпращачът може да предаде само 64КВ данни, след което той трябва да спре и да чака за потвърждение от получателя. Ако последният потвърди получаването на всички данни, то изпращачът може да предаде още 64 КВ. Ако се получи потвърждение , например, за първите 32КВ, то изпращачът може да изпрати още само 32КВ данни.

Полето за дължина на прозореца е 16-битово, което ограничава размера на прозореца до 65535 байта. Предложено е ново допълнение за мащабиране на прозореца, което позволява да се поддържат по-големи прозорци.

Връзки “от край до край”

Механизмите за управление на потока от данни и надежден обмен изискват инициализиране и поддържане на информация за състоянието на всеки поток от данни в ТСР. Както беше посочено по-горе, една връзка е определена от две двойки гнезда, които участват в нея. Информацията за състоянието на връзката включва поредните номера на байтовете, размера на прозореца и други. Две приложни програми използват протокола ТСР, трябва да установят ТСР връзка една с друга преди да започнат да обменят данни. При прекратяване на комуникацията, връзката се прекратява ли затваря и се освобождават съответните ресурси. За инициализиране на връзката се използва специален метод за договаряне, тъй като обикновено връзката се осъществява между ненадеждни хостове, използвайки ненадеждна комуникационна среда.

 

Заглавна част на ТСР сегмента

Освен разгледаните по-горе полета, свързани с идентифициране на ТСР връзката, надеждното предаване на данни и управлението на техния поток, заглавната част на сегмента включва още поле за дължина, указател за спешни данни, поле за опции и флагове.

Полето за дължина на заглавната част (header length) определя дължината на заглавната част в 32-битови думи. То е задължително, тъй като полето за опции е с променлива дължина. Полето за дължина е 4-битово, от което следва, че максималната дължина на заглавната част на ТСР е 64-байта.

Заглавната част на ТСР съдържа 6 еднобитови флага. Едновременно могат да бъдат вдигнати един или няколко от тях.

 

Установяване (отваряне) на връзката (Connection Establishment Protocol)

Процедурата за установяване на връзката е следната:

1.      Станцията (клиентът), която отваря връзката изпраща SYN сегмент. В сегмента се задава номерът на порта на сървера, с който трябва да се установи връзка, и началния номер ISN (initian sequence number) на клиента. Началният номер се генерира от хоста и съдържа номера на първия байт от потока  данни по новата ТСР връзка.

2.      Сърверът отговаря със собствен SYN сегмент, съдържащ неговия начален номер. В сегмента може да се съдържа потвърждение на SYN сегмента на клиента с номер на потвърждение, равен на началния номер на клиента +1. За самия SYN сегмент е необходим един пореден номер.

3.      Клиентът трябва да потвърди получаването на този SYN сегмент от сървера, като изпрати за потвърждаващ номер началния номер на сървера +1.

С обмена на тези три сегмента завършва установяването на ТСР връзката. Тази процедура се нарича трипосочен диалог (three-way handshake).

Станцията, изпратила първия SYN сегмент извършва активно отваряне на връзката (active open), а другата станция, която получава този сегмент и изпраща следващия SYN сегмент, извършва пасивно отваряне (passive open). Началните номера за връзките трябва да се променят, така че във всяка връзка да получава различен начален номер. Предлага се алгоритъм, при който началния номер да се генерира от 32-битов брояч, чието съдържание се увеличава на всеки 4 микросекунди. Целта е да се предотврати възможността закъснели пакети на вече прекратени ТСР връзка да се интерпретират като част от друга съществуваща връзка.

Затваряне на връзката

За затваряне на връзката не е необходим обмен на 4 сегмента. Връзката във всяка посока трябва да бъде затворена независимо. Тъй като ТСР връзката е пълен дуплекс възможно е затварянето и само в едната посока (half-close). Сегмент с установен флаг FIN може да изпрати която и да е страна на връзката, след като приключи с предаването на данни. Когато ТСР протокола получи FIN, трябва да се съобщи на приложната програма, че другата страна е затворила връзката в тази посока. Изпращането на сегмент с флаг FIN обикновено е резултат от завършване на работата на приложната програма. Получаването на FIN означава само, че няма да има повече предаване на данни от отсрещната страна. ТСР може да изпрати данни към нея и след получаването на FIN при положение, че приложната програма, която го ползва, не е затворила връзката. Въпреки, че е възможно една приложна програма да извърши затваряне на връзката само в едната посока, то такова затваряне не се използва често.

Станцията, инициирала затварянето на връзката (изпратила първия сегмент с флаг FIN) извършва активно затваряне на връзката (active close), а другата страна (получила този сегмент) извършва пасивно затваряне (passive close). Ако сърверът получи FIN, той изпраща обратно потвърждение с номер, равен на получения пореден номер +1. Сегментът, съдържащ FIN (както този, съдържащ SYN) изисква един пореден номер. След това сърверът затваря връзката, като протоколът ТСР изпраща FIN сегмент, който трябва да бъде потвърден от клиента. Установяването на ТСР връзката обикновено се инициира от клиента, като първият SYN сегмент се изпраща от клиента към сървера. Затварянето на връзката може да започне от която и да е страна, но най-често се прекратява от клиента, тъй като обикновено клиентският процес взаимодейства интерактивно с потребителя.

 

Максимален размер на сегмента- MSS

 

Максималният размер на сегмента MSS (Maximum Segment Size) е размерът на най-големия обмен данни, който протоколът ТСР ще изпраща в един сегмент към другата страна. При установяване на връзката, всяка страна може да анонсира размера на сегмента, който очаква да получи. Опцията MSS може да се попълни само в SYN сегмент. Ако единият край не получи MSS опция от другия, използваният размер е 536 байта. Това позволява да се вместят 20-байтовата заглавна част на IP протокола и 20-байтовата заглавна част на ТСР протокола в 576 байта на IP дейтаграмата. При изпращането на SYN сегмент  от ТСР максималната стойност на MSS е ограничен от стойността на MTU минус фиксирания размер на заглавните части на ТСР и IP. За стандарта Етернет това означава, че максимална стойност на MSS е до 1460 байта, а за стандарта IEEE 802.3- до 1452 байта. Ако IP адресът на получателя не е “локален” стойността на MSS обикновено се задава  равна на 536. В повечето реализации съществува възможност да се конфигурира кои подмрежи са локални или не.

Сегменти за прекратяване на връзката

 

В заглавната част битът RST идентифицира сегмент за прекратяване на връзката (reset сегмент). Той се изпраща от протокола ТСР, когато по връзката се получи некоректен сегмент, в който IP адресът и номерът на порта за изпращача или получателя не съвпадат с тези на съответната връзка.

Нормално ТСР връзката се прекратява когато една от страните изпрати FIN. Това прекратяване се нарича още нормално освобождаване на връзката (orderly release), тъй като сегментът FIN се изпраща след като всички данни са били предадени  и нормално не би трябвало да има загуба на данни. Прекратяването на връзката с изпращане на RST сегмент се нарича преждевременно освобождаване на връзката (abortive release).

Откриване на полуотворени връзки (Half- Open Connections)

ТСР връзката се нарича полуотворена (half-open), когато едната страна е затворила или прекратила връзката без знанието на другата страна. Възможна причина за такава ситуация е отказ на един от хостовете. Докато няма опит за предаване на данни по полуотворена връзка, хостът няма възможност да разбере, че другият хост е отказал. Когато се извършва обмен на данни между клиентска и сърверна програма, полуотворена връзка може да се получи при изключване на захранването  на хоста, на който работи клиентската програма , преди да се спре нейното изпълнение. След като се рестартира хостът, на неговия ТСР протокол не е известно нищо за съществуващата полуотворена връзка в хоста със сърверната програма. В този случай при ново обръщение на клиентския хост към сървера ТСР протоколът отговаря с RST сегмент.

Таймаут и предпредаване

 

ТСР осигурява надеждни услуги на транспортно ниво, като всяка страна изпраща потвърждения за получените от другата страна данни. Възможно е обаче сегментите с данни и/или потвържденията да се загубят. ТСР протоколът се справя с тази ситуация, като задава таймаут при изпращане на данни, които се препращат отново, ако не се получи потвърждение преди изтичането та таймаута. Той поддържа 4 различни таймера за всяка връзка:

1.      Таймер за препредаване (retransmission timer)- задава интервала време, в който трябва да се получи потвърждение от другата страна.

2.      Таймер за прозореца (persist timer)- съдържа информация за размера на прозореца на другата страна, дори и в случай, че другата страна затвори своя прозорец.

3.      Таймер за съществуване на връзката (keepalive timer)- чрез този таймер се открива дали другият край на връзката, по която има обмен на данни, е отказал или рестартирал.

4.      Таймер 2MSL- измерва времето, през което връзката е била в състояние TIME_WAIT.

ТСР протоколът осигурява надежден транспорт от край до край, при което данните се разглеждат като еднороден поток от байтове без разделители в тях. ТСР опакова данните в сегменти, задава таймаут за всяко предаване на данни, потвърждава данните получени от другата страна, подрежда данните, получени в ред, различен от този на изпращане, отхвърля дублираните пакети, осигурява управление на потока данни от край до край и изчислява и проверява задължителната контролна сума.

ТСР се използва от голям брой широко разпространени приложни програми, като Telnet, Rlogin, FTP, електронна поща (SMTP), НТТР. Въпреки, че ТСР и IP са тясно свързани, ТСР може вместо IP да ползва други протоколи- например протокола ISO 8473 (Connectionless Network Protocol или CLNP).

 

Протоколи на приложния слой (Application Protocols)

 

Протоколите на приложната ниво предоставят услуги за крайния потребител. ТСР/IP дефинира множество различни протоколи на приложно ниво, част от които са широко използвани, а другите- ограничено. Тези протоколи могат да се категоризират в две групи

·        услуги и протоколи за крайния потребител;

·        услуги и протоколи със спомагателни функции.

Сред най-популярните услуги за крайния потребител са Telnet, FTP, Rlogin. Telnet позволява на потребителя да използва отдалечен хост по начин, по който би го използвал, ако локално /непосредствено/ работи с последния. FTP (File Transfer Protocol) дава възможност на потребителя да обменя данни (в двете посоки) между локалния и отдалечения хост. Rlogin наподобява Telnet, но за разлика от последния се изпълнява само на UNIX система. NFS (Network File System) осигурява достъп на потребители, притежаващи разрешение за това, до файлове на отдалечен хост.

От протоколите със спомагателни функции системата X-Windows е набор от разпределени функции и услуги, които реализират прозоречен интерфейс върху монитора на потребителя. Протоколът SMTP (Simple Mail Transfer Protokol) служи за предаване на съобщения по електронната поща. POP (Post Office Prortokol) се използва, за да се прехвърлят съобщения от потребителската пощенска кутия до компютъра, на който работи потребителя. (NTP) Network Time Protokol позволява  на системата в мрежата да синхронизира стойностите за дата, час. (TFTP) Trivial File Transfer Protokol осигурява услуги подобни на FTP, но е с по-ограничени възможности и обикновено се използва от системни програми, а не от крайния потребител (както е с FTP).