Я очень доволен.В весенней загрузке 2, выпущенной в первой половине года, веб-контейнером по умолчанию является netty, что показывает, что «реактивные» контейнеры стали общей тенденцией. язык или модель потока реактора на основе Java, все они основаны на событиях.Программа для достижения экземпляров с высокой степенью параллелизма. В начале этой недели я расскажу обо всем, что касается NiO, каковы его основные принципы, каковы архитектуры приложений и как использовать его преимущества для создания высокопроизводительных серверов.
Перед введением NIO необходимо понять протокол TCP, поскольку большинство приложений в настоящее время работают на прикладном уровне, что приводит к скрытию большого количества деталей сети.Знание этих деталей и принципов очень полезно для устранения неполадок.
1. Особенности TCP
TCP — этоориентированный на соединениепротокол, обеспечивающий пользовательские процессыНадежный полный дуплексбайтовый поток. Убедитесь, что пакеты данных надежны, упорядочены и поддерживают управление потоком. Относительно того, почему TCP делает это, мы начнем со следующих аспектов:
Почему сетевой уровень IP не гарантирует надежность пакетов данных?
Как протокол TCP обеспечивает доступность и упорядоченность пакетов?
Как протокол TCP поддерживает управление потоком
Несколько состояний и приложений TCP
2. Почему сетевой уровень IP не гарантирует надежность пакетов данных?
Давайте сначала посмотрим на сетевые уровни OSI.На следующих уровнях TCP расположен на транспортном уровне, что обеспечивает надежность и непрерывность протокола. Конкретный отчет об отправке и получении определяется базовым канальным уровнем и физическим уровнем, поэтому работа, выполняемая TCP, также основана на оптимизации и улучшении базового уровня.
Связь между клиентом и сервером использует прикладной протокол, связь на транспортном уровне использует протокол TCP, а протокол TCP использует более низкий уровень протокола IP, а IP использует некоторую форму связи на канальном уровне.
Мы знаем, что данные в сети в конечном итоге передаются через несколько соединений маршрутизатора. Протокол Ethernet нижнего уровня определяет, как электронные сигналы формируют пакеты данных, что решает проблему двухточечной связи в локальных сетях, но не может решить проблему взаимодействия между несколькими локальными сетями.
IP-протокол, используемый сетевым уровнем, определяет набор собственных адресных правил, в основном решающих функции адресации и маршрутизации, а также поиск наилучшего пути для передачи информации в соответствии с IP-адресом другой стороны. Локальная сеть подключается через маршрутизатор, а маршрутизатор основан на протоколе IP и направляет пакеты данных для пересылки на определенный интерфейс маршрутизации. Однако протокол IP не гарантирует точное поступление и целостность пакетов, особенно когда сеть перегружена, некоторые пакеты данных будут отбрасываться для обеспечения эффективности передачи данных.
А для обеспечения целостности, порядка и надежности пакетов данных именно это и собирается делать протокол TCP.
Три, TCP протокол
1, состав пакета TCP
Многие сети имеют максимальную единицу передачи, которая является ограничением, налагаемым сетью на канальном уровне на кадры данных.В качестве примера для Ethernet используется MTU 1500 байт. Дейтаграмма IP передается в сети Ethernet.Если ее длина больше значения MTU, она будет фрагментирована и передана, так что длина каждой дейтаграммы будет меньше значения MTU.
Другой пакет данных также содержит информацию о заголовке, в дополнение к собственному заголовку Tcp есть информация о заголовке IP и информация о заголовке Ethernet. Для пакета данных IP требуется не менее 20 байтов полезной нагрузки пакета данных Ethernet, поэтому полезная нагрузка пакета данных IP составляет не более 1480 байтов.
Итак, каков размер TCP-пакета?
Нам нужно определить значение MSS, которое является понятием в TCP (в поле опций заголовка). MSS — это максимальный сегмент данных, который может быть передан TCP-пакетом каждый раз.Когда длина TCP-сегмента больше, чем MSS, выполняется сегментная передача. Если не задано, значение MSS по умолчанию составляет 536 байт. То есть пакет tcp составляет около 500 байт.
2. Как обеспечить надежность
Как упоминалось выше, базовая маршрутизация и пересылка пакетов не гарантирует надежность и порядок пакетов.
Прежде всего, чтобы обеспечить целостность пакета, TCP будет выполнять обработку пакетов большего размера, чем MSS, на основе MSS.Размер MSS по умолчанию составляет 563 байта, что меньше, чем MUT, чтобы предотвратить фрагментацию на сетевом уровне.
Во-вторых, добавляются SEQ и ACK, а для обеспечения надежности пакета используется механизм повторной передачи в сверхурочное время.
1) ПОСЛЕДОВАТЕЛЬНОСТЬ
Для обеспечения упорядоченности TCP присваивает каждому пакету порядковый номер, или сокращенно SEQ. Чтобы принимающая сторона могла навести порядок. В случае потери пакета вы также можете узнать, какой пакет был потерян. Как правило, номер первого пакета является случайным числом, которое также может начинаться с 1.
2) ПОДТВЕРЖДЕНИЕ
Итак, есть номер, как убедиться, что посылка должна прийти?
Подтверждение на основе ACK. Для получателя каждый раз, когда пакет принимается, должно быть возвращено сообщение подтверждения, так что отправитель подтверждает, что пакет был доставлен. Кроме того, получатель должен проверять каждое сообщение. Если при проверке обнаружена ошибка, подтверждающее сообщение не будет отправлено, что приведет к повторной передаче отправителем через какое-то время.
ACK содержит следующую информацию:
Ожидайте получения номера следующего пакета next SEQ
Оставшаяся емкость окна приема приемника
Мы используем wiershark для захвата пакета oschina, чтобы увидеть данные следующего трехэтапного рукопожатия.
我的本机ip:192.168.1.103
oschinaIp:116.211.174.177
三次握手过程:
1.me->osChina:syn=1 seq=x ack=0
2.osChina->me:syn=1 seq=y ack=x+1
3.me->osChina:seq=x+1 ack=y+1
1. me->osChina:syn=1 seq=0 ack=0
2. osChina->me:syn=1 seq=0 ack=0+1
3. me->osChina:seq=0+1 ack=0+1
Сравните процесс трехстороннего рукопожатия.
3) Тайм-аут повторной передачи
Мы знаем, что сеть крайне нестабильна, даже при добавлении SEQ и ACK к пакетам данных порядок может быть гарантирован, но проблема потери пакетов или тайм-аута все равно гарантирована. Что делать, если отправитель отправляет данные или получатель отвечает сообщением ACK, которое теряется в сети или время ожидания истекло?
RTO , время ожидания повторной передачи. Должна быть оценка, чтобы узнать, истек ли пакет по тайм-ауту, а RTT — это мера времени приема-передачи для данного соединения. Из-за изменений в сетевом трафике это время изменится соответствующим образом, и TCP должен отслеживать эти изменения и динамически корректировать время ожидания RTO.
Если отправитель не получает ACK сообщения в течение определенного периода времени, он считает, что сообщение потеряно в сети, и автоматически повторно отправляет сообщение. Этот механизм называется повторной передачей по тайм-ауту.
В течение этого периода, если сообщение получателя потеряно и получатель не получит подтверждение, отправитель повторно отправит пакет получателю. Если отправитель получает информацию о подтверждении пакета после таймера тайм-аута из-за тайм-аута, и отправитель неоднократно отправлял сообщение, отправитель не будет его обрабатывать и напрямую отклонит подтверждение. Получатель снова ответит на сообщение подтверждения после его получения.
4. Управление потоком
Из вышеизложенного мы знаем, что протокол TCP может обеспечить надежность данных, но он также должен учитывать эффективность. Для того, чтобы принять во внимание эффективность, необходимо рассмотреть следующие три аспекта:
Поддержка пакетного распространения
Возможность поддержки управления перегрузкой в зависимости от состояния сети
Быть в состоянии понять статус принимающей стороны и предотвратить неспособность принимающей стороны обработать его.
На основании трех вышеуказанных требований выполняется следующая обработка.
1. Раздвижное окно
Если все пакеты в TCP должны быть отправлены с одним подтверждением, эффективность слишком низкая.Хотя один пакет отправляется и подтверждается за раз, хотя надежность гарантируется, его эффективность не может быть гарантирована. На этом этапе вам нужен способ отправки и подтверждения пакетами, что и делают скользящие окна.
Отправить скользящее окно:
Окно отправки перемещается слева направо. Данные перед этим окном отправки должны быть отправлены и подтверждены получателем. Данные, попадающие в окно отправки, — это данные, которые может отправить отправитель. Данные после окна отправки не могут быть отправлены , данные.
Если происходит тайм-аут или проигрыш. Тогда есть два решения:
1. Откат N, все пакеты передаются повторно после номера потерянного пакета 2. Выберите для повторной передачи ARQ, отправляйте только потерянные, избегайте дубликатов (высокая эффективность, предотвращение отправки дубликатов)
Другая функция скользящего окна — сообщить отправителю о статусе обработки получателя. Предполагая, что буфер TCP-приемника заполнен и не может больше обрабатывать, а отправитель об этом не знает, он каждый раз будет информировать другую сторону о размере текущего скользящего окна, и отправитель больше не будет отправлять данные в этот раз.
Получатель также отправляет подтверждение сразу после получения данных, но в то же время объявляет отправителю, что размер окна равен 0. Таким образом, отправитель какое-то время не будет отправлять данные.
Подтверждение не отправляется сразу после поступления сообщения, пока в буфере не будет достаточно места. Это позволяет избежать сдвига окна отправителем. Однако есть и проблема: получатель не должен задерживать отправку подтверждения более чем на время ожидания, иначе отправитель ошибочно подумает, что данные потеряны, и отправит данные повторно.
2. Контроль перегрузки
Мы знаем, что у сетевых условий есть плохие друзья. В хорошие времена мы можем отправлять больше пакетов. В плохие времена, если скорость отправки пакетов останется прежней, в дополнение к увеличению нагрузки на сеть, это также приведет к чрезмерной потере пакетов, если больше происходят тайм-ауты, повторная передача, что, несомненно, снижает эффективность связи.
Исходя из этого, обе стороны TCP-соединения поддерживают значение, называемое окном перегрузки (cwnd, окно перегрузки), которое зависит от скорости перегрузки в сети, а значение окна отправки отправителя равно размеру окна перегрузки. Пока в сети нет перегрузки, значение окна перегрузки можно увеличить, чтобы отправитель мог отправить в сеть больше данных. Наоборот, значение окна перегрузки уменьшается, чтобы избежать увеличения скорости перегрузки сети.
В настоящее время существует четыре основных алгоритма управления перегрузкой в TCP:
медленный старт
предотвращение перегрузки
быстрая ретрансляция
быстрое восстановление
Конкретный метод реализации алгоритма представлен не будет.Функция реализации состоит в том, чтобы найти подходящую скорость передачи на основе текущих условий сети, чтобы предотвратить чрезмерную нагрузку на сеть. Например, медленный старт означает, что в начале скорость передачи медленнее, а затем скорость регулируется в зависимости от ситуации потери пакетов: если нет потерь пакетов, скорость передачи увеличивается, если пакеты потеряны, скорость передачи увеличивается. скорость передачи снижается.
5. Состояние TCP
Любой, кто знаком с TCP, знает, что когда TCP устанавливает соединение, происходит три рукопожатия, а когда соединение разрывается, происходит четыре рукопожатия. Так что же такое штаты?
Изображение выше выглядит слишком запутанным, чтобы его можно было запомнить, давайте взглянем на следующее изображение, чтобы разобраться в конкретном статусе приложения.
Как видно из вышеизложенного, при успешном установлении соединения его статус УСТАНОВЛЕНО. Когда принимающая сторона находится в состоянии SYN-RECV, это означает, что принимающая сторона ответила на информацию о втором рукопожатии, ожидая повторного подтверждения отправляющей стороной. Если сеть подвергается большому количеству SYN-атак, будет большое количество состояний SYN_RECV. В настоящее время эти проблемные IP-адреса могут быть обнаружены, и большое количество проблем с ложным подключением может быть решено с помощью фильтрации брандмауэра.
6. Пропадающее соединение - TIME_WAIT
В сети, если какой-то конец активно закрывается без прохождения четырехэтапного рукопожатия, остается ли канал, установленный tcp, и как долго он будет закрыт? Состояние TCP в это время — TIME_WAIT. Вполне возможно, что такая ситуация часто возникает в реальности. Большинство закрытых соединений активно закрываются, а не закрываются посредством согласованной связи. Затем закройте его в это время, если вы можете переподключиться к предыдущему каналу tcp, вам все равно нужно его пересоздать.
Любая реализация TCP ДОЛЖНА выбрать значение MSL, которое по умолчанию равно 2 минутам или 30 секундам, а TIME_WAIT по умолчанию равно 2-кратному MSL для продолжительности от 1 до 4 минут. MSL — это максимальное время, в течение которого IP-пакет может сохраняться в сети.
TIME_WAIT существует по двум причинам: 1. Надежно реализовать завершение полнодуплексных TCP-соединений 2. Разрешить исчезновение старых повторяющихся разделов в сети
TCP должен предотвращать повторное появление старых дубликатов пакетов соединения после разрыва соединения, что может быть неправильно истолковано как воплощения, принадлежащие одному и тому же соединению, с достаточно длительным time_wait, в 2 раза превышающим MSL, что достаточно для пропуска пакетов в определенном направлении Не более чем оставшийся MSL секунд отбрасывается.
От состояния TIME_WAIT до состояния CLOSED существует настройка времени ожидания.Это значение времени ожидания равно 2*MSL (RFC793 определяет MSL как 2 минуты, а в Linux установлено значение 30 с).Если это время превышено, текущий канал tcp будет отключен. определяется как замыкание.
Для получения дополнительных знаний об архитектуре, пожалуйста, обратите внимание на мой публичный аккаунт, большой код ожидания (cool_wier)