Пятиуровневая модель TCP/IP
Сначала посмотрите на картинку, разложите сетевую модель и полный рабочий процесс полного HTTP-запроса в пятиуровневой модели.
-
应用层: высший уровень, предоставляющий протоколы для конкретных приложений для работы в протоколах этого уровня: HTTP, FTP, SSH, WebScoket и т. д. -
传输层: Предоставляет общий протокол передачи данных для связи между двумя хост-процессами, например TCP, UDP. -
网络层: Отвечает за функции адресации и маршрутизации, отправки пакетов данных на определенные компьютеры, основным протоколом является протокол IP, на этом уровне находится маршрутизатор. -
链路层: Отвечает за преобразование пакетов двоичных данных и сетевых сигналов друг в друга, на этом уровне находятся коммутаторы и сетевые карты. -
物理层: В основном это приемники, передатчики, повторители, оптоволоконные кабели и т. д.
Сетевые протоколы определяют обязанности каждого уровня через уровни и работают вместе через четко определенные интерфейсы.Первый уровень может использовать функции следующих уровней, не беспокоясь о том, как реализован каждый уровень. Точно так же, как мы разрабатываем упакованные компоненты, каждый компонент отвечает за свои дела, не мешает друг другу и повышает степень повторного использования, как показано в базовом процессе передачи файлов выше, то есть,http分层工作流程:
-
Хост A инициирует запрос, и перед отправкой данные будут разделены на множество фрагментов, называемых пакетами данных, а затем пакеты данных инкапсулируются с использованием протокола http и добавляются с помощью
请求头, перешел на следующий слой -
Транспортный уровень получает данные, назначает номер порта каждому пакету данных, который используется для определения того, какое приложение целевого компьютера, а затем использует протокол TCP для обработки, плюс
TCP头илиUDP头, передается на следующий уровень по протоколу TCP -
После того, как сетевой уровень получает данные, он добавляет IP-адрес целевого компьютера к каждому пакету данных и решает, какой маршрут или хост отправить, а затем инкапсулирует его и отправляет на следующий уровень.
-
Канальный уровень преобразует данные в электронные сигналы, которые далее инкапсулируются в
数据帧, передается на физический уровень -
Физический уровень передается по кабелю на канальный уровень на стороне хоста B.
-
После того, как канальный уровень хоста B получит данные, он проверяет адрес назначения в каждом пакете и определяет, куда его отправить.Если он отправлен не самому себе, отбросить его, затем определить тип протокола по данным, а затем передать на IP сетевого уровня.Модуль протокола
-
После того, как сетевой уровень его получает, он разбирается и получается
IP头, посчитав, что IP-адрес, полученный в заголовке, совпадает, а затем по头部协议类型, переадресация TCP или UDP и т. д. -
После того, как протокол TCP транспортного уровня получит его, он
计算校验, Данные определения完整性, а затем обработать логику получения пакетов в последовательности и, наконец, в соответствии с端口Определите, какую программу перенаправить на прикладной уровень -
После того, как последний прикладной уровень получает данные по протоколу http
解析данные
Здесь только раскройте IP сетевого уровня и TCP и UDP транспортного уровня.
IP
если в局域网используется внутриMAC地址通信, Вне локальной сети необходимо использовать IP. MAC похож на удостоверение личности, а IP — на адрес. Все данные TCP, UDP, ICMP и т. д. передаются в формате IP-дейтаграмм.
Сам IP-протокол не поддерживает IP-пакеты, которые не могут быть отправлены на адрес назначения, и не обеспечивает прямого способа получения диагностической информации, например, о том, какие маршрутизаторы пропущены в пути, и времени приема-передачи, которое составляет определяетсяICMP协议быть ответственным за
ICMP не обеспечивает надежность для IP-сетей. Он используется только для обратной связи по различным сбоям и информации о конфигурации. Потеря пакета не вызывает срабатывания ICMP.
Обычно мы используем ping для использования пакетов запросов ICMP. Однако проверка связи с использованием протокола ICMP напрямую пропускает транспортный уровень, поэтому программа проверки связи не имеет номера порта.
Характеристики IP-протокола:
-
IP协议是不可靠的传输协议. Если в протоколе ICMP возникает ошибка при передаче, IP отбрасывает пакет и может ответить отправителю сообщением об ошибке ICMP, в то время какЛюбые требования к надежности должны быть предоставлены верхними слоями, такими как TCP -
IP协议是无连接的. То есть он не поддерживает никакой информации о состоянии последующих данных, и все данные независимы. Производительность такова: его можно получить вне порядка отправки, без сохранения состояния соединения и без сохранения реплицированной информации о состоянии канала (об этом расскажет TCP)
UDP
Особенности УДП
-
无连接Данные могут быть отправлены напрямую без рукопожатия и волны. -
不可靠性: Это портер, который передает данные и отправляет их, когда приходит пакет. Он не будет резервироваться, и не будет заботиться о том, правильно ли его получит другая сторона, и порядок передачи не может быть гарантирован. Следовательно, надежность может гарантировать только прикладной уровень, поскольку сетевой уровень также ненадежен.- На отправляющем конце прикладной уровень передает данные UDP транспортного уровня, который толькоДобавьте идентификатор заголовка UDP(протокол UDP), он отправляется непосредственно на сетевой уровень.
- Принимающая сторона отправляет данные на транспортный уровень на сетевом уровне, а транспортный уровень UDPУдалите только заголовок IPпередается на прикладной уровень.
- Ничто другое не имеет значения, но это также
减少开销和发送数据之前的延迟
-
支持广播: Он имеет функции одноадресной, многоадресной и широковещательной передачи, не только поддерживает режим передачи один к одному, но также поддерживает режим один ко многим, многие ко многим. -
首部开销小: 8 байт (源端口号(не требуется),目的端口号,UDP长度(вся длина дейтаграммы),UDP检查和(Проверьте, является ли дейтаграмма UDP неправильной или порт назначения не может найти соответствующий процесс,各2字节), потому что он не очень требователен и не реализует столько функций, поэтому полей заголовка не так много, иTCP有20个字节. Его данные могут быть 0, поэтому они могут быть не менее 8 байтов. -
是面向报文的: Он подходит для передачи небольшого количества данных за один раз, потому что прикладной уровень будет отправлять сообщение о том, как долго это происходит, по UDP, то есть отправлять полное сообщение за один раз, то есть не объединять и не разделять. Если пакет слишком длинный, если UDP полностью загружен и передан сетевому уровню, сетевой уровень будет фрагментирован, поскольку для него требуется MTU при отправке на канальный уровень, поэтому сетевой уровень должен быть фрагментирован, что будет Влияет на эффективность сетевого уровня -
无拥塞控制: Подходит для приложений в реальном времени, потому что он всегда будет отправлять данные на постоянной скорости, даже если условия сети не являются хорошими, скорость отправки не будет скорректирована. Это приводит к возможности потери пакета, когда сеть не является хорошей, но преимущества также очевидны. В некоторых сценариях с высокими требованиями в реальном времени, такие как чат, онлайн-видео, VoIP-вызовы и т. Д., Используйте UDP вместо TCP Такие, как звонка WECHAT случайных прерывистых телефонных звонков, не слишком большая проблема. Конечно, если заторы слишком серьезны, существуют некоторые лекарства, такие как коррекция вперед или повторная передача.
Почему UDP ненадежен
- перед передачей данных
不需要先建立连接 -
不保证消息交付, транспортному уровню удаленного хоста не нужно подтверждать получение UDP-пакета. -
不保证将会顺序, без порядкового номера пакета, без перегруппировки и без блокировки начала строки -
不进行拥塞控制, без встроенного механизма обратной связи, без повторной передачи, без тайм-аута
TCP
Это протокол, который мы обычно используем чаще всего, особенно интерфейс и сервер. TCP предоставляет приложениям совершенно другой сервис, чем UDP. TCP — это надежная служба, ориентированная на соединение.Ориентация на соединение означает, что два приложения TCP должны установить TCP-соединение, связавшись друг с другом, прежде чем они смогут обмениваться данными. TCP обеспечивает абстракцию потока байтов для приложений: он не вставляет автоматически метки записи или границы сообщения.Например, если отправитель отправляет 10 и 30 байт соответственно, получатель может прочитать два 20 байта.
Особенности TCP
-
是面向连接的, обе стороны должны установить соединение перед общением -
只支持单播, это двухточечная передача, TCP-соединение может иметь только две конечные точки -
提供可靠交付的服务, с проверкой целостности данные не будут потеряны, пакеты будут потеряны и переданы повторно, и будут приходить по порядку -
是面向字节流的. В отличие от UDP, который передает пакеты независимо один за другим, он передает в потоке байтов без сохранения границ пакетов. -
提供拥塞控制, когда сеть перегружена, есть управление потоком, которое может снизить скорость и количество передаваемых данных, уменьшить перегрузку и обеспечить стабильность -
提供全双工通信和可靠通信, что означает, что отправитель и получатель могут同时发送数据также может同时接收数据. Потому что у обеих сторон будетотправить буфера такжеприемный буфер-
发送缓存То есть в очереди буфера отправки есть данные для отправки и данные, которые были отправлены, но не получили подтверждения от получателя.Если подтверждение не получено, оно будет отправлено повторно, чтобы его нельзя было выбросить. , и он может быть передан повторно, поскольку TCP требует гарантированной надежной передачи. -
接收缓存То есть данные, поступающие по порядку, но не прочитанные принимающим приложением, и данные, поступающие не по порядку, должны быть упорядочены по порядку, чтобы получатель мог получать данные один за другим.
-
Почему TCP надежен?
Поскольку получатель отправит ответное сообщение подтверждения ACK после получения данных, чтобы отправитель знал, что его данные были получены другой стороной, и если ACK не был получен в течение определенного периода времени, он будет повторно отправлен . Следовательно, даже если данные не отправлены получателю или пакет ACK получателя потерян, существует механизм повторной передачи, гарантирующий, что обе стороны наконец смогут правильно получить сообщение посредством повторной передачи.
механизм ретрансляции
Поскольку нижний сетевой уровень TCP может быть потерян, повторяться или выходить из строя, протокол TCP должен обеспечивать надежные услуги передачи данных.
Для обеспечения корректности передачи данных после отправки пакета данных定时器, если отправленные данные не получены в течение определенного периода времениACK确认报文, сообщение будет重传, отказаться и отправить复位信号
Механизм контроля перегрузки
В основном отражается в четырех аспектах
- Один
慢启动, сначала не отправляйте много данных, сначала протестируйте сеть, а затем медленно увеличивайте размер окна перегрузки от маленького до большого - два это
拥塞避免, как только будет определено, что сеть перегружена, установите передачу на половину размера, когда происходит перегрузка, и установите окно перегрузки на 1, а затем перезапустите алгоритм медленного запуска. - Третий
快速重传Является ли получатель расстройства после получения сообщения, отправленного немедленно дубликаты подтверждений, алгоритм быстрой повторной передачи непрерывно, пока положения отправителя получают три дубликата подтверждения, немедленно повторно передают другие сегменты, которые еще не получены, а не продолжают ждать, когда истекает время повторной передачи - Четыре
快速恢复, учитывая, что если сеть перегружена, она не сможет получить несколько повторных подтверждений подряд, поэтому отправитель будет думать, что сеть может быть не перегружена, поэтому не будет выполнять алгоритм медленного старта, а выполнит перегрузку алгоритм избегания
управление потоком
Это делается для того, чтобы отправитель не отправлял данные слишком быстро, а получатель успевал их получить.
Когда полученные данные в буфере получателя не могут быть обработаны, уменьшите размер окна отправителя, чтобы у получателя было достаточно времени для приема пакета данных. Или, когда получатель бездействует, отправитель регулирует размер окна, чтобы ускорить передачу и разумно использовать сетевые ресурсы.
Трехстороннее рукопожатие TCP
-
первое рукопожатие: клиент отправляет (SYN, seq) на сервер
- Один
SYN报文 - клиент
初始化随机序列号(seq)
- Один
-
второе рукопожатие: сервер отправляет (SYN, ACK, seq, ack) клиенту после получения запроса
- мой собственный
SYN报文а такжеACK报文 - сервер
初始化随机序列号seq - Номер подтверждения ack = серийный номер, отправленный клиентом + 1, указывающий, что он получил
- мой собственный
-
третье рукопожатие: после того, как клиент получает подтверждающий ответ от сервера, он отправляет (ACK, seq, ack) на сервер
- Подтверждение ответа Сообщение ACK
- Последовательность, значение — это значение подтверждения, отправленного клиентом во втором рукопожатии.
- Подтверждение номера подтверждения, значение равно серийному номеру сервера + 1, сообщая серверу, что я его получил.
Почему не дважды?
- подтвердить обе стороны
发送а также接收Способность нормальная? - взаимный
确认初始化序列号, и сообщите другой стороне, какой серийный номер может получить сообщение. Если он используется только дважды, сервер не знает, был ли подтвержден его серийный номер другой стороной, что может привести к получению недопустимого сегмента сообщения. сервером, что приводит к возникновению ошибки.
Почему не в четыре раза?
Поскольку в этом нет необходимости, подтверждение было подтверждено трижды.
ПТС махнул четыре раза
Волна закрытия TCP-соединения,И клиент, и сервер могут инициировать операции отключения., взяв в качестве примера инициацию на стороне клиента
- Браузер отправляет первым
FINсообщение,Seq= Инициализируйте серийный номер на сервере и прекратите отправку данных, но по-прежнему можете принимать данные, полученные от сервера - После того, как сервер его получает, он отправляет
ACK = серийный номер браузера + 1 для браузера, указывающего на получение - Данные сервера были отправлены и отправлены в браузер
FINсообщение,Seq= серийный номер для браузера - После того, как браузер его получает, он отправляет
ACK= серийный номер сервера + 1 на сервер, указывающий на получение
После необходимого после конца четвертой волны через некоторое время (время ожидания после набора таймера 2MSL), чтобы ваш сервер получил пакеты ACK, войдут в состояние OFF, сервер получает пакеты ACK, также закройте соединение
Зачем ждать какое-то время перед закрытием, вы не можете подождать?
Это делается для предотвращения потери или ошибки сегмента подтверждения, отправленного на сервер, что может привести к сбою нормального завершения работы сервера. Время ожидания составляет 2MSL, что также является максимальным временем выживания пакета в сети, если оно превышает это время, оно будет отброшено.
RFC793 предусматривает, что MSL составляет 2 минуты, но в практических приложениях обычно используется 30 секунд, 1 минута и 2 минуты.Если это время превышено, активный доводчик отправит битовый пакет состояния RST, указывающий, что соединение сброшено. , В это время человек, которого закрывают, знает, что другая сторона закрыла соединение.
Если активное отключение не ждет из-за мультиплексирования портов, возможно, активное отключение открыло другое соединение.В это время отключение все еще пытается инициировать запрос FIN, в результате чего активное отключение получает много бесполезных пакетов. Поскольку у пакета есть порядковый номер, можно сделать вывод, что это не тот пакет, который должен быть получен в данном соединении, и он не будет обработан. По этой причине необходимо подождать, пока активное завершение работы не будет отправлять запросы FIN перед мультиплексированием портов.
Зачем махать четыре раза?
TCP использует четыре взмаха рук, потому что соединение TCP является полнодуплексным, поэтому обе стороны должны разорвать соединение другой стороны соответственно, а освобождение соединения одной стороны может означать только то, что данные больше не могут быть отправлены на другая сторона, но данные могут быть получены.
Следовательно, при закрытии соединения, когда сервер получает сообщение FIN, он, скорее всего, не закроет сокет сразу, потому что у него все еще могут быть сообщения, которые не были отправлены, поэтому он может только ответить сообщением подтверждения, сообщая клиенту " Вы отправили сообщение, которое я получил», я могу отправить сообщение FIN после того, как все мои сообщения будут отправлены, поэтому я не могу отправить их вместе, поэтому мне нужно четыре раза помахать
Закрепление и обработка TCP
Прилипший пакет означает, что для предотвращения передачи большого количества данных несколько сегментов TCP объединяются в один и отправляются. Это склеивание нескольких пакетов данных в один пакет.С точки зрения приемного буфера заголовок следующего пакета данных отправляется непосредственно в конец предыдущего пакета данных. Поскольку передача на уровне TCP является потоковой, самой большой проблемой является отсутствие границ, а отсутствие границ приведет к склеиванию данных.
Распаковка предназначена для разделения задачи и снижения частоты ошибок.
Сценарии, вызывающие липкие мешки
- Получатель не получает пакеты в буфер вовремя, что приводит к получению нескольких пакетов.
- Поскольку TCP использует значение по умолчанию
Nagle算法, сам алгоритм также может привести к проблеме залипания пакетов - Из-за ПТС
复用вызывают липкие пакеты. Из-за возможности повторного использования TCP-соединений установление соединения может использоваться несколькими процессами на одном хосте, поэтому обязательно будут странные проблемы с граничной сегментацией при потоковой передаче данных различной структуры в TCP. - Проблема залипших пакетов, вызванная слишком большими пакетами данных. Например, размер содержимого сообщения в буфере прикладного процесса превышает размер области буфера отправки, что может привести к залипанию пакетов, потому что сообщение было разделено и предыдущая часть была получена, но другая часть была получена.Часть может быть просто помещена в буферный буфер и готова к отправке, что приведет к тому, что последняя часть прилипнет к пакету
- Управление потоком, контроль перегрузки также может привести к залипанию пакетов.
Nagle算法,主要做两件事:
一是只有上一个分组得到确认,才会发送下一个分组;
二是收集多个小分组,数据包大小达到最大段大小(MSS),在一个确认到来时一起发送。
多个分组拼成一个数据段发出去,如果没有处理好边界问题,在解包的时候就会发生粘包
Как бороться с липкими пакетами
- если
Nagle算法В результате алгоритм может быть правильно закрыт в сочетании со сценарием приложения. - если не
-
尾部标记序列. Обозначайте границы пакетов специальными идентификаторами, такими как \n\r\t или некоторыми скрытыми символами. -
头部标记分步接收. Добавьте к заголовку сообщения TCP, чтобы указать длину данных. При использовании протокола с заголовком сообщения в заголовке сообщения хранятся начальный идентификатор и информация о длине сообщения.Когда поставщик услуг получает заголовок сообщения, он анализирует длину сообщения, а затем считывает содержимое длины в обратном порядке. - Когда прикладной уровень отправляет данные, они отправляются с фиксированной длиной.Сервер считывает содержимое заданной длины как полное сообщение.Если оно недостаточно длинное, он добавит фиксированные символы в пустое место.
-
Почему UDP не склеивает пакеты
- Поскольку UDP
面向消息的协议, сегмент UDP представляет собой сообщение, приложение должно извлекать данные в единицах сообщений и не может извлекать ни один байт данных за раз - UDP имеет
保护消息边界, В каждом UDP-пакете есть заголовок сообщения (адрес источника сообщения, информация о порте и т. д.), чтобы принимающая сторона могла легко выполнять обработку разделов. Протокол передачи обрабатывает данные как независимое сообщение и передает их в Интернете. Получатель может получать только независимые сообщения. Если содержимое сообщения слишком велико и превышает размер, который получатель может принять за один раз, часть данных потеряется, потому что даже если и потеряется, то дважды не получит
Различия и применимые сценарии между TCP и UDP
-
TCPмедленная передача;UDPвысокоскоростной -
TCPПротокол надежен, с контролем перегрузки и управлением потоком;UDPПротокол ненадежен, и нет контроля перегрузок и управления потоком и т.д. -
TCPПротокол ориентирован на соединение и требует 3 рукопожатия;UDPПротокол не требует установления соединения и не требует рукопожатий. -
TCPТолько одностороннее соединение;UDPПоддержка широковещательной передачи, один-к-одному, один-ко-многим и многие-ко-многим может быть -
TCPМинимальный размер заголовка — 20 байт;UDPМинимум 8 байт -
TCPОн ориентирован на байты при передаче; иUDPориентирован на сообщение -
TCPПротокол присваивает метки сегментам при передаче сегментов данных;UDPнет согласия
Кроме того, номера портов TCP и UDP не зависят друг от друга, поэтому они могут быть одинаковыми.
Применимая сцена
TCPОн подходит для передачи большого объема данных и сценариев, требующих надежной передачи (подтверждение данных, повторная передача, сортировка и т. д.), таких как вход в систему, передача файлов и т. д.UDPОн подходит для передачи небольшого объема данных и сценариев, требующих высокой эффективности, таких как приложения реального времени, обмен мгновенными сообщениями, видеозвонки в чате и т. д.
Эпилог
Ставь лайк и поддержи, оставь аромат в руке и будь почетным
Спасибо, что ты есть, давай!