ошибка связи, используемый адрес: невозможно использовать порт TCP для источника и адресата?

Я отлаживаю Hadoop DataNodes, которые не запускаются. Мы используем солонку, а также elasticsearch на машинах.

Ошибка Hadoop DataNode довольно ясна:

java.net.BindException: Problem binding to [0.0.0.0:50020] java.net.BindException: Address already in use; For more details see: http://wiki.apache.org/hadoop/BindException [...] Caused by: java.net.BindException: Address already in use [...] (ExitUtil.java:terminate(124)) - Exiting with status 1 

lsof -i -n для порта 50020 говорит, что он уже используется, но только как порт источника, а не порт назначения:

 salt-mini 1733 root 25u IPv4 17452 0t0 TCP xx.xx.132.72:50020->xx.xx.132.20:4505 (ESTABLISHED) java 2789 elasticsearch 2127u IPv6 9808 0t0 TCP xx.xx.132.72:50020->xx.xx.132.55:9300 (ESTABLISHED) 

Однако привязка к 0.0.0.0 не работает:

 root@host:~# nc -l 50020 nc: Address already in use 

Это намеренно? Является ли привязка к 0.0.0.0 запрещенным, когда порт уже используется порт источника? Ничего не слушает сокет – я действительно не знаю, почему он не должен работать.

Ubuntu 14.04:

 root@host:~# uname -a Linux host 4.2.0-19-generic #23~14.04.1-Ubuntu SMP Thu Nov 12 12:33:30 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 

3 Solutions collect form web for “ошибка связи, используемый адрес: невозможно использовать порт TCP для источника и адресата?”

Не имеет значения, является ли 50020 исходным или целевым портом: если он заявлен, он заявлен.

Я бы счел нужным запустить службу на определенном порту в диапазоне 49152 – 65535, поскольку это эфемерные порты, определенные IANA. Многие дистрибутивы Linux занимают порты выше 32768 как эфемерные. Вы можете просмотреть текущий эфемерный диапазон портов с помощью:

 cat /proc/sys/net/ipv4/ip_local_port_range 

Любое приложение может просто использовать порт из эфемерного диапазона, поэтому нет гарантии, что конкретный порт всегда будет бесплатным. Лучше выбрать неиспользуемый порт между 1024 и 32767.

См. Введение в эфемерные порты .

Если вы хотите изменить эфемерный диапазон для удовлетворения требований Hadoop DataNode, вы можете сделать это, отредактировав /etc/sysctl.conf и установив строку следующим образом:

 net.ipv4.ip_local_port_range=56000 65000 

edit: Спасибо @ mr.spuratic, который косвенно указал, что с достаточно недавним ядром (изменение было commitedd в мае 2010 года), можно сделать исключения из диапазона. Это рекомендуется, так как игра с самим диапазоном является довольно резким изменением.

 sysctl -w net.ipv4.ip_local_reserved_ports = 50020, 50021 

Цитата из документации / сети / ip-sysctl.txt

 ip_local_reserved_ports - list of comma separated ranges Specify the ports which are reserved for known third-party applications. These ports will not be used by automatic port assignments (eg when calling connect() or bind() with port number 0). Explicit port allocation behavior is unchanged. The format used for both input and output is a comma separated list of ranges (eg "1,2-4,10-10" for ports 1, 2, 3, 4 and 10). Writing to the file will clear all previously reserved ports and update the current list with the one given in the input. Note that ip_local_port_range and ip_local_reserved_ports settings are independent and both are considered by the kernel when determining which ports are available for automatic port assignments. You can reserve ports which are not in the current ip_local_port_range, eg: $ cat /proc/sys/net/ipv4/ip_local_port_range 32000 60999 $ cat /proc/sys/net/ipv4/ip_local_reserved_ports 8080,9148 although this is redundant. However such a setting is useful if later the port range is changed to a value that will include the reserved ports. Default: Empty 

Я думаю, что это нормальное поведение. Если используется порт, он используется. Источник или назначение не имеет значения.

0.0.0.0 означает, что вы пытаетесь прослушивать все сетевые адреса этого порта. Поэтому, если у вас есть 2 IP-адреса, скажем 192.168.1.20 и 10.4.2.1, вы можете использовать порт дважды, если вы укажете IP-адрес

Однако привязка к 0.0.0.0 не работает:

 root@host:~# nc -l 50020 nc: Address already in use 

Это намеренно? Является ли привязка к 0.0.0.0 запрещенным, когда порт уже используется порт источника? Ничего не слушает сокет – я действительно не знаю, почему он не должен работать.

Это совершенно нормально. Специальный IP-адрес 0.0.0.0 означает «любой» адрес интернет-протокола, на который отвечает этот компьютер, что означает, что он связывается с каждым IP-адресом в системе. Каждое TCP-соединение представляет собой двустороннее соединение с состоянием, а источник / назначение действительно имеет смысл только от первоначального рукопожатия. Все, что действительно имеет для вас значение, – это номер порта на вашей стороне соединения.

Рассмотрите то, что вы спрашиваете, с точки зрения стека IP. Он имеет существующее TCP-соединение на xx.xx.132.72: 50020, и вы пытаетесь связать сокет для прослушивания с 0.0.0.0:50020. Этот специальный адрес расширяется и включает в себя xx.xx.132.72: 50020 и не работает при использовании. Если это не сработало, как бы IP-пакет, входящий в этот адрес, различался, если он должен быть доставлен в ваш сокет-прослушиватель или в уже существующее соединение? Конечно, вы могли бы представить схему, позволяющую нескольким сокетам совместно использовать порт, но затем вы перестроили именно ту проблему, которую порты решают в первую очередь.

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

Interesting Posts

Требуется: perl (Compress :: Raw :: Zlib) = 2.052

Пытается обновить php на CentOS 5.7

Может ли ALSA выводить звук с входной линии гнезда материнской платы на HDMI?

Одиночная команда для проверки наличия файла и печати (настраиваемого) сообщения для stdout?

Объяснение запуска systemd

Экран экрана GNU переименовывается всякий раз, когда я набираю команду

Некоторые информационные страницы отсутствуют

Управление стандартным принтером пользователей в качестве администратора

Найти файлы, имя которых составляет 4 символа

Как убедиться, что pid-файл удален, когда соответствующий процесс завершается?

Концептуализация btrfs – понимание моментальных снимков и используемого пространства

Как получить доступ для чтения и записи (безопасный) к файловой системе ext4, используемой второй ОС, запущенной из виртуального

Последняя строка неверна при разбиении файла на awk

Псевдонимы

bash if statement troubles : не найден

Linux и Unix - лучшая ОС в мире.