정의
결함 격리(fault confinement)는 오류를 반복해 일으키는 노드가 버스를 계속 방해하지 못하도록 그 노드의 참여 권한을 단계적으로 줄이는 장치다. 모든 노드가 오류 카운터 두 개를 유지하고, 카운터 값에 따라 에러 액티브·에러 패시브·버스 오프 세 상태 사이를 오간다.[1]
에러 프레임은 양날의 칼이다. 오류를 버스 전체에 알려 데이터 일관성을 지켜 주지만, 고장 난 노드가 멀쩡한 전송마다 에러 플래그를 내면 버스가 통째로 마비된다. 결함 격리는 그 노드를 스스로 물러나게 만들어, 고장이 노드 하나에 머물고 나머지 통신의 대역폭이 남아 있게 한다.[2]
핵심은 일시적 방해와 영구적 고장을 가르는 것이다. CAN은 두 가지를 구별해 고장 난 노드만 떼어 내도록 설계됐다.[1] 오류가 몇 번 났다고 곧바로 노드를 끊어 내면 잡음 한 번에 통신이 끊기므로, 오류를 세되 성공한 전송으로 그 셈이 다시 줄어들게 해 두었다.
오류 카운터
각 노드는 송신 오류 카운터(TEC)와 수신 오류 카운터(REC)를 둔다. 이름 그대로 전자는 자신이 송신할 때의 오류를, 후자는 남의 프레임을 받을 때의 오류를 센다.[1]
| 사건 | 카운터 변화 |
|---|---|
| 송신 노드가 에러 플래그를 보냄 | TEC 8 증가 |
| 수신 노드가 오류를 검출함 | REC 1 증가 |
| 수신 노드가 에러 플래그를 보낸 직후 첫 비트로 dominant를 읽음 | REC 8 증가 |
| 에러 플래그를 보낸 뒤 dominant가 8비트 연속될 때마다 | TEC 또는 REC 8 증가 |
| 프레임 전송에 성공함 | TEC 1 감소 (0이면 그대로) |
| 프레임 수신에 성공함 | REC 1 감소 (1 이상 127 이하일 때) |
| REC가 127을 넘은 상태에서 프레임 수신에 성공함 | REC를 119 이상 127 이하로 낮춤 |
증가 폭과 감소 폭의 비대칭이 이 장치의 성격을 정한다. 오류 한 번의 값은 8인데 성공 한 번의 값은 1이므로, 고장이 이어지면 카운터는 빠르게 올라가고 회복은 천천히 이뤄진다. 마지막 줄의 예외는 회복 국면에서 REC가 임계값 언저리에 오래 머물지 않게 하는 규칙이다.
송신 쪽이 수신 쪽보다 여덟 배 빠르게 오르는 것도 의도된 설계다. 오류가 잦을 때 원인이 송신 노드에 있을 공산이 크기 때문이다. 카운터 값이 96을 넘으면 버스가 심하게 교란되고 있다는 신호로 보고, 대부분의 CAN 컨트롤러가 이 지점을 오류 경고 상태로 알린다.[3]
세 가지 상태
| 상태 | 진입 조건 | 거동 |
|---|---|---|
| 에러 액티브 | TEC·REC 모두 127 이하 | 제약 없이 송수신하고 액티브 에러 플래그를 낸다 |
| 에러 패시브 | TEC 또는 REC가 128 이상 | 송수신은 하되 패시브 에러 플래그만 내고, 전송 뒤 추가로 대기한다 |
| 버스 오프 | TEC가 256 이상 | 버스에 어떤 영향도 주지 않는다 |
노드는 에러 액티브로 시작한다. 두 카운터 중 하나라도 128에 이르면 에러 패시브로 내려가고, 두 카운터가 모두 127 이하로 돌아오면 다시 에러 액티브가 된다.[1]
수신 오류와 버스 오프
에러 패시브의 제약
에러 패시브 노드는 액티브 에러 플래그를 낼 수 없다. 오류를 검출해도 recessive 6비트짜리 패시브 에러 플래그만 내므로, 자신이 송신 중인 유일한 노드가 아닌 한 그 플래그는 버스에 아무 흔적도 남기지 않는다.[2] 이미 신뢰를 잃은 노드가 남의 통신을 부수지 못하게 막는 장치다.
전송 뒤 대기 규칙도 붙는다. 에러 패시브 노드는 프레임을 하나 보낸 뒤 인터미션에 이어 recessive 8비트를 더 내보내고 나서야 다음 전송을 시작하거나 버스를 유휴로 인정한다. 이 구간을 전송 유예(suspend transmission)라고 하며, 그동안 다른 노드가 전송을 시작하면 에러 패시브 노드는 그 프레임의 수신자가 된다.[1] 결과적으로 에러 패시브 노드는 다른 노드가 버스를 쓰지 않을 때에만 버스를 잡을 수 있다.
버스 오프와 복귀
TEC가 256에 이르면 노드는 버스 오프가 된다. 이 상태에서는 출력 드라이버가 꺼져 버스에 어떤 영향도 주지 못한다. 프레임도, 확인 응답도, 에러 프레임도 내보내지 않는다.[1][2] 버스에서 사실상 떨어져 나가는 셈이다.
복귀 조건은 버스가 정상으로 돌아왔다는 증거를 요구한다. 버스를 읽는 일은 계속하며, recessive 11비트 연속이 128번 관측되면 노드는 두 카운터를 0으로 되돌리고 에러 액티브로 복귀할 수 있다. 128번이라는 횟수는 버스가 한동안 방해 없이 흘러가는 것을 확인한 뒤에야 복귀를 허용하겠다는 뜻이다.
버스 오프 노드가 다시 통신에 참여할 수 있게 되더라도, 고장 원인이 그대로면 카운터는 같은 속도로 다시 오른다. 결함 격리는 고장을 고쳐 주는 장치가 아니라 고장의 영향 범위를 노드 하나로 묶어 두는 장치다.