предисловие
Протокол TCP — это вопрос знаний, который необходимо задать на собеседовании на крупной фабрике. Я отобрал 15 очень классических вопросов для собеседования по TCP. Надеюсь, каждый сможет найти идеальное предложение.
- публика:маленький мальчик собирает улиток
- гитхаб-адрес, спасибо за каждую звезду
1. Расскажите о процессе трехстороннего рукопожатия TCP
И клиент, и сервер находятся в состоянии ЗАКРЫТО, а затем сервер начинает прослушивать порт и переходит в состояние ПРОСЛУШИВАНИЕ.
- Первое рукопожатие (SYN=1, seq=x), после отправки клиент переходит в состояние SYN_SEND
- После отправки второго рукопожатия (SYN=1, ACK=1, seq=y, ACKnum=x+1) сервер переходит в состояние SYN_RCVD.
- Третье рукопожатие (ACK = 1, ACKNUM = Y + 1)
2. Почему рукопожатие TCP выполняется три раза, а не два? Разве нельзя четыре раза?
Почему рукопожатие TCP выполняется три раза? Для облегчения понимания возьмем в качестве примера влюблённость: самое главное, чтобы два человека сошлись, — это влюбиться друг в друга, т.я люблю тебя, и я знаю, что ты тоже любишь меня, а затем мы используем это для имитации процесса трехэтапного рукопожатия:
Почему рукопожатие не может быть дважды?
Если рукопожатий всего два, девушка может и не знать, что ее предложениея тоже тебя люблю, то ли мальчикПолучать, отношения не могут быть счастливыми.
Почему рукопожатие не может быть четырехкратным?
Потому что рукопожатие не может быть четыре раза? Потому что трех раз достаточно, три раза могут дать понять обеим сторонам: ты любишь меня, и я тоже люблю тебя. И четыре раза избыточно.
3. Расскажите о процессе четырехкратного махания руками в ПТС
- Первая волна раздач (FIN=1, seq=u), после отправки клиент переходит в состояние FIN_WAIT_1
- Вторая волна (ACK=1, ACK=U+1, SEQ=V)
- Третья волна (FIN=1, ACK1, seq=w, ack=u+1) после отправки сервер переходит в состояние LAST_ACK, ожидая последнего ACK от клиента.
- Четвертая волна (ACK=1, seq=u+1, ack=w+1), клиент получает от сервера запрос на отключение, отправляет пакет подтверждения и переходит в состояние TIME_WAIT,После ожидания в течение некоторого фиксированного времени (два максимальных времени жизни сегмента, 2MSL, 2 максимального времени жизни сегмента), не получил ACK от сервера и подумал, что сервер нормально закрыл соединение, поэтому он также закрыл соединение и перешел в состояние CLOSED. После того, как сервер получает этот пакет подтверждения, он закрывает соединение и переходит в состояние CLOSED.
4. Почему для волны TCP нужно четыре раза?
Например!
Сяоминг и Xiaohong пообщались по телефону. Когда звонок был почти закончен, Сяохонг сказал: «Мне нечего сказать». Сяоминг ответил: «Я вижу». Но Сяоминг может еще иметь что сказать, Xiaohong не может попросить Сяомин, чтобы закончить звонок в своем собственном темпе, поэтому Сяоминг может снова говорить, и, наконец, Сяоминг сказал: «Я сделал», Сяохонг ответил «Я знаю». Вызов заканчивается.
5. Почему состояние TIME-WAIT должно ждать 2MSL
2MSL, 2 максимального времени жизни сегмента, то есть два максимальных жизненных цикла сегмента
- 1 MSL гарантирует, что последнее сообщение ACK стороны, которая активно закрывает руки после четырех волн, может, наконец, достичь партнера.
- 1 MSL гарантирует, что сообщение FIN для повторной передачи может быть получено, если одноранговый узел не получил ACK
6. Разница между TCP и UDP
- TCP ориентирован на установление соединения (например, набор номера для установления соединения для совершения вызова); UDP не требует установления соединения, то есть ему не нужно устанавливать соединение перед отправкой данных.
- TCP требует безопасности, предоставляя надежную услугу, связанную передачей данных TCP, не теряемую, не дублирующую, безопасную и надежную. UDP делает все возможное, что не гарантирует надежной доставки.
- TCP — это соединение «точка-точка», UDP может быть «один-к-одному», «один-ко-многим», «многие-ко-многим».
- Эффективность передачи TCP относительно низкая, в то время как эффективность передачи UDP высока, он подходит для высокоскоростной передачи и связи в реальном времени или широковещательной связи.
- TCP подходит для веб-страниц, почты и т. д., UDP — для видео, голосового вещания и т. д.
- TCP ориентирован на байты, UDP ориентирован на пакеты.
7. Какие поля находятся в заголовке TCP-сообщения и каковы их функции?
- 16-битный номер порта: номер исходного порта, откуда приходит сегмент сообщения хоста; номер порта назначения, на который должен быть передан протокол или приложение верхнего уровня.
- 32-битный серийный номер: номер каждого байта потока байтов в определенном направлении передачи во время TCP-соединения (от установления TCP-соединения до отключения).
- 32-значный номер подтверждения: используется в качестве ответа на TCP-сегмент, отправленный другой стороной. Его значение равно значению порядкового номера полученного TCP-сегмента плюс 1.
- 4-битная длина заголовка: Указывает, сколько 32-битных слов (4 байта) в заголовке TCP (4 байта). Поскольку можно определить максимум 4 бита, размер заголовка TCP составляет 60 байт.
- 6-битные флаги: URG (действителен ли аварийный указатель), Ack (указывает, действителен ли номер подтверждения), PSH (буфер не заполнен), RST (указывает, что другой стороне требуется восстановить соединение), SYN ( установлен флаг сообщения об установлении соединения), FIN (указывает на уведомление Другая сторона собирается закрыть соединение)
- 16-битный размер окна: средство управления потоком TCP. Упомянутое здесь окно относится к окну получения уведомлений. Он сообщает другой стороне, сколько байтов данных может хранить буфер приема TCP на локальном конце, чтобы другая сторона могла контролировать скорость отправки данных.
- 16-битная контрольная сумма: Заполняется отправителем, а получатель выполняет алгоритм CRC для сегмента TCP, чтобы проверить, не поврежден ли сегмент TCP во время передачи. Обратите внимание, что эта проверка включает не только заголовок TCP, но и часть данных. Это также является важной гарантией надежной передачи TCP.
- 16-битный срочный указатель: Положительное смещение. Он добавляется к значению поля порядковых номеров, чтобы указать количество порядковых номеров следующего байта последних срочных данных. Следовательно, для того, чтобы быть точным, это поле является смещением срочного указателя относительно текущего порядкового номера, которое можно назвать срочным смещением. Срочный указатель TCP - это метод, с помощью которого отправитель отправляет срочные данные в приемник.
8. Как TCP обеспечивает надежность
- Во-первых, соединения TCP основаны натрехстороннее рукопожатие, в то время как отключениепомахал четыре раза. Обеспечьте надежность соединения и отключения.
- Во-вторых, надежность TCP, но и всостояние;TCP записывает, какие данные отправлены, какие данные приняты, а какие нет, и обеспечивает поступление пакетов данных, чтобы обеспечить безошибочную передачу данных.
- Опять же, надежность TCP также отражается науправляемый. Он имеет проверку сообщения, ответ ACK,Тайм-аут повторной передачи (отправитель), повторная передача данных вне очереди (получатель), отбрасывание повторяющихся данных, управление потоком (скользящее окно) и механизмы управления перегрузкой.
9. Механизм повторной передачи TCP
тайм-аут повторной передачи
Для обеспечения надежной передачи TCP реализует механизм повторной передачи. Самый простой механизм ретрансляциитайм-аут повторной передачи, то есть при отправке сообщения данных устанавливается таймер, и каждый временной интервал, если сообщение подтверждения ACK от другой стороны не получено, сообщение будет передано повторно.
Какова продолжительность этого интервала? Давайте сначала посмотрим, что естьRTT (время в обе стороны, время в обе стороны).
RTT — это время с момента отправки пакета данных до момента его возвращения, т. е.Одно время прохождения пакета туда и обратно. Тайм-аут повторной передачи — это Тайм-аут повторной передачи, называемыйRTO.
Как долго длится настройка RTO?
- Если RTO относительно невелико, велика вероятность того, что данные не будут потеряны, а будут переданы повторно, что вызовет перегрузку сети и приведет к большему количеству тайм-аутов.
- Если RTO относительно велико, подождите, пока цветы будут благодарны ретрансляции или нет, эффект будет плохим.
В целом, RTO немного больше, чем RTT, и эффект наилучший. Некоторые друзья спросят, существует ли формула для расчета периода тайм-аута?Да! Существует стандартный способ расчета формулы RTO, также называемыйАлгоритм Якобсона/Карелса. Рассмотрим формулу расчета RTO.
1. Сначала рассчитайте SRTT (рассчитайте сглаженный RTT)
SRTT = (1 - α) * SRTT + α * RTT //求 SRTT 的加权平均
2. Пересчитайте RTTVAR (изменение времени приема-передачи)
RTTVAR = (1 - β) * RTTVAR + β * (|RTT - SRTT|) //计算 SRTT 与真实值的差距
3. Окончательное РТО
RTO = µ * SRTT + ∂ * RTTVAR = SRTT + 4·RTTVAR
в,α = 0.125,β = 0.25, μ = 1,∂ = 4
Эти параметры являются оптимальными параметрами большого количества полученных результатов.
Однако повторная передача по тайм-ауту имеет следующие недостатки:
- Когда сегмент потерян, он будет ждать в течение определенного периода времени перед повторной передачей пакета, что увеличивает сквозную задержку.
- При потере сегмента в процессе ожидания таймаута может произойти следующее: следующий сегмент получен получателем, но долгое время не подтверждался, и отправитель будет думать, что он тоже потерян. тем самым вызывая ненужные повторные передачи, тратя ресурсы и время.
Кроме того, TCP имеет политику, согласно которой интервал тайм-аута будет удваиваться. Требуется повторная передача тайм-аутаждать долго. Поэтому вы также можете использоватьбыстрая ретрансляциямеханизм.
быстрая ретрансляция
быстрая ретрансляцияМеханизм управляется не временем, а данными. Он запускает повторную передачу на основе обратной связи от получателя.
Давайте посмотрим на процесс быстрой повторной передачи:
Отправитель отправил 1, 2, 3, 4, 5, 6 частей данных:
- Первый Seq=1 был доставлен первым, поэтому Ack вернул 2;
- Второй Seq=2 также отправляется, при условии, что он нормальный, поэтому ACK возвращает 3;
- Третий Seq=3 не был доставлен из-за сетевых и других причин;
- Четвертая Seq=4 также была доставлена, но не получена из-за Seq3. Итак, ACK возвращает 3;
- Следующие Seq=4,5 также были отправлены, но ACK по-прежнему ответил 3, потому что Seq=3 не был получен.
- Отправитель получает три повторяющихся избыточных подтверждения ACK=3 (фактически четыре, но первое является обычным ACK, а последние три повторяются избыточно), поэтому он знает, какой сегмент передается. передается повторно до истечения таймера.
- Наконец, получен Seq 3. В это время, поскольку все Seq = 4, 5 и 6 получены, ACK возвращает 7.
нобыстрая ретрансляцияТакже может быть проблема: ACK информирует отправителя только о самом большом заказанном сегменте, какой пакет потерян?Точно сказать не могу! Сколько пакетов нужно ретранслировать?
Как насчет повторной передачи Seq3? Или повторно передать Seq3, Seq4, Seq5, Seq6? Потому что отправитель не знает, кто отправил эти три последовательных ACK3 назад.
Повторная передача с подтверждением выбора (SACK)
Для решения проблемы быстрой ретрансляции:сколько пакетов нужно ретранслироватьTCP обеспечиваетSACK-метод(Повторная передача с выборочным подтверждением, выборочное подтверждение).
МЕШОЧНОЙ механизмТо есть на основе быстрой повторной передачи принимающая сторона возвращает диапазон порядковых номеров недавно полученного сегмента, так что передающая сторона знает, какие пакеты данных принимающая сторона не получила, а Jiangzi знает, какие пакеты данных нужно передать повторно. Маркер SACK добавляется в заголовок TCP.опцииВнутри поля.
Как показано на рисунке выше, отправитель трижды получает одно и то же подтверждающее сообщение ACK=30, что запускает механизм быстрой повторной передачи.30~39
Этот фрагмент данных потерян, поэтому при повторной передаче выбирается только он30~39
Сегмент TCP передается повторно.
D-SACK
D-SACK, Duplicate SACK (дубликат SACK), сделал несколько расширений на основе SACK и в основном используется, чтобы сообщить отправителю, какие пакеты данных были повторно приняты им самим. Цель DSACK — помочь отправителю определить, имело ли место нарушение последовательности пакетов, потеря ACK, дублирование пакетов или ложная повторная передача. Пусть TCP лучше управляет сетевым потоком. Смотрим картинку:
10. Расскажите о скользящем окне TCP
TCP отправляет данные и должен получить подтверждение перед отправкой следующих данных. Это имеет тот недостаток, что эффективность будет ниже.
Как будто мы общаемся лицом к лицу, после того, как вы закончите, я отвечаю, вы бы сказали следующее предложение. Ну, если я занят с другими вещами, это не удалось своевременно ответить на вас. После того, как вы закончите, вы хотите подождать, пока я не вернусь к вам занятым, вы просто говорите следующее предложение, которое, очевидно, не реалистично.
Для решения этой проблемы TCP ввелокно, который представляет собой кэш-пространство, открытое операционной системой. Значение размера окна представляет собой максимальное значение, при котором данные могут продолжать передаваться без ожидания подтверждения.
В заголовке TCP есть поле win, которое16-битный размер окна, он сообщает другой стороне, сколько байтов данных может хранить буфер приема TCP на локальном конце, чтобы другая сторона могла контролировать скорость отправки данных, чтобы достичьуправление потокомцель.
С точки зрения непрофессионала, каждый раз, когда получатель получает пакет данных, при отправке сообщения подтверждения он также сообщает отправителю, сколько свободного места есть в его буферной области.Свободное пространство в буферной области называется размером окна приема. Это победа.
Существует два типа скользящих окон TCP: окно отправки и окно приема.Скользящее окно на стороне отправителяОн состоит из четырех частей, а именно:
- Отправлено и получено подтверждение ACK
- Отправлено, но не получил подтверждение ACK
- Не отправлено, но можно отправить
- Не отправлено и не могу отправить
- Пунктирный прямоугольник — окно отправки.
- SND.WND: указывает размер окна отправки.Количество сеток в пунктирной рамке на рисунке выше равно 14.
- SND.UNA: Абсолютный указатель на порядковый номер первого отправленного, но не подтвержденного байта.
- SND.NXT: позиция для следующей отправки, она указывает на порядковый номер первого байта, который не был отправлен, но мог быть отправлен.
Скользящее окно приемника состоит из трех частей:
- Получил и подтвержден успешно
- Данные не получены, но могут быть получены
- Данные не получены и не могут быть получены
- Пунктирный прямоугольник — это принимающее окно.
- REV.WND: Указывает размер окна приема На приведенном выше рисунке в пунктирной рамке 9 сеток.
- REV.NXT: следующая полученная позиция, указывающая на порядковый номер первого байта, который не был получен, но мог быть получен.
11. Расскажите об управлении потоком TCP
TCP Трехстороннее рукопожатие, передающее и получение заканчивается в установленное состояние, то есть они могут с радостью передавать данные.
Однако отправитель не может лихорадочно отправлять данные получателю, потому что, если получатель не может их получить, получатель может только хранить необработанные данные в области буфера. Если область буфера заполнена, а отправитель все еще лихорадочно отправляет данные, получатель может только отбрасывать полученные пакеты данных, что приводит к пустой трате сетевых ресурсов.
TCP предоставляет механизм, который позволяет отправителю контролировать количество отправляемых данных в соответствии с фактическими возможностями приема получателя, т.е.управление потоком.
TCP управляет трафиком через скользящие окна Давайте взглянем на управление потоком.Краткий процессБар:
Две стороны первого трехстороннего рукопожатия, размер каждого окна инициализации составляет 400 байт.
- Если текущий отправитель отправляет получателю 200 байт, то отправитель
SND.NXT
Оно сдвинется вправо на 200 байт, что означает, что текущее доступное окно уменьшится на 200 байт. - После того, как получатель получит его, поместите его в очередь буфера, REV.WND=400-200=200 байт, поэтому отправителю возвращается win=200 байт. Получатель добавит уменьшенное скользящее окно размером 200 байт в заголовок сообщения ACK.
- Отправитель посылает еще 200 байт, 200 байт приходят и продолжают размещаться в буферной очереди. Однако в это время из-за большой нагрузки приемник не может обработать столько байтов, только 100 байт, а оставшиеся 100 байтов продолжают размещаться в буферной очереди. В это время REV.WND = 400-200-100=100 байт, то есть win=100 возвращается отправителю.
- Отправитель продолжает работать и отправляет байт 100. В это время выигрыш окна приема становится равным 0.
- Отправитель прекращает отправку, запускает запланированную задачу и время от времени спрашивает получателя, пока выигрыш не станет больше 0, он продолжает отправлять.
12. Контроль перегрузки TCP
контроль перегрузкиДействия в сети, предотвращающие попадание слишком большого количества пакетов данных в сеть и избегающие ситуации чрезмерной нагрузки на сеть.. Его цель в основном состоит в том, чтобы максимально использовать пропускную способность узкого места в сети. следуетуправление потокомКакая разница? Управление потоком применяется к приемнику в соответствии сФактическая пропускная способность контроля скорости передачи принимающей стороны, чтобы предотвратить потерю пакетов.
Мы можем сравнить сетевое соединение с водопроводной трубой.Если мы хотим максимально использовать сеть для передачи данных, мы должны сделать так, чтобы водопроводная труба достигла наилучшего состояния заполнения как можно скорее.
Отправитель поддерживаетОкно перегрузки cwnd (окно перегрузки)Переменная, используемая для оценки объема данных (воды), которые могут передаваться по этому каналу (водопроводу) за определенный период времени. Его размер представляет собой уровень перегрузки сети и изменяется динамически, но для достижения максимальной эффективности передачи, как мы узнаем, какова эффективность транспортировки этого водопровода?
Относительно простой метод увеличения количества передаваемой воды, пока труба не лопнет вверх (что соответствует потере сетевых пакетов), TCP описывается следующим образом:
Пока в сети нет перегрузки, значение окна перегрузки может быть увеличено для отправки большего количества пакетов, но пока сеть перегружена, значение окна перегрузки должно быть уменьшено, чтобы уменьшить инъекцию в сеть. , количество пакетов.
На самом деле существуют в основном эти общие алгоритмы управления перегрузкой.
- медленный старт
- предотвращение перегрузки
- происходит затор
- быстрое восстановление
алгоритм медленного старта
Алгоритм медленного старта, поверхностный смысл в том, что не спешите медленно. Это означает, что после установления TCP-соединения сначала не отправлять большой объем данных, а сначала определить степень загруженности сети. Постепенно увеличивайте размер окна перегрузки от маленького до большого, если нет потери пакетов,Каждый раз, когда принимается ACK, размер cwnd окна перегрузки увеличивается на 1 (единица измерения — MSS)..каждый раундОкно отправки удваивается и растет экспоненциально.Если происходит потеря пакетов, окно перегрузки уменьшается вдвое и переходит в фазу предотвращения перегрузки.
- Соединение TCP завершено, и cwnd = 1 инициализировано, указывая, что данные одного размера блока MSS могут быть переданы.
- Всякий раз, когда получен ACK, cwnd увеличивается на единицу;
- cwnd удваивается каждый раз, когда проходит RTT; экспоненциально увеличивается
Чтобы предотвратить перегрузку сети, вызванную чрезмерным ростом cwnd, необходимо установитьПорог медленного запуска ssthresh(порог медленного пуска) переменная состояния. когдаcwnd
После достижения этого порога водопровод как бы перекрывает кран, уменьшая состояние перегрузки. немедленноcwnd >ssthresh, вошелпредотвращение перегрузкиалгоритм.
Алгоритм предотвращения перегрузок
Вообще говоря, порог медленного запуска ssthresh составляет 65535 байт,cwnd
прибытьПорог медленного запускаЗадний
- Каждый раз при получении ACK cwnd = cwnd + 1/cwnd
- Когда каждый RTT проходит, cwnd = cwnd + 1
Очевидно, что это линейно возрастающий алгоритм, чтобы избежать чрезмерных проблем с перегрузкой сети.
происходит затор
Когда происходит перегрузка сетипотеря пакетов, возможны две ситуации:
- Повторная передача тайм-аута RTO
- быстрая ретрансляция
если это случилосьПовторная передача тайм-аута RTO, будет использоваться алгоритм генерации перегрузки
- Порог медленного запуска sshthresh = cwnd /2
- cwnd сбросить на 1
- Введите новый процесс медленного запуска
Это действительно такСкорбящий десятилетиями, прежде чем вернуться к освобождению. На самом деле, есть лучший способ справиться сбыстрая ретрансляция. Когда отправитель получает 3 последовательных повторных ACK, он быстро повторит передачу без ожидания.Тайм-аут RTOретранслировать.
Пороги медленного запуска ssthresh и cwnd изменяются следующим образом:
- Размер окна перегрузки cwnd = cwnd/2
- Порог медленного запуска ssthresh = cwnd
- Введите алгоритм быстрого восстановления
быстрое восстановление
Алгоритмы быстрой повторной передачи и быстрого восстановления обычно используются одновременно. Алгоритм быстрого восстановления полагает, что все еще получены 3 повторяющихся ACK, что указывает на то, что сеть не так уж и плоха, поэтому нет необходимости быть таким же сильным, как тайм-аут RTO.
Как было сказано ранее, cwnd и sshthresh были обновлены перед входом в режим быстрого восстановления:
- cwnd = cwnd /2
- sshthresh = cwnd
Тогда действительно быстрый алгоритм выглядит следующим образом:
- cwnd = sshthresh + 3
- Повторно передавать повторяющиеся ACK (то есть потерянные пакеты)
- Если вы получаете повторный ACK, то CWND = CWND +1
- Если получен ACK для новых данных, cwnd = sshthresh. Поскольку подтверждение новых данных получено, это указывает на то, что процесс восстановления завершен, и можно снова ввести алгоритм предотвращения перегрузки.
13. Взаимосвязь между очередью полусоединения и атакой SYN-флуда
Прежде чем TCP вступит в трехстороннее рукопожатие, серверCLOSEDстатус становитсяLISTENПри этом внутри создаются две очереди: полусвязная очередь (SYN-очередь) и полностью связанная очередь (ACCEPT-очередь).
чтоПолуочередь соединений (очередь SYN)что? что такоеПолностью подключенная очередь (очередь ACCEPT)Шерстяная ткань? Вспомним схему трехэтапного рукопожатия TCP:
- Во время трехстороннего рукопожатия TCP клиент отправляет SYN на сервер, и после того, как сервер его получает, он отвечаетАСК и СИНГосударство даноLISTEN становится SYN_RCVD, после чего соединение устанавливаетсяSYN-очередь, которая является полусвязной очередью.
- Когда клиент отвечает ACK и сервер получает его, трехэтапное рукопожатие завершается. В это время соединение будет ждать, пока его заберет конкретное приложение. Прежде чем его забрать, оно помещается в очередь ACCEPT, то есть в полную очередь соединений.
Syn Flush - это типичные DOS (отказ в обслуживании, отказа в обслуживании).IP-адрес, который не существует, отправить на сервер большое количество SYN-пакетов. Когда сервер отвечает сообщением SYN+ACK, он не получит ответного сообщения ACK, в результате чего на сервере создается большое количество полусвязных и полусвязных очередей, что делает невозможным обработку обычных TCP-запросов.
Естьsyn cookieиSYN-прокси-брандмауэри другие планы, с которыми нужно иметь дело.
-
syn cookie: после получения SYN-пакета сервер вычисляет значение cookie как порядковый номер своего собственного SYNACK-пакета в соответствии с определенным методом, используя исходный адрес, порт и другую информацию пакета данных в качестве параметров. , сервер не сразу выделяет ресурсы для обработки.После получения пакета ACK от отправителя пересчитывает, является ли порядковый номер подтверждения в пакете правильным в соответствии с исходным адресом и портом пакета данных.Если он правильный, установить соединение, в противном случае отбросить пакет.
-
SYN-прокси-брандмауэр: брандмауэр сервера будет проксировать и отвечать на каждое полученное сообщение SYN, а также поддерживать полусоединение. После того, как отправитель возвращает пакет ACK, пакет SYN реконструируется и отправляется на сервер для установления реального TCP-соединения.
14. Алгоритм Нэгла и отложенное подтверждение
Алгоритм Нэгла
Если отправитель судорожно отправляет получателю маленькие пакеты, типа 1 байт, то дорогие друзья, как вы думаете, в чем будет проблема?
В протоколе TCP/IP независимо от того, сколько данных отправляется, заголовок протокола всегда добавляется перед данными, в то же время, когда другая сторона получает данные, ей также необходимо отправить ACK для подтверждения. Чтобы максимально использовать пропускную способность сети, TCP всегда хочет отправить как можно больше данных.Алгоритм НэглаОн заключается в том, чтобы отправлять как можно больше больших блоков данных, чтобы избежать переполнения сети большим количеством небольших блоков данных.
Основное определение алгоритма Нэгла:В любой момент может быть максимум один неподтвержденный сегмент. Так называемый «маленький сегмент» относится к блоку данных меньшего размера, чем размер MSS.Так называемый «неподтвержденный» означает, что после отправки блока данных ACK, отправленный другой стороной, не получен для подтверждения того, данные получены.
Правила реализации алгоритма Нэгла:
- Если длина пакета достигает MSS, его отправка разрешается;
- Если он содержит FIN, его отправка разрешена;
- Если установлена опция TCP_NODELAY, разрешена отправка;
- Когда опция TCP_CORK не установлена, если все исходящие небольшие пакеты данных (длина пакета меньше MSS) подтверждены, их отправка разрешена;
- Ни одно из вышеперечисленных условий не выполняется, но происходит тайм-аут (обычно 200 мс), и он будет отправлен немедленно.
отложенное подтверждение
Если получатель только что получил пакет данных отправителя, он получает второй пакет через очень короткий промежуток времени. Итак, должен ли получатель отвечать по одному или они отвечают вместе?
После того, как получатель получит пакет данных, если какое-то время нет данных для отправки узлу, он может немного подождать перед подтверждением (по умолчанию 40 мс в Linux). Если есть данные для передачи на противоположный конец в течение этого периода, ACK будет передан с данными, и нет необходимости отправлять ACK отдельно. Если по истечении времени нет данных для отправки, также отправляется ACK, чтобы противоположная сторона не подумала, что пакет потерян.
Но некоторые сцены нельзя откладывать, например, обнаружениеВне заказа,Был получен пакет размером более одного кадра, и необходимо изменить размер окна.Ждать.
В целом,Алгоритм Нэгла и отложенное подтверждениенельзя использовать вместе, алгоритм Нэгла подразумевает отложенную отправку,отложенное подтверждениеЭто означает, что прием задерживается, а соус вызовет большую задержку и проблемы с производительностью.
15. Заклейка и распаковка ПТС
TCP — это ориентированная на поток неограниченная строка данных. Нижний уровень TCP не понимает конкретного значения бизнес-данных верхнего уровня.Он разделит пакеты в соответствии с фактическим состоянием буфера TCP.Поэтому с точки зрения бизнеса считается, чтоПолный пакет может быть разделен на несколько пакетов для передачи по протоколу TCP.,Также можно инкапсулировать несколько небольших пакетов в один большой пакет и отправлятьЭто так называемая проблема прилипания TCP и распаковки.
Почему происходит залипание и распаковка?
- Отправляемые данные меньше, чем размер буфера отправки TCP, TCP будет отправлять данные, записанные в буфер, несколько раз за один раз, и возникнет липкий пакет;
- Если прикладной уровень принимающей стороны данных не считывает данные в приемном буфере вовремя, будут возникать липкие пакеты;
- Если данные для отправки больше, чем оставшееся место в буфере отправки TCP, произойдет распаковка;
- Если отправляемые данные больше, чем MSS (максимальная длина сообщения), TCP распаковывает перед отправкой. То есть длина пакета TCP — длина заголовка TCP > MSS.
решение:
- Отправитель инкапсулирует каждый пакет в пакет фиксированной длины.
- Добавьте специальные символы в конце данных для разделения
- Разделите данные на две части: одна — заголовок, а другая — тело содержимого; структура заголовка имеет фиксированный размер, и есть поле для объявления размера тела содержимого.
Ссылка и спасибо
- Эти вещи о TCP (ниже)
- Принцип управления перегрузкой TCP, который вам нужно знать для заголовков интервью
- 30 диаграмм: повторная передача TCP, скользящее окно, управление потоком, контроль перегрузки.
- Душа протокола TCP объединяет базовую основу вашей сети.
- TCP торчат и распаковки
- Энциклопедия Байду