В одной из предыдущих статей мы выяснили, что такое как таковой протокол в ИТ и зачем он нужен. Кратко так:
- Компьютеры могут общаться между собой.
- Для этого им нужно договориться о языке общения — это и есть протокол.
- Протоколы бывают физическими — какие вольты, амперы, радиочастоты и модуляции использовать оборудованию.
- Протоколы бывают логическими — как понимать сигналы, закодированные в этих вольтах и модуляциях.
- Существует целый стек протоколов — как многослойный пирог. В фундаменте там вольты и амперы, потом основы языка, потом сложные конструкции языка и на самой верхушке — как должны общаться приложения. Этот стек (или модель) называют OSI — Open Systems Interconnection Model.
Сегодня поговорим о протоколах TCP/IP — именно они отвечают за работу всего интернета и позволяют нам отправлять запросы на сервер в другой стране и получать в ответ гифки, музыку и всё остальное.
Коротко: что такое и зачем нужны TCP/IP
- TCP/IP — это названия протоколов, которые лежат в основе интернета. Благодаря им компьютеры обмениваются данными, не мешая друг другу.
- Оба протокола отвечают за передачу данных, но IP просто отправляет их в сеть, а TCP ещё следит за тем, чтобы эти данные попали по нужному адресу.
- В TCP встроено подтверждение получения, поэтому при хорошей связи данные точно дойдут до получателя.
Что такое TCP/IP
TCP/IP — общее стандартное название двух протоколов, TCP и IP. Они стоят рядом потому, что протокол TCP работает поверх IP, а вместе эти протоколы образуют универсальный стек протоколов передачи данных.
TCP — это протокол управления передачей (Transmission Control Protocol). Его задача — управлять отправкой данных и следить за тем, чтобы они были гарантированно приняты получателем. Именно гарантия получения данных и сделала этот протокол таким востребованным. Про гарантированную доставку расскажем чуть позже.
IP — протокол, который отвечает за адресацию: чтобы нужные данные долетели до нужного компьютера. Его основная задача — логически соединить компьютеры между собой, чтобы можно было отправлять данные от одного к другому. Для этого он выделяет IP-адреса, строит маршруты доставки пакетов, а главное — умеет организовать передачу данных с помощью пакетов.
Получается так:
- IP-протокол знает, ЧТО нужно сделать, чтобы доставить данные от одного компьютера к другому;
- а TCP-протокол знает, КАК это сделать и при этом убедиться, что получатель точно получил все свои пакеты.
Пакетная передача данных
Когда один компьютер хочет передать что-то другому, то он не отправляет байт за байтом по очереди. Вместо этого он отправляет данные мелкими порциями, а получатель собирает из них исходные данные. Этим как раз занимаются протоколы — разбивают всё на части и склеивает заново, потому что каждый пакет пронумерован.
Пакет может быть размером от 1 до 64 килобайт, но в нём всегда есть несколько обязательных полей — по ним протокол понимает, кому какие данные нужно передать.
Гарантированная доставка пакетов
Протокол TCP следит за тем, пришли к получателю отправленные данные или нет и нужно ли их отправить заново. Для этого в нём есть механизм подтверждения: после очередной порции данных получатель отправляет сигнал, что данные получены, а отправитель дожидается этого сигнала.
Если сигнала подтверждения нет, то протокол отправляет этот же пакет данных ещё раз — мало ли что. Если подтверждения нет несколько раз подряд, то протокол выдаёт сообщение об ошибке и закрывает соединение.
Но если подтверждать получение каждого пакета, то на это будет уходить очень много времени: при скорости сети в 100 мегабит в секунду реальная скорость передачи данных будет около 50 килобит в секунду. А всё потому, что отправитель не будет передавать новые данные, пока не получит подтверждение по предыдущему пакету. В итоге почти всё время сеть будет занята не передачей данных, а подтверждениями и подтверждениями подтверждений.
Чтобы не было таких задержек, в протоколе предусмотрели кумулятивное и выборочное подтверждение:
- В кумулятивном получатель подтверждает приём последнего пакета и всех предыдущих.
- В выборочном — подтверждает диапазон пакетов, которые он получил. Если какого-то пакета нет в подтверждении, отправитель посылает его заново. Это одна из оптимизаций работы протокола, и в TCP таких оптимизаций много — благодаря им у нас шустрый интернет с быстрыми подтверждениями.
По умолчанию используется кумулятивное подтверждение, например, каждых 100 пакетов:
Уровни TCP/IP
На самом деле связка TCP/IP состоит из четырёх уровней, как слоёный пирог. Каждый из уровней отвечает за что-то своё, а вместе они заняты тем, чтобы точно доставить пакет от отправителя к получателю и убедиться, что по пути ничего не потеряно (а если потеряно — отправить заново).
Обычно TCP/IP разделяют на такие уровни:
- Канальный уровень. Он отвечает за физическое соединение устройств друг с другом, проще говоря — за канал связи. Wi-Fi, проводное подключение по кабелю, блютус — вот с чем работает канальный уровень. Алгоритмы как раз на этом уровне следят за тем, чтобы пакеты точно передались по сети на нужное устройство, и если этого не произошло, повторяют отправку.
- Межсетевой уровень. Если канальный уровень отвечает за связь между устройствами в одной подсети, то межсетевой — за связь между разными сетями, в том числе и в интернете. Для этого он запрашивает IP-адреса устройств, смотрит, в каких подсетях они находятся и по этим данным строит оптимальный маршрут от одного устройства в сети к другому.
- Транспортный уровень. На этом уровне используется канал связи, налаженный на предыдущих двух уровнях. Задача транспортного уровня — передать данные по этому каналу и убедиться, что всё передано без ошибок и в полном объёме. Для этого используется два основных протокола — TCP и UDP. Если коротко, то TCP гарантирует доставку всех пакетов, но передаёт данные не очень быстро, а UDP отправляет всё очень быстро, но ничего не гарантирует ¯\_(ツ)_/¯
- Прикладной уровень. Это самый верхний уровень, с которым и работают большинство программ и разработчиков. Он отвечает за связь между приложениями, сервисами и серверами по разным протоколам — HTTPS, FTP, IMAP и остальными. На этом уровне программы пользуются просто стандартами этих протоколов и не беспокоятся за то, как наладить связь с другими устройствами — за это отвечают три предыдущих уровня.
И что с того?
Связка протоколов TCP/IP делает так, чтобы мы могли отправить данные куда-то в интернет и они точно дошли. Всё это происходит быстро, незаметно для нас, где-то в глубинах наших компьютеров и телефонов.
При этом связка TCP/IP — не единственная, которая бывает. Например, есть ещё UDP/IP, которая чаще используется в онлайн-играх и видеосозвонах — там нет подтверждения получения пакетов, просто данные льются без конца.
Если вы не инженер или не разработчик сетевых систем, вам не нужно в этом разбираться — вы просто пользуетесь этим каждый день. Но зато теперь вы знаете, как это работает.