Транспортен Слой - TCP и UDP

Функции на транспортния слой

  • Осигурява транспортирането на съобщения от източника до получателя.
  • Установява връзка от тип “край-край” между комуникиращите системи, създавайки програмен канал между портовете на приложенията.

Установяване на съединения (сесии)

  • Процесът включва установяване на съединение, трансфер на данни и закриване на съединението.
  • Интерфейсът за надеждно обслужване се състои от примитиви като LISTEN, CONNECT, SEND, RECEIVE, DISCONNECT.
  • Сървърът изпълнява LISTEN, блокирайки до появата на клиент.
  • Клиентът изпълнява CONNECT, блокира и изпраща пакет за установяване на връзка.
  • Сървърът изпраща потвърждение, отблокира клиента и връзката се създава.

Портове и сокети

  • Множество процеси на един хост използват транспортния протокол едновременно.
  • Всеки процес има адрес или порт (16-битов номер).
  • Сокетът се формира от IP адрес и порт (IP:port), като двойка сокети идентифицира едно съединение (напр.: 62.44.96.22:80).
  • За IPv6 се използва [IPv6]:port, за да се избегне объркване между двуеточията в IPv6 адреса и порта (напр.: Listen [2001:db8::a00:20ff:fea7:ccea]:80).

Видове портове (RFC 6335)

  • Системни (Добре известни): 0-1023, присвояват се от IANA.
  • Потребителски (Регистрирани): 1024-49151, присвояват се от IANA.
  • Динамични (Частни или Ephemeral): 49152-65535, не се присвояват.
  • Добре известните портове са резервирани за популярни услуги (HTTP, POP3/SMTP, Telnet).
  • Регистрираните портове се присвояват на потребителски процеси и приложения.
  • Динамичните портове се присвояват динамично на клиентски приложения, иницииращи сесия.
  • Пример за проверка на обхвата на динамичните портове в Linux:
    bash less /proc/sys/net/ipv4/ip_local_port_range
  • Промяна/разширение на обхвата:
    bash sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  • Номерата се използват и в TCP, и в UDP за висока производителност.
  • DNS използва порт 53 и с двата протокола (UDP за бързи заявки, TCP за надеждност при предаване на информация).

Протокол TCP

  • Transmission Control Protocol (TCP) (RFC 793) осигурява надеждно, подредено доставяне на потока от байтове от програма на един компютър до програма на друг компютър.
  • TCP следи размера на съобщенията, скоростта на обмен и натоварването на мрежовия трафик.
  • TCP не гарантира времето на доставяне, внася големи закъснения и не е подходящ за приложения в реално време.
  • TCP се ползва от най-популярните Internet приложения - WWW, E-mail, FTP, SSH, Telnet и някои групови медийни приложения (streaming media).

Основни функции на TCP

  • Трасфер на данни: Пренася поток от байтове двупосочно, опаковайки ги в сегменти. Изисква изпълнение на push функцията за сигурност на предадените данни.
  • Надеждност: Възстановява повредени, загубени или неподредени данни. Присвоява последователен номер (sequence number) на всеки предаден байт и изисква положително потвърждение (ACK) от TCP получателя. При липса на ACK в рамките на timeout, данните се предават повторно. Приемникът използва sequence numbers за подреждане и елиминиране на дубликати. Добавя се checksum за проверка на повредени сегменти.
  • Управление на потока: Приемникът регулира обема на данните, изпратени от предавателя, чрез връщане на "window" с всеки ACK. Прозорецът показва позволения брой байтове, които предавателят може да предаде, преди да получи следващо позволение.
  • Мултиплексиране: Множество процеси използват едновременно TCP комуникациите чрез портове, формиращи сокети в съчетание с IP адресите. TCP съединението се идентифицира с двойка сокети. Един сокет може да служи едновременно на множество съединения.
  • Съединения - сесии: Изискват инициализиране и поддържане на информация за състоянието на всеки поток от данни (сокети, sequence numbers, размери на прозорци).

Съединения - терминиране

  • След приключване на комуникацията съединението се терминира, за да се освободят ресурсите.
  • Прилага се процедура по “ръкостискане” (handshake) с базирани на астрономическото време sequence numbers.

Принцип на действие. TCP и IP.

  • IP се грижи за доставянето на данните, TCP следи отделните сегменти, на които е разбито съобщението.
  • Дължината на сегмента зависи от MTU (Maximum Transmission Unit). Ако MTU = 1500 B, segment = 1460 B.
  • TCP софтуерът разделя последователността от байтове във файла на сегменти, които препраща към IP софтуера.
  • Мрежовият слой опакова всеки TCP сегмент в IP пакет.
  • Клиентската програма (TCP софтуер) възстановява оригиналното подреждане на сегментите, гарантира, че са получени без грешка, и ги препраща към приложната програма.

