Форум программистов, компьютерный форум, киберфорум
Наши страницы
Сети и средства коммуникаций
Войти
Регистрация
Восстановить пароль
 
Max_Cross
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 55
1

Правильно ли я представляю себе, как работает интернет?

31.03.2019, 20:08. Просмотров 294. Ответов 1
Метки нет (Все метки)

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

Я стал придумывать, как подобное реализовал бы я, основываясь на своих оооочень скромных знаниях о сетевой архитектуре. Придумать такую схему оказалось совсем не сложно, но, когда я решил проверить, действительно ли интернет работает более-менее так, как я себе вообразил, я понял, что всевозможные ролики на ютубе объясняют работу интернета уж слишком абстрактно, и эту магию, благодаря которой пакет с данными достигает своей цели, никто мне объяснять не собирается... Так вот и сижу с парой теорий, не понимая, насколько они правдоподобны, поэтому решил спросить тут. Текста получилось много, смысла - несколько меньше... Я так же понятия не имею, в правильный ли я раздел пишу (но я видел, что что-то подобное спрашивали именно в этом разделе)
И так, мой набор теорий:

Теория первая:
Интернет представляет собой следующее:
Есть 256 "глобальных" узлов (провайдеров? Буду пока называть их узлами). Назовём их узлами 1-го уровня.
Каждый из узлов 1-го уровня соединён напрямую с ещё 256-ю узлами 2-го уровня.
Каждый из узлов 2-го уровня соединён напрямую с ещё 256-ю узлами 3-го уровня.
Каждый из узлов 3-го уровня соединён напрямую с 256-ю шлюзами (роутерами? модемами? буду пока называть их шлюзами)
ip-ардес 11.12.13.14 значит, что шлюз подключён к узлу 3-го уровня и имеет у него id 14. узел 3-го уровня имеет id 13 у узла 2-го уровня, который, в свою очередь, имеет id 12 у 11-го узла первого уровня.
Все 256 узлов 1-го уровня соеденены между напрямую.

Допустим, я хочу послать пакет с данными с компьютера с адресом в локальной сети 192.168.0.2 и mac-адресом 01-02-03-04-05-06 через шлюз с ip-адресом 11.22.33.44 по адресу 11.41.31.21.
Сначала пакет отправляется на шлюз. Тут у меня 2 варианта:

1)Шлюз запоминает, что пк с локальным адресом 192.168.0.2 отправляет пакет по адресу 11.41.31.21, и в дальнейшем, когда он получит ответ с этого ip-адреса, он перенаправит его именно на 192.168.0.2. Конкретно этот вариант я подглядел на ютубе, и не до конца понял, как он работает, но заметил, что в моём понимании он накладывает кучу ограничений, например в виде невозможности нескольких пк в одной локальной сети посылать пакеты на один и тот-же ip-адрес, поэтому, ввиду того, что этот вариант я не понимаю, я предпочту выбрать второй.

2)Шлюз хранит в памяти таблицу открытых "портов" - уникальных для каждого процесса (программы) каждого пк в локальной сети. Что-то вроде:
80: это пк с адресом 192.168.0.2 и mac-адресом 01-02-03-04-05-06 хостит http-сервер при помощи программы http-server.
1111: это на том же пк с адресом 192.168.0.2 и mac-ом 01-02-03-04-05-06 открыт скайп.
1112: а это скайп открыт уже на 192.168.0.3 с mac-ом A7-03-B2-04-C6-05.
1113: а это на 192.168.0.3 с mac-ом A7-03-B2-04-C6-05 открыт chrome.
mac адреса шлюз хранит просто на всякий случай, что-бы какой-нибудь хакер с смартфоном и адресом 192.168.0.4 не смог притвориться, что на самом то деле это он 192.168.0.2, а мы в дальнейшем mac-и упоминать не будем, для удобства.
Как я и говорил, второй вариант вариант мне нравится больше, поэтому я, пока. буду использовать его. ввиду этого, я вынужден перефразировать сказанное мною выше.

