Вопрос о трехстороннем рукопожатии TCP и четырех волнах — один из самых распространенных контрольных вопросов на собеседованиях. Многие читатели знают три и четыре раза, но если спросить немного глубже, они часто не могут дать точного ответа.
В этой статье делается попытка использовать анимацию для объяснения этого факта, надеясь, что читатели смогут легче понять природу взаимодействия TCP.
Трехстороннее рукопожатие TCP
Трехстороннее рукопожатие TCP похоже на то, как два человека видят друг друга на расстоянии 50 метров друг от друга на улице, но они не могут быть подтверждены на 100% из-за смога и других причин, поэтому они должны помахать друг другу, чтобы определить, знает ли их другая сторона.
Чжан Сан сначала помахал Ли Си (syn), увидев, как Чжан Сан манит его, Ли Си кивнул собеседнику и выдавил улыбку (ack). Увидев улыбку Ли Си, Чжан Сан подтвердил, что Ли Си успешно идентифицировал себя (введитеestalishedгосударство).
Но Ли Си все еще был немного подозрительным, и он огляделся, чтобы увидеть, возможно ли, что Чжан Сан смотрел на кого-то еще, ему также нужно было подтвердить. Итак, Ли Си также помахала Чжан Саню (syn), Чжан Сан увидел, как Ли Си машет ему рукой, и понял, что другая сторона ищет его подтверждения, поэтому он кивнул и выдавил улыбку (ack), увидев улыбку собеседника, Ли Си подтвердил, что Чжан Сань приветствует его (введитеestablishedгосударство).
Итак, они ускорили шаг, подошли друг к другу и обняли друг друга.
Всего в этом процессе мы увидели четыре движения: Чжан Сан поманил — Ли Си кивнул и улыбнулся — Ли Си поманил — Чжан Сан кивнул и улыбнулся. Среди них Ли Си выполнила два последовательных действия: сначала кивнула и улыбнулась (отвечая другой стороне), а затем снова помахала (ища подтверждения).syn+ack). Таким образом, четыре движения были упрощены до трех движений, Чжан Сан поманил - Ли Си кивнул, улыбнулся и помахал рукой - Чжан Сан кивнул и улыбнулся. В этом суть трехстороннего рукопожатия, где одно действие посередине представляет собой слияние двух действий.
Мы видим, что есть два промежуточных состояния,syn_sentиsyn_rcvd, эти два состояния называются «полуоткрытыми», то есть они машут рукой другой стороне, но не успевают увидеть кивок и улыбку другой стороны.syn_sent- "полуоткрытое" состояние активного открывателя,syn_rcvdЭто «полуоткрытое» состояние пассивного открывателя. Клиент является активным открывателем, а сервер — пассивным открывателем.
- syn_sent: syn package has been sent
- syn_rcvd: syn package has been received
Передача данных TCP
Передача данных TCP — это разговор между двумя людьми в воздухе, на небольшом расстоянии, поэтому другой стороне необходимо неоднократно подтверждать, что они слышали свои собственные слова.
Чжан Сан выкрикивал слово (данные), и после того, как Ли Си его слышал, он отвечал Чжан Саню, что слышал (акк).
Если Чжан Сан выкрикивал слово и долго не слышал ответа Ли Си, Чжан Сан думал, что его слова унесло сильным ветром, а Ли Си этого не слышал, поэтому ему нужно было кричать снова, что была ретрансляция tcp.
Также возможно, что Ли Си услышал слова Чжан Саня, но ответ Ли Си Чжан Саню был унесен сильным ветром, так что Чжан Сан не услышал ответа Ли Си. Чжан Сан не мог понять, были ли его собственные слова унесены сильным ветром или ответ Ли Си был унесен сильным ветром.
Поскольку оно будет передано повторно, Ли Си, возможно, услышал одно и то же предложение дважды, что является «дедупликацией». Сетевые модули ядра «ретрансляции» и «дедупликации» работающей операционной системы были обработаны за нас, и пользовательскому уровню не нужно об этом заботиться.
Чжан Сан может кричать Ли Си, а Ли Си также может кричать Чжан Саню, потому что канал tcp является «дуплексным», и обе стороны могут активно инициировать передачу данных. Однако независимо от того, какая сторона звонит, ей необходимо получить подтверждение от другой стороны, чтобы считать, что другая сторона получила свой собственный вызов.
Чжан Сан может быть зенитным орудием, и он сказал восемь предложений подряд.В настоящее время Ли Си не может отвечать по одному предложению за раз, но, выслушав эти восемь предложений подряд, он ответит на другую сторону вместе и сказать, что у меня есть все восемь предложений, которые вы сказали ранее.Вы слышите это, это пакетный ack. Тем не менее, Чжан Сан не может сказать слишком много за один раз. Мозг Ли Си может быть не в состоянии переварить слишком много за короткое время. Им обоим необходимо согласовать соответствующую скорость отправки и получения. Это «размер окна TCP». ".
Взаимодействие данных в сетевой среде и диалог между людьми более сложны, и существует явление неупорядоченных пакетов данных. Различные пакеты данных из одного и того же источника могут проходить по разным путям в «Интернет-маршрутизации», и когда они, наконец, достигают одного и того же места, порядок их следования будет другим. Сетевой модуль ядра операционной системы отвечает за сортировку пакетов данных, и порядок, когда они достигают пользовательского уровня, полностью согласуется.
ПТС махнул четыре раза
Процесс отключения TCP-линка аналогичен процессу установления линка, за исключением того, что две части посередине не всегда объединяются в один шаг, поэтому он разбит на 4 действия, — махнул рукой (плавником) Чжан Сан — Ли Си грустно улыбнулся (акк) - Ли Си махнул рукой (фин) - Чжан Сан грустно улыбнулся (акк).
Причина, по которой два действия в середине не объединены, заключается в том, что tcp имеет «полузакрытое» состояние, то есть одностороннее отключение. Чжан Сан уже махнул рукой, но человек еще не ушел, он просто больше не говорит, но его уши еще могут продолжать слушать, а Ли Си продолжает кричать. Подождав, пока Ли Си устанет и перестанет говорить, он помахал Чжан Саню, который грустно улыбнулся, и все было кончено.
Существует очень особое состояние вышеtime_wait
, это долговременное состояние, в которое входит активно закрывающаяся сторона после ответа на волну другой стороны. Стандартная продолжительность этого состояния составляет 4 минуты. Через 4 минуты он перейдет в закрытое состояние и освободит ресурсы сокета. Однако это время может быть скорректировано в конкретной реализации.
Это как ответственность стороны, которая взяла на себя инициативу расстаться, это вы предложили расстаться, и вы должны заплатить цену. Эффект длится 4 минуты.time_wait
состояние, ресурсы сокетов (порты) не могут быть освобождены, как и период вдовства, в течение которого ресурсы сокетов (порты) не могут быть переработаны.
Его функция заключается в повторной передаче последнего сообщения подтверждения, чтобы убедиться, что другая сторона может его получить. Потому что, если другая сторона не получит подтверждение, сообщение fin будет передано повторно, и сокет в состоянии time_wait немедленно повторно передаст сообщение подтверждения другой стороне.
В то же время, в течение этого периода времени остаточные пакеты, генерируемые ссылкой в Интернете, маршрутизируются во время диалога (поскольку путь слишком труден, пакеты данных слишком долго путешествуют, все повторно переданные пакеты принимаются, и исходные пакеты все еще находятся в пути), они будут немедленно отброшены. 4 минут достаточно, чтобы эти остаточные пакеты полностью исчезли. В противном случае при повторном использовании нового порта эти остаточные пакеты могут мешать новому каналу.
4 минуты — это 2 MSL, каждый MSL — 2 минуты. MSL этоmaximium segment lifetime
- Максимальное время жизни сообщения. Это время указано в официальном протоколе RFC. Что касается того, почему есть 2 MSL вместо 1, я не видел очень удовлетворительного объяснения.
Четыре раза взмахивания не всегда четыре раза.Иногда два действия в середине могут быть объединены и выполнены вместе.В это время это становится трехкратным взмахом.fin_wait_1
заявить прямо вtime_wait
статус, пропущенfin_wait_2
государство.
Суммировать
Смена состояния TCP — очень сложный процесс, и в этой статье по аналогии объясняются лишь некоторые простые базовые моменты. Дополнительные знания о TCP также требуют от читателей поиска соответствующих технических статей для углубленного изучения. Если читатель хорошо разбирается в базовых знаниях TCP, продвинутые знания не будут слишком сложными для понимания.
Для получения дополнительных статей о TCP, пожалуйста, обратите внимание на публичный аккаунт WeChat «Code Cave», чтобы подписаться. Я продолжу обновлять более подробную информацию в будущем.
Если вы считаете, что качество этой статьи удовлетворительное, поддержите мой буклет Nuggets.
Глубокое понимание RPC Глубокое понимание RPC Глубокое понимание RPC
Глубокое понимание RPC Глубокое понимание RPC Глубокое понимание RPC