
Полный текст первых минут лекции «TCP и UDP» из видеокурса PracticU – субтитры с временной меткой для каждого абзаца. Так можно прочитать и найти нужные темы ещё до начала обучения.
Этот урок посвящен протоколам TCP и UDP. Важнейшие вещи на пути познания устройства связи между компьютерами. Впрочем, в этой лекции мы не будем в них слишком углубляться.
Скорее взглянем на них с высоты птичьего полета. Лекция будет включать следующие темы. Мы поговорим о номерах портов TCP и UDP. Уберем широко распространенные суеверия, связанные с портами.
То есть часто я слышу, как с языков начинающих компьютерщиков слетают одни и те же ошибки, когда они беседуют о портах. А также мы поговорим о конкретных номерах портов, за которыми закреплены конкретные их применения.
У некоторых номеров портов есть стандартный смысл назначения на уровне общемировых соглашений. И мы закончим сравнением между протоколом TCP и протоколом UDP.
Зачем у нас два протокола на уровне 4? Зачем нужно две упаковки, два способа запаковывать отсылаемую информацию в посылку? Итак, пристегните ремни, мы начинаем.
Что такое номера портов, с чем их едят? Для этой беседы сперва мы должны разобраться с тем, что такое клиент и что такое сервер.
На рисунке вот с этой стороны у нас клиенты, а вот тут у нас изображён сервер. Начнём с сервера. Сервер — это компьютер. У него есть процессор или процессоры, память, RAM и ПЗУ.
У него есть всё то же самое, что и у всех остальных компьютеров. Впрочем, на нём вещи стоят несколько посильнее. Серверы всё-таки работают 24 часа в сутки и обслуживают сразу очень много клиентов, но всё же сервер — это такой же компьютер.
Как и у всякого уважающего себя компьютера, когда он подключён к сети, у него есть свой адрес IP. 123031 — таков адрес IP у нашего сервера.
Так вот, на сервере работают программы, которые являются программами для сервера. Сервер отличается тем, что на нём просто работают особые программы. Вот и всё, что качественно отличает сервер от рабочей станции, от клиента.
Например, на нашем сервере может работать программа, которая называется WebServer. То есть этот сервер даёт услуги веб-сайта. К нему можно подключиться и полазить на веб-сайте, который на нём.
Или пример ещё одной программы для сервера — это FTP-сервер. Склад файлов, куда их можно закачивать и откуда их можно скачивать. И это всё организует серверская программа FTP.
Или возьмём другой пример менее стандартный. Программа для сервера, которая поддерживает какой-то игровой мир.
Есть какая-то компьютерная игра, рассчитанная на то, чтобы в неё играло всё время одновременно много людей. И вот среди программ этой игры есть также программа для сервера, которая управляет всей игровой вселенной, куда подключаются игроки со своих программ-клиентов.
Подключаются через интернет. А что такое клиент? Это тоже компьютер. Если он подключен к сети, у него тоже есть свой адрес IP, в нашем примере это такой, 64001.
И догадайтесь в трёх раз, какая же особенность клиента. Что его отличает от сервера? Совершенно верно, на клиенте работают программы, характерные для клиента.
Сервер гоняет через свой процессор программы для сервера, а клиент — программы для клиента. Например, клиентская программа, которая умеет разговаривать с веб-сервером — это веб-браузер.
Например, Chrome, Internet Explorer, Firefox — это всё клиентские программы. А если я хочу скачать или закачать файлы с FTP-сервера, то мне, соответственно, нужна клиентская программа для FTP.
Например, я люблю программу Total Commander, которая умеет состыковаться с серверской программой для FTP-сервера Filezilla. А, например, клиент какой-нибудь компьютерной игры — это, собственно, то, что вы покупаете в магазине как геймер.
Какой-то носитель информации с игрой, так вот это клиент игры. Но также этой игре соответствует серверская программа, которая работает у них там где-то на сервере, куда вы подключаетесь, чтобы играть через интернет, и где, собственно, строится сама жизнь
всего игрового мира. Вот что такое клиент и вот что такое сервер. Теперь мы можем вернуться к номерам портов.
Допустим, что клиент 1, C1, хочет отправить какую-то информацию. Назовём это дата, принадлежащая C1. Он это хочет отослать серверу и получить от него ответ.
Допустим, там веб-сервер, и клиент послал запрос: "Дай мне веб-страничку". И в то же время C3 тоже хочет послать информацию серверу. Data C3. Он это посылает той же самой машине.
Но на этой машине, на этом сервере, установлена также программа FTP Server. И C3 домогается именно туда. На двух клиентах работают два клиентских приложения.
Веб-браузер на одном, а на другом Total Commander. И они создали свою информацию для отправки в верхних уровнях OSI. и спустили это на транспортный уровень.
А на транспортном уровне, помните, у нас есть два протокола, которые умеют передавать информацию. Я говорю о протоколах TCP и UDP. TCP служит для надёжной связи, а UDP — для связи в реальном времени.
В нашем случае мы хотим получить интернет-страничку и файлы через FTP, и поэтому нам нужен TCP. Наши клиентские приложения выберут использовать TCP, потому что и получить файлы мы хотим без погрешностей.
без искажений, и интернет-странички тоже. Итак, на 4 уровне выбран TCP. Всё упаковано и спущено на более нижние уровни – OSI. На 3 уровне наши посылки получат указание адресов IP.
Посылки обоих наших клиентов получат одно и то же поле адресат с точки зрения адреса IP. Оба запроса пойдут к адресу IP 12 30 31, потому что это IP-адрес нашего FTP-сервера и веб-сервера.
Поэтому именно этот адрес будет указан в поле IP-адрес получателя, и информация пойдёт передаваться по сети и попадёт в наш сервер.
Сервер откроет посылки, увидит, что это для его IP-адреса, и посылки попадут в четвёртый уровень, в TCP. И тут сервер задастся таким вопросом:
«Эй, у меня тут есть информация от C1». Для какого сервера эта посылка? Для моего FTP-сервера или для моего веб-сервера? Или же вовсе для моего сервера, на котором творится компьютерная игра?
На мне ведь установлены 3 программы сервера. А также я тут вижу, что C3 мне тоже послал какой-то запрос, какие-то данные. Куда это он послал?
В веб-сервер, в FTP-сервер или в сервер компьютерной игры? На мне работают 3 разных сервера, откуда я знаю, к какому серверу предназначается запрос.
Какой программе-серверу я должен передать эту информацию и какой программе-серверу я должен передать эту информацию.
А теперь догадайтесь трёх раз, как компьютер ответит себе на этот вопрос. Верно! Правильный ответ — это номера портов. И это как раз и есть роль номеров портов.
Номера портов нам как раз и нужны для того, чтобы мы могли направлять информацию в рамках одного и того же адресата к разным его программам.
Обозначать, что определённая посылка направляется к веб-серверу. И обозначить, что иная информация направлена к серверу FTP. Чтобы у каждого запроса обозначить, к какой программе он направляется.
И это делается с помощью просто указания номера. Это и называется номер порта. Например, когда на нашем сервере мы включили программу веб-сервер, она объявила, что мой номер порта — это 80.
Если хотите что-то послать мне, укажите номер порта 80. И когда C1 хочет послать веб-серверу какой-то запрос, какую-то посылку, то он должен добавить в сегменте TCP, тут на уровне 4, на 4 уровне OSI он должен добавить, что это адресуется к порту 80.
И компьютер-получатель, который по адресу 123031, поймет, что данные C1 предназначены для веб-сервера, который работает на нем, на сервере.
Его веб-сервер прослушивает порт 80. А программа FTP-сервер, когда мы ее запустили, зарезервировала для себя порт 21. FTP-сервер сказал, что он хочет порт 21.
Если кто-то присылает информацию для порта 21, то это мне. Если кто-то хочет послать что-то мне, то пусть укажет, что это для порта 21. И когда посылка попадет в 12.30.31, то тамошний компьютер сможет направить информацию именно в FTP-сервер.
А наш игровой сервер, когда мы его запустили, сказал, что он хочет порт. Тут у нас пример нестандартного порта. Допустим, игровой сервер захотел порт 27001.
Это не маленький номер, который все зарезервированы жестко и стандартно на уровне Общемирового соглашения. Авторы же нашего игрового сервера просто выбрали какой-то номер порта.
Произвольно для своей программы сервера. И все клиенты, все игроки, которые хотят присоединиться к моей игре, должны будут указать номер порта 27001. То есть я хочу сказать, что с помощью номеров портов наш компьютер-сервер сможет понять, в какой из его серверов направлена информация.
И вообще есть ещё очень много приложений, есть, например, DNS-сервер. Он получит номер порта 53, а, например, SSH получит 22, а Telnet получит 21, а IMAP для скачивания почты получит 143, если я не ошибаюсь.
И есть ещё очень много других приложений, за которыми всегда закреплены стандартные номера портов. Впрочем, до сих пор мы говорили только о номерах портов, которые определяют серверские программы.
Ну а что касательно клиентских программ? На компьютере-клиенте ведь тоже работает множество клиентских приложений. Так вот, номера портов тоже нужны для того, чтобы определить, куда в клиентском компьютере, какой программе, адресовать ту или иную посылку.
На компьютере C1 пользователь открыл веб-браузер и отправил запрос к 123031 получить страничку интернета.
И когда он открыл веб-браузер, веб-браузер случайным образом выбрал себе номер порта, который он будет прослушивать. Допустим, он выбрал номер 1027 и сказал веб-браузере:
«1027 — это будет мой номер порта». Лектор пишет на иврите «web-браузер». Зачем же нужен этот номер 1027? А именно на этот номер порта будет возвращать сервер, запрошенную страничку интернета.
Множество разных посылок, разных информаций могут прийти на компьютер C1. Но только та информация, которая предназначена для порта 1027, попадёт в веб-браузер на компьютере C1.
А на компьютере C3 пользователь включил какую-то клиентскую программу, которая общается с FTP-сервером. И его FTP-клиент случайно получил номер порта, допустим, 2032, потому что в тот момент на компьютере C3 это был свободный порт.
И когда наш FTP-сервер даст свой ответ, компьютер, у которого IP 64002, то этот ответ попадёт в программу FTP-клиент, которая ждёт за портом 2032.
И только эта программа, связанная с портом 2032, получит ту информацию, ответ FTP-сервера. Я надеюсь, теперь стало ясно, что такое номера портов и зачем они нужны.
А ещё есть стандартные номера портов для определённых предназначений. Если бы этого не было, то была бы следующая проблема.
Допустим, на нашем сервере сейчас работают