Транспортный уровень в Интернете
Как уже неоднократно отмечалось, в Интернете (а точнее, в любой компьютерной сети, поддерживающей протокол TCP/IP) существуют два протокола транспортного уровня. Протокол UDP (User Datagram Protocol — протокол пользовательских дейтаграмм) предоставляет приложениям службу ненадежной передачи данных без установления логического соединения. Протокол TCP (Transmission Control Protocol — протокол управления передачей), напротив, предоставляет службу надежной передачи данных с установлением логического соединения. Создавая новое приложение, разработчик должен выбрать один из двух протоколов транспортного уровня для своего продукта. Как мы убедились в разделах «Программирование ТСР-сокетов» и «Программирование UDP-сокетов» главы 2, выбирать нужно при создании сокетов.
Для упрощения терминологии в контексте Интернета мы будем называть единицы обмена (PDU) транспортного уровня сегментами. Заметим, что в публикациях, посвященных Интернету (например, в документах RFC), сегментами, как правило, называют единицы обмена протокола TCP, при этом термин «дейтаграмма» используется для обозначения единиц обмена протокола UDP. В то же время в этих публикациях дейтаграммами называют единицы обмена сетевого протокола! Поскольку наша книга является введением в курс компьютерных сетей, мы сочли более наглядным употребление термина «сегмент» для обозначения единиц обмена обоих протоколов транспортного уровня, TCP и UDP, и термина «дейтаграмма» для обозначения единиц обмена сетевого уровня.
Перед тем как продолжить разговор о протоколах TCP и UDP, необходимо сказать несколько слов о сетевом уровне Интернета. В Интернете на сетевом уровне используется единственный протокол IP (Internet Protocol — Интернет-протокол). Протокол IP обеспечивает логическое соединение между хостами и предоставляет транспортному уровню услуги с доставкой «по возможности», или «с максимальными усилиями». Это означает, что IP пытается осуществить успешную доставку сегментов от отправителя до получателя, однако не дает никаких гарантий. Отсутствие гарантий распространяется не только на сам факт доставки сегментов, но и на сохранение порядка следования сегментов, а также на отсутствие искажений в доставленной информации. Говорят, что протокол IP предоставляет ненадежную службу. Каждый хост сети имеет не менее одного адреса сетевого уровня, часто называемого IP-адресом. В главе 4 мы подробно рассмотрим вопросы, относящиеся к IP-адресам, а здесь нам будет достаточно знать лишь об их существовании.
Кратко рассмотрев модель обслуживания протокола IP, займемся обобщением наших знаний о службах протоколов UDP и TCP. Основной задачей UDP и TCP является обеспечение обмена данными между процессами, выполняющимися на оконечных системах, при помощи службы обмена данными между оконечными системами, предоставляемой протоколом сетевого уровня. Такое «продолжение» соединения между оконечными системами до уровня процессов называется мультиплексированием и демультиплексированием на транспортном уровне и рассматривается в следующем разделе. Протоколы UDP и TCP также обеспечивают отсутствие искажений данных при передаче, включая в свои заголовки поля обнаружения ошибок. Заметим, что протокол UDP предоставляет минимальный набор служб транспортного уровня: службы обмена данными между процессами и контроля ошибок. Как и протокол IP, UDP обеспечивает ненадежную передачу данных, не предоставляя гарантий доставки и отсутствия ошибок. Подробное описание UDP будет приведено в разделе «Протокол UDP — передача без установления соединения» этой главы.
Протокол TCP обладает более широким набором служб по сравнению с UDP. Прежде всего TCP обеспечивает надежную передачу данных. При помощи средств контроля переполнения, порядковых номеров, квитанций и таймеров (которые рассматриваются позже) TCP гарантирует, что вся переданная информация будет получена в правильном порядке и без искажений. Таким образом, протокол TCP, используя службу ненадежной передачи данных между оконечными системами протокола IP, обеспечивает надежную передачу данных между процессами. Контроль перегрузки является одной из функций TCP, которую трудно отнести к услуге, предоставляемой приложению; скорее, контроль перегрузки помогает повысить качество обслуживания всех пользователей сети. Цель контролирования перегрузки — предотвращение слишком интенсивного трафика между парами оконечных систем, вызывающего перегрузку линий связи и маршрутизаторов. Фактически действие механизма контроля перегрузки заключается в разделении пропускной способности линии связи поровну между всеми TCP-соединениями. В свою очередь, такое разделение обеспечивается регулированием скорости передачи каждой оконечной системой. Протокол UDP не контролирует трафик, а следовательно, приложение, использующее UDP, может осуществлять передачу данных с любой скоростью в течение сколь угодно долгого времени.
Не удивительно, что протокол TCP, обеспечивающий надежную передачу данных и контролирование перегрузки, является весьма сложным. Принципы надежной передачи данных и контроля перегрузки изложены в нескольких разделах этой главы; кроме того, отдельный раздел посвящен самому протоколу TCP. Придерживаясь нашего подхода к изложению материала, мы сначала будем рассматривать общие задачи, а затем переходить к их практическому решению в протоколе TCP. Однако перед тем как начать детальное изучение TCP, обратимся к упомянутым выше операциям мультиплексирования и демультиплексирования на транспортном уровне.