패킷들은 checksum 필드를 갖고 있습니다. 이 필드를 이용해 이 패킷이 정상인지 아닌지 판단할 수 있습니다.
체크섬 계산은 간단히 할 수 있습니다.

알고리즘을 먼저 소개하겠습니다.


-- Ip Header checksum 계산--
1. ip header를 2바이트씩 자른다.
2. 체크섬 바이트를 0으로 초기화 합니다.
3. 체크섬 바이트에 짤린 바이트를 그대로 계속 더해갑니다. (sum += 각 2바이트)
4. 더해지는 sum은 4바이트여야 합니다. (올림이 생기기 때문에)
5. 다 더한다음 sum(4바이트) 중 윗 부분의 2바이트를 아랫부분의 2바이트에 다시 더합니다.
6. 다시 sum(4바이트) 중 윗 부분의 2바이트를 아랫부분의 2바이트에 다시 더합니다.

이와 같이 하는 이유는 올림이 다시 생기기 때문에 2번을 한다고 합니다.

7. 이제 2바이트가 된 sum을 1의 보수로 바꾸면 됩니다.



TCP, UDP, ICMP는 한가지 과정이 더 추가됩니다. IP Header의 정보가 필요합니다.
IP 헤더의 체크섬 계산법과 마찬가지로 20바이트에 해당하는 tcp 헤더의 값을 모두 더합니다.
데이터가 존재할경우 데이터 부분까지 더해 줍니다. 데이터가 홀수로 끝나는 부분은 주의해서 더해야 합니다.
다음으로 IP Header의 srcip, dstip를 2바이트로 잘라 더해줍니다.
부가적으로 IP Header의 protocol 필드, tcp 헤더의 길이를 더해줍니다.
여기서 tcp 헤더의 길이는 데이터 부분이 존재할경우 데이터 부분까지길이를 말합니다.
이후 IP의 체크섬과 마찬가지로 위 과정에서 발생한 케리값을 더해주는 과정을 거쳐 체크섬 계산이 완성됩니다.





UDP, ICMP의 경우는 TCP 체크섬 계산과 똑같습니다.

Bloger : moltak.net

'NativeCode > api' 카테고리의 다른 글

LoadLibrary, GetProcAddress, FreeLibrary, Name Mangling 해결  (0) 2010.11.09
printf, scanf 함수 포맷 문자열  (0) 2010.07.07
IpHlpApi MSDN  (0) 2010.07.04
SendARP  (0) 2010.07.03
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09

+ Recent posts