Título: ¿Por qué FUNCIONA TAN BIEN este TCP checksum? 4.0 Publicado por: Kaxperday en 4 Enero 2016, 09:23 am Lo que hace la función es recibir como argumentos los bytes de un paquete tcp y su tamaño, entonces recalcula su tcp checksum simplemente ESO.
Ayudandome con wireshark y estudiando los paquetes tcp, miro donde comienza cada campo, direcciónes ip origen y destino, los bytes donde se encuentran, y demás, y con la teoría aprendo a calcular las cosas. Bien, se supone que para calcular un tcp checksum necesito: http://www.roman10.net/how-to-calculate-iptcpudp-checksumpart-1-theory/ Citar source address: 32 bits/4 bytes, taken from IP header destination address: 32bits/4 bytes, taken from IP header resevered: 8 bits/1 byte, all zeros protocol: 8 bits/1 byte, taken from IP header. In case of TCP, this should always be 6, which is the assigned protocol number for TCP. TCP Length: The length of the TCP segment, including TCP header and TCP data. Note that this field is not available in TCP header, therefore is computed on the fly. Note that TCP pseudo header does not really exist, and it’s not transmitted over the network. It’s constructed on the fly to compute the checksum. If a TCP segment contains an odd number of octets to be checksummed, the last octect is padded on the right with zeros to form a 16-bit word. But the padding is not part of the TCP segment and therefore not transmitted. Lo que hago es eso, comienzo sumando ip de origen y destino, luego el numero de protocolo (con el byte de ceros a la izquierda que es indiferente y no lo pongo), luego sumo el tamaño del segmento tcp, tras mucho sudor lo conseguí pues coincide con el de wireshark y ahora los checksums me dan aproximados, y luego sumo los bytes de cabecera desde el byte que empieza hasta el final del mismo de 2 en 2 bytes, y luego con el payload tcp o campo de datos lo mismo hasta el final, y si es impar al ir sumando de 2 en 2 se queda sin pareja el ultimo byte, en ese caso hay que hacer un "padding a la derecha", que supongo que consiste en colocar un byte de ceros a la izquierda del ultimo byte para formar la ultima pareja del campo de datos o payload. Código: Código
Ejemplo de salida: Código: 7626==763a Como se puede observar en la salida, cuando es par hay una diferencia siempre constante entre el checksum original y el recalculado, sin embargo cuando es impar no encuentro la relación que difiere entre ellos. ¿que falla? ¿por qué no coinciden?, he sumado todos los campos que piden, tal y como piden. PD: y no me seáis guiris que responden sin cerebro: http://stackoverflow.com/questions/34582015/tcp-checksum-3-0-version Saludos y gracias. EDICION DELICATESSE MAAAXIMAAA: HOY ES EL DÍA, HOY ES EL DÍA que conseguí calcular el tcp checksum. Hoy es mí día, resulta que el padding cuando eran impares hay que añadir un byte de ceros en la última posición, no en la penúltima como hacía es decir, añader el cero a la derecha no a la izquierda, ahora si: Código: if (_tamaño % 2){ Queríais tcp checksum, tomad tcp checksums: Código: 504c==504c Eso sí, si me diriaís porque cohone estoy sumando 20 para que funcione ya sería lo maximo. Pero me es ya un poco indiferente porque.... FUNCIONAAAAA!!!!. SOOLUCIONADO TAMBIEN: Código
https://www.youtube.com/watch?v=m5voqcN9zm4 Me abro el champan. Os fije que caería esta semana, y no paso de primera hora. Saludos. |