Сеть: TCP/IP для интервью с другом, вернитесь и дождитесь уведомления

задняя часть
Сеть: TCP/IP для интервью с другом, вернитесь и дождитесь уведомления

предисловие

Недавно болтая с одноклассником, он хотел сменить работу, а потом пошел на встречу большому заводу. В то время он написал в своем резюме, что хорошо разбирается в TCP/IP, и он написал слово «опытный», потому что он немного разбирался в протоколе TCP, и интервьюер не стал задавать вопросы. Я не ожидал этого, неосторожный

Следите за официальной учетной записью, общайтесь друг с другом и ищите в WeChat: Sneak forward

открытие

Мой друг записался на собеседование в 10:30, приехал на 10 минут раньше, а потом тихонько сидел на диване и ждал, вспоминая материалы, которые я читал раньше. Было уже почти половина одиннадцатого, когда высокий и худощавый мужчина в клетчатой ​​рубашке толкнул дверь и сказал: «Здравствуйте, начнем интервью!» Друг вежливо улыбнулся и ответил «ОК».

Интервьюер: Согласно вашему резюме, вы хорошо разбираетесь в TCP и IP, тогда давайте обсудим сетевую модель и протоколы TCP и IP.Давайте сначала поговорим о вашем понимании.

  • Друзья (Почему вы спрашиваете ПТС, как только подходите, в карты по рутине не играете, не стоит ли спрашивать про основы java? А обычные вопросы, я ок)

  • Друзья: Сетевая модель обычно делится на семь уровней: прикладной уровень, уровень представления, сеансовый уровень, транспортный уровень, сетевой уровень, уровень канала передачи данных и физический уровень. К протоколам прикладного уровня относятся HTTP, FTP и SMTP, при этом TCP относится к транспортному уровню, а протокол IP относится к сетевому уровню.
  • Друг: Уровни сетевой модели TCP/IP идут сверху вниз, и они упакованы слой за слоем.Каждый уровень соответствует разному анализу протокола.Позвольте мне нарисовать картину.

Интервьюер: Глядя на картинку, которую вы нарисовали, TCP имеет свою структуру заголовка, какие там поля, лучше рассказать об их функциях.

  • Друзья (какого черта! Когда я был в Baidu Dictionary, как я это запомнил? Подождите, кажется, я видел это прошлой ночью, у меня есть впечатление)

  • Друг: Продолжай рисовать картинку, будь более интуитивным

  • Друг: Структура заголовка TCP представляет собой первый 16-битный номер исходного порта и номер порта назначения, за которыми следуют 32-битный порядковый номер и номер подтверждения. Далее идет заголовок длиной 4 бита, зарезервированные биты 6 бит и флаговые биты 6 бит.
  • Друг: 16-битные атрибуты включают размер окна (управление окном отправки), контрольную сумму (проверка того, не был ли изменен сегмент данных) и аварийный указатель. Наконец есть варианты, длина которых определяется длиной головы
  • Друг: Давайте поговорим о порядковом номере подробнее.Это числовой номер TCP-сегмента.Чтобы обеспечить надежное TCP-соединение, каждый отправляемый сегмент данных должен быть дополнен порядковым номером. Когда соединение установлено, оба конца случайным образом генерируют начальный порядковый номер. Номер подтверждения используется вместе с порядковым номером.При ответе на запрос возвращается номер подтверждения, значение которого равно порядковому номеру запроса другой стороны плюс 1.
  • Друг: 6 бит флага: URG: это экстренное сообщение, ACK: ответное сообщение, PSH: буфер не заполнен, RST: сброс соединения, SYN: флаг сообщения об установлении соединения, FIN: уведомление о закрытии соединения сообщение
  • Друг: Размер окна — это размер скользящего окна, используемого получателем для управления отправителем.

Интервьюер: В чем разница между TCP и UDP?

  • друг (с облегчением)
  • Друзья: 1) Аспект соединения: TCP ориентирован на соединение. UDP не требует установления соединения и не требует установления соединения перед отправкой данных.
  • Друзья: 2) С точки зрения безопасности: TCP предоставляет надежные услуги, чтобы гарантировать, что передаваемые данные безошибочны, не потеряны, не повторяются и поступают по порядку. UDP — это доставка с максимальной эффективностью, которая не гарантирует надежной доставки.
  • Друзья: 3) Эффективность передачи: эффективность передачи TCP относительно низкая, эффективность передачи UDP высока.