TCP в хост среда

  • TCP е модул в операционната система.
  • Потребителите го достъпват подобно като файловата система.
  • TCP може да извиква други функции на ОС, напр. Управление на структури с данни.
  • Интерфейсът към мрежата се контролира от драйвер на устройство, но TCP не го извиква директно, а чрез модула на IP протокола.

TCP Интерфейси

  • TCP/потребител: OPEN, CLOSE, SEND, RECEIVE, STATUS.
  • TCP/IP: извиквания за изпращане и получаване на IP пакети.
  • Параметри на тези извиквания са адрес, тип на услуга, приоритет, сигурност и др.

Структура на TCP сегмента

  • Състои се от заглавие (header) и данни (data).
  • Заглавието съдържа 11 полета, от които 10 са задължителни.
  • Source port (16 бита) – номер на изпращащ порт.
  • Destination port (16 бита) – номер на получаващ порт.
  • Sequence number (32 бита) – първоначалният номер (ако флаг SYN е вдигнат) или sequence number на първия байт с данни (ако флаг SYN не е вдигнат).
  • Acknowledgement Number: номерът на първия байт данни, който се очаква да се получи със следващия сегмент.
  • TCP header length (4 бита) – дължината на заглавната част на TCP сегмента.
  • Data Offset (4 бита) – броят на 32-bit думи в TCP хедъра.
  • Checksum (гарантира точността на сегмента). Изчислява се върху TCP header, TCP data, и псевдозаглавие (source IP, destination IP и поле дължина в IP заглавието).
  • Еднобитови флагове: URG, ACK, PSH, RST, SYN, FIN.
  • Window (16 бита): броят на байтовете с данни, които изпращачът на сегмента иска да предаде.
  • Urgent Pointer (16 бита): сочи към последователен номер на октет за незабавно изпращане (интерпретира се само за сегменти с вдигнат флаг URG).
  • Options: указване на максимална дължина на сегмента (MSS).

Sequence Numbers

  • Всеки байт се номерира (sequenced) и може да се потвърди.
  • Потвърждението на Seq.No. X показва, че всички байтове до (но не и) X са получени.
  • Байтовете се номерират така: първият след хедъра е с най-малък номер, следващите се увеличават с по 1.
  • Последователните номера са едно крайно число: (02321)(0 - 2^{32} - 1).
  • Аритметиката с тези номера е modulo 2322^{32}.

TCP Extensions (RFC 7323)

  • TCP Window Scale (WS): поддържа по-големи прозорци.
  • TCP Timestamps (TS): защита от препълване на полето SeqNo (Protection Against Wrapped Sequences - PAWS) и измерване на Round-Trip Time Measurement (RTTM).

Стартиране на TCP съединение

  • Двете крайни точки съдържат информация, дефинираща виртуален канал.
  • Приложението записва данни в TCP порта, която се прочита от крайната точка.

TCP - sliding window протокол

  • TCP е протокол с “плъзгащ прозорец” с time-out и повторни предавания.
  • Предадените данни се потвърждават от отдалеченото TCP.
  • Управление на потока се упражнява и от двете страни, за да не се получи препълване на буферите.
  • Размерът на прозореца определя количеството на данните, които се предадат, преди да се получи потвърждение.
  • В протокола TCP количеството на данните се измерва с броя на байтовете, а не с броя на TCP сегментите.

Initial Sequence Number

  • Генератор на начален последователен номер (ISN) избира нов 32-bit ISN при предавателя и при приемника.
  • Генераторът е обвързан с фиктивен 32-bit часовник, чийто младши бит се инкрементира на всеки 4 μs.
  • ISN превърта на всеки 4.55 часа при 2 Mb/s (при 100 Mb/s, 5.4 минути).
  • Сегментите престояват в мрежата не повече от Maximum Segment Lifetime (MSL= 2 минути) < 4.55 ч., следователно ще бъдат уникални.

RFC 6528 алгоритъм за генериране на ISN

  • ISN=M+F(localip,localport,remoteip,remoteport,secretkey)ISN = M + F(localip, localport, remoteip, remoteport, secretkey)
  • където M е 4 μs таймер, F() е псевдослучайна функция (pseudorandom function - PRF) на идентификатора на съединението.
  • PRF може да се реализира като криптографски хеш, изведен от connection-id и секретни данни.

3-way (или three message) handshake

  • При иницииализиране на съединение TCP-та трябва да си синхронизират ISN.
  • Те си обменят сегменти за установяване на съединение, които са с вдигнат бит "SYN" и ISN.

