Соединение компьютеров через интернет с динамическим IP
Возможно Вы тоже слышали, что нельзя так просто установить прямое соединение с другим компьютером, если у него динамический IP адрес. А если и реально, то для этого нужен дополнительный, внешний сервер.
Но все же, задумайтесь, ведь различные программы, типа торрентов, скайпа, аськи, они же могут создавать прямые подключения. И ни у кого не возникало с этих проблем, даже у тех, кто имеет динамический IP адрес. Согласитесь, что-то тут не так. Выходит, существуют некие пути, как это осуществить. Хотя без внешнего с сервера, нам действительно не обойтись.
Как это выглядит в теории?
Существует такая хитрая вещь, как NAT. Он позволяет многим из нас (у кого IPv4) успешно подключатся к интернету. Иначе, если бы мы начали выдавать каждому компьютеру адрес IPv4, то этих адресов определенно бы не хватило.
Таким образом NAT скрывает некоторую часть сетевых ресурсов. В связи с чем, у нас не получится так просто подключиться к другому компьютеру в интернете.
Давайте рассмотрим ситуацию, когда мы пассивно выполняем подключение к FTP серверу. Например:
Наш внешний адрес: 42.18.109.18
Наш внутренний адрес: 118.204.0.2
Адрес нашего NAT: 118.204.0.1
Создается соединение с нашего внутреннего адреса 118.204.0.2, по которому идет запрос на 21 порт. Этот запрос попадает к NAT. В свою очередь он сохранит, у себя в таблице, для нас соответствие внутреннего IP 118.204.0.2 и порта номер 21. Теперь, он создаст внешний порт, у которого будет номер, к примеру 51921 и свой адрес (42.18.109.18). Теперь NAT направит наш запрос на FTP сервер к 21 порту. Сервер установит, что запрос был получен с IP адреса 42.18.109.18 и порта 51921. Таким образом этот порт стал переадресатором, определяющим наш компьютер. После закрытия соединения, через несколько секунд, данные о связи порта с данным компьютером будут удалены.
Многие программы, устанавливающие прямое соединение между двумя компьютерами в сети, умеют создавать такие подключения, которые потом постоянно удерживаются.
Что получаем на практике?
Изучим эту тему чуть ближе используя, в качестве примера, ICQ. После запуска, устанавливается подключение к серверу аськи, и он открывает на нашем компьютере порт, например, это будет 5191. У другого компьютера тоже откроется порт 5191. IP адреса и порты обоих компьютеров в NAT могут выглядеть приблизительно так:
Первый компьютер: 43.12.102.14:56742
Второй компьютер: 43.12.102.15:61782
После определения обоих участников, сервер сообщит каждому внешний IP с портом другого компьютера. Затем, первый участник выполнит подключение к внешнему адресу второго и через NAT выполняет переадресацию на внутренний порт с номером 5191. После подтверждения вторым компьютером согласия на подключение, будет открыто соединение и начнется передача данных. Далее, по завершению операции, соединение закроется и через 10 секунд NAT удалит данный порт из таблицы соответствий, чтобы использовать его для других подключений.
Заключение и реализация
Как Вы поняли, в данной статье динамическими адресом называются, в первую очередь, именно внутренние IP, определяемые NAT. Конечно, не все NAT могут обеспечивать подобные соединения. Но, как правило, у провайдеров такие не используются.
А как же быть с серверами? Если есть желание испытать своими силами данную фишку, но нет внешнего сервера, способного определять внешние IP у пользователей? В этой ситуации тоже можно выкрутится воспользовавшись, например, STUN серверами. Их очень много и встречаются они на каждом шагу. Среди них можно встретить и публичные, бесплатные варианты. Такие сервера используют протокол UDP, его можно встретить в торрентах. А еще существуют подобные сервера для работы с протоколом TCP. Так что дерзайте и не останавливайтесь на достигнутом и тогда обязательно добьетесь успеха!