- Вопрос или проблема
- Ответ или решение
- Разница между адресом 127.0.0.1 и реальными (не локальными) адресами IP
- 1. Что такое адреса 127.0.0.1?
- 2. Разница с реальными (не локальными) IP-адресами
- 3. Что определяет доступность IP-адреса для функции bind()?
- 4. Кто назначил вашему сетевому адаптеру IP-адрес 72.212.216.41?
- 5. Необходимо ли привязывать IP-адрес к сетевому адаптеру?
- 6. Можно ли присвоить несколько IP-адресов одному сетевому адаптеру?
- 7. Почему в обучающих материалах часто используется адрес 127.0.0.1?
- Заключение
Вопрос или проблема
У меня есть пробел в понимании сетевых технологий, который мне всегда было трудно преодолеть.
На протяжении многих лет я писал различные небольшие проекты отправителей/приемников TCP/UDP — в основном простые примеры “привет, мир”, чтобы изучить механизмы отправки/приема данных по TCP или UDP.
Но почти все примеры, на которые я ориентировался, обычно используют 127.0.0.x как адрес приемника. То есть TCP-сервер выполняет bind()
на адрес 127.0.0.x.
Аналогично, в моем курсе Udemy по Docker и Kubernetes инструктор создает веб-сервер на Node.js, который слушает на 127.0.0.1 порту 3000.
У меня есть неуверенное понимание того, что эти “адреса обратной связи” представляют собой какую-то функцию ОС, которая создает эти “виртуальные адреса” и позволяет им действовать так, как будто они настоящие сетевые адреса. (Это объяснение, вероятно, было действительно плохим, раскрывая мое неуверенное понимание)
Мои вопросы (я знаю, что несколько вопросов в одном посте могут быть неприветствуемы, но надеюсь, что эти вопросы логически сгруппированы достаточно, чтобы было оправданным задать их вместе):
- В чем разница между этими адресами обратной связи (я предполагаю, что это 127.0.0.1 – 127.0.0.255?) и “настоящими” (возможно, более правильным словом будет не обратная связь?) IP-адресами?
- На данном ПК что определяет, доступен ли IP-адрес для C
bind()
?
Например, в следующем фрагменте кода (адаптированном здесь):struct sockaddr_in sin; int s = socket(AF_INET, SOCK_STREAM, 0); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(1221908521); // 72.212.216.41 согласно http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp?ipAddress=72.212.216.41 sin.sin_port = htons(3000); bind(s, (struct sockaddr *) &sin, sizeof sin);
…что определяет, доступен ли IP-адрес 72.212.216.41 на этом конкретном ПК, чтобы код C работал корректно?
- Кто присвоил моей сетевой карте адрес 72.212.216.41?
- Является ли 72.212.216.41 чем-то, что тесно связано с моей сетевой картой и неизменно? Или может какой-то программный процесс изменить его?
- Может ли одна сетевая карта иметь только один IP-адрес?
- Почему так много учебных пособий по сетевым технологиям используют 127.0.0.1 вместо “необратных” адресов? (Я не хочу обобщать, но, как я нашел, это в значительной степени правда)
Я думаю, суть моих вопросов в том, что я пытаюсь понять, как работает присвоение/доступность IP-адресов в контексте одного ПК.
Какое программное обеспечение/аппаратное обеспечение говорит: “ПК StoneThrow, тебе присвоен 72.212.216.41, так что твоим программам на C разрешено вызывать bind()
с этим адресом”?
-
IP-адреса присваиваются интерфейсам, а не компьютерам и т.д.
-
Интерфейсы не обязательно должны быть основаны на физическом оборудовании, операционная система может предоставить драйвер, который выглядит как сетевой интерфейс для приложения, но на самом деле является чем-то еще.
-
Таким образом, операционные системы могут представлять “интерфейс обратной связи” приложением, который внутренне будет принимать входящий трафик и просто копировать его в выходной буфер интерфейса, не передавая его драйверу устройства, который общается с физической сетевой картой – отсюда и “обратная связь”.
-
Некоторые операционные системы имеют интерфейс обратной связи в качестве интефейса, который вы можете видеть и с которым можете работать, как и с любым другим интерфейсом (Linux и общие
lo
интерфейсы по сравнению с такими, какeth0
и т.д.), а некоторые делают интерфейс обратной связи невидимым (Windows).
В чем разница между этими адресами обратной связи (я предполагаю, что это 127.0.0.1 – 127.0.0.255?) и “настоящими” (возможно, более правильным словом будет не обратная связь?) IP-адресами?
Все IP-адреса “настоящие”. Основные правила в сетевых технологиях таковы:
Вы можете сделать все, что хотите, если обе стороны согласны, но обычно вы не контролируете другую сторону, поэтому стандарты и соглашения определяют, что вы можете делать, если не создадите условия, при которых это больше не применяется.
127.0.0.0/16 зарезервирован IANA для целей адаптера обратной связи, и всё. Это соглашение, но соглашение, которому следуют все провайдеры интернет-услуг и операционные системы.
Технически вы могли бы назначить 127.0.0.1 физическому сетевому интерфейсу, но, я думаю, только Linux действительно позволит вам это сделать. Однако ни один роутер провайдера интернет-услуг не будет ничего делать с 127.0.0.0/16, кроме как отбрасывать его, так что, как только 127.0.0.1 покинет ваш роутер (при условии, что ваш роутер правильно настроен для маршрутизации его к вашему провайдеру), он будет отброшен. Вы всегда можете делать все, что хотите в своей локальной сети.
На данном ПК что определяет, доступен ли IP-адрес для C bind()?
Например, в следующем фрагменте кода (адаптированном здесь):
Я думаю, все, что интересует bind(), это то, что ничего другого не использует тот же сокет. Сокет — это IP+порт.
что определяет, доступен ли IP-адрес 72.212.216.41 на этом конкретном ПК для правильной работы кода C?
Ничто не мешает вам назначить этот IP на все, что вы хотите в своей сети. Будет ли это что-то продуктивное, зависит от того, как настроены другие сетевые интерфейсы в вашей сети (все ли они находятся в одной подсети?), может ли каждая система достучаться до роутера (получить IP роутера через DHCP или вручную задать), работает ли этот роутер и ваш провайдер интернет-услуг.
Кто присвоил моей сетевой карте адрес 72.212.216.41?
Вероятно, DHCP, и, вероятно, DHCP-сервер вашего провайдера интернет-услуг (Cox). Если не DHCP, тогда сработает реализация APIPA в большинстве операционных систем. Это предполагает, что вы не назначили статически IP + маску подсети.
Является ли 72.212.216.41 чем-то, что тесно связано с моей сетевой картой и неизменно? Или может какой-то программный процесс изменить это?
Нет. Это IP-адрес, и это уровень 3, тогда как ваша сетевуха заботится о уровне 2 (кадры Ethernet) и уровне 1 (физическое модулирование/прослушивание кабеля).
Хотя многие сетевые интерфейсы имеют “движки разгрузки”, которые обрабатывают части TCP/IP, их все можно отключить, и TCP/IP может полностью выполняться программным обеспечением.
Может ли одна сетевая карта иметь только один IP-адрес?
В большинстве операционных систем:
-
Чаще всего 1 порт сетевой карты = 1 интерфейс, но иногда вы можете провести объединение, когда 2 или 3 порта работают вместе и выглядят как 1 интерфейс. Это распространено на серверах и коммутаторах.
-
Интерфейс может иметь 0, 1 или больше чем 1 комбинацию IP-адреса и маски подсети. В IPv6 каждый интерфейс обычно будет иметь как минимум 2 (один будет локальным).
Почему так много учебных пособий по сетевым технологиям используют 127.0.0.1 вместо “необратных” адресов? (Я не хочу обобщать, но, как я нашел, это в значительной степени правда)
Чтобы вы не беспокоили публичные системы в Интернете, которые не ожидают, что вы будете с ними общаться, и также не беспокоили другие системы в своей локальной сети, которые не ожидают, что вы будете с ними общаться. Обратная связь остается исключительно на вашем компьютере.
Какое программное обеспечение/аппаратное обеспечение говорит: “ПК StoneThrow, тебе присвоен 72.212.216.41?
Часто это DHCP. Есть DHCP-серверы и DHCP-клиенты. DHCP-клиенты используют широковещательную передачу Ethernet, что отправляет трафик ко всем системам в сети и не требует IP-адреса, чтобы найти DHCP-сервер и получить IP-адрес от него.
IP может быть назначен вручную вами или автоматически различными механизмами конфигурации или протоколами.
Ваш адрес является публичным и назначается сетевому интерфейсу вашим провайдером через DHCP или PPTP.
Просто прочтите это в целом:
https://en.m.wikipedia.org/wiki/IP_address
IP-адреса в основном различаются по своей глобальной доступности:
https://en.m.wikipedia.org/wiki/Private_network
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
IP-адреса назначаются сетевому интерфейсу (карте) на вашем компьютере и могут быть изменены в любое время.
Компьютеры могут иметь несколько сетевых интерфейсов, и каждый интерфейс может иметь несколько назначенных IP-адресов.
127.0.0.1 используется для удобства и безопасности. Он всегда присутствует по умолчанию, даже если на компьютере нет сетевого интерфейса, и программное обеспечение может безопасно связаться с ним для связи только между локальными процессами.
Ответ или решение
Разница между адресом 127.0.0.1 и реальными (не локальными) адресами IP
Понимание различий между адресом 127.0.0.1 и другими адресами IP является основой для разработки сетевых приложений и эффективного взаимодействия между компьютерами. Данная статья будет охватывать основные аспекты, касающиеся данной темы, а также ответит на основные вопросы, связанные с адресацией и привязкой IP-адресов к сетевым интерфейсам.
1. Что такое адреса 127.0.0.1?
Адрес 127.0.0.1 относится к диапазону "петлевых" (loopback) адресов. Этот диапазон включает все адреса от 127.0.0.1 до 127.0.0.255. Эти адреса зарезервированы для связи внутри устройства, то есть они позволяют программам обмениваться данными без необходимости в физической сетевой связи. Например, если ваше приложение использует этот адрес для привязки, данные не выходят за пределы вашего компьютера — они просто «возвращаются» обратно, что обеспечивает быструю и безопасную коммуникацию между локальными процессами.
2. Разница с реальными (не локальными) IP-адресами
Реальные IP-адреса, такие как 72.212.216.41, используются для связи между различными устройствами в интернета или локальной сети. В отличие от адресов петлевого интерфейса, реальный IP-адрес должен быть однозначно привязан к сетевому интерфейсу, который может взаимодействовать с внешними системами. Поскольку 127.0.0.1 — это адрес, который никогда не будет отправлен за пределы локального устройства, вопросы безопасности и изоляции процессов облегчаются.
3. Что определяет доступность IP-адреса для функции bind()?
Вызов функции bind()
зависит от того, не используется ли данный IP-адрес и порт другой сокет-программой. Операционная система управляет данными ресурсами и обеспечивает уникальность сокетов на уровне комбинации адреса и порта. Таким образом, для успешной привязки к IP-адресу 72.212.216.41, он должен быть доступен и не использоваться в данный момент.
4. Кто назначил вашему сетевому адаптеру IP-адрес 72.212.216.41?
Данный IP-адрес, скорее всего, был назначен через протокол DHCP вашим интернет-провайдером. DHCP (Dynamic Host Configuration Protocol) автоматически управляет конфигурациями IP-адресов для устройств в сети, предоставляя динамически назначенные адреса, которые могут меняться.
5. Необходимо ли привязывать IP-адрес к сетевому адаптеру?
IP-адреса не фиксированы и могут быть изменены программными средствами. Сетевые адаптеры могут иметь несколько IP-адресов и их можно настраивать динамически. Это дает дополнительную гибкость для сети, позволяя, например, выделять несколько адресов на одном физическом адаптере.
6. Можно ли присвоить несколько IP-адресов одному сетевому адаптеру?
Да, один сетевой интерфейс может иметь несколько IP-адресов. Это часто используется в серверных конфигурациях и виртуальных машин для оптимизации сетевых ресурсов и управления трафиком.
7. Почему в обучающих материалах часто используется адрес 127.0.0.1?
Использование адреса 127.0.0.1 в учебных целях связано с его безопасностью и простотой наладки. Основанная работа с этим адресом позволяет избежать проблем, связанных с доступом к внешним ресурсам и конфликты с другими устройствами в сети. Это создание идеального окружения для изучения сетевого программирования и отладки, не подвергая риску реальную сетевую инфраструктуру.
Заключение
Понимание различий между адресами петлевого интерфейса и реальными IP-адресами, а также управление их назначением является критически важным для всех, кто хочет глубже понять сеть и развивать сетевые приложения. Помните, что работая с реальными IP-адресами, вы взаимодействуете с глобальной инфраструктурой, что требует учета вопросов безопасности и конфигурации сети, в то время как адреса 127.0.0.1 позволяют более свободно экспериментировать в локальной среде.