Начало сеанса TCP принято называть "тройным рукопожатием" (three-way handshake). Оно состоит из 3-х шагов , если быть точнее то из 3-х ладоней.
И так 1 клиент, клиент который намеривается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN.
Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента.
Второй клиент получает сегмент с флагом RST, то он запоминает номер последовательности и посылает сегмент с флагом ACK. Если он одновременно получает и флаг ACK (что обычно происходит), то он переходит в состояние ESTABLISHED.
Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться, те протянуть руку для рукопожатия...}
Ну а третий. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED.
Процесс называется "тройным рукопожатием" так как, несмотря на то что возможен процесс установления соединения с использованием 4 сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), на практике для экономии времени используется 3 сегмента.
Приёмник при обмене данных использует номер последовательности, содержащийся в получаемых сегментах, для восстановления их исходного порядка. Затем приёмник уведомляет передающую сторону о номере последовательности, до которой он успешно получил данные, включая его в поле "номер подтверждения". Все получаемые данные, относящиеся к промежутку подтвержденных последовательностей, игнорируются.
Если полученный сегмент содержит номер последовательности, больший, чем ожидаемый, то данные из сегмента буферизуются, но номер подтвёржденной последовательности не изменяется. Если в последствии будет принят сегмент, относящийся к ожидаемому номеру последовательности, то порядок данных будет восстановлен, исходя из номеров последовательности в сегментах.
Во избежание ситуации, когда передающая сторона отправляет данные интенсивней, чем их может обработать приёмник, TCP содержит средства управления потоком. Для этого используется поле "окно". В сегментах, направленных от приёмника передающей стороне, в поле "окно" В сегментах, направленных от приёмника передающей стороне, в поле "окно" указывается текущей размер приёмного буфера. Передающая сторона сохраняет размер окна и отправляет данных не более, чем указал приёмник. Если приёмник указал нулевой размер окна, то передача данных в направлении этого узла не происходит, то тех пор, пока приёмник не сообщит о большом размере окна.
Так же возможны ситуации, когда передающее приложение может явно затребовать протолкнуть данные до некоторой последовательности принимающему приложению, не буферизуя их. Для этого используется флаг PSH. Если в полученном сегменте обнаруживается флаг PSH, то реализация TCP отдаёт все буферизированные на данный момент данные принимающему приложению. "Проталкивание" может использоваться, например, в интерактивных приложениях. В сетевых терминалах нет смысла ожидать ввода пользователя, после того как он закончил набирать команду. Поэтому последний сегмент, содержащий команду, обязан содержать флаг PSH, чтобы приложение на принимающей стороне смогло начать её выполнение...