💡 핵심 인사이트
검사합(Checksum)은 2계층 랜선 단위가 아니라, 3계층(IP)과 4계층(TCP/UDP) 헤더에서 주로 사용하는 가벼운 에러 검출 알고리즘입니다.
패리티 검사가 '개수'만 센다면, 쳌섬은 보낼 데이터들을 숫자로 보고 몽땅 '더하기(Sum)' 연산을 한 뒤, 그 합계 값을 데이터 끝에 꼬리표(Check)로 달아 보내는 방식입니다.
Ⅰ. 검사합(Checksum)의 기본 원리
친구에게 (10, 20, 30) 이라는 3개의 숫자 데이터를 보낸다고 칩시다.
- 송신자: 이 3개를 다 더하면 60이네. 그럼 데이터 끝에 60을 달아서
[10, 20, 30, 60(쳌섬)]을 쏴주자. - 수신기: 데이터를 받은 뒤, 마지막 쳌섬 칸(60)을 떼어놓고 자기가 직접 앞의 3개를 더해봅니다. "나도 더하니까 60이 나오네! 그럼 오는 길에 숫자 하나도 안 깨졌군, 통과!"
이것이 검사합의 본질입니다. 단, 실제 컴퓨터는 십진수가 아니라 16비트(또는 8비트) 이진수로 이 더하기 연산을 수행합니다.
Ⅱ. '1의 보수(1's Complement)' 연산법
컴퓨터 네트워크에서 Checksum을 계산할 때는 아주 특수한 수학인 '1의 보수 산술'을 사용합니다. (정보처리기사 계산 문제로 나옵니다).
송신 측 (만드는 법)
- 보낼 데이터를 16비트 단위로 뚝뚝 끊습니다.
- 이 조각들을 몽땅 이진수 덧셈으로 다 더합니다.
- 더하다가 자릿수가 16자리를 넘어가서 맨 앞으로 툭 튀어나온 올림수(Carry)가 생기면 버리지 않고, 다시 끄트머리 1의 자리에 가져가서 한 번 더 더해줍니다(Wrap-around).
- 이렇게 얻어낸 최종 합계 값의 0과 1을 모두 거꾸로 뒤집어버립니다(1의 보수 취하기/NOT 연산). ➔ 이것이 최종 생성된 **'Checksum 값'**입니다.
수신 측 (검사하는 법)
- 날아온 데이터 조각들 + 꼬리에 달린 'Checksum 값'까지 남김없이 몽땅 다 더합니다. (마찬가지로 올림수는 뒤로 돌려 더함).
- 에러 없이 무사히 도착했다면, **이 덧셈의 최종 결과는 무조건 모든 자리가
1(1111111111111111)**이 나오게 수학적으로 설계되어 있습니다. - 만약 1이 아닌 0이 단 한 자리라도 섞여 있다면 "에러 났네!" 하고 패킷을 폐기합니다.
Ⅲ. 검사합의 특징과 한계
- 장점: 덧셈과 비트 뒤집기(NOT)라는 극단적으로 단순한 연산만 사용하므로, 컴퓨터 CPU나 라우터 칩셋이 소프트웨어적으로 계산하기에 엄청나게 가볍고 속도가 빠릅니다. 그래서 IPv4 헤더 검사나 TCP/UDP에서 널리 쓰입니다.
- 치명적 단점 (상쇄 에러): 덧셈의 한계가 있습니다. 만약 첫 번째 숫자의 1이 0으로 깨지고(-1), 두 번째 숫자의 0이 1로 깨지면(+1)? $10 + (-1) + 20 + (+1) = 30$으로 합계 자체는 똑같아집니다. 서로 다른 두 개의 비트가 상쇄되는 방향으로 동시에 깨지면 검사합은 이를 100% 정상으로 오해하고 패스시켜 버립니다. (이 허점을 잡기 위해 2계층에서는 무거운 CRC를 씁니다.)
📢 섹션 요약 비유: 검사합은 식당 사장님이 배달원에게 음식 3개를 주면서 **"이 음식들 가격표 다 더하면 총합이 6만 원(쳌섬)이야"**라고 영수증을 붙여 보내는 것입니다. 고객은 음식 가격표를 다 더해서 6만 원이 맞으면 안심합니다. 하지만 배달원이 만 원짜리 음식을 빼먹고(에러), 대신 지갑에서 만 원짜리 지폐 하나를 영수증에 껴놓으면(상쇄), 합계는 여전히 6만 원이라 고객은 사기를 당한 줄 모르는 맹점이 존재합니다.