¿Cómo se crea una solicitud HTTP?

A continuación se muestra la solicitud que inicié desde el cliente (una máquina centos), con la ayuda de wget.

  [ [correo electrónico protegido] ~] # wget http://192.168.0.103
 --15: 51: 09-- http://192.168.0.103/
 Conectando a 192.168.0.103:80 ... conectado.
 Solicitud HTTP enviada, esperando respuesta ... 200 OK
 Longitud: 6 [texto / html]
 Guardando en: `index.html.7 '
 100% [=======================================>] 6 --.- K / s en 0s
 15:51:09 (283 KB / s) - `index.html.7 'guardado [6/6]

Veamos qué sucedió durante la solicitud http iniciada por el cliente en el lado del servidor al capturar todo el tráfico de red usando tcpdump.

 [ [correo electrónico protegido] ~] # tcpdump -i eth0 -s0 -n -Un host 192.168.0.104 tcpdump: salida detallada suprimida, use -v o -vv para escuchar decodificación de protocolo completo en eth0, tipo de enlace EN10MB (Ethernet), tamaño de captura 65535 bytes 05: 36: 32.781066 IP 192.168.0.104.52802> 192.168.0.103.http: S 3151905201: 3151905201 (0) win 5840  E .. < [correo electrónico protegido] @ ...... h ... gBP.A ......... UR ......... .b.  192.168.0.104.52802: S 3165795006: 3165795006 (0) ack 3151905202 win 5792  E .. < [correo electrónico protegido ] @ ...... g ... hPB.2 ... A ...... h ......... .b.5.b.  192.168.0.103.http:.  ack 1 win 365  [correo electrónico protegido] @ ...... h ... gBP.A ... 2 .... md .... .b. =. b .5 05: 36: 32.784509 IP 192.168.0.104.52802> 192.168.0.103.http: P 1: 121 (120) ack 1 win 365  [correo electrónico protegido] @ ..... .h ... gBP.A ... 2 .... m ....... .b. =. b.5GET / HTTP / 1.0 User-Agent: Wget / 1.10.2 (Red Hat modificado) Aceptar: * / * Host: 192.168.0.103 Conexión: Keep-Alive 05: 36: 32.784551 IP 192.168.0.103.http> 192.168.0.104.52802:.  ack 121 win 362  [correo electrónico protegido] @. $ .... g ... hPB.2 ... B * ... j ....... .b. 8.b. = 05: 36: 32.786377 IP 192.168.0.103.http> 192.168.0.104.52802: P 1: 268 (267) ack 121 win 362  [correo electrónico protegido] @. #. .... g ... hPB.2 ... B * ... jQ .... .b.:. b. = HTTP / 1.1 200 OK Fecha: jue, 21 feb 2013 10:36:32 GMT Servidor: Apache / 2.2.3 (Red Hat) Última modificación: jue, 21 feb 2013 09:47:39 GMT ETag: "377709-6-f71984c0" Aceptar-Rangos: bytes Contenido-Longitud: 6 Conexión: cerrar Contenido- Tipo: texto / html;  charset = UTF-8 hola 05: 36: 32.787006 IP 192.168.0.103.http> 192.168.0.104.52802: F 268: 268 (0) ack 121 win 362  [correo electrónico protegido] @. $ .... g ... hPB.3 ... B * ... j ....... .b.:. b. = 05: 36: 32.787622 IP 192.168.0.104.52802> 192.168. 0.103.http:.  ack 268 gana 432 <nop, nop, t 

Examinemos la salida de tcpdump mediante un examen detallado. He dividido la salida tcpdump de nuestra solicitud http de muestra a diferentes pasos a continuación, para una fácil comprensión.

Paso 1: establecer una conexión TCP al servidor por parte del cliente

Al igual que cualquier otro protocolo de capa de aplicación, HTTP también funciona sobre TCP. Entonces, el primer paso realizado por el cliente para iniciar una conexión http es establecer una conexión TCP con el servidor http.

Puede verlo claramente en las tres primeras líneas de nuestra salida tcpdump anterior . Esas primeras tres líneas indican el protocolo de enlace TCP inicial.

Si ve la salida de tcpdump, la primera línea es una solicitud de inicio de conexión con la marca “S” establecida (por lo que es una solicitud de sincronización). La segunda es una respuesta del servidor al cliente con el conjunto de banderas ” S & ACK “. La tercera es una respuesta ” ACK ” del cliente para completar el apretón de manos de tres vías.

Tenga en cuenta que solo completamos el establecimiento de la conexión TCP hasta aquí.

Paso 2: Iniciar una solicitud HTTP GET del cliente al servidor

La cuarta línea en la salida de tcpdump es del cliente que inicia una solicitud http “GET”.

