GO интервью пожинать памятку

интервью
GO интервью пожинать памятку

Документ долгое время находился в аварийном состоянии, и некоторые части его содержания могут быть неточными. Пожалуйста, прочтите и берегите его.

Небольшое заводское интервью, запишите, ответ неверный, помогите исправить

идти часть

Сопоставьте базовую реализацию

Нижний слой карты реализован через хеш-таблицу

Подробнее о карте:Перейдите экспертами по программированию

Разница между срезом и массивом

array — это массив фиксированной длины, длина массива должна быть определена перед использованием

особенности массива:

  • Массив go является типом значения, то есть массив присваивается другому массиву, тогда он фактически является копией реального массива, и для его хранения требуется дополнительное пространство памяти.
  • Если массив в go используется в качестве параметра функции, то фактически передаваемый параметр является копией массива, а не указателем на массив.
  • Длина массива также является частью типа, что означает, что [10] int и [20] int различны

Особенности среза:

  • slice — это ссылочный тип, динамический указатель на срез массива.
  • Срез — это структура данных переменной длины, которая всегда указывает на базовый массив массивов.

разница:

  • При объявлении: массиву необходимо объявить длину или...
  • При использовании в качестве параметра функции: array передает копию массива, slice передает указатель

В чем разница между использованием структуры и ООП

Пожалуйста, внимательно прочитайте статью, аналогия с точки зрения ООП, а не с точки зрения ООП.

Прежде всего, характеристики ООП:继承、封装、多态

Многие люди в комментариях говорят такие вещи, как комбинации;

наследовать

Концепция: процесс, посредством которого объект получает свойства другого объекта.

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

упаковка

Концепция: автономный черный ящик с частной и общедоступной частями, доступ к общедоступной части возможен, доступ к частной внешней части недоступен.

  • Контроль доступа в Java контролируется ключевыми словами public, protected, private, default.
  • Go обеспечивает управление разрешениями посредством соглашения. Первые буквы имени переменной, эквивалентные общедоступным, первые буквы, эквивалентные частным. Доступ к тому же пакету, эквивалентному стандартному. Поскольку в Go нет наследования, нет и защищенного

полиморфизм

Концепция: функция, позволяющая интерфейсу получать доступ к одному и тому же классу действий.

  • Полиморфизм в java осуществляется черезextends classилиimplements interfaceвыполнить
  • интерфейс в проходе合约Пока структура реализует все методы интерфейса, она неявно реализует интерфейс.

Расскажите о своем понимании канала

Канал — это механизм связи, который позволяет одной горутине отправлять через него информацию о значениях другой горутине. Каждый канал имеет специальный тип, который является типом данных, которые может отправлять канал.

В каком состоянии канал

Канал имеет три состояния:

  1. nil, неинициализированное состояние, только объявленное или присвоенное вручную значение nil
  2. активный, нормальный канал, доступный для чтения и записи
  3. закрытый, закрытый

Каналы могут выполнять три операции:

  1. читать
  2. Писать
  3. закрытие

Эти три действия и состояния можно объединить в девять ситуаций:

действовать нулевой канал нормальный канал канал закрыт
блокировать успех или блокировка прочитать нулевое значение
ch блокировать успех или блокировка panic
закрыть (ч) (закрыть) panic успех panic

Как карта обеспечивает безопасность потоков в параллельном состоянии

Параллельный доступ к карте Go небезопасен, произойдет неопределенное поведение, что приведет к выходу программы.

До go1.6 встроенный тип карты был частично безопасен для горутин, и не было проблем с параллельным чтением, но могли быть проблемы с параллельной записью. После go1.6 одновременная карта чтения и записи будет сообщать об ошибке.

Сравните с JavaConcurrentHashMapРеализация карты, когда данные карты очень велики, блокировка заставит больших одновременных клиентов конкурировать за блокировку, решение Javashard, несколько блокировок используются внутри, и каждый интервал использует общую блокировку, что снижает влияние на производительность данных, совместно использующих блокировку.

