iBetter Books
수정

오류는 왜 생기고 어떻게 알아채나

회선 위를 달리는 신호는 완벽하지 않습니다. 전선 옆을 지나는 전기 기기, 무선 통신의 전파 간섭, 케이블의 물리적 구부러짐, 심지어 우주에서 날아온 고에너지 입자까지 신호를 망가뜨릴 수 있습니다. 비트 하나가 0에서 1로, 또는 1에서 0으로 뒤집히는 일을 비트 오류라고 부릅니다. 이 오류를 모르고 지나치면, 받은 쪽은 원본과 다른 데이터를 진짜라고 믿게 됩니다.

오류의 종류

비트 오류는 크게 두 가지로 나뉩니다. 하나는 단일 비트 오류로, 비트 한 개만 뒤집히는 경우입니다. 다른 하나는 버스트 오류로, 연속된 여러 비트가 한꺼번에 망가지는 경우입니다. 번개가 치거나 강한 전파 간섭이 있을 때 버스트 오류가 자주 발생합니다. 수신 측 장치 입장에서는 어떤 종류든 받은 비트가 보낸 것과 다르기 때문에 문제의 심각도는 비슷합니다.

오류가 생길 확률은 낮습니다. 유선 이더넷의 비트 오류율은 보통 10억 비트당 1개 이하입니다. 하지만 초당 수백 메가비트를 주고받는 현대 네트워크에서는 '낮은 확률'도 무시할 수 없는 빈도로 현실에 나타납니다. 따라서 오류를 탐지하는 체계가 반드시 필요합니다.

오류 탐지의 원리

오류 탐지의 핵심 아이디어는 간단합니다. 보내는 쪽이 데이터를 어떤 수식으로 계산해서 그 결과값을 데이터와 함께 보냅니다. 받는 쪽은 같은 수식으로 받은 데이터를 다시 계산하고, 그 결과가 함께 온 값과 같은지 비교합니다. 달라져 있다면 전송 중에 뭔가 바뀐 것입니다.

이 결과값을 오류 검출 코드라고 부릅니다. 가장 단순한 것이 패리티 비트이고, 조금 더 강력한 것이 체크섬이며, 가장 널리 쓰이는 것이 CRC입니다. 이더넷 프레임 트레일러에 있는 FCS 필드가 바로 CRC 값을 담는 자리입니다.

탐지와 정정의 차이

오류 탐지는 '뭔가 잘못됐다'는 사실을 알아채는 것입니다. 오류 정정은 한 걸음 더 나아가 '정확히 어떤 비트가 뒤집혔는지' 알아내서 스스로 고치는 것입니다. 정정까지 하려면 훨씬 많은 여분의 비트가 필요합니다. 이더넷은 탐지만 하고, 정정은 상위 계층(TCP)이나 재전송으로 해결합니다. 반면 무선 환경이나 위성 통신처럼 재전송 비용이 큰 곳에서는 오류 정정 코드를 쓰기도 합니다.

오류를 탐지했을 때 이더넷이 취하는 행동은 단순합니다. 그 프레임을 조용히 버립니다. 재전송 요청이나 알림 같은 것은 없습니다. 데이터링크계층은 "이 프레임은 오염됐으니 없던 것으로" 하고 끝냅니다. 그렇게 사라진 패킷을 다시 요청하는 일은 다음 장에서 배울 흐름 제어와 신뢰성 계층의 몫입니다. 다음 절에서는 오류를 계산하는 방법을 손으로 직접 해봅니다.