Skip to content

Instantly share code, notes, and snippets.

@codedokode
Created October 9, 2016 22:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codedokode/1af26d3a64748f05ba8b870b273edfc6 to your computer and use it in GitHub Desktop.
Save codedokode/1af26d3a64748f05ba8b870b273edfc6 to your computer and use it in GitHub Desktop.

Интернет

Интернет - это всемирная сеть, объединяющая множество компьютеров и устройств. Устройство и принцип работы этой сети описаны в протоколе (протокол это стандарт, описывающий взаимодействие систем) IP.

У каждого узла сети есть свой уникальный идентификатор (он называется IP адрес), и указав его, узлы могут передавать друг другу по этой сети пакеты данных. Сейчас все еще используются IPv4-адреса, которые имеют вид вроде 102.34.23.20 (4 числа от 1 до 254), но так как эти адреса заканчиваются, в будущем мы перейдем на IPv6, где адреса состоят из большего числа цифр.

Также, некоторые IP адреса имеют специальный смысл. IP-адреса вида 127.x.x.x(например 127.0.0.1) соответствуют так называемому loopback-интерфейсу и если попытаться отправить пакет на такой адрес, то он не уйдет в сеть, а останется на компьютере. Эта особенность используется программами, которые запущены на одном и том же узле и хотят обмениваться друг с другом данными.

Каждый IP-пакет содержит IP-адрес отправителя, получателя, а также примерно до 1600 байтов данных (байт это целое число от 0 до 255). IP адрес либо задается администратором узла, либо узел получает его автоматически через DHCP.

Если быть точнее, то обычно IP адрес назначается не узлу, а сетевой карте. Если у узла несколько сетевых карт, у него может быть несколько Ip адресов. Более того, можно присвоить одной сетевой карте несклоько IP адресов, но как правило это не имеет смысла.

Локальная сеть

Интернет это объединение большого числа локальных сетей. Есть сети, к ним подсоединены устройства, и эти сети соединены с помощью маршрутизаторов. Маршрутизатор (роутер) это узел, у которого 2 или больше сетевых карт и который подсоединен к 2 или больше сетям. Он позволяет пакетам проходить из одной сети в другую.

В переделах локальной сети узлы могут пересылать пакеты без IP адресов, по MAC-адресам (MAC адрес это серийный номер сетевой карты, вшитый в нее. В отличие от него IP адрес задается системой программно). В переделах локальной сети пакеты пересылаются напрямую. А вот чтобы отправить пакет в другую сеть, узел передает пакет машрутизатору-шлюзу, который передает его в соседнюю сеть, там его передают дальше, и т.д. IP-адрес шлюза задается в настройках сети на узле либо администратором либо получается автоматически по DHCP.

Маршрутизатор немного меняет пакеты. Так как он принимает пакет на одной сетевой карте и передает с другой, то в пакете MAC-адрес отправителя заменяется на адрес маршрутизатора, а MAC-адрес получателя - на адрес шлюза во второй сети. IP-адреса и другая информация в пакете не меняется.

Ты можешь увидеть путь пакета через цепочку маршрутизаторов командой traceroute (на Windows она называется tracert):

(linux) /usr/sbin/traceroute google.com (win) tracert google.com (онлайн на сайте) http://ping.eu/

Компьютеры объединяются в локальную сеть с помощью свитча. Это устройство, у которого много сетевых разъемов к которым подсоединяются узлы. Свитч это прозрачное устройство, у которого нет ни MAC- ни IP-адресов - оно просто принимает пакет от одного компьютера и передает другим.

Компьютеры в локальной сети имеют общий префикс IP-адреса. Например если у нас маска сети 255.255.255.0 и адрес шлюза 10.10.10.1 то все другие узлы этой сети должны иметь IP адреса вида 10.10.10.x. Именно по этому признаку узел определяет находится он в одной сети с получателем (и может слать ему пакет напрямую по MAC адресу) или в разных (и пакет надо передать шлюзу). Сеть обычно называют по префиксу, то есть говорят «узел находится в сети 10.10.10.0».

NAT

Если мы соединяем 2 или более сети маршрутизатором, то фактически получается одна большая сеть. Все узлы в ней имеют уникальные IP адреса и могут посылать друг другу пакеты, напрямую если они в одной локальной сети, или через маршрутизаторы если в разных. Маршрутизатор не меняет IP адреса в передаваемом пакете и никак не препятствует их передаче.

Но еще сети можно соединить с помощью NAT. В случае если мы включаем на маршрутизаторе между 2 сетями режим NAT, ситуация меняется. NAT принимает пакеты из внутренней сети и отправляет их во внешнюю от своего имени, заменяя IP адрес отправителя (допустим a.b.c.d) на свой. А когда извне приходит ответ, он передает этот пакет во внутреннюю сеть, меняя адрес получателя со своего IP адреса на a.b.c.d, то есть того, кто послал исходный пакет наружу.

Это приводит к тому что внутренняя сеть становится изолированной от внешней. Извне никто не видит узлы внутренней сети, снаружи ситуация выглядит как будто у нас один узел с одним IP адресом. Нельзя снаружи установить соединение с внутренним узлом (если только явно не пробросить порт через NAT).

Также, так как внутренние узлы не видны снаружи, мы не обязаны выдавать им белые уникальные IP адреса (которых мало и которые стоят денег). Мы можем выдать им «серые» адреса из диапазона 192.168.x.x или 10.x.x.x. В одной локальной сети IP адреса не могут повторяться, но в разных сетях (например у разных провайдеров), отделенных NAT, могут. Серые адреса уникальны только в пределах своей сети, а не во всем мире. Из-за неуникальности снаружи нельзя установить соединение с узлом у которого серый IP адрес. Именно потому NAT переписывает адрес отправителья на свой, «белый».

Большинство провайдеров помещает своих абонентов именно в изолированную сеть за NAT, из соображений экономии на IP адресах и безопасности. Если ты используешь дома роутер то в нем тоже есть NAT, у тебя создается изолированная домашняя сеть, и провайдер не видит устройства в ней, видит только роутер.

Проброс порта

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

Давай повторим, чтобы не забыть:

  • локальная сеть организуется на свитчах, IP адреса в ней начинаются с одного и того же префикса, узлы могут слать пакеты напрмямую по MAC адресу
  • локальные сети объединяются маршрутизаторами, которые при передаче пакета не меняют IP адреса в них
  • маршрутизатор может работать в режиме NAT, в этом случае он подменяет IP адреса в пакетах. Снаружи соединиться с узлом за NAT нельзя.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment