2009-03-28 35 views
14

Actualmente estoy trabajando en un programa que olfatea los paquetes TCP que se envían y reciben hacia y desde una dirección particular. Lo que intento lograr es responder con paquetes adaptados personalizados a ciertos paquetes recibidos. Ya he hecho el análisis sintáctico. Ya puedo generar paquetes Ethernet, IP y, en su mayor parte, TCP válidos.TCP: ¿Cómo se generan los números seq/ack?

Lo único que no puedo entender es cómo se determinan los números de seq/ack.

Si bien esto puede ser irrelevante para el problema, el programa está escrito en C++ utilizando WinPCap. Estoy pidiendo sugerencias, artículos u otros recursos que puedan ayudarme.

+0

El mejor lugar para la información relacionada con los estándares suele ser el RFC original (Solicitud de comentarios), en este caso, [RFC 2018] (http: //tools.ietf .org/html/rfc2018). En general [Wikipedia] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol) es también un buen lugar para buscar. De lo contrario, está casi garantizado que obtendrás resultados [aquí] (http://tinyurl.com/dkkjfn). –

Respuesta

23

Cuando se establece una conexión TCP, cada lado genera un número aleatorio como su número de secuencia inicial. Es un número muy aleatorio: hay problemas de seguridad si alguien en Internet puede adivinar el número de secuencia, ya que pueden forjar fácilmente paquetes para inyectar en la secuencia TCP.

A continuación, para cada byte transmitido, el número de secuencia aumentará en 1. El campo ACK es el número de secuencia del otro lado, enviado de vuelta para confirmar la recepción.

RFC 793 (la especificación original del protocolo TCP) sería de gran ayuda.

+2

No es el campo ack * no * el seq # del otro lado, pero seq # + longitud recibida (como en la respuesta de zainee khan a continuación) –

0

Los números de secuencia se incrementan después de establecer una conexión. El número de secuencia inicial en una nueva conexión se elige idealmente al azar, pero muchos sistemas operativos tienen algún algoritmo semi-aleatorio. Los RFC son el mejor lugar para averiguar más TCP RFC.

1

RFC 793 La sección 3.3 cubre los números de secuencia. La última vez que escribí el código en ese nivel, creo que mantuvimos un contador de una sola vez para los números de secuencia que persistieron.

1

Estos valores hacen referencia a las compensaciones esperadas del inicio de la carga para el paquete en relación con el número de secuencia inicial para la conexión.

Reference

número de secuencia (32 bits) - tiene un doble papel Si la bandera SYN se fija, entonces este es el número de secuencia inicial. El número secuencia del primer byte de datos real será entonces esta secuencia número más 1. Si la bandera SYN no es conjunto, entonces este es el número de secuencia del primer byte de datos

Reconocimiento número (32 bits): si el indicador ACK es establecido, el valor de este campo es el siguiente byte esperado que espera el receptor .

1

Los números se generan de forma aleatoria desde ambos lados, y luego se incrementan por el número de octetos (bytes) enviados.

2

parece que el resto de las respuestas explica casi todo acerca de dónde encontrar la información detallada y oficial sobre ACK, a saber TCP RFC

Aquí está una página más práctico y "fácil de entender" que encontré cuando estaba haciendo similares implementaciones que también pueden ayudar TCP Analysis - Section 2: Sequence & Acknowledgement Numbers

+0

Gracias por el enlace :) – xian

+0

gracias por el enlace –

4

Tengo el mismo trabajo que hacer. En primer lugar, el número seq inicial se generará aleatoriamente (0-4294967297). Luego el receptor contará la longitud de los datos que recibió y enviará el ACK de seq# + length = x al remitente. La secuencia será x y el remitente enviará los datos. Del mismo modo, el receptor contar la longitud x + length = y y enviar el ACK como y y así sucesivamente ... Su cómo se genera la SEQ/ACK ...

Si desea mostrar prácticamente tratar de oler un paquete de Wireshark y siga la secuencia de TCP y vea el escenario ...

+1

Mejore la claridad de tu respuesta. – JSuar

+0

también puede capturar paquetes del terminal de esta manera: sudo tcpdump -i eth0 – zee

Cuestiones relacionadas