Читаем Linux API. Исчерпывающее руководство полностью

На рис. 57.4 показана диаграмма перехода состояний для протокола TCP (за основу взяты диаграммы из RFC 793 и книги [Stevens et al., 2004]). Она описывает то, как одна из сторон TCP-соединения переходит от одного состояния к другому в зависимости от различных событий. Каждая стрелка символизирует потенциальный переход и помечена событием, которое инициирует данный переход. Это может быть действие приложения (выделяется жирным шрифтом) или строка recv, сигнализирующая о получении сегмента от удаленного сокета. По мере перехода от одного состояния к другому сокет может передавать сегменты удаленной стороне; в таком случае указывается метка send. Например, стрелка для перехода из ESTABLISHED в FIN_WAIT1 показывает, что инициатором является вызов close(), выполненный локальным приложением, и при этом удаленному сокету передается сегмент с битом FIN.

Обычное для TCP-клиента направление перехода показано на рис. 57.4 в виде сплошной стрелки, а пунктирной обозначено направление, которое, как правило, выбирает TCP-сервер (другие стрелки изображают направления, используемые не так часто). Глядя на номера, указанные в скобках рядом с этими стрелками, можно сделать вывод: отправляемые и принимаемые сегменты на обоих концах соединения являются зеркальным отражением друг друга. (После прохождения состояния ESTABLISHED маршруты, выбираемые сервером и клиентом, могут оказаться обратными тем, что изображены на диаграмме; так происходит, если активное закрытие выполняет серверная сторона.)

На рис. 57.4 показаны не все возможные переходы машины состояний протокола TCP, а только представляющие особый интерес. Больше подробностей о диаграмме перехода состояний для протокола TCP можно найти на www.cl.cam.ac.uk/~pes20/Netsem/poster.pdf.

Рис. 57.4.Диаграмма перехода состояний для протокола TCP

57.6.4. Установка TCP-соединения

На уровне своих программных интерфейсов два потоковых сокета соединяются, выполняя два следующих шага (см. рис. 52.1).

1. Сервер делает вызов listen(), чтобы выполнить пассивное открытие сокета, и затем вызывает операцию accept(), которая блокируется до тех пор, пока соединение не будет установлено.

2. Клиент делает вызов connect() с целью выполнить активное открытие сокета и установить соединение с пассивным сокетом на стороне сервера.

Этапы установки TCP-соединения изображены на рис. 57.5. Данную процедуру часто называют трехэтапным согласованием (англ. three-way handshake), так как между двумя концами соединения проходят три сегмента.

Рис. 57.5.Трехэтапное согласование при установке TCP-соединения

В процессе выполняются следующие шаги.

1. Вызов connect() заставляет TCP-клиент послать сегмент SYN, который информирует сервер о начальном порядковом номере клиента (на диаграмме обозначен как M). Эта информация является необходимой, поскольку, как было отмечено в подразделе 54.6.3, порядковые номера не начинаются с 0.

2. TCP-сервер должен подтвердить получение сегмента SYN и проинформировать клиента о своем собственном начальном порядковом номере (на диаграмме обозначен как N). Оба номера необходимы, так как потоковый сокет является двунаправленным. Для выполнения этих двух операций сервер может вернуть единственный сегмент с установленными битами SYN и ACK (мы как бы цепляем бит ACK к SYN).

3. TCP-клиент отправляет сегмент ACK, чтобы подтвердить получение сегмента SYN, посланного сервером.

Сегменты SYN, чей обмен происходит на первых двух шагах трехэтапного согласования, могут содержать в TCP-заголовке параметры, на основе которых определяются свойства соединения. Подробности можно найти в [Stevens et al., 2004], [Stevens, 1994] и [Wright & Stevens, 1995].

Метки в угловых скобках (например, ) на рис. 57.5 обозначают состояния обоих концов соединения.

Флаг SYN занимает один байт от места, выделенного для порядкового номера соединения. Это позволяет однозначно подтвердить получение SYN, так как сегмент, вместе с которым он передан, может также содержать какие-то данные. Вот почему подтверждение получения сегмента SYN M на рис. 57.5 изображено как ACK M+1.

57.6.5. Разрыв TCP-соединения

Закрытие TCP-соединения обычно происходит следующим образом.

1. Приложение на одном из концов соединения выполняет вызов close() (часто это делает клиент). Считается, что таким образом производится активное закрытие.

2. Позже приложение на другом конце соединения (сервер) тоже выполняет вызов close(). Данное действие называется пассивным закрытием.

На рис. 57.6 показано, какие действия выполняют соответствующие TCP-сокеты (подразумевается, что активное закрытие производит клиент).

1. Клиент выполняет активное закрытие, это заставляет его сокет отправить серверу сегмент FIN.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных