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

Для реализации надежного обмена данными протокол TCP использует положительные подтверждения. То есть, когда сегмент успешно принят, получатель отсылает отправителю сообщение с подтверждением (сегмент с установленным битом ACK), как показано на рис. 57.3. Поле с номером подтверждения в этом сообщении содержит логический порядковый номер байта, следующего за данными, которые принимающая сторона надеется получить (иными словами, номер подтверждения ровно на 1 больше порядкового номера последнего байта в сегменте, передающем подтверждение).

Рис. 57.3.Подтверждения в протоколе TCP

Когда отправляющая сторона передает сегмент, она устанавливает таймер. Если по истечении времени ожидания подтверждение все еще не получено, сегмент отправляется заново.

На рис. 57.3 и аналогичных диаграммах, представленных далее, иллюстрируется обмен TCP-сегментами между двумя конечными точками. Подразумевается, что время связано с осью ординат и течет сверху вниз.

57.6.3. Машина состояний и диаграмма перехода состояний в протоколе TCP

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

• LISTEN — сокет ожидает запрос на соединение со стороны удаленного клиента.

• SYN_SENT — сокет отправил от имени приложения, выполняющего активное открытие, сегмент с байтом SYN и теперь ждет ответа от удаленной стороны, чтобы завершить установку соединения.

• SYN_RECV — сокет, ранее пребывавший в состоянии LISTEN, принял байт SYN, послал в ответ SYN/ACK (то есть сегмент с установленными байтами SYN и ACK) и теперь ждет от удаленного сокета подтверждения, чтобы завершить установку соединения.

• ESTABLISHED — установка соединения с удаленным сокетом завершилась. Теперь можно передавать сегменты с данными в любом направлении.

• FIN_WAIT1 — приложение закрыло соединение. Сокет послал удаленной стороне байт FIN, чтобы прекратить взаимодействие, и теперь ждет подтверждения (бит ACK). Это и следующие три состояния относятся к приложению, выполняющему активное закрытие, — тому, которое первым разрывает соединение на своем конце.

• FIN_WAIT2 — сокет, ранее пребывавший в состоянии FIN_WAIT1, получил подтверждение от удаленной стороны.

• CLOSING — сокет, ранее ожидавший подтверждения в состоянии FIN_WAIT1, получил вместо этого бит FIN, сигнализирующий о том, что удаленная сторона тоже в данный момент пыталась выполнить активное закрытие (иными словами, оба конца TCP-соединения почти одновременно послали друг другу сегменты с битом FIN; такое бывает редко).

• TIME_WAIT — выполнив активное закрытие, сокет получил бит FIN, сигнализирующий о том, что удаленная сторона уже завершила пассивное закрытие. Теперь данный сокет должен провести определенное время в состоянии TIME_WAIT, чтобы гарантировать разрыв TCP-соединения и обеспечить истечение срока годности старых дублирующих сегментов в сети перед созданием нового экземпляра того же соединения (более подробно состояние TIME_WAIT рассматривается в подразделе 57.6.7). По завершении этого времени соединение закрывается, а связанные с ним ресурсы ядра освобождаются.

• CLOSE_WAIT — сокет получил от удаленной стороны байт FIN. Это и следующее состояния относятся к приложению, выполняющему пассивное закрытие, то есть ко второму приложению, закрывающему соединение.

• LAST_ACK — приложение выполнило пассивное закрытие, а сокет, ранее пребывавший в состоянии CLOSE_WAIT, послал удаленной стороне бит FIN и теперь ждет, когда та передаст подтверждение. Получив бит ACK, сокет закрывает соединение и освобождает связанные с собой ресурсы ядра.

Помимо описанных выше состояний документ RFC 793 предусматривает еще одно, фиктивное. Оно называется CLOSED и описывает ситуацию, когда соединения нет (то есть для поддержания TCP-соединения ядро не выделило никаких ресурсов).

В списке, приведенном выше, используются названия констант, определенных в исходном коде Linux. Они немного отличаются от названий, описанных в RFC 793.

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

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

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

Стивен Прата

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