[DESARROLLO] Http

Hola! Estoy montando un mini servidor web y necesito que me echéis una mano. Llevo un par de días leyendo documentación sobre la cabecera TCP y demás, pero tengo algunas dudas, sobre todo con el establecimiento de conexión, lo que denominan "negociación en 3 pasos":

Este es el esquema básico:
Imagen

Deduzco que tengo que :
-esperar a que me manden un paquete con SYN
-cuando me llegue mandar yo un SYN + ACK
-esperar un ACK
-esperar una petición (me imagino que un HTTP GET).

¿Y luego qué hago? A ver si hay alguein que me pueda echar una mano ;)
manugarrote escribió:Hola! Estoy montando un mini servidor web y necesito que me echéis una mano. Llevo un par de días leyendo documentación sobre la cabecera TCP y demás, pero tengo algunas dudas, sobre todo con el establecimiento de conexión, lo que denominan "negociación en 3 pasos":

Este es el esquema básico:
................

Deduzco que tengo que :
-esperar a que me manden un paquete con SYN
-cuando me llegue mandar yo un SYN + ACK
-esperar un ACK
-esperar una petición (me imagino que un HTTP GET).

¿Y luego qué hago? A ver si hay alguein que me pueda echar una mano ;)


Si lo que estás montando es un servidor web no necesitas meterte con el protocolo TCP, solo es cuestion de abrir el socket, asociarlo a una ip, ponerlo en modo de escucha y luego ir aceptando las conexiones que vengan, ya sea mediante un hilo por conexión o un solo hilo que se encargue de multiplexar todas las conexiones que vengan.

Sobre como manejar el protocolo http pues esto me ayudó un poco en el server http que estoy haciendo, tambien es buena idea leerse un poco el RFC 2616 que habla sobre HTTP/1.1. Sin conocer que lenguaje/plataforma estás utilizando no puedo ayudarte más. Saludos.
Estoy desarrollándolo en un microcontrolador, utilizando como base mi propia pila TCP/IP, así que sí que tengo que bajar hasta ese nivel ;)
Gracias por la respuesta.
manugarrote escribió:Estoy desarrollándolo en un microcontrolador, utilizando como base mi propia pila TCP/IP, así que sí que tengo que bajar hasta ese nivel ;)
Gracias por la respuesta.


En todo caso crear una pila TCP/IP es algo complejo por temas de ensamblado de paquetes, control de secuencia y reenvio, control de congestión, checksum, etc (más aun en microcontroladores por cuestiones de memoria y demás). Te recomiendo que uses por ejemplo uIP, la cual es una implementación de la pila TCP/IP para microcontroladores de codigo abierto, así solo te tendrias que enfocar en la parte del servidor HTTP. Saludos.
La pila ya la tengo hecha y es funcional ;D
Recibo sin problemas el paquete SYN, el problema viene a la hora de crear el paquete de respuesta, que el sniffer que tengo en el ordenador me da error (me dice que el paquete no está bien formado). La única información decente que he encontrado ha sido en la wikipedia inglesa, pero no me funciona y no sé por dónde meterle mano.
No uses como fuente fiable la wikipedia, y menos para implementar la pila tcp/ip.

Toda la información necesaria la tienes en los RFC, de todas formas, como bien te ha dicho codestation, no reinventes la rueda y usa uIP, porque hacer una implementacion sin bugs de tcp/ip no debe de ser algo trivial...

Saludos.
Es mi PFC, así que lo tengo que hacer solito jeje
La pila funciona sin problemas (la hemos testeado varias personas), el problema viene a la hora de crear los paquetes de negociación. He conseguido procesar correctamente el que me envía el cliente y enviarle yo la respuesta. He visto con Ethereal que esté bien hecha, pero el cliente no me responde, por lo que algo debe estar mal...
manugarrote escribió:He visto con Ethereal...

Con... Ethereal? Ethereal paso a ser Wireshark hace años... de que siglo es el programa que usas? XD
JanKusanagi escribió:
manugarrote escribió:He visto con Ethereal...

Con... Ethereal? Ethereal paso a ser Wireshark hace años... de que siglo es el programa que usas? XD

Voi hacer offtopic sorry
COMO ODIO EL WIRESHARK !! xD
Cada vez que montamos algo en clases de "redes de área local" y falla...usad el wireshark a ver los paquetitos blablabla!! xD
Me he colado... uso WireShark Version 1.2.6 [+risas]
No estoy seguro de lo que voy a decir pero...

Puede darse el caso que el host A no envie el ACK?
El ACK prácticamente no es necesario, ya que cuando el servidor ya devuelve el SYN+ACK la conexión ya se podría dar por establecida para el host B, por lo que en lugar de enviar el ACK, ya podría enviar directamente la solicitud HTTP.

A ver si alguien lo confirma :)
Que hilo mas interesante, cuando termines reflota el hilo eh!

Sobre la negociación ahora mismo no sabría decirte, lo estudie el año pasado y no lo recuerdo bien, no es mi fuerte. Si puedo repasarlo ya editaré.
Si la pila de protocolos la tienes bien hecha, a la hora de programar el server solo deberias preocuparte de cosas como "manda datos a la red" "dame datos de la red". Y listo, todo el tema de los ACK, las ventanas de transmisión y demás no es cosa de http. De hecho, HTTP deberia poder funcionar sobre "cualquier" protocolo orientado a conexión, el tema de como esa conexión se establezca es independiente.

Con esto te quiero decir que probablemente el problema lo tengas en tu pila de protocolos. Haz pruebas con telnet, en vez de un cliente HTTP, es mucho mas sencillo ver los pasos de la conexión.
Sertinell escribió:Si la pila de protocolos la tienes bien hecha, a la hora de programar el server solo deberias preocuparte de cosas como "manda datos a la red" "dame datos de la red". Y listo, todo el tema de los ACK, las ventanas de transmisión y demás no es cosa de http. De hecho, HTTP deberia poder funcionar sobre "cualquier" protocolo orientado a conexión, el tema de como esa conexión se establezca es independiente.

Con esto te quiero decir que probablemente el problema lo tengas en tu pila de protocolos. Haz pruebas con telnet, en vez de un cliente HTTP, es mucho mas sencillo ver los pasos de la conexión.

La pila está hecha, tengo implementado el protocolo TCP, pero sólo envía paquetes según yo le diga, o filtra los recibidos según mi necesidad.

Ha habido bastantes cambios desde mi pregunta y gente que me ha ayudado (gracias codestation), cuando termine os explicaré los pormenores, pero todavía falta un pelín.

Ya tengo hecho TODA la parte de las negociaciones, y funciona, pero hay un problema, y es que el código HTML de la web, en lugar de mandarlo como segmento de datos TCP lo hace como protocola de transferencia de hypertexto. He comparado mi paquete con otro que sí que está bien hecho y por más que miro no sé que es lo que me falla.

EDITO: solucionado!! El navegador no pone nada que no esté escrito dentro de la cabecera <HTML> [+risas]

FUNCIONA!!!!
13 respuestas