До go1.9 вообще прошелsync.RWMutexРеализуйте одновременный контроль доступа к карте или используйте только блокировки.

После go1.9 понялsync.Map, аналогично JavaConcurrentHashMap.

sync.MapВнедрение имеет несколько точек оптимизации:

  1. пространство для времени. Благодаря избыточности двух структур данных (READ, DIRTY) блокировка влияет на производительность.
  2. Используйте данные только для чтения (чтение), чтобы избежать конфликтов чтения и записи.
  3. Динамическая настройка, после большего количества промахов грязные данные будут обновлены для чтения
  4. double-checking
  5. Отложить удаление. Удаление значения ключа только помечается, а удаленные данные очищаются только при поднятии грязного
  6. Читайте, обновляйте, удаляйте из чтения в первую очередь, потому что чтение при чтении не требует блокировки

Расскажите о своем понимании gc

управление памятью

Проще говоря, управление памятью, реализованное в go, заключается в поддержании большого объема глобальной памяти.Каждый поток (P in go) поддерживает небольшую частную память.Если частной памяти недостаточно, она будет применяться глобально.

  • Когда программа go запускается, она обращается к большой памяти и делит ее на промежутки, растровые изображения и области арен.
  • Площадь области разделена на небольшие блоки по страницам
  • span управляет одной или несколькими страницами
  • mcentral управляет несколькими промежутками для потокового приложения
  • Как частный ресурс потока, mcache исходит от mcentral.

Дополнительные инструкции см. в примечаниях к цитированию.1

вывоз мусора

Распространенные алгоритмы сборки мусора:

  • Счетчик ссылок: счетчик ссылок поддерживается для каждого объекта.Когда объект, ссылающийся на объект, уничтожается, счетчик ссылок уменьшается на единицу, и объект перерабатывается, когда счетчик ссылок достигает 0.
    • Преимущества: Объекты могут быть возвращены очень быстро, без исчерпания памяти или достижения определенного порога.
    • Недостатки: он не очень хорошо справляется с циклическими ссылками, а поддержание подсчета ссылок в реальном времени также требует определенных затрат.
    • Представительные языки: Python, PHP, Swift
  • Mark-Clear: пройти все объекты, на которые есть ссылки, из корневой переменной, объекты, на которые есть ссылки, помечаются как «ссылочные», а те, которые не отмечены, перерабатываются.
    • Плюсы: устраняет недостатки подсчета ссылок.
    • Недостатки: требуется STW (Stop The World), то есть остановить все горутины, сконцентрироваться на сборке мусора и возобновить горутины после завершения сборки мусора, что приводит к приостановке работы программы на короткое время.
    • Репрезентативный язык: Go (трехцветное обозначение)
  • Коллекция поколений: разделите различные пространства поколений в соответствии с продолжительностью жизненного цикла объекта.Длинный жизненный цикл помещается в старое поколение, а короткий - в новое поколение.Разные поколения имеют разные алгоритмы и частоту повторного использования.
    • Достоинства: хорошая производительность по переработке
    • Недостаток: сложный алгоритм восстановления
    • Представительный язык: Java
Трехцветная нотация для сборки мусора Go

Метод трехцветной записи — это просто абстрактная формулировка для удобства описания, на самом деле цветового различия между объектами нет. Три цвета здесь соответствуют трем состояниям объекта во время сборки мусора:

  • Серый: объект все еще находится в очереди на маркировку.
  • Черный: объект помечен, и бит, соответствующий gcmarkBits, равен 1 (объект не будет очищен в этом сборщике мусора)
  • Белый: объект не помечен, бит, соответствующий gcmarkBits, равен 0 (объект будет очищен в этом сборщике мусора)

Оптимизация сборки мусора2

Барьер записи

