Статьи » TCP, порт, NAT и другие

Статья про TCP/IP и порты перемещена сюда: Викиучебник: TCP/IP.

Читайте и по возможности улучшайте сами.

Старую версию можно посмотреть тут.


Здесь пока осталось только ...

Как работает NAT


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

Рассмотрим это на примере. Пусть внешний адрес раутера 15.15.15.15. Компьютер с локальным адресом 10.0.0.5 передал раутеру пакет
10.0.0.5 : 500   =>   yahoo.com : 80

Раутер выбрал у себя временный порт 600 и переслал в интернет пакет
15.15.15.15 : 600   =>   yahoo.com : 80

Чуть позже, получив от сервера ответные пакеты на свой порт 600, раутер сверяется со своими записями, производит обратную трансляцию, на этот раз адреса и порта назначения, и пересылает пакеты на локальный компьютер
yahoo.com : 80   =>   10.0.0.5 : 500

Через некоторое время после того, как клиент и сервер закончат обмениваться пакетами, раутер сотрет у себя в таблице запись о 600м порту за сроком давности.

Отметим, что с точки зрения сервера пакеты приходят просто с адреса 15.15.15.15:600, и ни о каком раутере или локальной сети позади него сервер не знает. С точки зрения компьютера тоже вроде бы никакого раутера и трансляции адресов по дороге не было.

Таким образом, для исходящих из локальной сети соединений NAT работает “прозрачно”, никак не мешая установлению соединений.

С другой стороны, очевидно, что без дополнительной настройки раутер будет отвергать все входящие соединения (то есть делает все порты недоступными для входящих соединений у всех компьютеров в локальной сети). Получая новый пакет извне, раутер просто не знает, какому локальному компьютеру он предназначался.