Как устанавливаются и разрываются TCP-соединения?

задняя часть сервер TCP/IP DNS

Как происходит трехстороннее рукопожатие TCP?


  1. Запрашивающая сторона (клиент) инициирует первый SYN и выполняет активное открытие, указывая, что хочет подключиться к серверу, и одновременно указывает начальный порядковый номер (ISN, например, здесь 141553152)
  2. Сервер отвечает, указывает свой начальный серийный номер, выполняет пассивное открытие и устанавливает серийный номер подтверждения, чтобы добавить 1 к исходному серийному номеру клиента, указывая, что SYN клиента подтвержден.
  3. Клиент устанавливает порядковый номер подтверждения равным начальному порядковому номеру сервера плюс 1, указывая, что SYN сервера подтвержден.
ISN: начальный порядковый номер, который можно рассматривать как 32-битный счетчик, увеличивающийся на 1 каждые 4 мс, подробности см. в RFC 793.

Каков процесс четырех волн TCP?


  1. Запрашивающая сторона (клиент) хочет отключиться, поэтому отправляет пакет FIN.
  2. Сервер получает запрос и добавляет 1 к серийному номеру клиента в серийном номере подтверждения, чтобы указать, что он был подтвержден.
  3. Сервер закрывает собственное соединение и отправляет пакет FIN
  4. Клиент получает запрос и добавляет 1 к серийному номеру сервера в серийном номере подтверждения, чтобы указать, что он был подтвержден.
TCP-соединения полнодуплексные, каждое направление должно быть закрыто отдельно

Что произойдет, если время соединения истекло?


место действия

Сервер был выключен только тогда, когда клиент установил соединение. Видно, что клиент делает повторную попытку, но временной интервал между повторными попытками составляет 5,81 секунды в первый раз и 24,00 секунды во второй раз.

Для BSD-версии реализации программного обеспечения TCP этот интервал повторных попыток обусловлен наличием таймера 500 мс. Первый интервал обычно заканчивается в любое время 5,5-6 секунд, в то время как второй интервал обычно стабилен на уровне 24 секунд. Это связано с тем, что в тот момент, когда TCP получает управление системой в течение 500 мс, система может отдать приоритет другим прерываниям, поэтому первое уменьшение счетчика произойдет в любое время между 0-500 мс. И каждый раз при вызове ядром таймера TCP 500ms он будет исправляться, так что последующая стабильность

tos 0x10 указывает тип службы в дейтаграмме IP, значение здесь является запросом udp DNS

Что происходит, когда соединение разрывается аварийно?

Сторона подключения отправляет сообщение сброса, чтобы разорвать соединение на полпути [обычно отправляется FIN]

В конце аварийного выпуска будет возвращен сегмент сообщения RST, принимающая сторона разорвет соединение и уведомит прикладной уровень о сбросе, а получатель не подтвердит сообщение RST.

Что такое полузакрытие в TCP?

После того, как один конец TCP завершит отправку, он все еще может получать данные, отправленные другим концом.

Сценарии применения

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

Что такое полуоткрытый в TCP?

Один конец соединения был закрыт или прерван аварийно, но другой конец об этом не знает.

место действия

Когда клиент и сервер нормально обмениваются данными, внезапно сервер отключается. В это время клиент не знает, что сервер выключен. В этом случае, если сервер немедленно восстанавливает питание и немедленно перезагружается, когда клиент отправляет сообщение после перезапуска сервера. Когда данные получены, сервер отвечает флагом сброса, то есть флаг R TCP устанавливается в 1, а клиент получает информацию и знает, что соединение разорвано.

Аналогичный сценарий:После того, как клиент закончил использовать свой компьютер, он напрямую отключает шнур питания компьютера.В это время сервер не знает, что клиент исчез.После повторного включения клиента будет установлено новое соединение, в результате много полуоткрытых серверов.

Что, если оба конца TCP открыты одновременно?

SYN, отправленные обеими сторонами связи, поступают на другую сторону одновременно, и порт, отправленный одним концом, совпадает с портом, запрошенным другим концом.

место действия

Приложение хоста A использует локальный порт 7777 и выполняет активное открытие с портом 8888 хоста B, а приложение хоста B использует локальный порт 8888 и выполняет активное открытие с портом 7777 хоста A.

Статус перехода сообщения выглядит следующим образом


Весь процесс открытия требует обмена сегментами 4. Сам дизайн tcp гарантирует, что в этом сценарии будет установлено только 1 соединение.

Другие семейства протоколов могут устанавливать два, например, транспортный уровень OSI.

Что, если оба конца TCP закрыты одновременно?