Допустим, пк с адресом в локальной сети 192.168.0.2 при помощи программы 'testprogram' через шлюз с ip-адресом 11.22.33.44 хочет отправить пакет по адресу 11.41.31.21:80
Сначала он отправляет пакет на шлюз.
Шлюз помнит, что программа 'testprogram' на компе с адресом 192.168.0.2 пожелала находится на порту 7777, поэтому он пересылает пакет, пометив, что адрес отправителя - 11.22.33.44:7777, в узел 3-го уровня, с которым тот соединён напрямую. Сам узел, очевидно, имеет адрес 11.22.33
Узел 3-го уровня смотрит, что ip-получателя начинается с 11.41.31, что не совпадает с его собственным адресом (11.22.33), поэтому пересылает пакет дальше, в узел 2-го уровня.
Узел 2-го уровня смотрит, что ip-получателя начинается с 11.41, что не совпадает с его собственным адресом (11.22), поэтому пересылает пакет дальше, в узел 1-го уровня.
Узел 1-го уровня смотрит, что ip-получателя начинается с 11, что совпадает с его собственным адресом, поэтому он смотрит на 2-й байт адреса получателя и пересылает пакет в узел 2-го уровня, с которым он соединён напрямую по 41-му проводу.
(предположим, что 00 - это id самого узла, поэтому по 41-му, а не 42-му)
Узел 2-го уровня смотрит, что ip-получателя начинается с 11.41, что совпадает с его собственным адресом, поэтому он смотрит на 3-й байт адреса получателя и пересылает пакет в узел 3-го уровня, с которым он соединён напрямую по 31-му проводу.
Узел 3-го уровня смотрит, что ip-получателя начинается с 11.41.31, что совпадает с его собственным адресом, поэтому он смотрит на 4-й байт адреса получателя и пересылает пакет в конечный шлюз, с которым он соединён напрямую по 21-му проводу.
Наконец, пакет от отправителя 11.22.33.44:7777 к получателю 11.41.31.21:80 доходит до конечного шлюза.
Шлюз смотрит, что 80-й порт - это на компе с адресом 192.168.0.7 запущен http-server, и поэтому шлюз пересылает пакет компу, с которым он соединён по 6-му проводу (по крайней мере, лично я никогда не видел компа с адресом 192.168.0.0, поэтому предположил, что нумеруются они с единицы, а 192.168.0.1, это, вроде, адрес самого шлюза, поэтому по 6-му, а не 8-му).
Таким образом, пакет, наконец, дошёл до получателя...


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

Допустим, пк с адресом в локальной сети 192.168.0.2 при помощи программы 'testprogram' через шлюз с ip-адресом 111.22.33.44 хочет отправить пакет по адресу 99.41.31.21:80
Для начала, как и в первой теории, пакет отправляется на шлюз, и с ним происходит всё то-же, что и в первой теории до того момента, пока он с новым адресом отправителя 111.22.33.44:7777 не отправится в первый промежуточный узел.
Для начала, для удобства, переведём оба ip-адреса в двоичную систему.
ip отправителя: 111.22.33.44: 01101111000101100010000100101100
ip получателя: 99.41.31.21: 01100011001010010001111100010101

И так, первый узел является финальным в сети и соединён напрямую с 64-мя шлюзами. Это значит, что для id шлюза он использует последние 6 бит ip-адреса, а все остальные - его собственный адрес. Следовательно, узел имеет следующие параметры:
Адрес узла: 01101111000101100010000100000000
Маска подсети: 11111111111111111111111111000000
Этот узел вычисляет результат поразрядной конъюнкции с ip-адресом получателя и смотрит, что полученный результат не совпадает с адресом самого узла, и поэтому он перенаправляет сообщение на узел выше.

Этот узел имеет следующие параметры:
Адрес узла: 01101111000101100010000000000000
Маска подсети: 11111111111111111111110000000000
Этот узел вычисляет результат поразрядной конъюнкции с ip-адресом получателя и смотрит, что полученный результат не совпадает с адресом самого узла, и поэтому он перенаправляет сообщение на узел выше.

Этот узел имеет следующие параметры:
Адрес узла: 01101111000101100000000000000000
Маска подсети: 11111111111111100000000000000000
Этот узел вычисляет результат поразрядной конъюнкции с ip-адресом получателя и смотрит, что полученный результат не совпадает с адресом самого узла, и поэтому он перенаправляет сообщение на узел выше.

Этот узел имеет следующие параметры:
Адрес узла: 01101100000000000000000000000000
Маска подсети: 11111100000000000000000000000000
Этот узел вычисляет результат поразрядной конъюнкции с ip-адресом получателя и смотрит, что полученный результат не совпадает с адресом самого узла, и поэтому он перенаправляет сообщение на узел выше.

Этот узел имеет следующие параметры:
Адрес узла: 01100000000000000000000000000000
Маска подсети: 11100000000000000000000000000000
Этот узел вычисляет результат поразрядной конъюнкции с ip-адресом получателя и смотрит, что на этот раз, наконец, полученный результат совпадает с адресом самого узла. И что-же происходит дальше?
Этот узел хранит в памяти таблицу каждого подключенного к нему напрямую узла уровня ниже вместе с их адресами и их масками подсети. Узел вычисляет результат поразрядной инверсии своей маски подсети (меняет все 1 на 0, а все 0 на 1), а после пробегается по каждому узлу в таблице, и для них он:
-вычисляет результат поразрядной конъюнкции результата поразрядной инверсии своей маски подсети и маски подсети узла из таблицы.
-Вычисляет результат поразрядной конъюнкции результата из предыдущего пункта сначала с адресом узла из таблицы, а потом с адресом получателя.
-Сравнивает значения, и, если они равны, то он пересылает пакет именно на этот узел.
В нашем случае для правильного узла он получит следующее:
Маска подсети самого узла: 11100000000000000000000000000000
Результат её поразрядной инверсии: 00011111111111111111111111111111
Маска подсети подходящего нам узла из таблицы: 11111110000000000000000000000000
Результат поразрядной конъюнкции результата поразрядной инверсии маски самого узла и подходящего нам узла из таблицы: 00011110000000000000000000000000
Адрес подходящего нам узла: 01100010000000000000000000000000
Результат поразрядной конъюнкции адреса подходящего нам узла и... ну, той штуки, что была перед ним: 00000010000000000000000000000000
То-же самое мы получим, если вычислим результат поразрядной конъюнкции адреса получателя и той штуки. Это значит, что данный узел нам подходит.
Стоит учесть, что если от каждого элемента в таблице отрезать слева количество бит, равное количеству единиц в маске подсети текущего узла, а справа - количество бит, равное количеству нулей маски подсети узла из таблицы, то все элементы из полученной таблицы обязательно должны удовлетворять условию Фано.

