Книга «Теоретический минимум по Computer Science. Сети, криптография и data science»

20

Хватит тратить время на занудные учебники! Это краткое и простое руководство предназначено для читателей, не заботящихся об академических формальностях. Большинство технологических прорывов нашей эпохи происходят в цифровой среде, создаваемой программистами. Ученые-компьютерщики объединяют различные области исследований и расширяют возможности этого нового мира. Чтобы научиться плавать в океане информации, необходимо разбираться в основах сетевых технологий, криптографии и науке о данных. Вы узнаете как эффективно манипулировать данными, освоите машинное обучение и современные концепциии безопасности. Раскройте мощь Computer Science и станьте гуру цифровой эпохи!

Доступ

В XIX веке люди-операторы должны были декодировать электрические сигналы телеграфа на человеческий язык и наоборот. На рубеже веков их работу облегчило новое устройство, получившее название «телетайп». Эти машины были подключены к телеграфным проводам и включали в себя механическую пишущую машинку, которая могла автоматически печатать входящие телеграфные символы.

Телетайпы также имели клавиатуру, поэтому символы, набранные их оператором, автоматически передавались по телеграфному проводу. Это позволяло людям общаться на больших расстояниях: сообщения, набранные на одной машинке, печатались второй машинкой на другой стороне линии.

Терминалы

Когда в 1950-х годах появились первые коммерческие электронные компьютеры‚ у них еще не было экранов. Чтобы получать обратную связь от машин, люди должны были подключать свои входные/выходные соединения к телетайпам. Так они могли передавать данные и инструкции на компьютер, набирая текст, и ответ их компьютера печатался в режиме реального времени. Такие телетайпы, которые позволяют взаимодействовать с компьютерами через текст, называются терминалами.

Компьютерная программа, которая обрабатывает информацию и инструкции, поступающие в терминал и исходящие из него, называется оболочкой. Для того чтобы взаимодействовать с людьми, она использует интерфейс командной строки (Command-Line Interface, CLI). Когда пользователь терминала вводит команду в CLI, оболочка подтверждает каждый символ, прося терминал распечатать его. При этом пользователь может в режиме реального времени видеть, что именно он печатает. Пользователь может ввести непечатаемый символ (Non-Printing Character, NPC), называемый возвратом каретки, и оболочка выполнит всю строку как команду, при необходимости запросив терминал для печати каких-то выходных данных‚ после чего будет ожидать следующей команды.

В 1960-х годах появились стеклянные телетайпы. Они работали точно так же, как и старые, за исключением того, что они отображали символы на экране вместо печати на бумаге. Вот почему и по сей день отображение текста на экране терминала называется печатью!

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

Видеомониторы были представлены в конце 1960-х годов, а первый коммерческий компьютер с графическим интерфейсом (Graphical User Interface, GUI) появился в 1979 году. Сегодня практически все персональные компьютеры, такие как ноутбуки и телефоны, работают с оболочкой, которая управляет графическим интерфейсом: мы взаимодействуем со значками и окнами с помощью мыши, трекпада и сенсорного экрана (рис. 2.3).

image

Но многие айтишники продолжают взаимодействовать со своими компьютерами через CLI. Это может быть необходимым, например, для работы с корпоративными серверами, на которых не поддерживается графический интерфейс, но также и по личным предпочтениям. Некоторые используют свой графический интерфейс только для того, чтобы открыть эмулятор терминала: приложение, которое подключается к оболочке CLI компьютера и превращает ваш экран и клавиатуру в стеклянный телетайп.

Эмуляторы терминалов — это мощные интерфейсы. С помощью CLI можно выполнять практически любые текстовые задачи, такие как организация папок, отправка электронной почты, написание кода и компиляция ПО (рис. 2.4). Мы написали и отредактировали эту книгу в эмуляторах терминалов!

image

TELNET

В течение большей части 1950-х и 1960-х годов терминал должен был быть подключен непосредственно к компьютеру, чтобы взаимодействовать с его оболочкой. Однако все изменилось в 1969 году, когда инженеры разработали способ подключения терминалов к любому компьютеру в сети. Они называли эту технологию teletype over network или telnet.

Сегодня эмуляторы терминалов могут использовать telnet для доступа к удаленным компьютерным оболочкам через интернет. CLI удаленной оболочки должен быть чрезвычайно надежным, так как неупорядоченные или отсутствующие символы могут привести к выполнению ошибочных и потенциально разрушительных команд. По этой причине предпочтительным протоколом транспортного уровня для telnet является TCP, а не UDP. Серверы telnet‚ как правило‚ ожидают подключения через TCP-порт 21.