Стъпки при ръкостискането

  1. A --> B SYN моят sequence number е X
  2. A <-- B ACK твоят sequence number е X
  3. A <-- B SYN моят sequence number е Y
  4. A --> B ACK твоят sequence number е Y
  • Стъпки 2 и 3 се комбинират в едно съобщение, затова имаме трипосочно ръкостискане.

Терминиране на TCP сесия

  • Имаме три случая:
    1. Потребителят го инициира, като “казва” на TCP да затвори (CLOSE) съединението.
    2. Отдалеченото TCP инициира като изпраща сигнал FIN.
    3. И от двете страни едноременно затварят (CLOSE).

conntrack

  • Показва установени TCP сесии.

Предаване и приемане на данни

  • Започва обмен на данни (сегменти) след установяване на съединението.
  • Загубени сегменти се предават повторно след timeout.
  • Възможно е дублиране на сегменти, затова TCP тества SeqNos и ACKNos.
  • Изпращачът следи поредния номер чрез променливата SND.NXT и последния непотвърден номер чрез SND.UNA.
  • Приемникът следи чрез RCV.NXT.

Интерфейс User/TCP

  • При междупроцесните комуникации TCP трябва не само да приема команди, но и да връща информация към процесите, които обслужва.
    • обща информация за съединението.
    • отговори на определени потребителски команди.

Команди User/TCP

  • OPEN (local port, foreign socket, active/passive [, timeout] [, precedence] [, security/compartment] [, options]) -> local connection name
  • SEND (local connection name, buffer address, byte count, PUSH flag, URGENT flag [,timeout])
  • RECEIVE (local connection name, buffer address, byte count) -> byte count, urgent flag, push flag
  • CLOSE (local connection name)
  • STATUS (local connection name) -> status data
  • ABORT (local connection name)

Отношение на TCP към IP

  • TCP използва следните стойности:
    • Type of Service = Precedence: routine, Delay: normal, Throughput: normal, Reliability: normal (00000000).
    • Time to Live = 1 minute (00111100).
  • IP протоколът трябва да осигури source address, destination address и протоколни полета и да определи "TCP length".

Flow control. Sliding Window.

  • Flow Control определя темпа на информационния обмен от гледна точка на получателя на информационния поток.
  • Стойността на прозореца указва на отсрещната страна колко байта могат да бъдат изпратени и съответно приети без препълване на входия буфер след последния потвърден номер на байт.
  • При получаване на данни, размерът на прозореца намалява. Ако той стане равен на 0, изпращачът трябва да престане да предава данни.
  • След като данните се обработят, получателят увеличава размера на своя прозорец, което означава, че е готов да получава нови данни.

TCP. Потвърждение и прозорци.

  • Стойностите SEQNo. и ACKNo. в заглавието на сегмента съвместно служат за потвърждение на получените байтове с данни.
  • SEQNo. е относителния брой байтове, които са предадени в дадената сесия + 1 (номера на първия байт с данни в дадения сегмент).
  • TCP използва числото ACKNo. в сегментите, които се изпращат обратно на източника, за да покаже кой е следващия байт, който приемника очаква да получи в настоящата сесия. Това се нарича очакваното потвърждение.

TCP. Повторно предаване.

  • TCP осигурява методи за управление на загуби на сегменти, включително механизъм за повторно предаване на сегменти с непотвърдени данни.
  • TCP услугата в хоста-приемник потвърждава само данни, състоящи се от непрекъсната последователност от данни.
  • Ако липсват един или повече сегменти, потвърждават се само данните в сегментите, които попълват плътно потока. Това е Selective Acknowledge (SACK).

TCP. Управление на потока и задръстванията.

  • Управление на потока (flow control) синхронизира скоростите на потока от данни между двете услуги в сесията.
  • Полето Window Size определя количеството данни, което може да бъде предадено, преди да бъде получено потвърждение.
  • Първоначалният размер на прозореца се определя в началото на сесията чрез three-way handshake.
  • Механизмът за обратна връзка в TCP нагласява ефективната скорост на предаване на данните към максималния поток, който мрежата и устройството-получател могат да поддържат без загуби и без повторни предавания.

TCP. Редуциране на загубите.

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

Window scaling

  • Linux поддържа подобрения за висока производителност в TCP (RFC 7323).
  • Window scaling – да използва по-дълги прозорци (> 64K) (Спомняте си, че 216=655352^{16} = 65535).
  • window scale “разширява” опцията TCP window до 32 бита и чрез коефициент на мащабиране пренася 32-битовата стойност в 16-битовото поле Window на TCP заглавието.

