인디노트

TCP 헤더의 Checksum 값을 계산하는 공식 본문

개발 플랫폼 및 언어/네트워크 기술

TCP 헤더의 Checksum 값을 계산하는 공식

인디개발자 2023. 4. 17. 08:50
  1. TCP 헤더의 Checksum 필드를 0으로 설정합니다.
  2. TCP 헤더와 TCP 데이터를 모두 합친 패킷을 16 비트 단위로 쪼개어 1의 보수를 취합니다.
  3. 쪼개진 16 비트 값들을 모두 더합니다.
  4. 더한 결과값이 16비트를 초과하면 초과한 값은 더하고, 아닌 경우에는 더하지 않습니다.
  5. 마지막으로 1의 보수를 취한 값이 TCP 헤더의 Checksum 필드 값이 됩니다.

 

Pseudo-Header Checksum (RFC 793):
[Src IP] + [Dst IP] + [0x00] + [Protocol] + [TCP Length]
(16 bits)    (16 bits)   (8 bits)   (8 bits)    (16 bits)

TCP Checksum:
[TCP Header] + [TCP Payload]
(16 bits)       (variable)
TCP 체크섬을 계산하기 위해선, 
TCP 헤더와 TCP 데이터를 모두 포함하는 패킷을 생성한 뒤, 
위 수식을 사용하여 TCP 체크섬을 계산합니다.

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

unsigned short calculate_tcp_checksum(unsigned short *ptr, int nbytes)
{
    register long sum;
    unsigned short oddbyte;
    register short answer;

    sum = 0;
    while (nbytes > 1) {
        sum += *ptr++;
        nbytes -= 2;
    }
    if (nbytes == 1) {
        oddbyte = 0;
        *((u_char *)&oddbyte) = *(u_char *)ptr;
        sum += oddbyte;
    }

    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    answer = (short)~sum;

    return (answer);
}

이 함수는 TCP 헤더의 시작 위치와 TCP 데이터의 길이를 인자로 받아서 TCP 체크섬 값을 계산하고, 계산된 체크섬 값을 리턴합니다. 이 함수는 IP 헤더와 TCP 헤더가 이미 생성되어 있다는 가정 하에 사용됩니다.

이 함수는 위에서 설명한 TCP 체크섬 계산 알고리즘을 구현하고 있습니다. 계산된 체크섬 값은 TCP 헤더의 Checksum 필드에 저장됩니다

반응형
Comments