Servicios Linux escuchando por el mismo puerto
- August 27, 2013
- tuxotron
- En la forma tradicional en al que un servicio procesa conexiones, es entrando en un bucle sin fin e ir creando hilos (threads) para procesar cada petición. Por lo visto Herbert tiene situaciones en las que tiene que lidiar con 40000 peticiones por segundo, y ese único punto de entrada se acaba convirtiendo en un cuello de botella.
- De nuevo, con el método tradicional multihilo, la carga de trabajo entre los hilos que están esperando peticiones no está balanceada. Es decir, que hay varios hilos que reciben casi todo el trabajo, mientras que otros pasan la mayor parte de su tiempo esperando y como consecuencia de ello, no se aprovechan todos los procesadores del sistema de una forma optimizada.
- El primer servicio que empiece a escuchar por el puerto X, debe establecer la opción SO_REUSEPORT. Si esto no ocurre, ningún otro servicio podrá escuchar por dicho puerto.
- Los servicios que compartan puerto, deben tener un User ID efectivo y éste debe ser el mismo que el primer servicio que abrió el puerto. Con esto se consigue evitar el secuestro de puertos. De otra forma, un usuario malo malísimo, podría poner a escuchar algún servicio malicioso por un puerto con un servicio legítimo.

Cuando leí sobre la nueva funcionalidad introducida en el núcleo de Linux en su versión 3.9 me acordé de la entrada HTTPS, SSH y OpenVPN en un mismo puerto, ¿magia? en SecurityByDefault aunque son cosas distintas.
Como decía en la versión del núcleo de Linux 3.9, se introdujo una nueva característica relacionada con los Sockets, la cual permite poner a más de un servicio o demonio escuchando por el mismo puerto. Esto se consigue a través de una nueva opción llamada SO_REUSEPORT. Los parches para esta nueva funcionalidad fueron implementados por Tom Herbert, un ingeniero de Google.
Algunos de los argumentos que Tom Herbert puso sobre la mesa para implementar esta característica fueron:

Vamos a usar el siguiente script escrito en Ruby:
La línea 10 es la clave. Ahí es donde decimos que queremos compartir el puerto. Todo lo que nuestro servicio va a hacer es repetir lo que el cliente le mande, con el prefijo “Version 1” en este caso. Por lo tanto si arrancamos 2 servicios y nos conectamos al puerto 5555 varias veces:

Otra de las bondades de esta nueva opción es que podemos agregar nuevos servicios en cualquier momento. Digamos que hemos arreglado un error en nuestro script y queremos ponerlo a escuchar. Vamos a modificar la salida del script a: “Version 2”, más lo que nos mande el cliente:

Como vemos, ahora tenemos corriendo dos servicios “Version 1” y un servicio “Version 2”. De esta forma podemos tener nuestro servicio corriendo sin coste en el tiempo de despliego (deployment), con lo cual nunca dejamos de dar servicio. Una vez que tengamos corriendo nuestro nueva versión, podemos ir cerrando las “Versiones 1” e ir dejando levantando “Versiones 2”.
Creo que es una característica que da mucho juego. Como nota final decir que aunque esto haya llegado a Linux recientemente, es una característica que los sistemas BSD desde hace años.
Fuentes http://freeprogrammersblog.vhex.net/post/linux-39-introdued-new-way-of-writing-socket-servers/2 https://lwn.net/Articles/542629/
Disponible el código fuente de la mítica demo "Second Reality" de Future Crew + análisis del mismo
- August 26, 2013
- cybercaronte
- VGA
- Ensamblador
- Arquitectura PC (Programación PIC y PIT)
- VGA Architecture: FreeVGA Project
- The Art of Assembly (especialmente el capítulo 17 ).
- 8254 PIT Programming
- El código está empaquetado con punteros "FAR" y "NEAR", este enlace es especialmente útil: Intel's Basic Architecture Documentation, especialmente el capítulo 4.3.
- Los clásicos artículos de Michael Abrash de su libro Graphic Programming Black Book: Chapter 3: (Zen Timer and PIT), Chapter 24: VGA tour, Chapters 47,48and 49: (Mode X).
Antes de empezar, vamos a deleitarnos otra vez con la mejor demostración gráfica de todos los tiempos:
httpv://youtu.be/rFv7mHTf0nA
Second Reality fue una "demo" programada por Future Crew para la demoparty Assembly 93. Después de ganarla pasó a la posteridad por su gran calidad en la programación de efectos gráficos (no falta ni uno) y de la música.
Pues los chicos de Future Crew han celebrado su 20 aniversario de la forma que más nos gusta a los geek como nosotros, publicando el código fuente original de la demo que puedes descargar aquí (el código se publicó el 30 de Julio de este mismo año.). Aunque ya tiene algún tiempo (1993), es interesante analizar la forma en la cual crearon esos fantásticos efectos y aprender de ellos.
Pero lo mejor de todo es que Fabien Sanglard nos ha ahorrado horas de dejarnos los ojos y los sesos analizando el código fuente, ya que ha creado un fantástico análisis de todo su funcionamiento, aquí tienes enlaces a los índices:
Part 1: Introduction Part 2: Engine Part 3: Demo Interrupt Server Part 4: Dev Vs Prod Part 5: Parts
Genial, no te lo pierdas. Encontrarás curiosidades como por ejemplo que utilizaban código autogenerado en C para crear bucles en ASM ó que toda la información de la demo como gráficos, efectos de sonido, música, etc estaba en un fichero llamado REALITY.FC en formato WAD, propiedad de los chicos que crearon en mítico DOOM.
Los tres pilares para entender la demo son (según el autor del artículo):
Por fin podemos desentrañar los secretos de esta maravilla de la programación, gracias a Fabien Sanglard.
Artículo creado partiendo de este enlace.
Aprende y/o enseña a programar con Python y Minecraft Pi
- August 25, 2013
- tuxotron

Raspberry Pi + Minecraft Pi + Python Pi es una combinación perfecta para la enseñanza de la programación, asequible y al alcance de cualquiera.
Eso mismo pensó Craig Richardson, autor de un libro que nos podemos descargar de forma totalmente gratuita en el recoge una serie ejercicios sobre programación en Python usando Minecraft Pi. El libro se titula Minecraft Pi Book (PDF).
Cada capítulo del libro comienza con varios ejercicios de programación sobre Minecraft y después de estos, podemos encontrar explicaciones y conceptos de programación/Python que necesitaremos para realizar los ejercicios anteriormente propuestos. Cada capítulo va tocando conceptos más avanzados y también reta al estudiante con ejercicios extras que van un poco más allá de los conceptos explicados.
El libro está pensado como material de apoyo de las clases de Python ofrecidas en Codecademy.
El índice resumido del mismo es el siguiente:
1 Introduction 2 Getting Started 3 Python Syntax 4 Maths Operations 5 Strings and Console Output 6 Comparators and Control Flow 7 Functions 8 Lists and Dictionaries 9 Functions and Lists 10 Loops 11 Advanced Topics in Python 12 Binary and Bitwise Operators 13 Classes 14 File Input and Output 15 Error Handling Appendices
Además de este libro, el autor también ha creado un pequeño libro de apoyo con apuntes para el profesor (PDF), así como una plantilla de la API de Minecraft (PDF).Un completo para enseñar, aprender y jugar todo al mismo tiempo!!
Nota: Los últimos capítulos del libro están incompleto y por lo tanto veremos nuevas versiones pronto.
Buscar
Entradas Recientes
- Posts
- Reemplazando la bateria del AirTag
- OpenExpo Europe décima edición, 18 de mayo: El Epicentro de la Innovación y la Transformación Digital
- Docker Init
- Kubernetes para profesionales
- Agenda: OpenExpo Europe 2022 llega el 30 de junio en formato presencial
- Libro 'Manual de la Resilencia', de Alejandro Corletti, toda una referencia para la gestión de la seguridad en nuestros sistemas
- Mujeres hackers en ElevenPaths Radio
- Creando certificados X.509 caducados
- Generador de imágenes Docker para infosec