Изчисляване на прозореца по високоскоростна линия

  • Bandwidth[bps]RTT[s]=TCPwindow[bits]/8=TCPwindow[Bytes]Bandwidth [bps] * RTT [s] = TCP window [bits] / 8 = TCP window [Bytes]
  • Пример: 1,000,000,000 bps * 0.030 s = 30,000,000 bits / 8 = 3,750,000 Bytes

MSS (IPv4)

  • TCP контролира максималната дължина на сегмента - Maximum Segment Size (MSS) за всяка връзка.
  • За директно свързаните мрежи TCP изчислява MSS въз основа на дължината на MTU на интерфейса:
    • MSS=MTU(IPHL+TCPHL)MSS = MTU - (IPHL + TCPHL)
    • Напр., Ethernet: MTU = 1500 байта
    • MSS = 1500 - (20 + 20) = 1460 байта
  • HL – Header Length

SYN flood атаки

  • Атакуващият изпраща няколко SYN, но не връща ACK, което води до полуотворени конекции и невъзможност за легитимни потребители да се свържат.

Защита от SYN flood. Вградена.

  • tcpsynackretries (integer; default: 5): Максималният брой повторни предавания на SYN/ACK сегмент.
  • tcpmaxsyn_backlog: Максималният брой заявки в опашката, които не са получили acknowledgement от клиента.

UDP

  • UDP (RFC 768) е по-опростен транспортен протокол с неустановена връзка.
  • Осигурява процедури за приложните програми да изпращат съобщения до други програми с минимална служебна информация (overhead).
  • Това е транзакционно-ориентиран протокол.
  • Не гарантира доставянето и защита от дублиране на данните.
  • Прилага се там, където закъсненията и синхронизацията са критични, а не загуби на пакети.
    • Онлайн игрите или Vo (Video)IP.
  • Други приложения като DNS или TFTP ще повторят заявката, ако не получат отговор.
  • Протоколните единици в UDP се наричат дейтаграми, за които подобно на IP пакетите се полагат максимални усилия за доставяне - "best effort".

UDP дейтаграма

  • Полето Source Port е опция.
  • UDP единствено гарантира точността на съобщението чрез checksum (има го в IPv4, но не и в IPv6).

UDP. Възстановяване на дейтаграми.

  • UDP не следи последователността на дейтаграмите при приемане като TCP.
  • Ако тя е от значение, за това се грижи приложната програма.

UDP порт – опашка от съобщения.

  • Пристигнало съобщение се поставя в опашката за съответен порт, ако има място, иначе се изхвърля.
  • Няма управление на потока.

UDP. Клиентски процеси.

  • Клиентският UDP процес избира на случаен принцип номер на порт от динамичните.
  • В UDP не се създават съединения (сесии).
  • След като данните са готови и портовете са идентифицирани, UDP формира дейтаграма и я подава към мрежовия слой за изпращане по мрежата.

UDP Jumbograms (IPv6)

  • 16-бит поле Length в UDP header ограничава дължината на UDP пакета (UDP header + данни) <= 65535 октета.
  • За да се справим с това ограничение (RFC 2675):
    • UDP пакети > 65,535 октета се изпращат като UDP Length = 0, получателят извлича фактическата дължина на UDP пакета от IPv6 payload length.

UDP-Lite

  • Lightweight User Datagram Protocol (RFC 3828, Updated: 6335), или UDPLite, е подобен на UDP, но може да обслужва приложения в силно ненадеждна мрежова среда, където целта е данните да бъдат доставени, даже и повредени.
  • Ако тази характеристика не се използва, UDP-Lite семантично е идентичен с UDP.
UDP-Lite приложения
  • кодери за глас и видео
  • UDP-Lite е семантично идентичен с UDP ако checksum покрива целия пакет.

Защита на канално ниво

  • Силна проверка на интегритета на данните (напр., CRC-32).
  • Ако е ясно коя е чувствителната част от пакета, възможно е физическата линия да осигури по-добра защита именно на тези чувствителни байтове (напр., Forward Error Correction).

Ролята на IP и транспортния слой

  • В IPv4 UDP checksum покрива или целия пакет, или нищо.
  • В IPv6 UDP checksum е задължителна, защото IPv6 хедъра няма header checksum.

Какво защитава UDP-Lite

  • Приложната програма, която изпраща данните, определя кои байтове трябва да се верифицират със checksum.

Частичен checksum

  • UDP-Lite прелага като опция checksum с частично покритие.
  • Пакетът се разделя на чувствителна част и нечувствителна част.
  • Грешки в нечувствителната част няма да предизвикат отхвърляне на пакета.

Средства за следене на TCP/UDP активности

  • Tcpdump