CS/네트워크

[네트워크] 체크섬 (checksum)

hojak99 2016. 11. 23. 23:13

[체크섬]


체크섬은 중복 검사의 한 형태. 송신된 자료의 무결성을 보호하는 단순한 방법이다.


통신에서 CRC, 즉 순환 중복 검사를 체크섬이라고도 말하는데 엄밀히 따지면 체크섬은 나열된 데이터를 더하여 체크섬 숫자를 얻고, 정해진 비트 수의 모듈라로 정해진 비트 수로 재구성한다.



체크섬은 기본적인 메시지 구성 요소를 추가해 결과값을 저장함으로 써 동작한다. 만약 체크섬이 맞아 떨어지지 않는다면 메시지가 손상되었다고 결론을 내릴 수 있다.



[예시]


4 바이트의 데이터가 있다.         0x25,    0x62,    0x3F,    0x52


1단계 : 모든 바이트를 덧셈하면 0x118 이 된다.

2단계 : 캐리 니블(1바이트의 절반으로 보통 4비트를 가리키는 컴퓨터 환경의 용어)을 버림으로써 0x18을 만든다.

3단계 : 0x18의 2의 보수를 얻어 0xE8을 얻는데 이것이 바로 체크섬 바이트이다.


체크섬 바이트를 테스트하려면 원래의 그룹의 바이트에 체크섬 바이트까지 더하면 0x200이 된다.

다시 캐리 니블을 버림으로써 0x00이 된다. 0x00이라는 뜻은 오류가 없다는 뜻인데 오류가 있어도 우연히 될 수도 있다.



--출처 wikipedia





계산해보자!!!


0x25, 0x62, 0x3F, 0x52를 10진수로 계산하자.


0x25 = 37

0x62 = 98

0x3F = 63

0x52 = 82


모두 다 더하면 280이고 280을 다시 16진수로 변환시키면 0x118이다.

여기서 캐리 니블을 버리도록 해보자. 0x118을 2진수로 변환시키면?


계산하는 법은 그냥 1, 1, 8을 2진수로 변환시키면 된다. 만약 11A라면 A는 10으로 계산하는 식으로!

어쨌든 118은 0001 0001 1000이 되게 된다. 


캐리니블, 즉 최상위 니블을 버리면 0001을 버리게 되니까 0001 1000만 남게 된다.


이제 2의 보수를 취하면 되는데 2의 보수는 먼저 1의 보수로 바꾸고 거기에 +1을 하면 된다.

해보자.



0001 1000    ->    1110 0111    = 1의 보수

1110 0111    +1   1110 1000    = 2의 보수


1110 1000을 다시 16진법으로 계산하면 0xE8이 완성! 이것을 바로 체크섬 바이트라고 한다는 것이다.




체크섬 바이트 테스트를 진행하겠다.

0x118 + 0xE8 = 0x200 (512)가 된다. 이제 0x200을 2진수로 변환시카자

2진수로 변환시키면 0010 0000 0000 이 된다.


캐리니블을 다시 버리자!

0000 0000이다.


오류가 없다!

 

늠나 어려운 것. 눈으로 보는 것만으로는 이해하기 조금 그런데 직접 계산하고 하니까 이해가 잘된다. 

반응형