Интервьюер: Вы только что сказали, что TCP — это надежное соединение, как оно реализовано?

  • Друг: TCP-соединение основано на трехстороннем рукопожатии, а отключение основано на четырех взмахах рук.
  • Друзья: Чтобы гарантировать, что данные не будут потеряны и не возникнут ошибки (надежность), он имеет проверку сообщения, ответ ACK, повторную передачу тайм-аута (отправитель), повторную передачу данных не по порядку (получатель), отбрасывание дубликатов данных, управление потоком (скользящее window)) и такие механизмы, как управление перегрузкой

Интервьюер: В частности, поговорим о трехстороннем рукопожатии и четырехстороннем волновом механизме.

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

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

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

Интервьюер: В чем была бы проблема без трехстороннего рукопожатия?

  • Друзья: если есть только два рукопожатия, клиент не будет ACK SYN сервера после отправки запроса на соединение.
  • Друзья: в это время, если клиент решит, что установление соединения не удалось по его собственным причинам, он может повторить установление TCP-соединения, но сервер будет думать, что TCP, отброшенный клиентом, все еще действителен, что приведет к потере Ресурсы.

Интервьюер: В чем разница между TIME_WAIT и CLOSE_WAIT?

  • Друзья: CLOSE_WAIT формируется путем пассивного закрытия; когда другая сторона закрывает сокет и отправляет сообщение FIN, он переходит в состояние CLOSE_WAIT после ответа на ACK. Затем проверьте, есть ли непереданные данные, если нет, инициируйте третью волну, отправьте сообщение FIN другой стороне, войдите в состояние LAST_ACK и дождитесь прибытия сообщения ACK другой стороны.
  • Друзья: TIME_WAIT формируется путем активного закрытия соединения; когда он находится в состоянии FIN_WAIT_2, он переходит в состояние TIME_WAIT после получения сообщения FIN от другой стороны; затем ожидание двух MSL (Максимальное время жизни сегмента: максимальное время существования сообщения)

Интервьюер: Какова роль TIME_WAIT и почему время состояния должно поддерживать два MSL?

  • друг
  • Друзья: 1) Функция TIME_WAIT состоит в том, чтобы гарантировать, что сообщение ACK последней волны может быть доставлено другой стороне.Если ACK будет потерян, другая сторона повторно передаст FIN с течением времени, и активный закрывающий конец ответит снова к ACK; если нет состояния TIME_WAIT, закрыть его напрямую, сообщение FIN, повторно переданное другой стороной, отвечает сообщением RST, и этот RST пассивно закроет конец и будет проанализирован как ошибка
  • Друг: 2) Есть два соединения, первое соединение закрывается нормально, а второе такое же соединение устанавливается сразу, если придёт бродячее сообщение первого соединения, то оно будет мешать второму соединению, а ожидание двух МСЛ может сделать Данные сообщения о последнем соединении исчезают после того, как сеть

Интервьюер: Вы только что упомянули о контроле перегрузки.Каков метод протокола TCP для решения проблемы перегрузки?

  • друг:Первый способ — медленный старт и предотвращение перегрузок.
  • Друзья: 1) Медленный старт, отправитель TCP будет поддерживать окно перегрузки (окно перегрузки), называемое cwnd. Окно перегрузки изначально составляет 1 сегмент, и после каждого RTT (время от полной отправки данных до подтверждения) размер окна удваивается (экспоненциальный рост, но медленный на ранней стадии)
  • Друзья: 2) Предотвращение перегрузки.Идея состоит в том, чтобы медленно увеличивать окно перегрузки cwnd.После того, как cwnd отправителя достигает порога ssthresh (начальное значение определяется системой), окно перегрузки увеличивается на единицу каждый RTT, а не удваивается. (получено два или четыре подтверждения, оба cwnd+1), cwnd увеличивается линейно (аддитивное увеличение)
  • Друг: (нарисуй картинку для анализа)

  • Друзья: если вы столкнулись с перегрузкой сети, пороговое значение окна перегрузки ssthresh уменьшается вдвое, cwnd устанавливается равным 1, а фаза медленного старта повторно вводится.