Los clientes utilizan las solicitudes de obtención para recuperar datos del servidor. Si ve de cerca la solicitud GET del cliente, revela cierta información como se muestra a continuación.

  1. ¿Qué solicita el cliente? Por ejemplo, en nuestro caso, es un simple “/” . GET “/” , este tipo de solicitud le dice al servidor que recupere el directorio raíz (la página predeterminada del sitio web).
  2. También le dice a la versión http que está utilizando el cliente. En nuestro caso es HTTP / 1.0 .
  3. El cliente informa al servidor qué tipo de agente de usuario se está utilizando para la solicitud (tipo de navegador, su versión, si es una aplicación, etc. Esta parte es enviada por el software del cliente utilizado para iniciar la conexión. En nuestro caso su ” Wget /1.10.2 (Red Hat modificado) “)
  4. Otro detalle importante que el cliente informa al servidor es el tipo de datos que el cliente está listo para aceptar. HTTP permite todos los tipos de medios MIME. En nuestro ejemplo, nuestro cliente está listo para aceptar cualquier tipo de datos, por lo tanto, es * / *
  5. El campo HOST indica el nombre de host del servidor, desde el cual el cliente solicita los datos.
  6. La mayoría de los clientes solicitan un tipo de conexión de mantenimiento del servidor. Keep-alive se utiliza para mantener la conexión tcp realizada por el cliente, de modo que la sobrecarga de crear una conexión tcp se reduce para solicitudes posteriores. Aunque el cliente solicita una conexión de tipo mantener vivo del servidor, es el servidor quien decide si mantener la conexión TCP activa o no (según la configuración del servidor).

Todos los parámetros de solicitud GET mencionados anteriormente se muestran a continuación (que también se muestra en la salida tcpdump anterior).

  05: 36: 32.784509 IP 192.168.0.104.52802> 192.168.0.103.http: P 1: 121 (120) ack 1 win 365 
 [correo electrónico protegido] @ ...... h ... gBP.A ... 2 .... m .......
 .b. =. b.5GET / HTTP / 1.0
 User-Agent: Wget / 1.10.2 (Red Hat modificado)
 Aceptar: * / *
 Anfitrión: 192.168.0.103
 Conexión: Keep-Alive

Los registros del servidor web también informarán la misma información que vimos anteriormente, confirmemos al ver la solicitud de obtención de los registros de nuestro servidor web.

  [ [correo electrónico protegido] ~] # tail -f / var / log / httpd / access_log
 192.168.0.104 - - [21 / feb / 2013: 05: 34: 14 -0500] "GET / HTTP / 1.0" 2

Paso 3: respuesta del servidor HTTP a una solicitud HTTP GET

Al recibir la solicitud GET del cliente, el servidor responde revelando cierta información sobre sí mismo y metadatos sobre los datos solicitados por el cliente, junto con los datos.

  1. El servidor envía un código de estado (este código de estado informa al software del cliente sobre el resultado de la solicitud). HTTP utiliza muchos códigos de estado. Veremos algunos códigos de estado comunes en HTTP más adelante en esta publicación. Discutir todos los códigos de estado utilizados HTTP está más allá del alcance de este artículo.

El servidor responde al cliente con un código de estado de 200 y la versión http que está utilizando. En nuestro caso es HTTP /1.1 .

El código de estado de 200 significa que la solicitud se ha realizado correctamente.

2. Fecha especifica la fecha y hora en que se originó la respuesta

3. El servidor presentado en la respuesta indica el software del servidor que se está utilizando (este campo es modificable en casi todos los servidores web. Esto a veces es una violación de seguridad ya que revela la información del servidor al cliente).

En nuestro caso es Apache 2.2.3 (Red Hat)

4. El último campo modificado informa al cliente, la fecha y hora modificadas de los datos solicitados.

5. Etag es una cadena que identifica la modificación de los datos solicitados. Esto se usa para el almacenamiento en caché. Esto mejora la calidad del almacenamiento en caché web.

Etag es un identificador asignado por el servidor web a una versión específica del recurso solicitado.

6. Otro factor importante que hace de http un protocolo maravilloso es que puede solicitar los bytes requeridos de un recurso.

Por ejemplo, si está descargando un archivo de 100M y en medio de la conexión interrumpida, puede reanudar la descarga especificando el rango de bytes desde donde comenzar la descarga en la solicitud GET.

En nuestro caso, el servidor informa al cliente en su respuesta que admite el rango de bytes.

7. Content-Length especifica el tamaño del recurso solicitado en bytes. En nuestro caso es solo un “hola” impreso. De ahí sus 6 bytes.

8. Conexión: cerrar, en nuestro caso indica que la conexión se cerrará después de completar esta solicitud en particular.

