Транспортен Слой - 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.
- Последователните номера са едно крайно число: (0−232−1).
- Аритметиката с тези номера е modulo 232.
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)
- където M е 4 μs таймер, F() е псевдослучайна функция (pseudorandom function - PRF) на идентификатора на съединението.
- PRF може да се реализира като криптографски хеш, изведен от connection-id и секретни данни.
3-way (или three message) handshake
- При иницииализиране на съединение TCP-та трябва да си синхронизират ISN.
- Те си обменят сегменти за установяване на съединение, които са с вдигнат бит "SYN" и ISN.
Стъпки при ръкостискането
- A --> B SYN моят sequence number е X
- A <-- B ACK твоят sequence number е X
- A <-- B SYN моят sequence number е Y
- A --> B ACK твоят sequence number е Y
- Стъпки 2 и 3 се комбинират в едно съобщение, затова имаме трипосочно ръкостискане.
Терминиране на TCP сесия
- Имаме три случая:
- Потребителят го инициира, като “казва” на TCP да затвори (CLOSE) съединението.
- Отдалеченото TCP инициира като изпраща сигнал FIN.
- И от двете страни едноременно затварят (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=65535).
- window scale “разширява” опцията TCP window до 32 бита и чрез коефициент на мащабиране пренася 32-битовата стойност в 16-битовото поле Window на TCP заглавието.
Изчисляване на прозореца по високоскоростна линия
- Bandwidth[bps]∗RTT[s]=TCPwindow[bits]/8=TCPwindow[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)
- Напр., 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 активности