Транспортный уровень модели OSI. Сокеты, UDP и TCP.
Взаимодействие программ через Интернет
Ну что же с сетевым уровнем мы разобрались в предыдущих статьях. Осталось немного. Буквально пара лекций и начинаем с нового года кодить что-то полезное.
Сегодня я расскажу как приложения обмениваются данными через интернет.
Прежде всего разберем все по пунктам.
На компьютере программа представляет собой данные и код, которые хранятся в соответствии с определенной структурой (форматом) в файлах. Когда операционная система хочет запустить программу она копирует эти данные с кодом из файла в память компьютера, считывает из заголовка адрес точки входа в программу и передает туда управления командой "ПРЫГ", которая задает значение регистру "СЧЕТЧИК КОМАНД", также попутно настраивает переменные окружения. Каким именно образом это делается зависит от ОС. Более подробно об этом будет сказано при разработке программ.
Процесс на компьютере может делать много полезного. Но для нас наиболее сейчас важно 2 вещи.
- Процесс может открывать файлы, читать и записывать данные в них.
- Процесс может открывать соединение с Интернетом и читать и записывать в него, также как при работе с файлами.
При открытии файла указывается путь к этому файлу в файловой системе и режим работы с ним (чтение, запись).
Процесс открытия соединения с Интернетом происходит с помощью открытия сокета - в этом случае указываются настройки соединения с удаленным компьютером (или компьютерами).
Когда мы записываем не в файл, а в сокет происходит следующее. В системе формируется специальный внутренний адрес (порт), который определяет локальный адрес процесса. Это число до 65535. Таким образом когда компьютер посылает данные на другой компьютер через сеть, он указывает не только IP адрес получателя, но и порт (внутренний адрес программы) которая имеется на компьютере получателя. Порт задается при настройке конфигурации сокета.
UDP
Это сегмент данных, который помещается в IP пакет. Он также содержит свой заголовок, в котором как раз и записываются порт отправителя и порт получателя.
Когда IP пакет через сеть приходит на компьютер получателя (по его IP), из него извлекается UDP-данные, из заголовка этих данных достается порт получателя и передается специальной программе (в Linux это inetd) эта программа берет порт, и находит по его номеру программу (сервер), запускает ее и передает ей данные UDP-пакета. Порт отправителя (вместе с его IP) нужен обычно для отправки ответов отправителю.
UDP-дейтаграммы не отличаются большой надежностью. Поэтому часто теряются или портятся во время передачи. Однако для их передачи требуется меньше ресурсов, что весьма полезно для передачи мультимедиа (аудио, видео, IP-телефонии и.т.п). Также UDP часто применяется как каркас на базе которого разрабатываются более специфические протоколы передачи данных.
TCP
Протокол TCP был разработан для надежной передачи данных. При работе с ним создается канал, через который как бы связываются 2 процесса на разных компьютерах через интернет. Этот протокол умеет проверять корректность данных, перезапрашивать поврежденные пакеты, восстанавливать их исходную очередность, если они во время передачи по сети предались не последовательно. Таким образом TCP в отличии от UDP предоставляет надежный способ связи.
Когда передается пакет по TCP - получающий компьютер должен выслать подтверждение о получении пакета (ACK). Иначе отправитель повторит отправку этого пакета. Также повторная отправка будет выполнена и если не придет подтверждение в течении определенного времени отсчитываемого по таймеры после отправки пакета в сеть. Это и есть одно из основных отличий TCP от UDP (в UDP подтверждения о получении пакетов не отсылаются).
Однако TCP из-за своих особенностей реализации не может использоваться для широковещательной и многоадресной рассылки пакетов в интернете.
Пример TCP-соединения - это открытие страницы сайта в браузере. То есть браузер использует для своей работы протокол TCP. А вот прослушка аудио и просмотр видео уже происходит через UDP, точнее его надстройки - протокола RTP.
В следующем посте мы рассмотрим примеры популярных сетевых программ, а также я расскажу как работают P2P приложения в интернете. На этом пожалуй и закончится вводный курс. А в Новом Году мы начнем рассматривать уже реальное написание сетевых программ. Сначала простых, а затем более сложных и постепенно перейдем к рассмотрению и написанию собственных блокчейн-систем. А также в лекциях "Азбуки блокчейна" будем уделять внимание проектам golos и ethereum и другим.