Cuando me conecto a https://www.google.co.uk, esto cambia a 216.58.198.228:443. Luego se abre una conexión conmigo en [Mi dirección IP]: 63998.
Mi pregunta es cómo se elige el puerto 63998 y si hay alguna forma de forzarlo a ser 63999.
networking
port
tcp
TheGathron
fuente
fuente
Respuestas:
¿Cómo se determinan los puertos locales?
El software de implementación de TCP elige el número de puerto de un rango de números de puerto llamados Puertos efímeros .
El mecanismo exacto para elegir el número de puerto y el rango a utilizar depende del sistema operativo.
¿Hay alguna manera de obligarlo a ser 63999?
Esto se puede hacer cambiando la configuración del software de implementación TCP.
Las instrucciones sobre cómo configurar el rango de puertos efímeros para una variedad de diferentes sistemas operativos se pueden encontrar en Cambiar el rango de puertos efímeros .
Sin embargo, no es una buena idea restringir el rango a un solo puerto, por ejemplo
63999
.De hecho, en Windows esto no es posible ya que:
La efímera gama portuaria
Fuente El rango de puerto efímero
Cambio de la gama de puertos efímeros
Linux:
Windows Vista / Windows Server 2008 y más reciente:
Fuente que cambia el rango de puerto efímero
Fuente del artículo 929851 de Microsoft Knowledgebase :
Windows XP y versiones anteriores:
Fuente que cambia el rango de puerto efímero
fuente
bind
sistema antes de que llameconnect
. Algunas aplicaciones tienen una opción para hacerlo, otras no.La respuesta de David Postill es perfectamente correcta. Solo quisiera agregarle algo más, enfatizando que cambiar el rango de puertos efímeros en Linux es tan simple que el OP tiene una respuesta afirmativa.
Cambia el EPR de la siguiente manera:
y puede seleccionar el puerto 50000 (como ejemplo) con el siguiente script:
Una advertencia aquí: dado que hay un solo puerto en el rango, otra aplicación podría arrebatárselo entre la ejecución de la tercera y la cuarta líneas anteriores; Además, incluso si no hay condición de carrera, paralizará todas las demás aplicaciones hasta que restaure un EPR grande, por lo que restauré el rango original lo antes posible.
Por lo tanto, si el sistema operativo de los OPs hubiera sido Linux, la respuesta habría sido que podría hacerse fácilmente.
Sorprendentemente, esto no es tan sencillo en los BSD, algunos de los cuales ni siquiera tienen una configuración de kernel en tiempo de ejecución para el EPR. MacOS X, FreeBSD y OpenBSD requieren modificar el archivo /etc/sysctl.conf , pero tienen diferentes opciones para el EPR.
Independientemente de lo anterior y del sistema operativo, el hecho de que se pueda hacer algo no significa que deba hacerse: ¿por qué en la Tierra necesitas esto? No puedo pensar en un solo caso de uso.
fuente
BIND_PORT
opcional, de modo que el código todavía se pueda usar exactamente de la misma manera que el original. Creo quehtons(bind_port_env ? atoi(bind_port_env) : 0)
haría lo correcto.Vale la pena agregar que el kernel de Linux también tiene
net.ipv4.ip_local_reserved_ports
perilla que hace algo opuesto pero, sin embargo, podría ser muy útil porque de esa manera puede "perforar un agujero" para servicios que abren puertos específicos en un rango de puertos que de otro modo sería efímero.
Breve extracto de los documentos :
fuente