Как упоминалось в самом начале, на транспортном уровне присутствуют два протокола – TCP и UDP. TCP используется для гарантированной передачи данных, в то время как UDP используется для передачи потоковых данных.

Функции TCP

  • Использование портов – функция, которая позволяет определить для какого приложения предназначены данные, основываясь на номере порта (можно считать это адресацией транспортного уровня).
  • Восстановление после ошибок – работает за счет подтверждений.
  • Управление потоком с использованием окон – процесс, определяющий количество сегментов передаваемых до подтверждения.
  • Установление и завершение соединений.
  • Сегментация и упорядочивание передаваемых данных. Данные, разбитые на сегменты, должны быть собраны, после передачи, в том же порядке, в каком были разбиты изначально.

Использование портов

TCP и UDP используют порты, которые в свою очередь, делятся на зарезервированные порты и динамические:

  • с 1 по 1023 – зарезервированные порты (well-known ports, общеизвестные или системные, пример в таблице 5.1);
  • с 1024 по 49151 – зарезервированные порты (пользовательские);
  • с 49152 по 65535 – динамически распределяемые порты.

Таблица 5.1 Список зарезервированных портов

Номер порта Протокол Транспортного Уровня Протокол Уровня Приложений
20,21 TCP FTP
22 TCP SSH
23 TCP Telnet
53 TCP,UDP DNS
67,68 UDP DHCP
69 UDP TFTP
80 TCP HTTP
443 TCP HTTPS

Чтобы лучше понять, что такое порты и как их “едят”, разберем пример соединений с использованием портов.

Наверно, самое часто используемое приложение – браузер. Часто мы открываем несколько “вкладок” с одним и тем же сайтом, и у каждой вкладки должно быть отличие, по которому компьютер сможет определить какой вкладке предназначены приходящие данные.

Рисунок 5.1 Передача данных с использованием портов
Рисунок 5.1 Передача данных с использованием портов


Компьютер Андрея запросил с веб-сервера три веб-страницы (открыл три “вкладки” в браузере). На рисунке 5.1, Веб-сервер отправляет пакеты с одинаковыми заголовками (в заголовках одинаковые IP адреса), но заголовки сегментов различаются ( обратите внимание на порт отправителя (S_PORT) и порт получателя (D_PORT)). Изначально компьютер Андрея привязал к каждому соединению определенный порт, который был определен случайным образом из динамически распределяемого диапазона (от 49152 по 65535), а обратился он на зарезервированный порт 80 (HTTP). Так происходит со всеми передаваемыми данными, к каждому приложению присваивается определенный порт/порты, таким образом данные получает то приложение, которому они предназначены. Еще можно схематично представить наш пример.

Рисунок 5.2 Схематичное представление соединений
Рисунок 5.2 Схематичное представление соединений



На заметку. TCP и UDP могут устанавливать соединения с одинаковыми номерами портов, но при этом они будут считаться разными соединениями, так например, порт UDP 69 и порт TCP 69 – это два различных соединения.

Сегментация


Сегментация – разбивание данных на сегменты.

Прежде чем данные будут переданы по сети они должны быть разбиты на сегменты, обычно не превышающие 1460 байт.

Например, вы хотите передать видео файл размером 200Кбайт. Видео не будет передаваться одним целым файлом, оно будет разбито на сегменты, после чего по сети будут передаваться около 137 сегментов (200 000/1460~137).

Установление соединений

Устанавливаются соединения в 3 сообщения, рисунок 5.3.

Рисунок 5.3 Установка соединения TCP
Рисунок 5.3 Установка соединения TCP


  1. TCP устанавливает порт для приложения (для клиента, чаще всего, он находится случайным образом из диапазона от 49152 по 65535, в нашем примере, Source PORT 61734), определяет порт получателя/сервера (Destination PORT 80), случайно выставляет номер сегмента ( SEQuence 300, каждый передаваемый сегмент имеет порядковый номер) и устанавливает параметр SYN (SYNchronization – этот параметр означает инициализацию соединения) в одно из полей заголовка сегмента (напомню, что в каждом заголовке много разных полей – настроек, с помощью которых осуществляется одноуровневое взаимодействие). Такой сегмент приходит на сервер, который просматривает все, что приходит на 80-й порт.
  2. Сервер формирует ответный сегмент, где он так же указывает порты отправителя и получателя. Но на этом шаге он указывает свой номер сегмента (случайно подобранный, SEQ 900), параметр SYN и новый параметр ACK (ACKnowledgment) – это подтверждение. В нашем примере параметр ACK равен 301, тем самым сервер подтверждает получение сегмента с номером 300, и ожидает получения сегмента с порядковым номером 301.
  3. Третьим сообщением является ответ клиента на сегмент сервера, в нем указывается следующий порядковый номер (SEQ=301, а был SEQ=300) и подтверждается получение предыдущего сегмента от сервера (ACK=901, подтверждает получение сегмента SEQ=900).

После этих трех сообщений соединение считается установленным, и клиент отправляет запрос на получение данных с сервера.

Завершаются соединения в четыре сегмента, здесь этот процесс рассмотрен не будет.

Восстановление после ошибок


Восстановление данных осуществляется за счет подтверждений (а обнаружение ошибок происходит на канальном уровне, за счет FCS).

Рисунок 5.4 Восстановление данных
Рисунок 5.4 Восстановление данных


На рисунке 5.4 изображена передача сегментов, и 3-й сегмент не приходит получателю. Введем некоторое пояснение, SEQ, помимо номера сегмента, обозначает количество переданных байт, например, первый сегмент 1400 байт, второй сегмент имеет такой же размер, но номер его 2800, он означает, что при получении этого сегмента будет передано уже 2800 байт. Вернемся к нашему примеру, веб-сервер передает не сразу все сегменты, а по частям, ожидая подтверждения каждой части. Так например, если бы передача прошла успешно, веб сервер бы получил ACK=7000. В нашем примере 3-й сегмент потерялся, поэтому клиент отправляет подтверждение ACK=4200 (как бы спрашивая у сервера, “Где сегмент №4200?”), а сервер это будет трактовать как сегмент с номером 4200 был потерян, и веб-сервер отправляет его еще раз. Вот так и осуществляется восстановление данных после ошибок.

Управление потоком с использованием окон


Окно, в понятии TCP – количество сегментов передаваемых до подтверждения. Окно может менять свой размер, уменьшаться (сужаться), т.е. уменьшать кол-во передаваемых сегментов, при возникновении ошибок и расширяться при успешной передаче данных, т.е. увеличивать количество передаваемых сегментов.

Максимальная единица передаваемых данных (MTU)


Maximum Transmission Unit – это максимальный размер пакета, который может быть передан, без дробления на более мелкие пакеты. Этой величиной может управлять транспортный уровень, за счет увеличения или уменьшения сегмента.



ID: 113 Created: Oct 19, 2016 Modified Oct 07, 2019