Обе взаимодействующие стороны выполняют активное отключение. Статус меняется следующим образом:


Количество обмениваемых сегментов такое же, как и при обычном отключении.

Каков процесс перехода состояния TCP?

Переход состояния трехэтапного рукопожатия


Переход состояния тайм-аута установления соединения


Также открытые переходы состояний


4 перехода состояния волны


Также закрыть переходы между состояниями


Возможные переходы состояний при получении RST

Обычно RST возникает из-за того, что пакет, полученный получателем, явно не имеет ничего общего с текущим соединением, в это время запускается генерация RST-пакета.

  • Из-за какого-то неизвестного фактора клиент много раз отправляет SYN, но сервер получает старый SYN, в это время клиент отправляет RST, а сервер получает RST для переподключения.


  • В полуоткрытом состоянии, когда соединение было установлено, клиент внезапно зависает, в это время, когда клиент снова пытается открыть соединение или сервер снова отправляет данные, сервер получает RST.


На картинке выше показан АВАРИЙНЫЙ СБОЙ клиента, после чего клиент переподключается, на картинке ниже показан КРЭШ клиента, а затем сервер возвращает данные клиенту



Из состояния SYN_RECEVIED в состояние FIN_WAIT_1

В это время отправлять нечего, и в очереди на отправку нет ничего незавершенного, поэтому генерируется пакет FIN, отправляется и соединение разрывается.

Есть что отправить, например ack, чтобы установить соединение

Каково время ожидания 2MSL?

MSL (Maximum Segment Lifetime) — максимальное время жизни сегмента.

Время жизни ограничено.Поскольку сегмент TCP передается в сети как дейтаграмма IP, а дейтаграмма IP ограничена числом переходов TTL, время жизни сегмента ограничено до того, как сегмент будет отброшен.

Когда TCP выполняет активное закрытие и отправляет последний ACK, соединение должно ожидать в 2 раза больше времени MSL в состоянии TIME_WAIT.

Причины: 1: Если ACK, отправленный активным закрывающим концом TCP, потерян, пассивный закрывающий конец снова отправит FIN.В это время время ожидания может сделать последний ACK, отправленный активным закрывающим концом TCP, не потерянным; 2 Следующее новое соединение может мультиплексировать тот же порт, если старые данные поступают из-за задержки в сети, они будут смешаны с новыми данными, ожидание 2MSL может привести к полному исчезновению старых данных.

В течение периода времени 2MSL сокеты (IP-адрес и порт клиента, IP-адрес и порт сервера), которые определяют это соединение, больше не могут использоваться сторонами с пассивным отключением.

Если соединение сервера внезапно прервалось, а затем сразу перезапущено, клиент не может подключиться к этому порту сервера в пределах 2MSL [здесь клиент — пассивный разъединитель]; аналогично, если клиент отключается сам, немедленно использовать тот же порт Также невозможно подключиться к серверу за время 2MSL [здесь сервер — пассивный разъединитель]. В этом сценарии клиент может изменить порт по своему желанию, но общий порт приложения сервера является фиксированным, что может легко вызвать проблемы.

Если на сервер одновременно поступает несколько запросов, как сервер их обрабатывает?

Сервер TCP специально организует процесс, который всегда находится в состоянии LISTEN для получения запроса клиента.Когда запрос получен, модуль TCP в системе создаст процесс в состоянии ESTABLISHED.
Процессы в состоянии LISTEN не могут получать сегменты данных, а процессы в состоянии ESTABLISHED не могут получать сегменты SYN.

Berkeley TCP реализует правила обработки множественных соединений следующим образом:

  1. Существует очередь соединений фиксированной длины, ожидающая запроса на соединение.Соединение в очереди было принято TCP, но прикладной уровень еще не обнаружил его.
  2. Прикладной уровень указывает максимальную длину очереди изменений, которая обычно называется значением невыполненной работы, и диапазон значений составляет 0–5.
  3. При поступлении нового соединения, если в очереди на соединение есть место, модуль TCP подтвердит SYN и завершит установление соединения. Но прикладной уровень узнает об этом новом соединении только после получения третьего сегмента трехэтапного рукопожатия.
  4. Приходит новое соединение, но в очереди соединений нет места. Модуль TCP игнорирует SYN и не отправляет обратно RST. Если прикладной уровень не принимает соединение, принятое TCP вовремя, соединение заполнено , и время активного открытия клиента в конечном итоге истечет.
Принимающее соединение TCP помещается в очередь соединений, а принимающее соединение прикладного уровня удаляется из очереди.
Задержка очереди не имеет ничего общего с максимальным количеством подключений, которые может обработать сервер.