Интервьюер: Какие еще методы существуют для контроля перегрузки?

  • друг:Быстрая ретрансляция и быстрое восстановление
  • Друзья: 1) Быстрая повторная передача означает, что когда получатель получает не по порядку сообщение, он немедленно сообщает об этом отправителю и быстро пересылает его
  • Друг: Если получатель M1 получил его, но M2 не получил его, то M3, M4 и M5 были отправлены снова.В это время получатель непрерывно возвращал отправителю 3 подтверждающих сообщения M1. Затем быстрая повторная передача предусматривает, что, пока отправитель получает 3 повторных подтверждения подряд, он немедленно повторно передает M2, отправленный другой стороной (следующее сообщение повторного сообщения подтверждения)

  • Друг: 2) Быстрое выздоровление
  • Друг: Когда отправитель получает три повторных подтверждения подряд, ssthresh уменьшается вдвое; так как отправитель может подумать, что сеть сейчас не перегружена, в отличие от медленного старта, установите значение cwnd на значение после того, как ssthresh уменьшится вдвое, а затем выполните алгоритм предотвращения перегрузки, cwnd увеличивается линейно
  • Друг: (еще одно фото)

Интервьюер: Зная, что скользящего окна нет, каков процесс, когда клиент и сервер управляют скользящим окном?

  • Друг: получатель помещает размер буфера, который он может получить, в поле "размер окна" в заголовке TCP и уведомляет отправителя через сообщение ACK. Скользящее окно используется получателем для управления размером данных. отправлено отправителем, чтобы обеспечить управление потоком
  • Друг: На самом деле верхняя граница окна отправителя — это минимальное значение окна перегрузки и скользящего окна.

Интервьюер: Тогда вы знаете разницу между скользящим окном и окном перегрузки?

  • Друзья: Тот же самый момент заключается в контроле явления потери пакетов, а механизм реализации заключается в том, чтобы отправитель отправлял медленнее.
  • Друг: Разница в том, что объекты управления разные
  • Друзья: 1) Объектом управления потоком является получатель, боюсь, что отправитель будет отправлять слишком быстро, так что получатель не успеет обработать его вовремя.
  • Друзья: 2) Объектом управления перегрузкой является сеть.Я боюсь, что отправитель будет отправлять слишком быстро, вызывая перегрузку сети и заставляя сеть слишком поздно ее обрабатывать.

Интервьюер: Что вы думаете о заклейке и распаковке ПТС

  • Друзья: Размер данных, которые программа должна отправить, отличается от MSS (максимальный размер сегмента, максимальная длина сообщения), который может отправить сегмент TCP.
  • Друзья: когда он больше, чем MSS, данные программы необходимо разделить на несколько сегментов TCP, что называется распаковкой; когда он меньше, чем MSS, он рассмотрит возможность объединения нескольких данных программы в один сегмент TCP, который представляет собой липкий пакет. ; Где MSS = длина сегмента TCP - длина заголовка TCP
  • Друг: На уровне протокола IP, канальном уровне и физическом уровне происходят явления распаковки и прилипания.

Интервьюер: Какие есть решения для склеивания и распаковки?

  • Друзья: 1) Добавьте спецсимволы в конце данных для сегментации
  • Друг: 2) Сделать данные фиксированного размера
  • Друг: 3) Разделите данные на две части, одна из которых является заголовком, а другая — телом содержимого; размер структуры заголовка фиксирован, и есть поле для объявления размера тела содержимого

Опрашивающий: SYN Flood понимает?

  • Друг: SYN Flood подделывает сообщение SYN, чтобы инициировать соединение с сервером, и сервер отвечает SYN_ACK после получения сообщения. После отправки этого ответа он не получит сообщение ACK, что приводит к половинному соединению.
  • Друзья: если злоумышленник отправит большое количество таких пакетов, на атакуемом узле появится большое количество полусоединений, что истощит его ресурсы и сделает недоступными обычных пользователей, пока не истечет время полусоединения.

Интервьюер: Владение TCP неплохое, давайте спросим о знании HTTP. Знаете ли вы, сколько шагов обычно проходит программа для HTTP-запроса?

  • Друзья: 1) разрешить доменное имя -> 2) инициировать трехстороннее рукопожатие TCP для установления соединения -> 3) инициировать HTTP-запрос на основе TCP -> 4) сервер отвечает на HTTP-запрос и возвращает данные -> 5) клиент анализирует возвращенные данные

