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

Протоколы

Сетевым протоколом называют набор правил, описывающий какой-нибудь вид связи.

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

TCP/IP

Стеком протоколов TCP/IP называют набор протоколов, используемых в интернете.

IP

На более высоком сетевом уровне находится IP (Internet Protocol) - самый базовый протокол интернета.

Это маршрутизируемый протокол: узлы в интернете не «видят» друг друга непосредственно, а объединены в подсети по «похожести» их IP адресов - четырех байтов, обычно записываемых как n.n.n.n.

Для передачи пакета с данными узел указывает в пакете свой IP адрес и адрес назначения и передает пакет ближайшему узлу. Тот смотрит на IP адрес назначения и решает куда передать пакет дальше, все ближе и ближе к узлу назначения - это и есть маршрутизация. Такая система позволяет иметь в сети очень много узлов.

IP описывает передачу одного пакета, он не устанавливает «соединений» и не даже гарантирует доставку.

TCP

TCP - основной протокол транспортного уровня в интернете.
После этого считается, что TCP соединение установлено, и узлы могут пересылать друг другу пакеты с данными.

Когда один из узлов решает, что пора заканчивать соединение, он посылает специальный пакет FIN, после этого узлы прощаются и разрывают соединение.


«Соединение» понимается в том смысле, что узлы помнят друг о друге, нумеруют все пакеты идущие в обе стороны, посылают подтверждение о получении каждого пакета и перепосылают потерявшиеся по дороге пакеты. Все это очень сильно упрощает работу любого «верхнего» протокола, базирующегося на TCP.


Для локального узла, пославшего приглашение, это соединение исходящее. Для удаленного узла, принявшего приглашение, это соединение входящее. Эти термины показывают только инициатора соединения. Любое установленное TCP соединение симметрично, и пакеты с данными по нему всегда идут в обе стороны.

Сетевой порт

Порт - условное число от 1 до 65535, указывающее, какому приложению предназначается пакет.

Концепция портов позволяет независимо использовать TCP протокол сразу многим программам на одном и том же компьютере. Если прибегнуть к аналогии, то IP адрес - почтовый адрес дома, а порт - номер квартиры конкретного жильца.

Конечный узел, получив пакет, смотрит на порт назначения и передает пакет соответствующему приложению.


Использование портов

Клиентом называют приложение, которое пользуется каким-то сервисом, предоставляемым другим приложением - сервером, обычно на удаленном компьютере. Примеры: браузер и веб сервер, почтовая программа и почтовый сервер.

Практически всегда клиент начинает исходящие соединения к серверу, а сервер ожидает входящих соединений от клиентов, хотя бывают и исключения.


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

Клиент, начиная соединение, выпрашивает у своей ОС какой-нибудь незанятый порт во временное пользование, и указывает его в посланных пакетах как порт источника.

После того, как клиент и сервер установили соединение, с точки зрения сети никакой разницы между ними больше нет.

Стандартные порты

Для большинства программ-серверов определены стандартные порты. Это значит, что по умолчанию ожидается, что сервер на компьютере будет слушать именно этот порт. Самыe известные стандартные порты: 80 для http (web), 21 для ftp и 25 для smtp (пересылки почты).

И большинство веб серверов в сети действительно слушают порт 80. Поэтому в браузере мы набираем адреса веб серверов и обычно не указываем порт - наши браузеры сами добавляют стандартный номер порта. Например, адрес http://yahoo.com/ на самом деле полностью выглядит так: http://yahoo.com:80/

Разумеется, стандартный - не значит обязательный. Владелец компьютера может по желанию указать в настройках своему веб серверу слушать любой порт. А если, например, 80й порт уже занят работающим веб сервером, а владелец хочет запустить еще один, то он просто вынужден указать любой другой свободный порт. Часто выбирают порт 8080 - стандартный “альтернативный” веб порт. В таком случае владелец, публикуя адрес своего веб сервера, указывает адрес вместе с портом (например http://vasyapupkin.com:8080).

Как работает 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 работает “прозрачно”, никак не мешая установлению соединений.

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


См. также

Википедия: TCP

Внутреннее устройство TCP/IP на citforum.ru

Википедия: клиент