Как упоминалось ранее, целью STW является предотвращение изменения памяти во время сканирования сборщика мусора и остановка горутины, а барьер записи — это средство, позволяющее запускать горутину и сборщик мусора одновременно. Хотя барьеры записи не могут полностью устранить STW, они могут значительно сократить время STW.

Барьер записи похож на переключатель, который включается в определенное время GC.После включения указатель будет помечен при прохождении указателя, то есть этот раунд не будет переработан, а будет определен на следующем ГК.

Вновь выделенная память в процессе GC будет помечена сразу, и технология барьера записи не используется, то есть память, выделенная в процессе GC, не будет высвобождена в этом раунде GC.

Вспомогательный сборщик мусора (вспомогательный мутатор)

Чтобы выделение памяти не было слишком быстрым, в процессе выполнения GC, если горутине нужно выделить память, то горутина будет участвовать в части работы GC, то есть помогать GC выполнять часть работы , этот механизм называется Mutator Assist.

Время триггера сборки мусора3

Объем выделенной памяти достигает порога и запускает GC

Каждый раз при выделении памяти он будет проверять, достигло ли текущее выделение памяти порогового значения, и если оно достигает порогового значения, GC будет запущен немедленно.

阈值 = 上次GC内存分配量 * 内存增长率

Скорость роста памяти определяется переменной средыGOGCControl, по умолчанию 100, то есть GC запускается каждый раз при удвоении памяти.

Периодически запускать GC

По умолчанию GC запускается максимум каждые 2 минуты, а интервалsrc/runtime/proc.go:forcegcperiodобъявляется переменная:

// forcegcperiod is the maximum time in nanoseconds between garbage
// collections. If we go this long without a garbage collection, one
// is forced to run.
//
// This is a variable for testing purposes. It normally doesn't change.
var forcegcperiod int64 = 2 * 60 * 1e9
Ручной триггер

также может использоваться в программном кодеruntime.GC()Ручной запуск GC в основном используется для тестирования производительности GC и сбора статистики.

Оптимизация производительности GC

Производительность сборщика мусора отрицательно связана с количеством объектов: чем больше объектов, тем хуже производительность сборщика мусора и тем больше влияние на программу.

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

Кроме того, посколькуфеномен побега из памяти, также будут происходить некоторые неявные выделения памяти, которые также могут стать бременем для GC.

феномен побега из памяти3.1: переменная, размещенная в стеке, должна иметь возможность определять свою область видимости в компиляторе, иначе она будет размещена в куче. А динамически выделяемая память в куче намного дороже, чем статически выделяемая память в стеке.

проходить черезgo build -gcflags=mкоманда для наблюдения за экранированием переменных4

Еще сценарии побега:сцена побега

Роль анализа побега:

  1. Преимущества Escape Analysis - снижение давления GC, а не избежать объекта, выделенного на стеке, когда функция возвращается к переработке ресурсов, без четкой маркировки GC.
  2. После escape-анализа можно определить, какие переменные можно размещать в стеке.Выделение стека происходит быстрее, чем в куче, и производительность лучше (экранированные локальные переменные будут размещены в куче, а те которые не убегают, будут размещены в стеке компилятором)
  3. Устранение синхронизации.Если определяемый вами объект имеет блокировку синхронизации для метода, но только один поток обращается к нему во время выполнения, машинный код после анализа побега будет выполняться без блокировки синхронизации.

резюме побега

  • Выделение памяти в стеке более эффективно, чем выделение памяти в куче
  • Память, выделенная в стеке, не требует обработки GC
  • После того, как память, выделенная в куче, будет использована, она будет передана сборщику мусора для обработки.
  • Цель escape-анализа состоит в том, чтобы решить, выделяется ли память в кучу или в стек.
  • Анализ побега выполняется на этапе компиляции

В чем разница между передачей ссылки на метод go и python, java

Справочная документация:Сведения о передаче параметров go