И так, мы перенаправили пакет в узел со следующими параметрами:
Адрес узла: 01100010000000000000000000000000
Маска подсети: 11111110000000000000000000000000

С него мы, осуществив те же действия, перенаправим пакет в узел со следующими параметрами:
Адрес узла: 01100011000000000000000000000000
Маска подсети: 11111111110000000000000000000000

А с него на узел со следующими:
Адрес узла: 01100011001010010000000000000000
Маска подсети: 11111111111111111000000000000000

А с него на узел со следующими:
Адрес узла: 01100011001010010001111100000000
Маска подсети: 11111111111111111111111111100000
Ну а это уже будет финальный узел, который соединён напрямую с 32-мя шлюзами, и ему останется только переслать пакет на шлюз с номером 21 (10101), а он уже осуществит те же действия, что и в первой теории...

Добавлено через 41 минуту
Цитата Сообщение от Max_Cross Посмотреть сообщение
Узел вычисляет результат поразрядной инверсии своей маски подсети (меняет все 1 на 0, а все 0 на 1), а после пробегается по каждому узлу в таблице, и для них он:
-вычисляет результат поразрядной конъюнкции результата поразрядной инверсии своей маски подсети и маски подсети узла из таблицы.
-Вычисляет результат поразрядной конъюнкции результата из предыдущего пункта сначала с адресом узла из таблицы, а потом с адресом получателя.
-Сравнивает значения, и, если они равны, то он пересылает пакет именно на этот узел.
В нашем случае для правильного узла он получит следующее:
Маска подсети самого узла: 11100000000000000000000000000000
Результат её поразрядной инверсии: 00011111111111111111111111111111
Маска подсети подходящего нам узла из таблицы: 11111110000000000000000000000000
Результат поразрядной конъюнкции результата поразрядной инверсии маски самого узла и подходящего нам узла из таблицы: 00011110000000000000000000000000
Адрес подходящего нам узла: 01100010000000000000000000000000
Результат поразрядной конъюнкции адреса подходящего нам узла и... ну, той штуки, что была перед ним: 00000010000000000000000000000000
То-же самое мы получим, если вычислим результат поразрядной конъюнкции адреса получателя и той штуки. Это значит, что данный узел нам подходит
Ладно, с этим я загнул... Хватит просто для каждого узла в таблице проверять, будет ли его адрес совпадать с результатом поразрядной конъюнкции его маски подсети и ip получателя...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2019, 20:08
Ответы с готовыми решениями:

Как обеспечить себе анонимный интернет?
Здравствуйте форумчане. Я впервые на Вашем форуме. Возникла необходимость обеспечить...

На ПК интернет работает так, как и должен, как я подключил интернет к ноутбуку скорость упал на несколько раз
и пинг в играх от 500 до 1000 доходит. На сайтах тоже грузит долго.На вирус проверял не...

как устно сделать я не представляю
Определить результат выполнение следующих команд(нужно устно сделать) s:=5;repeats:=s*2-3;until...

Вообще не представляю как делать
Условие задачи:(консольный режим в делфи) Дан двумерный массив. Пройдите от клетки с координатами...

как усыплять микроконтроллер - представляю. а периферию?
есть мысль сварганить на базе известного блютус модуля (HC05 или как там его), микроконтроллера и...

1
evgenii3000
981 / 471 / 58
Регистрация: 16.01.2013
Сообщений: 3,674
01.04.2019, 09:15 2
Max_Cross, почитайте лучше про модели OSI.
0
Миниатюры
Правильно ли я представляю себе, как работает интернет?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2019, 09:15

в общих чертах представляю,но как это реализовать?
Ввести строку, заменить интервалы между словами на 2 пробела.

Сам по себе выключается интернет
Приветствую. Собственно, проблема в том, что интернет отключается сам по себе (роутер). Начинает...

Часто сам по себе отключается интернет
Такая проблема,сижу в интернете через 3G модем МТС,интернет выключается каждые минут 10-20,раньше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru