Э. Таненбаум - Компьютерные сети. (4-е издание) (DJVU) (1130092), страница 163
Текст из файла (страница 163)
Таким образом, постоянно активен только гпетд, остальные вызываются только тогда, когда для ннх есть работа. 1пегг) имеет специальный конфигурационный файл, из которого он может узнать о назначении портов. Это значит, что системный администратор может настроить систему таким образом, чтобы с самыми загруженными портами (например, 80) были связаны постоянные демоны, а с остальными — гпеЫ. Транспортные протоколы Интернета: ТСР 609 Все ТСР-соединения являются полнодуплексными и двухточечными. Полный дуплекс означает, что трафик может следовать одновременно в противоположные стороны. Двухточечное соединение подразумевает, что у него имеются ровно две конечные точки.
Широковещание и многоадресная рассылка протоколом ТСР не поддерживаются. ТСР-соединение представляет собой байтовый поток, а не поток сообщений. Границы между сообщениями не сохраняются. Например, если отправляющий процесс записывает в ТСР-поток четыре 512-байтовых порции данных, зти данные могут быть доставлены получающему процессу в виде четырех 512-байтовых порций, двух 1024-байтовых порций, одной 2048-байтовой порции (см. рис. 6.22) или как-нибудь еше, Нет способа, которым получатель смог бы определить, каким образом записывались данные. (Р-загоповок ТСР-заголовок С 0 А й С Рис. 6.22. Четыре 512-байтовых сегмента, посланные как отдельные (Р-дейтаграммы (в1; 204Э байт данных, доставленные приложению с помощью отдельного вызова процедуры йЕАС(61 Файлы в системе 0й1к также обладают этим свойством.
Программа, читаюшая файл, не может определить, как был записан этот файл: поблочно, побайтно или сразу целиком. Как и в случае с файлами системы 0й1х, ТСР-программы не имеют представления о назначении байтов и не интересуются этим. Байт для них— просто байт. Получив данные от приложения, протокол ТСР может послать их сразу или поместить в буфер, чтобы послать сразу большую порцию данных, по своему усмотрению. Однако иногда приложению бывает необходимо, чтобы данные были посланы немедленно. Допустим, например, что пользователь регистрируется на удаленной машине.
После того как он ввел команду и нажал клавишу Ептег, важно, чтобы введенная им строка была доставлена на удаленную машину сразу же, а не помещалась в буфер, пока не будет введена следующая строка. Чтобы вынудить передачу данных без промедления, приложение может установить флаг Р()8Н (протолкнуть). Некоторые старые приложения использовали флаг Р\38Н как разделитель сообщений.
Хотя этот трюк иногда срабатывает, не все реализации протокола ТСР передают флаг РУБН принимающему приложению. Кроме того, если прежде чем первый пакет с установленным флагом Р()ЯН будет передан в линию, ТСР-сушность получит еше несколько таких пакетов (то есть выходная линия будет занята), ТСР-сушность будет иметь право послать все зти данные в виде единой дейтаграммы, не разделяя их на отдельные порции. Последней особенностью службы ТСР, о которой следует упомянуть, являются срочные данные. Когда пользователь, взаимодействующий с программой 610 Глава 6. Транспортный уровень в интерактивном режиме, нажимает клавишу Ов1в1в или СП!-С, чтобы прервать начавшийся удаленный процесс, посылающее приложение помещает в выходной поток данных управляющую информацию и передает ее ТСР-службе вместе с флагом 0кйьлт (срочно).
Этот флаг заставляет ТСР-сущность прекратить накопление данных и без промедления передать в сеть все, что у нее есть для данного соединения. Когда срочные данные прибывают по назначению, получающее приложение прерывается (то есть «получает сигнал», в терминологии 1)Х1Х), после чего оно может считать данные из входного потока и найти среди них срочные. Конец срочных данных маркируется, так что приложение может распознать, где они заканчиваются. Начало срочных данных не маркируется, Приложение должно само догадаться.
Такая схема представляет собой грубый сигнальный механизм, оставляя все прочее приложению. ПРОТОКОЛ ТСР В данном разделе будет рассмотрен протокол ТСР в общих чертах. В следующем разделе мы обсудим заголовок протокола, поле за полем. Ключевым свойством ТСР, определяющим всю структуру протокола, является то, что в ТСР-соединении у каждого байта есть свой 32-разрядный порядковый номер.
В первые годы сутцествования Интернета базовая скорость передачи данных между маршрутизаторами по выделенным линиям составляла 56 Кбит/с. Хосту, постоянно выдающему данные с максимальной скоростью, потребовалось бы больше недели на то, чтобы порядковые номера совершили полный круг. При нынешних скоростях порядковые номера могут кончиться очень быстро, об этом еще будет сказано позже. Отдельные 32-разрядные порядковые номера используются для подтверждений и для механизма скользящего окна, о чем также будет сказано позже.
Отправляющая и принимающая ТСР-сущностн обмениваются данными в виде сегментов. Сегмент состоит из фиксированного 20-байтового заголовка (плюс необязательная часть), за которой могут следовать байты данных. Размер сегментов определяется программным обеспечением ТСР.
Оно может объединять в один сегмент данные, полученные в результате нескольких операций записи, или, наоборот, распределять результат одной записи между несколькими сегментами. Размер сегментов ограничен двумя пределамн. Во-первых, каждый сегмент, включая ТСР-заголовок, должен помещаться в 65 515-байтное поле полезной нагрузки 1Р-пакета.
Во-вторых, в каждой сети есть максимальная единица передачи (МТЦ Мах!пщт Тгапз(ег ()п1г), и каждый сегмент должен помещаться в МТП. На практике размер максимальной единицы передачи составляет обычно 1500 байт (что соответствует размеру поля полезной нагрузки ЕгЬегпег), и таким образом определяется верхний предел размера сегмента. Основным протоколом, используемым ТСР-сущностями, является протокол скользящего окна.
При передаче сегмента отправитель включает таймер. Когда сегмент прибывает в пункт назначения, принимающая ТСР-сущность посылает обратно сегмент (с данными, если есть что посылать, или без данных) с номером Транспортные протоколы Интернета: ТСР 611 подтверждения, равным порядковому номеру следуюШего ожидаемого сегмента, Если время ожидания подтверждения истекает, отправитель посылает сегмент еще раз. Хотя этот протокол кажется простым, в нем имеется несколько деталей, которые следует рассмотреть подробнее.
Сегменты могут приходить в неверном порядке. Так, например, возможна ситуация, в которой байты с 3072-го по 4095-й уже прибыли, но подтверждение для них не может быть выслано, так как байты с 2048-го по 3071-й еше не получены. К тому же сегменты могут задерживаться в сети так долго, что у отправителя истечет время ожидания и он передаст их снова. Переданный повторно сегмент может включать в себя уже другие диапазоны фрагментов, поэтому потребуется очень аккуратное администрирование для определения номеров байтов, которые уже были приняты корректно. Тем не менее, поскольку каждый байт в потоке единственным образом определяется по своему сдвигу, эта задача оказывается реальной. Протокол ТСР должен умсть справляться с этими проблемами и решать их эффективно.
На оптимизацию производительности ТСР-потоков было потрачено много сил. В следующем разделе мы обсудим несколько алгоритмов, используемых в различных реализациях протокола ТСР. Заголовок ТСР-сегмента На рис. 6.23 показана структура заголовка ТСР-сегмента. Каждый сегмент начинается с 20-байтного заголовка фиксированного формата. За ним могут следовать дополнительные поля. После дополнительных полей может располагаться до 65 535 — 20 — 20 = 65 495 байт данных, где первые 20 байт — это 1Р-заголовок, а вторые — ТСР-заголовок. Сегменты могут и не содержать данных. Такие сегменты часто применяются для передачи подтверждений и управляющих сообщений.
Рассмотрим ТСР-заголовок поле за полем. Поля Порт получателя и Порт отправителя являются идентификаторами локальных конечных точек соединения. Популярные номера портов перечислены на ачгчгйапа.огц, однако, что касается всех остальных портов, то каждый хост может сам решать, как их распределять, Номер порта вместе с 1Р-адресом хоста образуют уникальный 48-битный идентификатор конечной точки. Пара таких идентификаторов, относящихся к источнику и приемнику, однозначно определяет соединение. Поля Порядковый номер и Номер подтверждения выполняют свою обычную функцию.
Обратите внимание; поле Номер подтверждения относится к следуюпгему ожидаемому байту, а не к последнему полученному. Оба они 32-разрядные, так как в ТСР-потоке нумеруется каждый байт данных. Поле длина ТСР-заголовка содержит размер ТСР-заголовка, выраженный в 32-разрядных словах. Эта информация необходима, так как поле Факультативные поля, а вместе с ним и весь заголовок, может быть переменной длины. По сути, это поле указывает смешение от начала сегмента до поля данных, измеренное в 32-битных словах.