Передача параметров функций в go использует передачу значений

gin

Расскажите о своем понимании джина

Gin — это микрофреймворк Go с элегантной инкапсуляцией и дружественным API. Быстрый и гибкий. Отказоустойчивость и удобство.

На самом деле для go зависимость от веб-фреймворков намного меньше, чем у Python и Java. себяnet/httpДостаточно просто, да и производительность тоже очень хорошая, большинство фреймворков правильныеnet/httpэлитная упаковка. Так что фреймворк gin больше похож на набор общих функций или инструментов. Использование среды gin для разработки может повысить эффективность и согласовать стиль кодирования команды.

Почему компонент маршрутизации джина обладает высокой производительностью

дерево маршрутизации

gin использует высокопроизводительную библиотеку маршрутизацииhttprouter5

В среде Gin правила маршрутизации разделены на 9 классов деревьев префиксов, каждый метод HTTP соответствует дереву префиксов, а узлы дерева иерархически разделены в соответствии с символом / в URL-адресе.

gin.RouterGroup

Упаковка RouterGroup для дерева маршрутизации все правила маршрутизации в конечном итоге управляются им. Структура двигателя унаследована RouterGerGroup, поэтому имеет прямую маршрутизацию двигателя RouterGerGroup из всех функций управления.

привязка данных джина

Gin предоставляет очень удобную функцию привязки данных, которая может автоматически привязывать параметры, переданные пользователем, к определяемой нами структуре.

Это также важная причина, по которой я выбираю джин.

проверка данных джина

На основе приведенной выше привязки данных gin также предоставляет метод проверки данных. проверка данных gin сочетается с привязкой данных. Просто добавьте его в тег переменной-члена структуры с привязкой к данным.bindingПравила сделают. Это экономит много времени на проверку и является идеальной альтернативой для программистов, привыкших к AspCoreMVC и Spring MVC.

джин промежуточное ПО

Промежуточное ПО gin использует стек вызовов функций.后进先出Характеристикой промежуточного программного обеспечения является завершение операции обработки промежуточного программного обеспечения после завершения пользовательской функции обработки.

redis

Почему у Redis высокая производительность

  • Чистая работа с памятью, скорость чтения и записи памяти очень высока.
  • один поток6, чтобы избежать ненужного переключения контекста и условий конкуренции, а также нет потребления ресурсов ЦП из-за переключения, вызванного многопроцессорностью или многопоточностью.Нет необходимости рассматривать различные проблемы блокировки, и нет операции блокировки и снятия блокировки, потому что тупика нет.
  • Эффективная структура данных, структура данных Redis специально разработана
  • Используйте модель мультиплексирования нескольких вводов-выводов, неблокирующий ввод-вывод
  • Используются разные базовые модели, и базовые методы реализации и протоколы приложений для связи с клиентами разные.Redis напрямую строит свой механизм ВМ, потому что если общая система вызывает системные функции, то на перемещение и запрос потребуется определенное время ;

Почему Redis использует один поток

Официальный ответ: Поскольку Redis — это операция, основанная на памяти, ЦП не является узким местом Redis. Узким местом Redis, скорее всего, является объем памяти или пропускная способность сети машины. Так как однопоточность легко реализовать и ЦП не станет узким местом, логично принять однопоточное решение.

Модель мультиплексирования множественного ввода-вывода, неблокирующий ввод-вывод

Выберите, опрос и эполл под Linux делают это. Наиболее продвинутый в настоящее время является Epoll. Зарегистрируйте FD, соответствующую пользователю сокет в EPOLL, а затем Epoll может помочь вам отслеживать приход сообщений на те розетки, что позволяет избежать многих бесполезных операций. В это время сокет принимает режим безблокировки. Таким образом, этот процесс будет блокировать только при вызове EPOLL, а отправка и приема клиентских сообщений не будут блокировать, а весь процесс или нить будут полностью использованы, что является управляемым событием.

5 часто используемых структур данных

  • Строка: кеш, счетчик, распределенная блокировка и т. д.
  • Список: связанный список, очередь, временная шкала, список подписчиков Weibo и т. д.
  • Хэш: информация о пользователе, хеш-таблица и т. д.
  • Установить: дедупликация, лайки, общие друзья и т.д.
  • ZSET: Рейтинг посещений, Рейтинг щелчков и т. Д.

Как обеспечить надежность Redis в качестве очереди сообщений

Ссылаясь на механизм ACK RabbitMQ, потребитель предоставляет обратную связь о потреблении.

RabbitMQ

image-20200511112528827

Как RabbitMQ гарантирует надежность сообщений

производственная сторона

Есть два варианта:Сообщение о транзакции, подтверждение сообщения

Сообщения о транзакциях будут серьезно истощать производительность RabbitMQ, поэтому они в основном не используются. Поэтому метод асинхронного подтверждения сообщения обычно используется для обеспечения того, чтобы отправленное сообщение прибыло в RabbitMQ.

потребитель

Подтверждение сообщения (ACK), когда Клиент используетautoAck=trueПри подписке на сообщение узла RabbitMQ в пути это может быть связано с сетевыми причинами или из-за исключения, когда Заказчик обрабатывает сообщение, или сервер не работает, и сообщение может быть потеряно.

и когдаautoAck=trueКогда сообщение отправлено, RabbitMQ автоматически установит исходящее сообщение как подтверждение, а затем удалит его из памяти (или с диска), независимо от того, потребляет ли потребитель эти сообщения на самом деле.

Чтобы избежать потери сообщений в этом случае, RabbitMQ предоставляет возможность потребителю подтвердить обработку сообщений, поэтому необходимо установитьautoAck=false

сам MQ

Выше приведены гарантии надежности сообщения на уровне приложения.Хотя безопасность приложения была значительно улучшена, при перезапуске или выходе из строя узла RabbitMQ сообщение все равно будет потеряно, поэтому необходимо установить постоянство очереди . Постоянство сообщения гарантирует, что сообщение может быть восстановлено после того, как узел выйдет из строя или перезапустится.

Если есть одна проблема, сообщение все равно будет потеряно. Поэтому для ключевых сообщений можно настроить зеркальные очереди и кластеры, чтобы обеспечить высокую доступность служб сообщений.

MongoDB

MongoDB — это универсальная документно-ориентированная распределенная база данных.

Структура данных индекса MongoDB

Движок MongoDB по умолчаниюWiredTigerиспользоватьB树В качестве базовой структуры данных индекса, в дополнение к B-дереву, LSM-дерево также поддерживается в качестве дополнительной базовой структуры хранения данных.

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

Почему MongoDB по умолчанию выбирает B-дерево вместо дерева B+ по умолчанию MySQL

Первый сценарий приложения:

  • Поскольку MongoDB является нереляционной базой данных, требования к обходу данных не такие строгие, как требования к реляционным базам данных: она преследует производительность при чтении и записи одной записи.
  • Большинство баз данных сталкиваются со сценарием большего чтения и меньшей записи, и B-дерево и LSM-дерево имеют большие преимущества в этом сценарии.

Дерево B+, используемое в MySQL, связано с тем, что только листовые узлы дерева B+ будут хранить данные, а обход порядка может быть достигнут путем соединения каждого листового узла вида дерева через указатель, а обход базы данных очень распространен в реляционных базах данных. .

