BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

Dudas acerca de tcp ip segmentacion ip ...

BocaDePez
BocaDePez

Hola amigos, a ver si alguien me puede responder algunas dudas que tengo:

Cuando yo hago un ping a una máquina de mi red, por ejemplo ping -s 2000 DIRECCION ­estoy diciendo "hazme un ping de 2000 bytes de tamaño de datos". Tengo establecido el tamaño MTU a 1500, por lo que obviamente se fragmenta el datagrama. La duda es: ¿cuantos bytes en total ocupa cada datagrama ?

Con tcpdump corriendo sobre la interfaz de red (tcpdump -­i eth0 -­e) me aparece un campo length de valor 1514 en el primer datagrama y de 562 en el segundo. ¿De donde vienen esos valores? ¿Por que el primero supera el MTU de la red? He pensado que serían las cabeceras ip/tcp pero no me salen las cuentas. Por lo que he leido por ahí las cabeceras ocupan 20 bytes cada una por lo que 1514 - 40 = 1474 y 562 - 40=522 entonces 522 + 1474 =1996 que no son los 2000 que había yo enviado.

Hay algo que se me escapa en las cuentas pero no sé el que.

Por otro lado, hay alguna forma de obtener la longitud de cabeceras de un datagrama dado?

Muchas gracias por vuestro tiempo

BocaDePez
BocaDePez

Un ping no envía datagramas

Un ping ICMP no puede tener cabeceras TCP

🗨️ 1
BocaDePez
BocaDePez

Un ping si envia datagramas IP. Ello ocurre pues el protocolo ICMP se encapsula en un datagrama IP. Efectivamente un ping no posee cabeceras de capa de transporte (TCP o UDP). Respecto de que a nivel de capa de enlace la captura de 1514 y no 1518 es porque Wireshark no muestra el campo CRC (trailer) para la detección de errores.

BocaDePez
BocaDePez

Tal vez Wireshark te dé una mejor explicación de qué es cada cabecera ... ;)

xavisuper

Me gustan estas cuestiones. A mí sí me han salido las cuentas, aunque no como esperaba. Vamos allá.

Una de conceptos.

MTU es el tamaño máximo de la carga que puede transportar un protocolo de nivel 2, en tu caso ethernet. O sea MTU de 1500 significa que el tamaño máximo del paquete IP, con su cabecera y sus datos, es de 1500 bytes.

Ergo, la trama ethernet más grande con una MTU de 1500 es 1518 (1500 de MTU más 14 bytes de cabecera mas 4 de trailer). El que a tí te salga una trama de 1514 me hace sospechar que tcpdump no considera el trailer en el cómputo. Asumamos pues 14 bytes de cabecera ethernet.

Por otro lado, la cabecera IP típica son 20 bytes, la cabecera ICMP son 4 bytes y el ping añade una subcabecera de otros 4 bytes.

Según me consta al consultar 'man ping' en mi ordenador, un 'ping -s 2000' se va convirtiendo en:

- 2004 bytes al añadirle la subcabecera de ping.

- 2008 bytes al añadir la cabecera ICMP.

- Serían 2028 bytes al añadirle la cabecera IP, pero como hay que segmentar, se generan dos paquetes IP cada uno con su cabecera, o sea, 2048 bytes, en dos paquetes, el primero de 1500 bytes y el segundo de 548 bytes.

- En Ethernet añade 14 bytes de cabecera a cada uno. RESULTADO: 1514 y 562 bytes respectivamente.

Ahora vienen mis dudas, ¿por qué la trama más grande es de 1514 y no de 1518, según me consta a mí en teoría? ¿Será que tcpdump no computa el CRC al calcular la longitud de la trama?

La otra explicación, si tcpdump realmente computa la cabecera y el trailer, 18 bytes, sería entonces que la MTU real es de 1496 bytes, no 1500, y en los 2000 bytes se incluyen la cabecera ICMP y la subcabecera de ping. ¡No me convence!

🗨️ 5
xavisuper

No puedo ni editar ni borrar mi respuesta, ¡una pena!, tengo que ponerlo a continuación.

Ya he aclarado mis dudas.

Efectivamente, ni tcpdump ni wireshark cuentan el CRC a la hora de calcular el tamaño de una trama. Así que olvidaos de los dos últimos párrafos que he escrito.

Prueba a añadir la opción -v al comando tcpdump, te da más información que te puede ayudar a entender lo que ocurre. O como bien te han dicho, wireshark, que es libre y gratuito.

BocaDePez
BocaDePez

Muchisimas gracias xavisuper, me has aclarado muchas dudas, chapó por tu respuesta, clara y explicativa.

Al leer tu explicación me ha surgido otra duda:

cuando se fragmenta ese paquete en el caso del 1º estamos hablando entonces de (no incluyo los 14 bytes de trama):

- 1472 bytes de "data"

- 20 + 4 + 4 bytes de cabeceras

y en el caso del 2º:

- 528 bytes de data

- 20 bytes de cabeceras, pero ¿por que no 28 como el 1er paquete? ¿Acaso tienen cabeceras de distinto tamaño?

Lo que yo estaba mezclando era el tamaño de la trama con el tamaño del paquete. Lo que me ofrece tcpdump (sin -v) es el tamaño de la trama y no del paquete.

Y claro para un paquete del tamaño de 1500 (en Ethernet es el máximo) , al tamaño del paquete se le suman 18 bytes.

Gracias de nuevo por la explicación y por la recomendación de wireshark, ya lo he probado y es muy interesante :)

🗨️ 3
xavisuper

cuando se fragmenta ese paquete en el caso del 1º estamos hablando entonces de (no incluyo los 14 bytes de trama):

- 1472 bytes de "data"

- 20 + 4 + 4 bytes de cabeceras

No, son 2000 bytes de datos, más 4 de subcabecera ping más 4 de cabecera ICMP; en total 2008 bytes. Hasta este momento aún no hay fragmentación.

Luego se cogen los primeros 1480 bytes de ésos 2008, se le ponen 20 bytes de cabecera IP, y ya tienes los 1500 bytes del primer fragmento.

Para el segundo fragmento te quedan 2008-1480=528 bytes. Le añades 20 bytes de cabecera IP, y tienes los 548 del segundo fragmento.

Luego en destino se quitan las cabeceras IP, se reensamblan los dos fragmentos, con lo que recuperas los 2008 bytes originales, y se entrega a ICMP para que lo procese.

🗨️ 2
BocaDePez
BocaDePez

Xavisuper, mañana tengo un examen de laboratorio de telematica y me has salvado la vida.

Graciaaaaaaas!!!!

🗨️ 1