lunes, 9 de abril de 2012

Errores en el manual de bash

Me aburro. No os creáis, me pasa amenudo. Y no lo veo como algo malo, ya que normalmente para quitarme el aburrimiento hago lo que yo llamo "cosas productivas". Como leer el manual de bash, por ejemplo.

$ man bash

Así de fácil. Y la verdad que está bastante interesante y uno se entera de cosas que no sabia, o entiende cosas en las que hasta ahora dudaba. Pero estoy yo tan tranquilo leyendo el manualillo en mi Kindle[0] en el avión, cuando me encuentro con una cosa que no me ha acaba de gustar. En el apartado REDIRECTION, pone lo siguiente:

Bash handles several filenames specially when they are used in redirections, as described in the following table:
/dev/tcp/host/port
If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a TCP connection to the corresponding socket.

Bueno, hasta aquí no tengo ninguna queja. Estoy conforme con esto. Pero ya no me parece tan bien el siguiente bloque. ¡Ai señor! ¡Cuánto daño ha hecho el copy-paste!

/dev/udp/host/port
If host is a valid hostname or Internet address, and port is an integer port number or service name, bash >>>attempts to open a UDP **connection**<<< to the corresponding socket.
O sea, exactamente igual que el bloque de anterior, pero cambiando TCP por UDP. Solo que estos dos protocolos no son lo mismo. Y dá la casualidad que en el protocolo UDP no se establecen conexiones. Y no es porque lo diga yo. Si hacemos un "man udp", podemos leer en la primera línea:

This is an implementation of the User Datagram Protocol described in RFC 768. It implements a **connectionless**, unreliable datagram packet service. Packets may be reordered or duplicated before they arrive.

Connectionless, sin conexiones. Por lo que el término "connection" al lado de UDP ya es incorrecto en si mismo, ya que las conexiones UDP no existen (si eso, se implementan en capas superiores en la pila TCP/IP, o sea, en la capa de Aplicación. Pero en el protocolo UDP no existen conexiones). Además, "attemps to open" también es incorrecto, ya que UDP no intenta "abrir" nada, sinó mas bien intenta mandar el paquete a la red. ¿Que el paquete llega? Bues bien. ¿Que no llega? Pues a UDP se la suda. De hecho el protocolo UDP no sabe ni si ha llegado el paquete[1], ni le importa. Repito, no existe el concepto de conexión en el protocolo UDP.

¿Qué todavía no me crees? Vaya, macho... a ver. RFC793, TCP[2]. Ocurrencias de la palabra connection: 271. RFC768, UDP[3]. Ocurrencias de la palabra connection: ninguna!!!

¿Qué propongo? Pues cambiar la frase a algo así:

If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to send a UDP datagram to the corresponding socket.

Ya he mandado un email al mantenedor del manual de bash, en mi perfecto inglés de mierda (gracias hermana por ayudarme a corregir mi inglesanalfabetismo). A ver que dice. Ya os diré cosas cuando conteste. A ver que le parece a él.

Un saludo, Jan.


[0] Noooo! Tranquilos!! No soy tan bruto como para inslarle Linux en un Kindle! Es simplemente que quería decir que me había comprado el juguetito ^_^
[1] no debería decir paquete sinó datagrama, para ser mas exacto, ya que lo que comunmente llamamos paquetes se trata siempre del nombre del PDU de Capa de Red, o sea, protocolo IP, y ahora estamos hablando de la capa de tranmisión de datos, donte tenemos datagramas en el caso de UDP y segmentos en el caso de TCP, pero bueno..... sé que diciendo paquete ya nos entendemos! Y recordemos que UDP es unreliable y por esto se la suda si llegan o no los paquetes.

No hay comentarios:

Publicar un comentario