Механизмы установления соединения и завершения соединения TCP спроектированы для устойчивости. Они служат для обрамления данных, передаваемых в ходе соединения, таким образом, чтобы не только данные, но и их размеры сообщались надежно.
Кроме того, процедура спроектирована для обнаружения старых соединений, которые не завершились правильно из-за аварии одного из узлов или потери возможности сетевого соединения.
Если обнаруживается такое полуоткрытое соединение, оно прерывается. Хосты выбирают новые начальные номера последовательности для каждого соединения, чтобы уменьшить шансы того, что старый пакет может быть перепутан с текущим соединением.
Обычная процедура установления соединения известна как трехстороннее рукопожатие (three-way handshake). Каждый узел посылает другому SYN sent, и каждый в свою очередь подтверждает TCP SYN другого своим АСК. На практике соединение обычно инициируется клиентом, пытающимся соединиться с сервером, прослушивающим хорошо известный порт. Клиент выбирает номер порта и начальный номер последовательности и использует эти значения в первоначальном пакете с SYN SENT. Сервер создает управляющий блок протокола для ожидающего соединения и отправляет пакет с начальным номером последовательности, SYN и АСК клиентского SYN. Клиент отвечает АСК для SYN-сервера, завершая установление соединения. Поскольку АСК первого TCP SYN скомбинирован со вторым TCP SYN, эта процедура требует трех пакетов, откуда и происходит название трехстороннее рукопожатие. Протокол по-прежнему работает правильно, если оба узла пытаются установить соединение одновременно, хотя установление соединения требует четырех пакетов.
FreeBSD при инициализации соединения включает вместе с SYN три опции. Одна содержит максимальный размер сегмента, который система хочет принять [Jacobson et al., 1992]. Вторая из этих опций указывает значение масштабирования окна, выраженное в виде значения двоичного сдвига, что позволяет окну превысить 65 535 октетов. Если в ходе трехстороннего рукопожатия оба узла включат эту опцию, действуют оба значения масштабирования; в противном случае значение окна остается в октетах. Третья опция является опцией отметки времени. Если эта опция отправляется в ходе установления соединения в обоих направлениях, она будет также отправляться с каждым пакетом в ходе передачи данных. Поле данных опции отметки времени включает отметку времени, связанную с текущим номером последовательности, а также отражает в виде эха отметку времени, связанную с текущим подтверждением. Аналогично пространству последовательностей отметка времени использует 32-разрядное поле и модульную арифметику.
Единица поля отметки времени не определена, хотя она должна находиться между 1 миллисекундой и 1 секундой. Значение, отправляемое каждой системой, должно в ходе соединения монотонно не снижаться. FreeBSD использует значение тиков, которое увеличивается со скоростью системного тактового генератора в герцах. Эти отметки времени могут использоваться для реализации определения времени обращения. Они служат также в качестве расширения пространства последовательностей для предотвращения приема старых дублированных пакетов; это расширение имеет значение, когда используются большое окно или путь с помехами, такой, как Ethernet.
После установления соединения каждый узел включает в каждый пакет подтверждение и сведения об окне. Каждый может посылать данные в соответствии с окном, которое он получает от другого узла. Когда один конец отправляет данные, окно заполняется. Когда данные получаются другим узлом, могут быть отправлены подтверждения, так что отправитель может сбросить данные из своей очереди отправки. Если получатель готов принять дополнительные данные, возможно из-за того, что принимающий процесс использовал предыдущие данные, он передвигает также окно управления потоком. Данные, подтверждения и обновления окна все могут объединяться в одно сообщение.
Если отправитель не получает подтверждения в течение некоторого разумного времени, он повторно передает данные, которые, как он полагает, были потеряны. Дублированные данные уничтожаются получателем, но подтверждаются снова на случай, если повторная передача была вызвана потерей подтверждения. Если данные получены вне очереди, получатель обычно сохраняет внеочередные данные для использования, когда будет получен отсутствующий сегмент. Внеочередные данные не могут быть подтверждены, поскольку подтверждения являются кумулятивными. В Jacobson et al. [1992] был введен механизм избирательного подтверждения, но он в FreeBSD не реализован.
Каждый узел может в любое время завершить передачу данных, отправив пакет с битом FIN. FIN представляет окончание данных (аналогично указателю конца файла). FIN подтверждается путем увеличения номера последовательности на 1. Соединение может продолжать передавать данные в другом направлении до тех пор, пока в этом направлении не будет отправлен FIN. Подтверждение FIN завершает соединение. Чтобы гарантировать синхронизацию при завершении соединения, узел, отправляющий последний АСК для FIN, должен сохранять свое состояние достаточно долго, чтобы любые повторно переданные пакеты FIN дошли до него или были уничтожены; в противном случае, если АСК был бы потерян, а повторно переданный FIN получен, получатель не смог бы повторить подтверждение. В качестве этого интервала произвольно устанавливается промежуток времени, равный двум максимальным ожидаемым временам жизни сегмента (известный как 2MSL).
Модуль обработки ввода TCP и модули таймеров должны поддерживать состояние соединения в течение времени жизни этого соединения. Таким образом, кроме обработки полученных через соединение данных модуль ввода должен обрабатывать флаги TCP SYN и FIN и другие переходы состояний.
Если соединение потеряно из-за аварии или тайм-аута на узле, но другим узлом оно по-прежнему рассматривается как установленное, тогда любые отправленные через соединение и полученные на другом конце данные вызовут обнаружение полуоткрытого соединения. При обнаружении полуоткрытого соединения принимающий узел отправляет пакет с флагом RST и номером последовательности, полученном от входящего пакета, чтобы оповестить о том, что соединения больше не существует.