Transmission Control Protocol (TCP)
Как упоминалось в самом начале, на транспортном уровне присутствуют два протокола - 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, Веб-сервер отправляет пакеты с одинаковыми заголовками (в заголовках одинаковые IP адреса), но заголовки сегментов различаются ( обратите внимание на порт отправителя (S_PORT) и порт получателя (D_PORT)). Изначально компьютер Андрея привязал к каждому соединению определенный порт, который был определен случайным образом из динамически распределяемого диапазона (от 1023 до 65535), а обратился он на зарезервированный порт 80 (HTTP). Так происходит со всеми передаваемыми данными, к каждому приложению присваивается определенный порт/порты, таким образом данные получает то приложение, которому они предназначены. Еще можно схематично представить наш пример.
Сегментация
Прежде чем данные будут переданы по сети они должны быть разбиты на сегменты, обычно не превышающие 1460 байт.
Например, вы хотите передать видео файл размером 200Кбайт. Видео не будет передаваться одним целым файлом, оно будет разбито на сегменты, после чего по сети будут передаваться около 137 сегментов (200 000/1460~137).
Установление соединений
Устанавливаются соединения в 3 сообщения, рисунок 5.3.
- TCP устанавливает порт для приложения (для клиента, чаще всего, он находится случайным образом из диапазона от 1023 до 65535, в нашем примере, Source PORT 61734), определяет порт получателя/сервера (Destination PORT 80), случайно выставляет номер сегмента ( SEQuence 300, каждый передаваемый сегмент имеет порядковый номер) и устанавливает параметр SYN (SYNchronization - этот параметр означает инициализацию соединения) в одно из полей заголовка сегмента (напомню, что в каждом заголовке много разных полей - настроек, с помощью которых осуществляется одноуровневое взаимодействие). Такой сегмент приходит на сервер, который просматривает все, что приходит на 80-й порт.
- Сервер формирует ответный сегмент, где он так же указывает порты отправителя и получателя. Но на этом шаге он указывает свой номер сегмента (случайно подобранный, SEQ 900), параметр SYN и новый параметр ACK (ACKnowledgment) - это подтверждение. В нашем примере параметр ACK равен 301, тем самым сервер подтверждает получение сегмента с номером 300, и ожидает получения сегмета с порядковым номером 301.
- Третьим сообщением является ответ клиента на сегмент сервера, в нем указывается следующий порядковый номер (SEQ=301, а был SEQ=300) и подтверждается получение предыдущего сегмента от сервера (ACK=901, подтверждает получение сегмента SEQ=900).
После этих трех сообщений соединение считается установленным, и клиент отправляет запрос на получение данных с сервера.
Завершаются соединения в четыре сегмента, здесь этот процесс рассмотрен не будет.Восстановление после ошибок
На рисунке 5.4 изображена передача сегментов, и 3-й сегмент не приходит получателю. Введем некоторое пояснение, SEQ, помимо номера сегмента, обозначает количество переданных байт, например, первый сегмент 1400 байт, второй сегмент имеет такой же размер, но номер его 2800, он означает, что при получении этого сегмента будет передано уже 2800 байт. Вернемся к нашему примеру, веб-сервер передает не сразу все сегменты, а по частям, ожидая подтверждения каждой части. Так например, если бы передача прошла успешно, веб сервер бы получил ACK=7000. В нашем примере 3-й сегмент потерялся, поэтому клиент отправляет подтверждение ACK=4200 (как бы спрашивая у сервера, "Где сегмент №4200?"), а сервер это будут трактовать как сегмент с номером 4200 был потерян, и веб-сервер отправляет его еще раз. Вот так и осуществляется востановление данных после ошибок.
Управление потоком с использованием окон
Максимальная единица передаваемых данных (MTU)
Наш Спонсор
Если вы нашли в тексте ошибку, выделите текст и нажмите Ctrl + Enter.