Конечная цель выбора между несколькими различными структурами данных между MongoDB и MySQL состоит в том, чтобы уменьшить количество случайных iOS, необходимых для запросов. Mysql считает, что запросы, которые требуют траверсных данных, поэтому он выбирает B + деревьев в качестве основной структуры данных. MongoDB считает, что запрос одной записи данных гораздо чаще, чем прохождение данных. Поскольку у узлов Non листа B-дерева также могут хранить данные, такСреднее количество случайных iOS, необходимых для запроса элемента данных, будет меньше, чем у дерева B +, скорость запросов MongoDB с использованием B-дерева будет выше, чем у MySQL в аналогичных сценариях. Это не означает, что MongoDB не может просматривать данные Мы также можем использовать диапазонные запросы в MongoDB для запроса пакета записей, соответствующих соответствующим условиям, но это займет больше времени, чем MySQL.

Будучи нереляционной базой данных, MongoDB использует совершенно другой подход к проектированию коллекций.Если мы по-прежнему будем использовать идеи проектирования таблиц традиционных реляционных баз данных для проектирования коллекций в MongoDB, письменный запрос может привести к относительно низкой производительности.

Рекомендуемый подход к проектированию в MongoDB заключается в использовании встроенных документов.7.

Что такое индексы MongoDB и в чем отличия

MongoDB поддерживает несколько типов индексов, включая индексы с одним полем, составные индексы, индексы с несколькими ключами, текстовые индексы и т. д. Каждый тип индекса имеет разные сценарии использования.

  • **Индекс одного поля:** может ускорить выполнение различных запросов к указанному полю. Это наиболее распространенная форма индекса. Индекс идентификатора, создаваемый MongoDB по умолчанию, также относится к этому типу.
  • **Составной индекс:** – это обновленная версия индекса с одним полем. Он создает индекс для нескольких полей совместно, сортирует по первому полю, сортирует документы с одинаковым первым полем по второму полю и т. д.
  • **Многоключевой индекс.** Когда индексируемое поле является массивом, созданный индекс называется многоключевым индексом, а многоключевой индекс создает индекс для каждого элемента массива.
  • **Хэш-индекс:** относится к созданию индекса в соответствии с хеш-значением поля. В настоящее время он в основном используется дляMongoDB Sharded ClusterРазбиение хэшей, хеш-индекс могут удовлетворять запросы только с точно совпадающими полями, но не могут удовлетворять запросы диапазона и т. д.
  • **Указатель местоположения:** Он может хорошо решать сценарии приложений O2O, такие как «найти еду поблизости», «найти станцию ​​в определенном районе» и так далее.
  • ** Текстовый индекс: ** может удовлетворить потребности быстрого текстового поиска, например, набор сообщений в блоге, вам нужно быстро найти содержимое блога, вы можете создать текстовый индекс для содержимого блога.

Nginx

Документация:woohoo.ossa book.org/en/nginx.contract…

img

Цитирование статей8

Почему Nginx обладает высокой производительностью

Работающий процесс Nginx

  1. Многопроцессность: один главный процесс, несколько рабочих процессов
  2. Основной процесс: управление рабочими процессами
  3. Внешний интерфейс: прием внешних операций (сигналов)
  4. Внутренняя переадресация: управляйте рабочими с помощью сигналов в соответствии с внешними операциями.
  5. Мониторинг: отслеживание текущего состояния рабочего процесса и автоматический перезапуск рабочего процесса после аварийного завершения рабочего процесса.
  6. Рабочие процессы: все рабочие процессы равны
  7. Фактическая обработка: сетевые запросы, обрабатываемые рабочим процессом;
  8. Количество рабочих процессов: настраивается в nginx.conf, обычно устанавливается на количество ядер, чтобы полностью использовать ресурсы ЦП и в то же время избегать слишком большого количества процессов, избегать процессов, конкурирующих за ресурсы ЦП, и увеличивать потери. переключения контекста.

Установление HTTP-соединения и обработка запросов

  • Когда Nginx запускается, главный процесс загружает файл конфигурации
  • Мастер-процесс, инициализируйте прослушивающий сокет
  • Мастер-процесс, разветвление нескольких рабочих процессов
  • Процесс Worker соревнуется за новые подключения, победившая сторона устанавливает Socket-соединение посредством трехэтапного рукопожатия и обрабатывает запрос.