Когда через порт 21 установлено TCP-соединение, сервер telnet запускает оболочку и отправляет все входящие данные из соединения в оболочку. Вывод оболочки отправляется клиенту. На стороне клиента все символы, введенные пользователем, посимвольно передаются на сервер в режиме реального времени. И когда клиент получает один или несколько символов, они отображаются на эмуляторе терминала.

Обычно после установки соединения telnet удаленная оболочка запрашивает имя пользователя и пароль с целью аутентификации. После входа в систему клиент telnet работает как терминал, подключенный непосредственно к серверу. Если на компьютере работает сервер telnet, любой компьютер, подключенный к интернету, может выступать в качестве терминала для этого сервера. Гики способны управлять компьютером на другом континенте, как если бы они сидели перед его экраном и клавиатурой!

Протоколы связи через интернет используются не только программистами. А теперь рассмотрим самые популярные приложения интернета, начиная с наиболее известного способа обмена письменными сообщениями.

Почта

В 1960-х годах немногие компьютеры совместно использовались множеством пользователей. В то время «почтовые» программы уже были популярны, но они позволяли оставлять сообщение только коллеге, работающему на том же самом компьютере. Эти программы просто добавляли текст к файлам, которые служили почтовыми ящиками. Каждому пользователю назначался один файл почтового ящика. Когда пользователи входили в систему, появлялись оповещения, если в их почтовых ящиках находились новые сообщения.

В 1970-х годах компьютерные сети выросли и появилась технология доступа к файлам на удаленных компьютерах. Почтовые программы эволюционировали для добавления текста в почтовые ящики уже удаленных компьютеров. Это позволяло пользователям удаленных компьютеров обмениваться сообщениями, как если бы они работали на одной машине. Со временем программисты улучшили эффективность этих систем путем постепенного принятия общего формата сообщений, который выглядел так:

From: White at SRI-ARC
Date: 24 JUL 1973 1527-PDT
Subject: Multi-Site Journal Meeting Announcement
NIC: 17996
At 10 AM Wednesday 25-JULY there will be a meeting
to discuss a Multi-Site Journal in the context of
the Utility. Y’all be here.

Сообщение начинается с заголовков, которые содержат общую информацию о сообщении, такую как его отправитель, получатель и тема. Каждый заголовок занимает одну строку, и двоеточие отделяет имя заголовка от его содержания. После заголовков пустая строка сигнализирует о начале тела сообщения. Эти сообщения широко использовались программистами, которые стали называть их email (e расшифровывается как electronic). По сей день письма, которыми мы обмениваемся, следуют такому формату.

В 1973 году на вышеприведенное письмо можно было ответить, добавив новое сообщение в почтовый файл Уайта на компьютере SRI-ARC. В то время TCP/IP и DNS еще не было, и компьютеры получали такие вот прозвища. Позже слово at уступило позиции символу @, поэтому почтовый ящик в примере был бы записан как White@SRI-ARC. Для справки‚ SRI расшифровывается как Stanford Research Institute — это одна из организаций, которая помогла создать и стандартизировать этот формат сообщений.

Почтовые серверы

Компьютеры постепенно становились менее дорогими, и к 1980-м годам уже не было ничего необычного в том, что кто-то работал на нескольких машинах. Но было бы легче связываться с людьми по электронной почте, если бы у каждого человека его основной адрес почтового ящика был в одном месте. Многие группы пользователей принимали решение держать свои основные ящики на одном хосте, как если бы все по-прежнему работали на одном компьютере.

Организации помогали этому, назначая один из своих компьютеров почтовым сервером.
В то время студенты университетов и инженеры-технологи получали учетную запись на почтовом сервере своей организации, независимо от того, какие компьютеры они использовали. Основной адрес почты каждого указывал на этот почтовый сервер. С разных компьютеров люди использовали telnet для входа на почтовый сервер и чтения электронных писем, хранящихся в их отдельных файлах почтовых ящиков.

В 1985 году была запущена DNS, и она значительно улучшила систему электронной почты. Организации начали использовать доменные имена и создавать записи MX для публичного объявления своих почтовых серверов‚ и доменные имена стали стандартным способом адресации почтовых ящиков. Например, ящик с именем White на почтовом сервере SRI получил адрес white@sri.com.

Имея такой адрес, любой может использовать DNS для обнаружения почтового сервера, на котором хранится файл почтового ящика, и отправки IP-пакетов на этот компьютер. Но, чтобы сохранить новое сообщение на чужом сервере, сначала нужно было получить доступ к файлам его ящика. Это было непростой задачей, поэтому инженеры принялись изобретать способы получения писем без внешних манипуляций с какими-либо файлами на принимающем сервере.

Настала заря протоколов электронной почты. Как NTP обеспечивает базовый функционал для обмена временем, так и почтовые протоколы позволяют программам обмениваться письмами. Были разработаны различные протоколы, и вскоре каждый почтовый сервер придерживался одного из них. Теперь электронные письма можно было отправлять практически в любое место, куда могли дойти IP-пакеты.