9. Content-Type especifica el tipo de contenido. En nuestro ejemplo es un simple texto / HTML.

10. Finalmente vienen los datos después de estos encabezados.

Todos los detalles mencionados anteriormente de la salida tcpdump en una respuesta de obtención http se muestran a continuación.

  05: 36: 32.786377 IP 192.168.0.103.http> 192.168.0.104.52802: P 1: 268 (267) ack 121 win 362 
 [correo electrónico protegido] @. # .... g ... hPB.2 ... B * ... jQ ....
 .b.:. b. = HTTP / 1.1 200 OK
 Fecha: jue, 21 de febrero de 2013 10:36:32 GMT
 Servidor: Apache / 2.2.3 (Red Hat)
 Última modificación: jue, 21 feb 2013 09:47:39 GMT
 ETag: "377709-6-f71984c0"
 Aceptar-Rangos: bytes
 Longitud del contenido: 6
 Conexión: cerrar
 Tipo de contenido: texto / html;  juego de caracteres = UTF-8
 
 Hola

Tipos de solicitud HTTP:

Ya hemos visto el tipo de solicitud GET en el ejemplo anterior, veamos algunos tipos más de tipos de solicitud HTTP.

Solicitud de HTTP Head

La solicitud de cabecera HTTP es muy similar a la solicitud GET. Es el método más fácil para conocer los detalles completos del recurso disponible en una URL en particular, sin descargar todos los datos.

Por ejemplo, si usamos la solicitud HEAD en nuestro ejemplo anterior, obtendremos todos los encabezados en la respuesta, excepto nuestra página que contiene el mensaje “Hola”.

Este tipo de solicitud se usa solo para recuperar atributos de los datos sin los datos. Esto puede brindarle información sobre el recurso al guardar su ancho de banda.

Solicitud de publicación HTTP

La solicitud POST se usa principalmente para enviar datos desde el cliente al servidor. Veamos un ejemplo de solicitud de publicación HTTP del cliente al servidor.

  POST /my_data_send.php HTTP / 1.1
 Anfitrión: 192.168.0.105
 User-Agent: ELinks / 0.11.1 (modo de texto; Linux; 80x25-2)
 Referer: http://192.168.0.105/
 Aceptar: * / *
 Aceptar-Codificación: gzip
 Aceptar-Idioma: en
 Conexión: Keep-Alive
 Tipo de contenido: application / x-www-form-urlencoded
 Longitud del contenido: 62
 nombre = sarath & last = pillai & email = & phone = & comments =

En la solicitud posterior que se muestra arriba, la solicitud se envía a “my_data-send.php” . Estos datos que se envían al servidor también contendrán otros encabezados que vimos durante nuestro ejemplo de solicitud GET.

La última línea envía los datos exactos al servidor.

Solicitud de colocación HTTP:

La solicitud de colocación HTTP es muy similar a la solicitud de publicación. La solicitud PUT envía o crea un recurso en el URI especificado.

SI el recurso ya está presente en ese URI especificado, actualizará ese URI; de lo contrario, creará el recurso.

Solicitud de eliminación de HTTP:

La solicitud de eliminación de HTTP elimina un recurso especificado en un URI especificado.

No es recomendable configurar un servidor web para la operación de eliminación de HTTP. Sin embargo, si desea habilitar tales funcionalidades, es mejor que con una operación POST http utilizando un formulario web, que el interno eliminará un recurso.

Solicitud de rastreo HTTP

La solicitud de rastreo HTTP se utiliza para solucionar problemas de páginas web http.

Por ejemplo, si se supone que una página web no se carga de la manera que desea en su navegador. Luego, en tales casos, la solicitud de rastreo http se puede utilizar para recuperar la solicitud completa que el servidor recibió del cliente de vuelta al cliente mismo.

Este tipo de solicitud está deshabilitado principalmente en la mayoría de los servidores web. La razón principal es que es muy similar a ver el registro del servidor web de la solicitud que envía.

Algunos códigos de error famosos

Algunos de los códigos de estado HTTP ampliamente conocidos se mencionan a continuación.

400:

El código de error Http 400 significa “Tipo de solicitud incorrecta” . el servidor responde con un error 400 cuando el servidor recibe una solicitud con formato incorrecto de cualquier tipo.

403

El servidor muestra este error de código de estado cuando el recurso solicitado está prohibido.

En otras palabras, se puede decir que no tiene acceso al recurso al que está intentando acceder.

404

El código de error más famoso en http es 404. Indica un error no encontrado. El recurso solicitado no se encuentra en el servidor.

500

Este código de error de 500 se utiliza para informar al cliente que se produjo un error interno en el servidor. Pero este error no especifica un problema específico en el servidor web.

O diga un error desconocido en el servidor web.

Nota – Fuente original (Referencias) – Shashroot