2010-03-16 17 views
5

Tengo que hacer un sniffer como tarea para el curso de seguridad. Estoy usando C y la biblioteca pcap. Todo funcionó bien (ya que obtuve un código de Internet y lo cambié). Pero tengo algunas preguntas sobre el código.Descomposición de un encabezado IP

u_int ip_len = (ih->ver_ihl & 0xf) * 4; 

ih es de tipo ip_header, y su momento, que apunta a la cabecera IP en el paquete.
ver_ihl da la versión de la IP.
No puedo imaginar qué es: & 0xf) * 4;

+0

1 por ser honesto y minucioso :) –

Respuesta

3

& es el operador AND, en este caso estás anding ver_ihl con 0xf que tiene el efecto de borrar todos los bits que no sean los menos signifcant 4

0xff & 0x0F = 0x0F

ver_ihl se define como primera 4 bits = versión + segundo = longitud de la cabecera 4 Internet. La operación y elimina los datos de la versión dejando los datos de longitud por sí mismo. La longitud se registró como el recuento de palabras de 32 bits lo que la convierte * 4 ip_len en el recuento de bytes en la cabecera

En respuesta a tu comentario:

bit a bit y ands los bits correspondientes en los operandos. Cuando tú y cualquier cosa con 0 se convierte en 0 y cualquier cosa con 1 permanece igual.

0xf = 0x0f = binario 0000 1111

Así que cuando usted y 0x0f con cualquier cosa los primeros 4 bits se ponen a 0 (como eres anding contra 0) y los últimos 4 bits permanecen como en el otro operando (como lo eres y anding ellos contra 1). Esta es una técnica común llamada enmascaramiento de bits.

http://en.wikipedia.org/wiki/Bitwise_operation#AND

+0

me ocurrió la idea (ver_ihl contiene la versión (4 bits) + longitud de la cabecera internet (4 bits)), pero yo todavía no entiendo cómo esta operación es la eliminación de los datos de versión . cuando esté anding con 0xf quiere decir esto que su anding sólo el puño de 4 bits? – scatman

0

El campo ver_ihl contiene dos números enteros de 4 bits, envasados ​​como la baja y alta nybble. La longitud se especifica como un número de palabras de 32 bits. Por lo tanto, si usted tiene un marco de IP versión 4, con 20 bytes de cabecera, tendría un valor de campo de ver_ihl 69. Entonces será tener presente:

01000101 
& 00001111 
    -------- 
    00000101 

Así que, sí, el "& 0xf "enmascara los 4 bits bajos".

1

lectura de RFC 791 que define IPv4:

Un resumen de los contenidos de la cabecera de internet siguiente:

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|Version| IHL |Type of Service|   Total Length   | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

Los primeros 8 bits de la cabecera IP son una combinación de la versión y el campo de DIH.

DIH: 4 bits

Header Internet longitud es la longitud de la cabecera de internet en 32 palabras de bits, y por lo tanto señala el principio de los datos. Tenga en cuenta que el valor mínimo para un encabezado correcto es 5.

Lo que está haciendo el código, es tomar los primeros 8 bits allí, y cortar la parte de IHL, y luego convertirla en el número de bytes. La AND a nivel de bit 0xF aislará el campo IHL, y la multiplicación por 4 está allí porque hay 4 bytes en una palabra de 32 bits.

Cuestiones relacionadas