Поскольку любая организация, подключенная к интернету, могла участвовать в таком обмене, электронная почта быстро стала популярной. То, что начиналось как простые записки, оставленные на столе друга, постепенно становилось столь же важным, как и традиционная переписка.

В 1990-х годах интернет-провайдеры начали предоставлять доступ к интернету в домах людей. В качестве одной из основных продающих услуг интернет-провайдеры часто использовали возможность открывать учетные записи электронной почты на своих серверах. В те годы персональные компьютеры начали поставлять с уже предустановленными почтовыми программами. Люди в основном использовали их для подключения к своему интернет-провайдеру или почтовому серверу работодателя.

Электронная почта распространилась подобно лесному пожару. Обычные люди толпами стекались в интернет, иногда исключительно для того, чтобы воспользоваться почтой. И один протокол стал главным фактором этой революции электронной почты. Узнаем же, как передавать по нему сообщения между хостами и почтовыми серверами.

SIMPLE MAIL TRANSFER PROTOCOL

Наиболее широко используемым протоколом является Simple Mail Transfer Protocol (SMTP). Он задает правила общения между сервером электронной почты и клиентским компьютером. Как мы увидим далее, SMTP более сложен, чем протоколы запроса-ответа, такие как DNS и NTP.
Во-первых, письма могут содержать сообщения, которые не помещаются в один IP-пакет. Когда электронная почта передается многими IP-пакетами, важно, чтобы их полезная нагрузка была собрана в нужном порядке. По этой причине SMTP работает на TCP, а не на UDP.
Почтовые серверы ожидают входящих подключений через TCP-порт 25. Когда соединение установлено, сервер начинает взаимодействие. Он посылает сообщение, чтобы идентифицировать себя:

220 mail-server.example.com

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

HELO client.code.energy

На этом этапе сервер решает, хочет ли он продолжить общение, основываясь на том, кем является клиент. Некоторые почтовые серверы используют обратный DNS и сравнивают имя клиента, о котором он сам сообщил, с именем, связанным с его IP-адресом. Если почтовый сервер решает продолжить, он отправляет код ответа 250, который означает, что действие, запрошенное клиентом, было принято:

250 mail-server.example.com

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

MAIL FROM: <ada@code.energy>

Опять же у сервера есть возможность принять или отклонить эти данные. Некоторые почтовые серверы настроены на прием только с определенных адресов. Если адрес принят, сервер возвращает код 250:

250 Ок

Затем клиент должен сообщить серверу о целевом почтовом ящике:

RCPT TO: <charles@example.com>

Сервер подтверждает, принимает ли он этот почтовый ящик назначения. Если сервер соглашается принять сообщение, он использует тот же код возврата 250, сообщая клиенту, что тот может продолжить:

250 Ок

Теперь клиент может отправить команду DATA. Эта команда просит сервер начать передачу сообщения электронной почты:

DATA

Сервер подтверждает и инструктирует клиента сигнализировать об окончании передачи строкой, содержащей только точку. Код 354 информирует клиента о том, что сервер будет рассматривать следующие символы, которые он получит‚ как часть сообщения электронной почты:

354 End data with <CR><LF>.<CR><LF>

Затем клиент передает сообщение. Заголовки From, To и Date являются обязательными и должны присутствовать в каждом электронном письме. Другие заголовки, такие как Subject, обычно используются, но не являются обязательными. Тело сообщения также необязательно. Отправка почты без тела сообщения похожа на отправку пустого конверта. Вот пример сообщения, которое может передать клиент:

From: <ada@code.energy>
Date: Wed, 27 Nov 2002 15:30:34 +0100
To: <charles@example.com>
That brain of mine is something more than
merely mortal; as time will show.
.

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

250 Ok: queued as 1079212633C

На этом этапе клиент может быть уверен, что сервер либо доставит сообщение, либо возвратит1 его с сообщением об ошибке. Клиент может продолжить и отправить другую команду MAIL FROM для отправки новых писем. В противном случае он может вежливо сказать, что закончил, отправив QUIT:

QUIT

Получив это, сервер должен попрощаться и закрыть TCP-соединение:

221 Bye

Диалог, подобный этому, происходит каждый раз, когда вы отправляете письмо, — ваше почтовое ПО проводит его незаметно от вас. Первоначально в SMTP не было аутентификации: серверы безоговорочно верили‚ что клиенты отправляли правильные электронные письма. К сожалению, как только электронная почта стала популярной, безрассудные интернет-пользователи принялись отправлять всякий спам на все адреса, которые могли найти. Некоторые даже отправляют мошеннические письма с нелегитимными полями From.

Источник

Вам также могут понравиться