TCP/UDP

TCP

Трехстороннее рукопожатие TCP

image-20200511141254856

Картинка взята из "Иллюстрированного HTTP"

image-20200511142015251

  • Клиент - Отправить пакет с флагом SYN - Одно рукопожатие - Сервер
    • Первое рукопожатие: Клиент ничего не может подтвердить; Сервер подтверждает, что другая сторона нормально отправляет и нормально получает
  • Сервер — отправка пакетов с флагом SYN/ACK — двустороннее рукопожатие — клиент
    • Второе рукопожатие: клиент подтверждает: он отправляет и получает нормально, другая сторона отправляет и получает нормально; сервер подтверждает; другая сторона отправляет и получает нормально
  • Клиент — отправить пакет с флагом ACK — трехстороннее рукопожатие — сервер
    • Третье рукопожатие: Клиент подтверждает: отправляет и принимает нормально, другая сторона отправляет и получает нормально; Сервер подтверждает: отправляет и получает нормально, другая сторона отправляет и принимает нормально

Поэтому требуется три рукопожатия, чтобы подтвердить, что обе стороны имеют нормальные функции отправки и получения.

Tcp помахал четыре раза

image-20200511142037378

Для отключения TCP-соединения требуются «четыре волны»:

  • Клиент — отправляет FIN, чтобы закрыть передачу данных между клиентом и сервером.
  • Сервер — получает этот FIN, отправляет обратно ACK, подтверждая, что порядковый номер равен полученному порядковому номеру плюс 1. Как и SYN, FIN будет занимать порядковый номер
  • Сервер - закрывает соединение с клиентом, отправляет клиенту FIN
  • Клиент - отправьте обратно подтверждение сообщения ACK и установите порядковый номер подтверждения равным полученному порядковому номеру плюс 1.

Любая сторона может отправить уведомление об освобождении соединения после окончания передачи данных, ожидая подтверждения другой стороны или переходя в полузакрытое состояние.

Когда у другой стороны нет данных для повторной отправки, выдается уведомление об освобождении соединения, и TCP-соединение полностью закрывается после подтверждения другой стороной.

UDP

UDP не нужно устанавливать соединение перед передачей данных, а удаленному хосту не нужно давать никаких подтверждений после получения UDP-пакета. Хотя UDP не обеспечивает надежную доставку, в некоторых случаях UDP является наиболее эффективным способом работы (обычно используется для мгновенного общения, например: язык QQ, видео QQ, прямая трансляция и т. д.).

Длинное соединение / короткое соединение9

В самом TCP нет разницы между длинными и короткими соединениями, длинный он или нет, зависит от того, как мы его используем.

  • **Короткое соединение: **Для каждой связи создайте сокет, когда связь закончится, вызовитеsocket.close(), что является короткой связью в общем смысле.
    • Преимущество короткого соединения в том, что им проще управлять, а существующие соединения — это все доступные соединения, и не требуется никаких дополнительных средств управления.
  • **Длительное соединение:** После завершения каждого сеанса связи соединение не будет закрыто, поэтому его можно будет использовать повторно.
    • Преимущество длинного соединения в том, что оно экономит время на создание соединения и имеет хорошую производительность.

  1. радужное манго.git book.IO/go/chapter0…
  2. радужное манго.git book.IO/go/chapter0…
  3. радужное манго.git book.IO/go/chapter0…
  4. Подробный анализ побега из памяти
  5. Перейти к анализу выхода из памяти
  6. httprouter
  7. Один поток Redis означает, что модуль сетевых запросов использует один поток, то есть один поток обрабатывает все сетевые запросы, а другие модули по-прежнему используют несколько потоков.
  8. Почему MongoDB использует B-деревья
  9. сегмент fault.com/ah/119000002…
  10. www.cnkirito.moe/tcp-talk/