Интервьюер: Какие коды состояния ответа есть в HTTP? Перечислите несколько из них, с которыми вы знакомы.

  • Друг: Вероятно, есть следующие
    • 200: Указывает на успешный нормальный запрос
    • 400: Неверная семантика, обычно неверный формат запроса
    • 401: требуется авторизация пользователя, обычно токен сертификата не проходит аутентификацию.
    • 403: Отказано в обслуживании
    • 404: Ресурс не существует
    • 500: Ошибка сервера
    • 503: сервер временно обслуживается, перегружен; подлежит восстановлению

Интервьюер: Да, я проверю вас еще раз, в чем разница между сеансом и файлом cookie?

  • Друзья: 1) Место хранения другое, куки - это данные, хранящиеся на стороне клиента, данные сеанса хранятся на сервере
  • Друзья: 2) Емкость хранилища разная, данных, сохраняемых одним куки, мало, а сайт может хранить до 20 куки, верхнего предела для сессий нет
  • Друзья: 3) Способ хранения другой, в куке можно хранить только строки ASCII, в сессии можно хранить данные любого типа
  • Друзья: 4) Разные политики конфиденциальности, куки видны клиенту, сеансы хранятся на сервере, что прозрачно для клиента
  • Друзья: 5) Срок действия разный, кука может существовать долго, сессия зависит от куки с именем JSESSIONID, время истечения по умолчанию -1, и сессия будет недействительна, просто закрыв окно
  • Друзья: 6) Междоменная поддержка отличается, куки поддерживают междоменный доступ, сессия не поддерживает междоменный доступ

Интервьюер: Да, вы знаете, что такое сегментированная доставка HTTP?

  • Друг: Передача по частям — это механизм передачи HTTP, который позволяет разделить данные, отправляемые сервером клиенту, на несколько частей.Этот протокол предусмотрен в HTTP/1.1.

Интервьюер: Каковы преимущества фрагментации HTTP

  • Друг: HTTP Chunked Transfer Encoding позволяет серверам поддерживать постоянные HTTP-соединения для динамически генерируемого контента.
  • Друг: кодирование фрагментированной передачи позволяет серверу отправлять поля заголовка сообщения в конце. Важно для ситуаций, когда значение поля заголовка не может быть известно до тех пор, пока содержимое не будет сгенерировано, например, содержимое сообщения подписано хешем.
  • Друг: HTTP-серверы иногда используют сжатие (gzip или deflate), чтобы сократить время, необходимое для передачи. Поблочное кодирование передачи можно использовать для разделения нескольких частей сжатого объекта. В этом случае блоки не сжимаются по отдельности, а сжимается вся полезная нагрузка. Поблочное кодирование облегчает отправку данных при сжатии

Интервьюер: Как вы понимаете длинное соединение HTTP

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

Интервьюер: Безопасен ли HTTP? Как добиться безопасной передачи по протоколу HTTP

  • Друг: Это небезопасно.Данные, передаваемые по HTTP, представляют собой обычный текст, который легко может быть перехвачен третьими лицами.Для безопасной передачи данных вы можете использовать обновленную версию HTTPS-протокола HTTP.

Интервьюер: Как вы понимаете разницу между HTTPS и HTTP

  • Друзья: 1) Соединение по протоколу http не имеет состояния и передается в виде простого текста
  • Друзья: 2) HTTPS — это сетевой протокол с зашифрованной передачей и аутентификацией личности, построенный по протоколу SSL/TLS+HTTP.

Интервьюер: Что такое SSL/TLS и как реализована безопасность HTTPS?

  • Друзья: SSL (Secure Socket Layer) — это уровень шифрования протокола на основе HTTPS для обеспечения конфиденциальности данных. TLS (Transport Layer Security) — это обновленная версия SSL.
  • Друг: https добавляет уровень аутентификации безопасности и уровень шифрования TLS или SSL к основе http.Он сначала выполнит аутентификацию сертификата ca через уровень безопасности и правильно получит открытый ключ сервера.
  • Друзья: Затем клиент подтвердит алгоритм шифрования с помощью открытого ключа и сервера, и следующие данные могут быть зашифрованы с использованием алгоритма шифрования.

Интервьюер: Не могли бы вы подробнее рассказать о процессе сертификации TLS/SSL... (В это время мобильный телефон интервьюера на рабочем столе завибрировал, он подсознательно посмотрел на мобильный телефон и сделал паузу)

Интервью с другом на данный момент подошло к концу (продолжите в следующий раз)

Добро пожаловать на ошибку в тексте

Справочная статья