체크섬(checksum)은 데이터에서 계산해 데이터 뒤에 덧붙여 보내는 값으로, 오류를 검출하는 데 쓴다.[1][2] 수신 측은 받은 데이터로 체크섬을 다시 계산해 오류를 검사한다.[2][3]
체크섬은 데이터를 바이트나 워드 단위로 더한 합으로 만들기도 한다.[3][4]
인터넷 체크섬
RFC 1071은 IP(Internet Protocol), UDP, TCP가 쓰는 체크섬을 인터넷 체크섬이라 부른다.[3] RFC 791은 IP 헤더 체크섬을 헤더의 모든 16비트 워드를 1의 보수로 더한 합의 1의 보수로 정한다.[5] RFC 9293은 TCP 체크섬을 의사 헤더를 포함한 헤더와 데이터의 16비트 워드를 같은 방식으로 더해 구하도록 정한다.[6] RFC 768은 UDP 체크섬을 의사 헤더, UDP 헤더, 데이터를 같은 방식으로 더해 구하도록 정한다.[7]
1의 보수 덧셈은 최상위 비트에서 넘친 올림수를 최하위 비트에 다시 더한다.[3][8]
RFC 791과 RFC 9293은 체크섬을 계산할 때 체크섬 필드를 0으로 두도록 정한다.[5][6] RFC 1071에 따르면 수신 측이 체크섬 필드까지 포함해 1의 보수 합을 구했을 때 모든 비트가 1이면 검사를 통과한다. 1의 보수 합은 교환 법칙과 결합 법칙이 성립해서, 바이트의 짝·홀 자리만 지키면 어떤 순서와 묶음으로 더해도 합이 같다. 또 하드웨어의 바이트 순서와 상관없이 같은 방법으로 구할 수 있다.[3]
덧셈으로 만드는 체크섬은 서로 다른 두 블록의 같은 비트 자리에서 한쪽의 1이 0으로, 다른 쪽의 0이 1로 함께 뒤집힌 오류를 찾지 못한다. 한 블록이 줄어든 만큼 다른 블록이 늘어 합이 그대로이기 때문이다.[9]
Fletcher 체크섬과 Adler-32
Fletcher 체크섬은 데이터를 더한 합 와, 를 다시 누적한 합 두 개를 체크섬으로 쓴다.[4][10] RFC 1146에 따르면 에는 옥텟마다 자리에 따른 가중치가 붙어서, Fletcher 알고리즘은 표준 TCP 체크섬과 달리 데이터그램 안에서 옥텟이나 워드가 자리를 바꾼 것을 찾아낸다.[10]
RFC 1950에 따르면 Adler-32는 Fletcher 알고리즘을 32비트로 넓히고 개선한 것이다. zlib 포맷의 Adler-32는 바이트의 합 과 값들의 합 로 이루어진다. 두 합은 65521로 나눈 나머지로 유지하고, 은 1, 는 0에서 시작하며, 결과는 로 저장한다. zlib 포맷은 압축 전 데이터의 Adler-32를 싣고, 이 포맷을 따르는 압축 해제기는 이를 검사해 값이 틀리면 오류를 알려야 한다. 두 합 가운데 바이트를 더하기만 한 은 와 달리 바이트의 위치와 순서에 민감하지 않다.[11]
LIN이 쓰는 체크섬은 LIN에서 다룬다.
CRC와의 차이
CRC는 체크섬보다 오류 검출 능력이 크다.[2][3] RFC 1071에 부록으로 실린 IEN 45에 따르면 CRC 다항식 부호는 프로그램으로 구현하기에 비용이 크다.[3]
다만 덧셈으로 만드는 체크섬도 짧은 버스트 오류는 모두 찾아낸다. 체크섬 크기가 비트일 때 2의 보수 덧셈 체크섬은 길이 비트 이하, 1의 보수 덧셈 체크섬은 비트 이하의 버스트 오류를 모두 찾아낸다.[9]